This commit is contained in:
Thomas Willingham 2013-01-26 20:04:31 +00:00
commit 5e291da9c3
95 changed files with 1601 additions and 777 deletions

Binary file not shown.

View file

@ -93,7 +93,7 @@ function altpager_settings(&$a,&$s) {
}
function altpager_plugin_admin(&$a, &$o){
$t = file_get_contents( "addon/altpager/admin.tpl" );
$t = get_markup_template( "admin.tpl", "addon/altpager/" );
$o = replace_macros($t, array(
'$submit' => t('Submit'),
'$global' => array('altpagerchoice', t('Global'), 1, t('Force global use of the alternate pager'), get_config('alt_pager', 'global') == 1),
@ -106,3 +106,4 @@ function altpager_plugin_admin_post(&$a){
set_config('alt_pager','global',($choice == 1 ? 1 : 0));
info( t('Settings updated.'). EOL );
}

0
altpager/admin.tpl → altpager/view/admin.tpl Executable file → Normal file
View file

View file

View file

@ -0,0 +1,3 @@
{{include file="field_radio.tpl" field=$global}}
{{include file="field_radio.tpl" field=$individual}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>

Binary file not shown.

View file

@ -93,8 +93,9 @@ function blackout_plugin_admin(&$a, &$o) {
if (! is_string($myend)) { $myend = "YYYY-MM-DD:hhmm"; }
$myurl = get_config('blackout','url');
if (! is_string($myurl)) { $myurl = "http://www.example.com"; }
$t = file_get_contents( dirname(__file__)."/admin.tpl" );
$o = replace_macros($t, array(
$t = get_markup_template( "admin.tpl", "addon/blackout/" );
$o = replace_macros($t, array(
'$submit' => t('Submit'),
'$rurl' => array("rurl", "Redirect URL", $myurl, "all your visitors from the web will be redirected to this URL"),
'$startdate' => array("startdate", "Begin of the Blackout<br />(YYYY-MM-DD hh:mm)", $mystart, "format is <em>YYYY</em> year, <em>MM</em> month, <em>DD</em> day, <em>hh</em> hour and <em>mm</em> minute"),

View file

@ -0,0 +1,11 @@
{{include file="field_input.tpl" field=$startdate}}
{{include file="field_input.tpl" field=$enddate}}
{{include file="field_input.tpl" field=$rurl}}
<div style="border: 2px solid #f00; padding: 10px; margin:
10px;font-size: 1.2em;"><strong>Note</strong>: The redirect will be active from the moment you
press the submit button. Users currently logged in will <strong>not</strong> be
thrown out but can't login again after logging out should the blackout is
still in place.</div>
<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>

Binary file not shown.

View file

@ -9,3 +9,26 @@ choosed to be in site directory), last ten public photos and last ten
In main content is shown the community stream. This plugin doesn't
honour your community page visibility site setting: the community
stream is shown also if you have choose to not show the community page.
If 'home.html' is found in your friendica root, its content is inserted
before community stream
Each elements can be show or not. At the moment, there is no admin page
for settings, so this settings must be added to yout .htconfig.php
$a->config['communityhome']['showcommunitystream'] = true;
$a->config['communityhome']['showlastlike'] = true;
$a->config['communityhome']['showlastphotos'] = true;
$a->config['communityhome']['showactiveusers'] = true;
$a->config['communityhome']['showlastusers'] = true;
If you don't want to show something, set it to false.
Note:
-----
- Default is "false". With no settings in .htconfig.php, nothing is
shown, except login form and content of 'home.html'
- Active users query can be heavy for db, and on some system don't work

View file

@ -39,4 +39,5 @@ aside .directory-photo-img { max-width: 48px; max-height: 48px; }
aside #likes { margin: 0px; padding: 0px; list-style: none; }
aside #login-extra-links { overflow: auto; width: 100%; padding-top:120px;}
aside #div_id_remember { overflow: auto; width: 100%; padding-top:120px;}
#login_openid input { width: 160px; }

View file

@ -2,7 +2,7 @@
/**
* Name: Community home
* Description: Show last community activity in homepage
* Version: 1.0
* Version: 2.0
* Author: Fabio Comuni <http://kirgroup.com/profile/fabrixxm>
*/
@ -35,152 +35,166 @@ function communityhome_home(&$a, &$o){
$aside['$login_form'] = login(($a->config['register_policy'] == REGISTER_CLOSED) ? false : true);
// last 12 users
$aside['$lastusers_title'] = t('Latest users');
$aside['$lastusers_items'] = array();
$sql_extra = "";
$publish = (get_config('system','publish_all') ? '' : " AND `publish` = 1 " );
$order = " ORDER BY `register_date` DESC ";
if (get_config('communityhome','showlastusers')===true){
$aside['$lastusers_title'] = t('Latest users');
$aside['$lastusers_items'] = array();
$sql_extra = "";
$publish = (get_config('system','publish_all') ? '' : " AND `publish` = 1 " );
$order = " ORDER BY `register_date` DESC ";
$r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`
FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid`
WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra $order LIMIT %d , %d ",
0,
12
);
$tpl = file_get_contents( dirname(__file__).'/directory_item.tpl');
if(count($r)) {
$photo = 'thumb';
foreach($r as $rr) {
$profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']);
$entry = replace_macros($tpl,array(
'$id' => $rr['id'],
'$profile-link' => $profile_link,
'$photo' => $a->get_cached_avatar_image($rr[$photo]),
'$alt-text' => $rr['name'],
));
$aside['$lastusers_items'][] = $entry;
$r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`
FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid`
WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra $order LIMIT %d , %d ",
0,
12
);
# $tpl = file_get_contents( dirname(__file__).'/directory_item.tpl');
$tpl = get_markup_template( 'directory_item.tpl', 'addon/communityhome/' );
if(count($r)) {
$photo = 'thumb';
foreach($r as $rr) {
$profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']);
$entry = replace_macros($tpl,array(
'$id' => $rr['id'],
'$profile_link' => $profile_link,
'$photo' => $a->get_cached_avatar_image($rr[$photo]),
'$alt_text' => $rr['name'],
));
$aside['$lastusers_items'][] = $entry;
}
}
}
// 12 most active users (by posts and contacts)
// this query don't work on some mysql versions
$r = q("SELECT `uni`.`contacts`,`uni`.`items`, `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname` FROM
(SELECT COUNT(`id`) as `contacts`, `uid` FROM `contact` WHERE `self`=0 GROUP BY `uid`) AS `con`,
(SELECT COUNT(`id`) as `items`, `uid` FROM `item` WHERE `item`.`changed` > DATE(NOW() - INTERVAL 1 MONTH) AND `item`.`wall` = 1 GROUP BY `uid`) AS `ite`,
(
SELECT `contacts`,`items`,`ite`.`uid` FROM `con` RIGHT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid`
UNION ALL
SELECT `contacts`,`items`,`con`.`uid` FROM `con` LEFT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid`
) AS `uni`, `user`, `profile`
WHERE `uni`.`uid`=`user`.`uid`
AND `uni`.`uid`=`profile`.`uid` AND `profile`.`publish`=1
GROUP BY `uid`
ORDER BY `items` DESC,`contacts` DESC
LIMIT 0,10");
if($r && count($r)) {
$aside['$activeusers_title'] = t('Most active users');
$aside['$activeusers_items'] = array();
if (get_config('communityhome','showactiveusers')===true){
$r = q("SELECT `uni`.`contacts`,`uni`.`items`, `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname` FROM
(SELECT COUNT(`id`) as `contacts`, `uid` FROM `contact` WHERE `self`=0 GROUP BY `uid`) AS `con`,
(SELECT COUNT(`id`) as `items`, `uid` FROM `item` WHERE `item`.`changed` > DATE(NOW() - INTERVAL 1 MONTH) AND `item`.`wall` = 1 GROUP BY `uid`) AS `ite`,
(
SELECT `contacts`,`items`,`ite`.`uid` FROM `con` RIGHT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid`
UNION ALL
SELECT `contacts`,`items`,`con`.`uid` FROM `con` LEFT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid`
) AS `uni`, `user`, `profile`
WHERE `uni`.`uid`=`user`.`uid`
AND `uni`.`uid`=`profile`.`uid` AND `profile`.`publish`=1
GROUP BY `uid`
ORDER BY `items` DESC,`contacts` DESC
LIMIT 0,10");
if($r && count($r)) {
$aside['$activeusers_title'] = t('Most active users');
$aside['$activeusers_items'] = array();
$photo = 'thumb';
foreach($r as $rr) {
$profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']);
$entry = replace_macros($tpl,array(
'$id' => $rr['id'],
'$profile-link' => $profile_link,
'$photo' => $rr[$photo],
'$alt-text' => sprintf("%s (%s posts, %s contacts)",$rr['name'], ($rr['items']?$rr['items']:'0'), ($rr['contacts']?$rr['contacts']:'0'))
));
$aside['$activeusers_items'][] = $entry;
$photo = 'thumb';
foreach($r as $rr) {
$profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']);
$entry = replace_macros($tpl,array(
'$id' => $rr['id'],
'$profile_link' => $profile_link,
'$photo' => $rr[$photo],
'$alt_text' => sprintf("%s (%s posts, %s contacts)",$rr['name'], ($rr['items']?$rr['items']:'0'), ($rr['contacts']?$rr['contacts']:'0'))
));
$aside['$activeusers_items'][] = $entry;
}
}
}
// last 12 photos
$aside['$photos_title'] = t('Latest photos');
$aside['$photos_items'] = array();
$r = q("SELECT `photo`.`id`, `photo`.`resource-id`, `photo`.`scale`, `photo`.`desc`, `user`.`nickname`, `user`.`username` FROM
(SELECT `resource-id`, MAX(`scale`) as maxscale FROM `photo`
WHERE `profile`=0 AND `contact-id`=0 AND `album` NOT IN ('Contact Photos', '%s', 'Profile Photos', '%s')
AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`='' GROUP BY `resource-id`) AS `t1`
INNER JOIN `photo` ON `photo`.`resource-id`=`t1`.`resource-id` AND `photo`.`scale` = `t1`.`maxscale`,
`user`
WHERE `user`.`uid` = `photo`.`uid`
AND `user`.`blockwall`=0
AND `user`.`hidewall` = 0
ORDER BY `photo`.`edited` DESC
LIMIT 0, 12",
dbesc(t('Contact Photos')),
dbesc(t('Profile Photos'))
);
if (get_config('communityhome','showlastphotos')===true){
$aside['$photos_title'] = t('Latest photos');
$aside['$photos_items'] = array();
$r = q("SELECT `photo`.`id`, `photo`.`resource-id`, `photo`.`scale`, `photo`.`desc`, `user`.`nickname`, `user`.`username` FROM
(SELECT `resource-id`, MAX(`scale`) as maxscale FROM `photo`
WHERE `profile`=0 AND `contact-id`=0 AND `album` NOT IN ('Contact Photos', '%s', 'Profile Photos', '%s')
AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`='' GROUP BY `resource-id`) AS `t1`
INNER JOIN `photo` ON `photo`.`resource-id`=`t1`.`resource-id` AND `photo`.`scale` = `t1`.`maxscale`,
`user`
WHERE `user`.`uid` = `photo`.`uid`
AND `user`.`blockwall`=0
AND `user`.`hidewall` = 0
ORDER BY `photo`.`edited` DESC
LIMIT 0, 12",
dbesc(t('Contact Photos')),
dbesc(t('Profile Photos'))
);
if(count($r)) {
$tpl = file_get_contents( dirname(__file__).'/directory_item.tpl');
foreach($r as $rr) {
$photo_page = $a->get_baseurl() . '/photos/' . $rr['nickname'] . '/image/' . $rr['resource-id'];
$photo_url = $a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . $rr['scale'] .'.jpg';
if(count($r)) {
# $tpl = file_get_contents( dirname(__file__).'/directory_item.tpl');
$tpl = get_markup_template( 'directory_item.tpl', 'addon/communityhome/' );
foreach($r as $rr) {
$photo_page = $a->get_baseurl() . '/photos/' . $rr['nickname'] . '/image/' . $rr['resource-id'];
$photo_url = $a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . $rr['scale'] .'.jpg';
$entry = replace_macros($tpl,array(
'$id' => $rr['id'],
'$profile-link' => $photo_page,
'$photo' => $photo_url,
'$alt-text' => $rr['username']." : ".$rr['desc'],
));
$entry = replace_macros($tpl,array(
'$id' => $rr['id'],
'$profile_link' => $photo_page,
'$photo' => $photo_url,
'$alt_text' => $rr['username']." : ".$rr['desc'],
));
$aside['$photos_items'][] = $entry;
$aside['$photos_items'][] = $entry;
}
}
}
// last 10 liked items
$aside['$like_title'] = t('Latest likes');
$aside['$like_items'] = array();
$r = q("SELECT `T1`.`created`, `T1`.`liker`, `T1`.`liker-link`, `item`.* FROM
(SELECT `parent-uri`, `created`, `author-name` AS `liker`,`author-link` AS `liker-link`
FROM `item` WHERE `verb`='http://activitystrea.ms/schema/1.0/like' GROUP BY `parent-uri` ORDER BY `created` DESC) AS T1
INNER JOIN `item` ON `item`.`uri`=`T1`.`parent-uri`
WHERE `T1`.`liker-link` LIKE '%s%%' OR `item`.`author-link` LIKE '%s%%'
GROUP BY `uri`
ORDER BY `T1`.`created` DESC
LIMIT 0,10",
$a->get_baseurl(),$a->get_baseurl()
);
if (get_config('communityhome','showlastlike')===true){
$aside['$like_title'] = t('Latest likes');
$aside['$like_items'] = array();
$r = q("SELECT `T1`.`created`, `T1`.`liker`, `T1`.`liker-link`, `item`.* FROM
(SELECT `parent-uri`, `created`, `author-name` AS `liker`,`author-link` AS `liker-link`
FROM `item` WHERE `verb`='http://activitystrea.ms/schema/1.0/like' GROUP BY `parent-uri` ORDER BY `created` DESC) AS T1
INNER JOIN `item` ON `item`.`uri`=`T1`.`parent-uri`
WHERE `T1`.`liker-link` LIKE '%s%%' OR `item`.`author-link` LIKE '%s%%'
GROUP BY `uri`
ORDER BY `T1`.`created` DESC
LIMIT 0,10",
$a->get_baseurl(),$a->get_baseurl()
);
foreach ($r as $rr) {
$author = '<a href="' . $rr['liker-link'] . '">' . $rr['liker'] . '</a>';
$objauthor = '<a href="' . $rr['author-link'] . '">' . $rr['author-name'] . '</a>';
foreach ($r as $rr) {
$author = '<a href="' . $rr['liker-link'] . '">' . $rr['liker'] . '</a>';
$objauthor = '<a href="' . $rr['author-link'] . '">' . $rr['author-name'] . '</a>';
//var_dump($rr['verb'],$rr['object-type']); killme();
switch($rr['verb']){
case 'http://activitystrea.ms/schema/1.0/post':
switch ($rr['object-type']){
case 'http://activitystrea.ms/schema/1.0/event':
$post_type = t('event');
break;
default:
//var_dump($rr['verb'],$rr['object-type']); killme();
switch($rr['verb']){
case 'http://activitystrea.ms/schema/1.0/post':
switch ($rr['object-type']){
case 'http://activitystrea.ms/schema/1.0/event':
$post_type = t('event');
break;
default:
$post_type = t('status');
}
break;
default:
if ($rr['resource-id']){
$post_type = t('photo');
$m=array(); preg_match("/\[url=([^]]*)\]/", $rr['body'], $m);
$rr['plink'] = $m[1];
} else {
$post_type = t('status');
}
break;
default:
if ($rr['resource-id']){
$post_type = t('photo');
$m=array(); preg_match("/\[url=([^]]*)\]/", $rr['body'], $m);
$rr['plink'] = $m[1];
} else {
$post_type = t('status');
}
}
}
$plink = '<a href="' . $rr['plink'] . '">' . $post_type . '</a>';
$aside['$like_items'][] = sprintf( t('%1$s likes %2$s\'s %3$s'), $author, $objauthor, $plink);
}
$plink = '<a href="' . $rr['plink'] . '">' . $post_type . '</a>';
$aside['$like_items'][] = sprintf( t('%1$s likes %2$s\'s %3$s'), $author, $objauthor, $plink);
}
$tpl = file_get_contents(dirname(__file__).'/communityhome.tpl');
# $tpl = file_get_contents(dirname(__file__).'/communityhome.tpl');
$tpl = get_markup_template('communityhome.tpl', 'addon/communityhome/');
$a->page['aside'] = replace_macros($tpl, $aside);
$o = '<h1>' . ((x($a->config,'sitename')) ? sprintf( t("Welcome to %s") ,$a->config['sitename']) : "" ) . '</h1>';
$oldset = get_config('system','no_community_page');
set_config('system','no_community_page', false);
$o .= community_content($a,1);
set_config('system','no_community_page', $oldset);
if(file_exists('home.html'))
$o = file_get_contents('home.html');
if (get_config('communityhome','showcommunitystream')===true){
$oldset = get_config('system','no_community_page');
set_config('system','no_community_page', false);
$o .= community_content($a,1);
set_config('system','no_community_page', $oldset);
}
}

View file

@ -1,3 +0,0 @@
This is a variant of the community home. Instead of displaying the community tab in the front page, we still use home.html, but we also add the latest users to the sidebar.
Simply replace addon/communityhome/communityhome.php with this version then enable community home in your admin panel as usual.

View file

@ -1,107 +0,0 @@
<?php
/**
* Name: Community home
* Description: Show last community activity in homepage
* Version: 1.0
* Author: Fabio Comuni <http://kirgroup.com/profile/fabrixxm>
*/
require_once('mod/community.php');
function communityhome_install() {
register_hook('home_content', 'addon/communityhome/communityhome.php', 'communityhome_home');
logger("installed communityhome");
}
function communityhome_uninstall() {
unregister_hook('home_content', 'addon/communityhome/communityhome.php', 'communityhome_home');
logger("removed communityhome");
}
function communityhome_home(&$a, &$o){
// custom css
$a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="'.$a->get_baseurl().'/addon/communityhome/communityhome.css" media="all" />';
$aside = array(
'$tab_1' => t('Login'),
'$tab_2' => t('OpenID'),
'$noOid' => get_config('system','no_openid'),
);
// login form
$aside['$login_title'] = t('Login');
$aside['$login_form'] = login(($a->config['register_policy'] == REGISTER_CLOSED) ? false : true);
// last 12 users
$aside['$lastusers_title'] = t('Latest users');
$aside['$lastusers_items'] = array();
$sql_extra = "";
$publish = (get_config('system','publish_all') ? '' : " AND `publish` = 1 " );
$order = " ORDER BY `register_date` DESC ";
$r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`
FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid`
WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra $order LIMIT %d , %d ",
0,
12
);
$tpl = file_get_contents( dirname(__file__).'/directory_item.tpl');
if(count($r)) {
$photo = 'thumb';
foreach($r as $rr) {
$profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']);
$entry = replace_macros($tpl,array(
'$id' => $rr['id'],
'$profile-link' => $profile_link,
'$photo' => $rr[$photo],
'$alt-text' => $rr['name'],
));
$aside['$lastusers_items'][] = $entry;
}
}
// 12 most active users (by posts and contacts)
// this query don't work on some mysql versions
$r = q("SELECT `uni`.`contacts`,`uni`.`items`, `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname` FROM
(SELECT COUNT(`id`) as `contacts`, `uid` FROM `contact` WHERE `self`=0 GROUP BY `uid`) AS `con`,
(SELECT COUNT(`id`) as `items`, `uid` FROM `item` WHERE `item`.`changed` > DATE(NOW() - INTERVAL 1 MONTH) AND `item`.`wall` = 1 GROUP BY `uid`) AS `ite`,
(
SELECT `contacts`,`items`,`ite`.`uid` FROM `con` RIGHT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid`
UNION ALL
SELECT `contacts`,`items`,`con`.`uid` FROM `con` LEFT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid`
) AS `uni`, `user`, `profile`
WHERE `uni`.`uid`=`user`.`uid`
AND `uni`.`uid`=`profile`.`uid` AND `profile`.`publish`=1
GROUP BY `uid`
ORDER BY `items` DESC,`contacts` DESC
LIMIT 0,10");
if($r && count($r)) {
$aside['$activeusers_title'] = t('Most active users');
$aside['$activeusers_items'] = array();
$photo = 'thumb';
foreach($r as $rr) {
$profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']);
$entry = replace_macros($tpl,array(
'$id' => $rr['id'],
'$profile-link' => $profile_link,
'$photo' => $rr[$photo],
'$alt-text' => sprintf("%s (%s posts, %s contacts)",$rr['name'], ($rr['items']?$rr['items']:'0'), ($rr['contacts']?$rr['contacts']:'0'))
));
$aside['$activeusers_items'][] = $entry;
}
}
$tpl = file_get_contents(dirname(__file__).'/communityhome.tpl');
$a->page['aside'] = replace_macros($tpl, $aside);
$o = '';
if(file_exists('home.html'))
$o .= file_get_contents('home.html');
}

View file

@ -2,8 +2,8 @@
<div class="directory-item" id="directory-item-$id" >
<div class="directory-photo-wrapper" id="directory-photo-wrapper-$id" >
<div class="directory-photo" id="directory-photo-$id" >
<a href="$profile-link" class="directory-profile-link" id="directory-profile-link-$id" >
<img class="directory-photo-img" src="$photo" alt="$alt-text" title="$alt-text" />
<a href="$profile_link" class="directory-profile-link" id="directory-profile-link-$id" >
<img class="directory-photo-img" src="$photo" alt="$alt_text" title="$alt_text" />
</a>
</div>
</div>

View file

@ -0,0 +1,70 @@
<script>
$(function(){
$("#tab_1 a").click(function(e){
$("#login_standard").show();
$("#login_openid").hide();
$("#tab_1").addClass("active");
$("#tab_2").removeClass("active");
e.preventDefault();
return false;
});
$("#tab_2 a").click(function(e){
$("#login_openid").show();
$("#login_standard").hide();
$("#tab_2").addClass("active");
$("#tab_1").removeClass("active");
e.preventDefault();
return false;
});
});
</script>
{{if $noOid}}
<h3>{{$login_title}}</h3>
{{else}}
<ul class="tabs">
<li id="tab_1" class="tab button active"><a href="#">{{$tab_1}}</a></li>
<li id="tab_2" class="tab button"><a href="#">{{$tab_2}}</a></li>
</ul>
{{/if}}
{{$login_form}}
{{if $lastusers_title}}
<h3>{{$lastusers_title}}</h3>
<div class='items-wrapper'>
{{foreach $lastusers_items as $i}}
{{$i}}
{{/foreach}}
</div>
{{/if}}
{{if $activeusers_title}}
<h3>{{$activeusers_title}}</h3>
<div class='items-wrapper'>
{{foreach $activeusers_items as $i}}
{{$i}}
{{/foreach}}
</div>
{{/if}}
{{if $photos_title}}
<h3>{{$photos_title}}</h3>
<div class='items-wrapper'>
{{foreach $photos_items as $i}}
{{$i}}
{{/foreach}}
</div>
{{/if}}
{{if $like_title}}
<h3>{{$like_title}}</h3>
<ul id='likes'>
{{foreach $like_items as $i}}
<li>{{$i}}</li>
{{/foreach}}
</ul>
{{/if}}

View file

@ -0,0 +1,10 @@
<div class="directory-item" id="directory-item-{{$id}}" >
<div class="directory-photo-wrapper" id="directory-photo-wrapper-{{$id}}" >
<div class="directory-photo" id="directory-photo-{{$id}}" >
<a href="{{$profile}}-link" class="directory-profile-link" id="directory-profile-link-{{$id}}" >
<img class="directory-photo-img" src="{{$photo}}" alt="{{$alt}}-text" title="{{$alt}}-text" />
</a>
</div>
</div>
</div>

Binary file not shown.

View file

@ -5,7 +5,7 @@
* Name: external cron
* Description: Use external server or service to run poller regularly
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
* Author: Mike Macgirvin <https://macgirvin.com/profile/mike>
*
* Notes: External service needs to make a web request to http(s)://yoursite/extcron
*/

Binary file not shown.

View file

@ -383,10 +383,12 @@ function fb_get_friends_sync_full($uid, $access_token, $persons) {
if($s) {
$results = json_decode($s);
logger('fb_get_friends: info: ' . print_r($results,true), LOGGER_DATA);
foreach ($results as $contact) {
if ($contact->code != 200) logger('fb_get_friends: not found: ' . print_r($contact,true), LOGGER_DEBUG);
else fb_get_friends_sync_parsecontact($uid, json_decode($contact->body));
}
if(count($results)) {
foreach ($results as $contact) {
if ($contact->code != 200) logger('fb_get_friends: not found: ' . print_r($contact,true), LOGGER_DEBUG);
else fb_get_friends_sync_parsecontact($uid, json_decode($contact->body));
}
}
}
}
}

Binary file not shown.

View file

@ -22,6 +22,7 @@
* in a future release.
*/
define('FACEBOOK_DEFAULT_POLL_INTERVAL', 5); // given in minutes
require_once('include/security.php');
@ -32,6 +33,7 @@ function fbpost_install() {
register_hook('connector_settings', 'addon/fbpost/fbpost.php', 'fbpost_plugin_settings');
register_hook('enotify', 'addon/fbpost/fbpost.php', 'fbpost_enotify');
register_hook('queue_predeliver', 'addon/fbpost/fbpost.php', 'fbpost_queue_hook');
register_hook('cron', 'addon/fbpost/fbpost.php', 'fbpost_cron');
}
@ -42,8 +44,7 @@ function fbpost_uninstall() {
unregister_hook('connector_settings', 'addon/fbpost/fbpost.php', 'fbpost_plugin_settings');
unregister_hook('enotify', 'addon/fbpost/fbpost.php', 'fbpost_enotify');
unregister_hook('queue_predeliver', 'addon/fbpost/fbpost.php', 'fbpost_queue_hook');
unregister_hook('cron', 'addon/fbpost/fbpost.php', 'fbpost_cron');
}
@ -140,6 +141,9 @@ function fbpost_post(&$a) {
$value = ((x($_POST,'post_by_default')) ? intval($_POST['post_by_default']) : 0);
set_pconfig($uid,'facebook','post_by_default', $value);
$value = ((x($_POST,'mirror_posts')) ? intval($_POST['mirror_posts']) : 0);
set_pconfig($uid,'facebook','mirror_posts', $value);
$value = ((x($_POST,'suppress_view_on_friendica')) ? intval($_POST['suppress_view_on_friendica']) : 0);
set_pconfig($uid,'facebook','suppress_view_on_friendica', $value);
@ -209,7 +213,7 @@ function fbpost_content(&$a) {
$o .= '<div id="fbpost-enable-wrapper">';
$o .= '<a href="https://www.facebook.com/dialog/oauth?client_id=' . $appid . '&redirect_uri='
. $a->get_baseurl() . '/fbpost/' . $a->user['nickname'] . '&scope=publish_stream,manage_pages,photo_upload,user_groups,offline_access">' . t('Install Facebook Post connector for this account.') . '</a>';
. $a->get_baseurl() . '/fbpost/' . $a->user['nickname'] . '&scope=read_stream,publish_stream,manage_pages,photo_upload,user_groups,offline_access">' . t('Install Facebook Post connector for this account.') . '</a>';
$o .= '</div>';
}
@ -221,7 +225,7 @@ function fbpost_content(&$a) {
$o .= '<div id="fbpost-enable-wrapper">';
$o .= '<a href="https://www.facebook.com/dialog/oauth?client_id=' . $appid . '&redirect_uri='
. $a->get_baseurl() . '/fbpost/' . $a->user['nickname'] . '&scope=publish_stream,manage_pages,photo_upload,user_groups,offline_access">' . t('Re-authenticate [This is necessary whenever your Facebook password is changed.]') . '</a>';
. $a->get_baseurl() . '/fbpost/' . $a->user['nickname'] . '&scope=read_stream,publish_stream,manage_pages,photo_upload,user_groups,offline_access">' . t('Re-authenticate [This is necessary whenever your Facebook password is changed.]') . '</a>';
$o .= '</div>';
$o .= '<div id="fbpost-post-default-form">';
@ -234,6 +238,10 @@ function fbpost_content(&$a) {
$checked = (($suppress_view_on_friendica) ? ' checked="checked" ' : '');
$o .= '<input type="checkbox" name="suppress_view_on_friendica" value="1"' . $checked . '/>' . ' ' . t('Suppress "View on friendica"') . EOL;
$mirror_posts = get_pconfig(local_user(),'facebook','mirror_posts');
$checked = (($mirror_posts) ? ' checked="checked" ' : '');
$o .= '<input type="checkbox" name="mirror_posts" value="1"' . $checked . '/>' . ' ' . t('Mirror wall posts from facebook to friendica.') . EOL;
// List all pages
$post_to_page = get_pconfig(local_user(),'facebook','post_to_page');
$page_access_token = get_pconfig(local_user(),'facebook','page_access_token');
@ -386,6 +394,14 @@ function fbpost_post_hook(&$a,&$b) {
if($b['deleted'] || ($b['created'] !== $b['edited']))
return;
// Don't transmit answers (have to be cleaned up in the following code)
if($b['parent'] != $b['id'])
return;
// if post comes from facebook don't send it back
if($b['app'] == "Facebook")
return;
/**
* Post to Facebook stream
*/
@ -965,3 +981,214 @@ function fbpost_get_app_access_token() {
}
}
function fbpost_cron($a,$b) {
$last = get_config('facebook','last_poll');
$poll_interval = intval(get_config('facebook','poll_interval'));
if(! $poll_interval)
$poll_interval = FACEBOOK_DEFAULT_POLL_INTERVAL;
if($last) {
$next = $last + ($poll_interval * 60);
if($next > time()) {
logger('facebook: poll intervall not reached');
return;
}
}
logger('facebook: cron_start');
$r = q("SELECT * FROM `pconfig` WHERE `cat` = 'facebook' AND `k` = 'mirror_posts' AND `v` = '1' ORDER BY RAND() ");
if(count($r)) {
foreach($r as $rr) {
logger('facebook: fetching for user '.$rr['uid']);
fbpost_fetchwall($a, $rr['uid']);
}
}
logger('facebook: cron_end');
set_config('facebook','last_poll', time());
}
function fbpost_fetchwall($a, $uid) {
$access_token = get_pconfig($uid,'facebook','access_token');
$post_to_page = get_pconfig($uid,'facebook','post_to_page');
$lastcreated = get_pconfig($uid,'facebook','last_created');
if ((int)$post_to_page == 0)
$post_to_page = "me";
$url = "https://graph.facebook.com/".$post_to_page."/feed?access_token=".$access_token;
$first_time = ($lastcreated == "");
if ($lastcreated != "")
$url .= "&since=".urlencode($lastcreated);
$feed = fetch_url($url);
$data = json_decode($feed);
$items = array_reverse($data->data);
foreach ($items as $item) {
if ($item->created_time > $lastcreated)
$lastcreated = $item->created_time;
if ($first_time)
continue;
if ($item->application->id == get_config('facebook','appid'))
continue;
if(isset($item->privacy) && ($item->privacy->value !== 'EVERYONE') && ($item->privacy->value !== ''))
continue;
$_SESSION["authenticated"] = true;
$_SESSION["uid"] = $uid;
$_REQUEST["type"] = "wall";
$_REQUEST["api_source"] = true;
$_REQUEST["profile_uid"] = $uid;
$_REQUEST["source"] = "Facebook";
$_REQUEST["body"] = (isset($item->message) ? escape_tags($item->message) : '');
if(isset($item->name) and isset($item->link))
$_REQUEST["body"] .= "\n\n[bookmark=".$item->link."]".$item->name."[/bookmark]";
elseif (isset($item->name))
$_REQUEST["body"] .= "\n\n[b]" . $item->name."[/b]";
/*if(isset($item->caption)) {
if(!isset($item->name) and isset($item->link))
$_REQUEST["body"] .= "\n\n[bookmark=".$item->link."]".$item->caption."[/bookmark]";
//else
// $_REQUEST["body"] .= "[i]" . $item->caption."[/i]\n";
}
if(!isset($item->caption) and !isset($item->name)) {
if (isset($item->link))
$_REQUEST["body"] .= "\n[url]".$item->link."[/url]\n";
else
$_REQUEST["body"] .= "\n";
}*/
$quote = "";
if(isset($item->description) and ($item->type != "photo"))
$quote = $item->description;
if(isset($item->caption) and ($item->type == "photo"))
$quote = $item->caption;
//if (isset($item->properties))
// foreach ($item->properties as $property)
// $quote .= "\n".$property->name.": [url=".$property->href."]".$property->text."[/url]";
if ($quote)
$_REQUEST["body"] .= "\n[quote]".$quote."[/quote]";
// Only import the picture when the message is no video
// oembed display a picture of the video as well
if ($item->type != "video") {
//if (($item->type != "video") and ($item->type != "photo")) {
if(isset($item->picture) && isset($item->link))
$_REQUEST["body"] .= "\n".'[url='.$item->link.'][img]'.fpost_cleanpicture($item->picture).'[/img][/url]';
else {
if (isset($item->picture))
$_REQUEST["body"] .= "\n".'[img]'.fpost_cleanpicture($item->picture).'[/img]';
// if just a link, it may be a wall photo - check
if(isset($item->link))
$_REQUEST["body"] .= fbpost_get_photo($uid,$item->link);
}
}
/*if (($datarray['app'] == "Events") and isset($item->actions))
foreach ($item->actions as $action)
if ($action->name == "View")
$_REQUEST["body"] .= " [url=".$action->link."]".$item->story."[/url]";
*/
if(trim($_REQUEST["body"]) == '') {
logger('facebook: empty body '.$item->id.' '.print_r($item, true));
continue;
}
$_REQUEST["body"] = trim($_REQUEST["body"]);
if (isset($item->place)) {
if ($item->place->name or $item->place->location->street or
$item->place->location->city or $item->place->location->country) {
$_REQUEST["location"] = '';
if ($item->place->name)
$_REQUEST["location"] .= $item->place->name;
if ($item->place->location->street)
$_REQUEST["location"] .= " ".$item->place->location->street;
if ($item->place->location->city)
$_REQUEST["location"] .= " ".$item->place->location->city;
if ($item->place->location->country)
$_REQUEST["location"] .= " ".$item->place->location->country;
$_REQUEST["location"] = trim($_REQUEST["location"]);
}
if ($item->place->location->latitude and $item->place->location->longitude)
$_REQUEST["coord"] = substr($item->place->location->latitude, 0, 8)
.' '.substr($item->place->location->longitude, 0, 8);
}
//print_r($_REQUEST);
logger('facebook: posting for user '.$uid);
require_once('mod/item.php');
item_post($a);
}
set_pconfig($uid,'facebook','last_created', $lastcreated);
}
function fbpost_get_photo($uid,$link) {
$access_token = get_pconfig($uid,'facebook','access_token');
if(! $access_token || (! stristr($link,'facebook.com/photo.php')))
return "";
$ret = preg_match('/fbid=([0-9]*)/',$link,$match);
if($ret)
$photo_id = $match[1];
else
return "";
$x = fetch_url('https://graph.facebook.com/'.$photo_id.'?access_token='.$access_token);
$j = json_decode($x);
if($j->picture)
return "\n\n".'[url='.$link.'][img]'.fpost_cleanpicture($j->picture).'[/img][/url]';
return "";
}
function fpost_cleanpicture($image) {
if (strpos($image, ".fbcdn.net/") and (substr($image, -6) == "_s.jpg"))
$image = substr($image, 0, -6)."_n.jpg";
$queryvar = fbpost_parse_query($image);
if ($queryvar['url'] != "")
$image = urldecode($queryvar['url']);
return $image;
}
function fbpost_parse_query($var) {
/**
* Use this function to parse out the query array element from
* the output of parse_url().
*/
$var = parse_url($var, PHP_URL_QUERY);
$var = html_entity_decode($var);
$var = explode('&', $var);
$arr = array();
foreach($var as $val) {
$x = explode('=', $val);
$arr[$x[0]] = $x[1];
}
unset($val, $x, $var);
return $arr;
}

Binary file not shown.

View file

@ -163,16 +163,17 @@ function forumdirectory_content(&$a) {
$about = ((x($profile,'about') == 1) ? t('About:') : False);
$tpl = file_get_contents( dirname(__file__).'/forumdirectory_item.tpl');
# $tpl = file_get_contents( dirname(__file__).'/forumdirectory_item.tpl');
$tpl = get_markup_template( 'forumdirectory_item.tpl', 'addon/forumdirectory/' );
$entry = replace_macros($tpl,array(
'$id' => $rr['id'],
'$profile-link' => $profile_link,
'$profile_link' => $profile_link,
'$photo' => $a->get_cached_avatar_image($rr[$photo]),
'$alt-text' => $rr['name'],
'$alt_text' => $rr['name'],
'$name' => $rr['name'],
'$details' => $pdesc . $details,
'$page-type' => $page_type,
'$page_type' => $page_type,
'$profile' => $profile,
'$location' => template_escape($location),
'$gender' => $gender,

View file

@ -2,14 +2,14 @@
<div class="forumdirectory-item" id="forumdirectory-item-$id" >
<div class="forumdirectory-photo-wrapper" id="forumdirectory-photo-wrapper-$id" >
<div class="forumdirectory-photo" id="forumdirectory-photo-$id" >
<a href="$profile-link" class="forumdirectory-profile-link" id="forumdirectory-profile-link-$id" >
<img class="forumdirectory-photo-img photo" src="$photo" alt="$alt-text" title="$alt-text" />
<a href="$profile_link" class="forumdirectory-profile-link" id="forumdirectory-profile-link-$id" >
<img class="forumdirectory-photo-img photo" src="$photo" alt="$alt_text" title="$alt_text" />
</a>
</div>
</div>
<div class="forumdirectory-profile-wrapper" id="forumdirectory-profile-wrapper-$id" >
<div class="contact-name" id="forumdirectory-name-$id">$name</div>
<div class="page-type">$page-type</div>
<div class="page-type">$page_type</div>
{{ if $pdesc }}<div class="forumdirectory-profile-title">$profile.pdesc</div>{{ endif }}
<div class="forumdirectory-detailcolumns-wrapper" id="forumdirectory-detailcolumns-wrapper-$id">
<div class="forumdirectory-detailscolumn-wrapper" id="forumdirectory-detailscolumn1-wrapper-$id">

View file

@ -0,0 +1,42 @@
<div class="forumdirectory-item" id="forumdirectory-item-{{$id}}" >
<div class="forumdirectory-photo-wrapper" id="forumdirectory-photo-wrapper-{{$id}}" >
<div class="forumdirectory-photo" id="forumdirectory-photo-{{$id}}" >
<a href="{{$profile_link}}" class="forumdirectory-profile-link" id="forumdirectory-profile-link-{{$id}}" >
<img class="forumdirectory-photo-img photo" src="{{$photo}}" alt="{{$alt_text}}" title="{{$alt_text}}" />
</a>
</div>
</div>
<div class="forumdirectory-profile-wrapper" id="forumdirectory-profile-wrapper-{{$id}}" >
<div class="contact-name" id="forumdirectory-name-{{$id}}">{{$name}}</div>
<div class="page-type">{{$page_type}}</div>
{{if $pdesc}}<div class="forumdirectory-profile-title">{{$profile.pdesc}}</div>{{/if}}
<div class="forumdirectory-detailcolumns-wrapper" id="forumdirectory-detailcolumns-wrapper-{{$id}}">
<div class="forumdirectory-detailscolumn-wrapper" id="forumdirectory-detailscolumn1-wrapper-{{$id}}">
{{if $location}}
<dl class="location"><dt class="location-label">{{$location}}</dt>
<dd class="adr">
{{if $profile.address}}<div class="street-address">{{$profile.address}}</div>{{/if}}
<span class="city-state-zip">
<span class="locality">{{$profile.locality}}</span>{{if $profile.locality}}, {{/if}}
<span class="region">{{$profile.region}}</span>
<span class="postal-code">{{$profile.postal-code}}</span>
</span>
{{if $profile.country-name}}<span class="country-name">{{$profile.country-name}}</span>{{/if}}
</dd>
</dl>
{{/if}}
{{if $gender}}<dl class="mf"><dt class="gender-label">{{$gender}}</dt> <dd class="x-gender">{{$profile.gender}}</dd></dl>{{/if}}
</div>
<div class="forumdirectory-detailscolumn-wrapper" id="forumdirectory-detailscolumn2-wrapper-{{$id}}">
{{if $marital}}<dl class="marital"><dt class="marital-label"><span class="heart">&hearts;</span>{{$marital}}</dt><dd class="marital-text">{{$profile.marital}}</dd></dl>{{/if}}
{{if $homepage}}<dl class="homepage"><dt class="homepage-label">{{$homepage}}</dt><dd class="homepage-url"><a href="{{$profile.homepage}}" target="external-link">{{$profile.homepage}}</a></dd></dl>{{/if}}
</div>
</div>
<div class="forumdirectory-copy-wrapper" id="forumdirectory-copy-wrapper-{{$id}}" >
{{if $about}}<dl class="forumdirectory-copy"><dt class="forumdirectory-copy-label">{{$about}}</dt><dd class="forumdirectory-copy-data">{{$profile.about}}</dd></dl>{{/if}}
</div>
</div>
</div>

Binary file not shown.

View file

@ -74,7 +74,7 @@ function forumlist_network_mod_init($a,$b) {
if(count($contacts)) {
foreach($contacts as $contact) {
$forumlist .= '<a href="' . $a->get_baseurl() . '/redir/' . $contact["id"] . '" title="' . $contact['url'] . '" class="label sparkle" target="external-link"><img class="forumlist-img" height="20" width="20" src="' . $contact['micro'] .'" alt="' . $contact['url'] . '" /></a> <a href="' . $a->get_baseurl() . '/network?f=&cid=' . $contact['id'] . '" >' . $contact["name"]."</a><br />";
$forumlist .= '<div><a href="' . $a->get_baseurl() . '/redir/' . $contact["id"] . '" title="' . $contact['url'] . '" class="label sparkle" target="external-link"><img class="forumlist-img" height="20" width="20" src="' . $contact['micro'] .'" alt="' . $contact['url'] . '" /></a> <a href="' . $a->get_baseurl() . '/network?f=&cid=' . $contact['id'] . '" >' . $contact["name"]."</a></div>";
}
}
else {

Binary file not shown.

View file

@ -7,4 +7,9 @@ $a->config['fromgplus']['poll_interval'] = 10;
You need an API key for "Simple API Access".
You get it via https://code.google.com/apis/console/ and then "API Access".
- You go to https://code.google.com/apis/console/
- Then you go to "Services" and activate "Google+ API".
- After that you go to "API Access".
- At the bottom of the page you see "Simple API Access".
The value after "API key:" is the key that you need.

View file

@ -327,22 +327,27 @@ function fromgplus_fetch($a, $uid) {
case "activity":
$post = fromgplus_html2bbcode($item->annotation)."\n";
$post .= fromgplus_html2bbcode("&#x2672;");
//$post .= html2bbcode("&#x267B;");
//$post .= fromgplus_html2bbcode("&#x25CC;");
$post .= " [url=".$item->object->actor->url."]".$item->object->actor->displayName."[/url] \n";
/*$post .= "[share author='".$item->object->actor->displayName.
"' profile='".$item->object->actor->url.
"' avatar='".$item->object->actor->image->url.
"' link='".$item->object->url."']\n";*/
if (intval(get_config('system','new_share'))) {
$post .= "[share author='".str_replace("'", "&#039;",$item->object->actor->displayName).
"' profile='".$item->object->actor->url.
"' avatar='".$item->object->actor->image->url.
"' link='".$item->object->url."']";
$post .= fromgplus_html2bbcode($item->object->content);
$post .= fromgplus_html2bbcode($item->object->content);
if (is_array($item->object->attachments))
$post .= "\n".trim(fromgplus_handleattachments($item));
if (is_array($item->object->attachments))
$post .= "\n".trim(fromgplus_handleattachments($item));
//$post .= "[/share]";
$post .= "[/share]";
} else {
$post .= fromgplus_html2bbcode("&#x2672;");
$post .= " [url=".$item->object->actor->url."]".$item->object->actor->displayName."[/url] \n";
$post .= fromgplus_html2bbcode($item->object->content);
if (is_array($item->object->attachments))
$post .= "\n".trim(fromgplus_handleattachments($item));
}
if (isset($item->address))
$location = $item->address;

View file

@ -40,8 +40,8 @@ function geonames_install() {
*
*/
register_hook('plugin_settings', 'addon/geonames/geonames.php', 'geonames_settings');
register_hook('plugin_settings_post', 'addon/geonames/geonames.php', 'geonames_settings_post');
register_hook('plugin_settings', 'addon/geonames/geonames.php', 'geonames_plugin_admin');
register_hook('plugin_settings_post', 'addon/geonames/geonames.php', 'geonames_plugin_admin_post');
logger("installed geonames");
}
@ -58,8 +58,8 @@ function geonames_uninstall() {
*/
unregister_hook('post_local', 'addon/geonames/geonames.php', 'geonames_post_hook');
unregister_hook('plugin_settings', 'addon/geonames/geonames.php', 'geonames_settings');
unregister_hook('plugin_settings_post', 'addon/geonames/geonames.php', 'geonames_settings_post');
unregister_hook('plugin_settings', 'addon/geonames/geonames.php', 'geonames_plugin_admin');
unregister_hook('plugin_settings_post', 'addon/geonames/geonames.php', 'geonames_plugin_admin_post');
logger("removed geonames");
@ -135,7 +135,7 @@ function geonames_post_hook($a, &$item) {
*
*/
function geonames_settings_post($a,$post) {
function geonames_plugin_admin_post($a,$post) {
if(! local_user() || (! x($_POST,'geonames-submit')))
return;
set_pconfig(local_user(),'geonames','enable',intval($_POST['geonames']));
@ -153,7 +153,7 @@ function geonames_settings_post($a,$post) {
function geonames_settings(&$a,&$s) {
function geonames_plugin_admin(&$a,&$s) {
if(! local_user())
return;

Binary file not shown.

View file

@ -55,7 +55,7 @@ function gravatar_lookup($a, &$b) {
* Display admin settings for this addon
*/
function gravatar_plugin_admin (&$a, &$o) {
$t = file_get_contents( dirname(__file__)."/admin.tpl");
$t = get_markup_template( "admin.tpl", "addon/gravatar/" );
$default_avatar = get_config('gravatar', 'default_img');
$rating = get_config('gravatar', 'rating');

View file

@ -0,0 +1,3 @@
{{include file="field_select.tpl" field=$default_avatar}}
{{include file="field_select.tpl" field=$rating}}
<div class="submit"><input type="submit" value="{{$submit}}" /></div>

Binary file not shown.

View file

@ -78,7 +78,7 @@ function impressum_plugin_admin_post (&$a) {
info( t('Settings updated.'). EOL );
}
function impressum_plugin_admin (&$a, &$o) {
$t = file_get_contents( dirname(__file__). "/admin.tpl" );
$t = get_markup_template( "admin.tpl", "addon/impressum/" );
$o = replace_macros($t, array(
'$submit' => t('Submit'),
'$owner' => array('owner', t('Site Owner'), get_config('impressum','owner'), t('The page operators name.')),

0
impressum/admin.tpl → impressum/view/admin.tpl Executable file → Normal file
View file

View file

@ -0,0 +1,7 @@
{{include file="field_input.tpl" field=$owner}}
{{include file="field_input.tpl" field=$ownerprofile}}
{{include file="field_textarea.tpl" field=$postal}}
{{include file="field_textarea.tpl" field=$notes}}
{{include file="field_input.tpl" field=$email}}
{{include file="field_textarea.tpl" field=$footer_text}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>

Binary file not shown.

View file

@ -60,7 +60,7 @@ function libravatar_lookup($a, &$b) {
* Display admin settings for this addon
*/
function libravatar_plugin_admin (&$a, &$o) {
$t = file_get_contents( dirname(__file__)."/admin.tpl");
$t = get_markup_template( "admin.tpl", "addon/libravatar" );
$default_avatar = get_config('libravatar', 'default_img');

View file

@ -0,0 +1,2 @@
{{include file="field_select.tpl" field=$default_avatar}}
<div class="submit"><input type="submit" value="{{$submit}}" /></div>

Binary file not shown.

View file

@ -66,11 +66,12 @@ function mathjax_plugin_admin_post (&$a) {
info( t('Settings updated.'). EOL);
}
function mathjax_plugin_admin (&$a, &$o) {
$t = file_get_contents( dirname(__file__)."/admin.tpl");
if (get_config('mathjax','baseurl','') == '') {
set_config('mathjax','baseurl','http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML');
}
$o = replace_macros( $t, array(
$t = get_markup_template( "admin.tpl", "addon/mathjax/" );
if (get_config('mathjax','baseurl','') == '') {
set_config('mathjax','baseurl','http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML');
}
$o = replace_macros( $t, array(
'$baseurl' => array('baseurl', t('MathJax Base URL'), get_config('mathjax','baseurl' ), t('The URL for the javascript file that should be included to use MathJax. Can be either the MathJax CDN or another installation of MathJax.')),
));
));
}

View file

@ -0,0 +1,2 @@
{{include file="field_input.tpl" field=$baseurl}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>

Binary file not shown.

View file

@ -0,0 +1,41 @@
var toolserver = 'http://toolserver.org/~kolossos/openlayers/kml-on-ol.php';
var startTag = '<iframe class="osmFrame" style="width: 100%; height: 350px; clear: both;" src="'+ toolserver + '?lang=de&amp;uselang=de&amp;params=';
var endTag = '"></iframe>';
jQuery(document).ready(function($) {
$('.wall-item-content-wrapper').each(function(index) {
var link = $(this).find('.wall-item-location .OSMMapLink');
link.toggle(addIframe, removeIframe);
});
});
function addIframe(ev) {
var coordinate = $(ev.target).attr('title');
var newTag = startTag + convertCoordinateString(coordinate) + endTag;
$(ev.target).parents('.wall-item-content-wrapper').append(newTag);
}
function removeIframe(ev) {
$(ev.target).parents('.wall-item-content-wrapper').find('iframe').remove();
}
function convertCoordinateString(coordinate) {
var locstring = coordinate.split(' ');
var northSouth;
var westEast;
if (locstring[0] < 0) {
northSouth = '_S_';
}else{
northSouth = '_N_';
}
if (locstring[1] < 0) {
westEast = '_W';
}else{
westEast = '_E';
}
return Math.abs(locstring[0]) + northSouth + Math.abs(locstring[1]) + westEast;
}

View file

@ -10,24 +10,33 @@
function openstreetmap_install() {
register_hook('render_location', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_location');
register_hook('page_header', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_alterheader');
logger("installed openstreetmap");
}
function openstreetmap_uninstall() {
unregister_hook('render_location', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_location');
unregister_hook('page_header', 'addon/openstreetmap/openstreetmap.php', 'openstreetmap_alterheader');
logger("removed openstreetmap");
}
function openstreetmap_alterheader($a, &$navHtml) {
$addScriptTag='<script type="text/javascript" src="' . $a->get_baseurl() . '/addon/openstreetmap/openstreetmap.js' . '"></script>' . "\r\n";
$a->page['htmlhead'] .= $addScriptTag;
}
function openstreetmap_location($a, &$item) {
//
if(! (strlen($item['location']) || strlen($item['coord'])))
return;
/*
* Get the configuration variables from the .htconfig file.
*/
*/
$tmsserver = get_config('openstreetmap','tmsserver');
if(! $tmsserver)
$tmsserver = 'http://openstreetmap.org';
@ -38,12 +47,27 @@ function openstreetmap_location($a, &$item) {
$location = '';
$coord = '';
if($item['location'] && !$item['coord'] && true){ //if only a location is given, find the lat-lon
$geo_account='demo';
$s = fetch_url('http://api.geonames.org/search?maxRows=1&fuzzy=0.8&q=' . $item['location'] . '&username=' . $geo_account);
if($s){
$xml = parse_xml_string($s);
if($xml->geoname->lat && $xml->geoname->lng){
$item['coord'] = $xml->geoname->lat . ' ' . $xml->geoname->lng;
}
}
}
$location = (($item['location']) ? '<a target="map" title="' . $item['location'] . '" href="'.$tmsserver.'?q=' . urlencode($item['location']) . '">' . $item['location'] . '</a>' : '');
if($item['coord']) {
$coords = explode(' ', $item['coord']);
if(count($coords) > 1) {
$coord = '<a target="map" title="' . $item['coord'] . '" href="'.$tmsserver.'?lat=' . urlencode($coords[0]) . '&lon=' . urlencode($coords[1]) . '&zoom='.$zoom.'">' . $item['coord'] . '</a>' ;
$coord = '<a target="map" class="OSMMapLink" title="' . $item['coord'] . '" href="'.$tmsserver.'?lat=' . urlencode($coords[0]) . '&lon=' . urlencode($coords[1]) . '&zoom='.$zoom.'"> Map </a>' ;
}
}
if(strlen($coord)) {
@ -58,7 +82,7 @@ function openstreetmap_location($a, &$item) {
function openstreetmap_plugin_admin (&$a, &$o) {
$t = file_get_contents( dirname(__file__)."/admin.tpl");
$t = get_markup_template( "admin.tpl", "addon/openstreetmap/" );
$tmsserver = get_config('openstreetmap','tmsserver');
if(! $tmsserver)
$tmsserver = 'http://openstreetmap.org';
@ -67,9 +91,9 @@ function openstreetmap_plugin_admin (&$a, &$o) {
$zoom = 17;
$o = replace_macros( $t, array(
'$submit' => t('Submit'),
'$tmsserver' => array('tmsserver', t('Tile Server URL'), $tmsserver, t('A list of <a href="http://wiki.openstreetmap.org/wiki/TMS" target="_blank">public tile servers</a>')),
'$zoom' => array('zoom', t('Default zoom'), $zoom, t('The default zoom level. (1:world, 18:highest)')),
'$submit' => t('Submit'),
'$tmsserver' => array('tmsserver', t('Tile Server URL'), $tmsserver, t('A list of <a href="http://wiki.openstreetmap.org/wiki/TMS" target="_blank">public tile servers</a>')),
'$zoom' => array('zoom', t('Default zoom'), $zoom, t('The default zoom level. (1:world, 18:highest)')),
));
}
function openstreetmap_plugin_admin_post (&$a) {

View file

@ -0,0 +1,3 @@
{{include file="field_input.tpl" field=$tmsserver}}
{{include file="field_input.tpl" field=$zoom}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>

BIN
page.tgz

Binary file not shown.

BIN
piwik.tgz

Binary file not shown.

View file

@ -84,7 +84,7 @@ function piwik_analytics($a,&$b) {
}
}
function piwik_plugin_admin (&$a, &$o) {
$t = file_get_contents( dirname(__file__)."/admin.tpl");
$t = get_markup_template( "admin.tpl", "addon/piwik/" );
$o = replace_macros( $t, array(
'$submit' => t('Submit'),
'$baseurl' => array('baseurl', t('Piwik Base URL'), get_config('piwik','baseurl' ), t('Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)')),

0
piwik/admin.tpl → piwik/view/admin.tpl Executable file → Normal file
View file

View file

@ -0,0 +1,5 @@
{{include file="field_input.tpl" field=$baseurl}}
{{include file="field_input.tpl" field=$siteid}}
{{include file="field_checkbox.tpl" field=$optout}}
{{include file="field_checkbox.tpl" field=$async}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>

Binary file not shown.

View file

@ -119,7 +119,17 @@ function privacy_image_cache_init() {
// It shouldn't happen but it does - spaces in URL
$_REQUEST['url'] = str_replace(" ", "+", $_REQUEST['url']);
$img_str = fetch_url($_REQUEST['url'],true);
// if the picture seems to be from another picture cache then take the original source
$queryvar = privacy_image_cache_parse_query($_REQUEST['url']);
if ($queryvar['url'] != "")
$_REQUEST['url'] = urldecode($queryvar['url']);
// if fetching facebook pictures don't fetch the thumbnail but the big one
if (strpos($_REQUEST['url'], ".fbcdn.net/") and (substr($_REQUEST['url'], -6) == "_s.jpg"))
$_REQUEST['url'] = substr($_REQUEST['url'], 0, -6)."_n.jpg";
$redirects = 0;
$img_str = fetch_url($_REQUEST['url'],true, $redirects, 10);
$tempfile = tempnam(get_config("system","temppath"), "cache");
file_put_contents($tempfile, $img_str);
@ -132,9 +142,9 @@ function privacy_image_cache_init() {
$mime = "image/png";
$cachefile = ""; // Clear the cachefile so that the dummy isn't stored
$valid = false;
$img = new Photo($img_str);
$img = new Photo($img_str, "image/png");
if($img->is_valid()) {
$img->scaleImage(1);
$img->scaleImage(10);
$img_str = $img->imageString();
}
//} else if (substr($img_str, 0, 6) == "GIF89a") {
@ -226,13 +236,21 @@ function privacy_image_cache_cachename($url, $writemode = false) {
* @return boolean
*/
function privacy_image_cache_is_local_image($url) {
if ($url[0] == '/') return true;
if ($url[0] == '/') return true;
if (strtolower(substr($url, 0, 5)) == "data:") return true;
// Check if the cached path would be longer than 255 characters - apache doesn't like it
if (is_dir($_SERVER["DOCUMENT_ROOT"]."/privacy_image_cache")) {
$cachedurl = get_app()->get_baseurl()."/privacy_image_cache/". privacy_image_cache_cachename($url);
if (strlen($url) > 255)
return true;
}
// links normalised - bug #431
$baseurl = normalise_link(get_app()->get_baseurl());
$baseurl = normalise_link(get_app()->get_baseurl());
$url = normalise_link($url);
return (substr($url, 0, strlen($baseurl)) == $baseurl);
return (substr($url, 0, strlen($baseurl)) == $baseurl);
}
/**
@ -311,14 +329,12 @@ function privacy_image_cache_cron(&$a = null, &$b = null) {
logger("Purging old Cache of the Privacy Image Cache", LOGGER_DEBUG);
q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%" AND `created` < NOW() - INTERVAL %d SECOND', $cachetime);
set_config('pi_cache', 'last_delete', $time);
clear_cache($a->get_basepath(), $a->get_basepath()."/privacy_image_cache");
set_config('pi_cache', 'last_delete', $time);
}
/**
* @param App $a
* @param null|object $o
@ -364,3 +380,22 @@ function privacy_image_cache_plugin_admin_post(&$a = null, &$o = null){
q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%"');
}
}
function privacy_image_cache_parse_query($var) {
/**
* Use this function to parse out the query array element from
* the output of parse_url().
*/
$var = parse_url($var, PHP_URL_QUERY);
$var = html_entity_decode($var);
$var = explode('&', $var);
$arr = array();
foreach($var as $val) {
$x = explode('=', $val);
$arr[$x[0]] = $x[1];
}
unset($val, $x, $var);
return $arr;
}

BIN
procrunner.tgz Normal file

Binary file not shown.

53
procrunner/procrunner.php Executable file
View file

@ -0,0 +1,53 @@
<?php
/**
* Name: Proc Runner
* Description: Derivative of poormancron when proc_open() and exec() are disabled
* Version: 1.0
* Author: Fabio Comuni <http://kirgroup.com/profile/fabrix>
* Author: Mike Macgirvin
*/
function procrunner_install() {
$addons = get_config('system','addon');
if(strstr('poormancron',$addons)) {
logger('procrunner incompatible with poormancron. Not installing procrunner.');
return;
}
// check for command line php
$a = get_app();
$ex = Array();
$ex[0] = ((x($a->config,'php_path')) && (strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php');
$ex[1] = dirname(dirname(dirname(__file__)))."/testargs.php";
$ex[2] = "test";
$out = exec(implode(" ", $ex));
if ($out==="test") {
logger('procrunner not required on this system. Not installing.');
return;
} else {
register_hook('proc_run', 'addon/procrunner/procrunner.php','procrunner_procrun');
logger("installed procrunner");
}
}
function procrunner_uninstall() {
unregister_hook('proc_run', 'addon/procrunner/procrunner.php','procrunner_procrun');
logger("removed procrunner");
}
function procrunner_procrun(&$a, &$arr) {
$argv = $arr['args'];
$arr['run_cmd'] = false;
logger("procrunner procrun ".implode(", ",$argv));
array_shift($argv);
$argc = count($argv);
logger("procrunner procrun require_once ".basename($argv[0]));
require_once(basename($argv[0]));
$funcname=str_replace(".php", "", basename($argv[0]))."_run";
$funcname($argv, $argc);
}

Binary file not shown.

View file

@ -39,7 +39,8 @@ function remote_permissions_settings(&$a,&$o) {
/* Add some HTML to the existing form */
$t = file_get_contents("addon/remote_permissions/settings.tpl" );
// $t = file_get_contents("addon/remote_permissions/settings.tpl" );
$t = get_markup_template("settings.tpl", "addon/remote_permissions/" );
$o .= replace_macros($t, array(
'$remote_perms_title' => t('Remote Permissions Settings'),
'$remote_perms_label' => t('Allow recipients of your private posts to see the other recipients of the posts'),
@ -190,7 +191,7 @@ function remote_permissions_content($a, $item_copy) {
}
function remote_permissions_plugin_admin(&$a, &$o){
$t = file_get_contents( "addon/remote_permissions/admin.tpl" );
$t = get_markup_template( "admin.tpl", "addon/remote_permissions/" );
$o = replace_macros($t, array(
'$submit' => t('Submit'),
'$global' => array('remotepermschoice', t('Global'), 1, t('The posts of every user on this server show the post recipients'), get_config('remote_perms', 'global') == 1),

View file

@ -0,0 +1,3 @@
{{ inc field_radio.tpl with $field=$global }}{{ endinc }}
{{ inc field_radio.tpl with $field=$individual }}{{ endinc }}
<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>

View file

@ -0,0 +1,3 @@
{{include file="field_radio.tpl" field=$global}}
{{include file="field_radio.tpl" field=$individual}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>

View file

@ -0,0 +1,8 @@
<div class="settings-block">
<h3>{{$remote_perms_title}}</h3>
<div id="remote-perms-wrapper">
<label id="remote-perms-label" for="remote-perms">{{$remote_perms_label}}</label>
<input id="remote-perms-input" type="checkbox" name="remote-perms" value="1" {{$checked}} />
</div><div class="clear"></div>
<div class="settings-submit-wrapper" ><input type="submit" name="remote-perms-submit" class="settings-submit" value="{{$submit}}" /></div></div>

Binary file not shown.

View file

@ -15,19 +15,15 @@
width: 250px;
margin-bottom: 25px;
}
#statusnet-default-label {
float: left;
width: 250px;
}
#statusnet-sendtaglinks-label {
float: left;
width: 250px;
margin-bottom: 25px;
}
#statusnet-disconnect {
float: left;
}
#statusnet-default-label,
#statusnet-sendtaglinks-label,
#statusnet-shortening-label,
#statusnet-mirror-label,
#statusnet-pin-label,
#statusnet-enable-label {
float: left;
width: 250px;
@ -38,11 +34,6 @@
float: left;
}
#statusnet-pin-label {
float: left;
width: 250px;
margin-bottom: 25px;
}
#statusnet-pin {
float: left;
}

View file

@ -30,6 +30,8 @@
* Thank you guys for the Twitter compatible API!
*/
define('STATUSNET_DEFAULT_POLL_INTERVAL', 5); // given in minutes
require_once('library/twitteroauth.php');
class StatusNetOAuth extends TwitterOAuth {
@ -104,6 +106,7 @@ function statusnet_install() {
register_hook('notifier_normal', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
register_hook('post_local', 'addon/statusnet/statusnet.php', 'statusnet_post_local');
register_hook('jot_networks', 'addon/statusnet/statusnet.php', 'statusnet_jot_nets');
register_hook('cron', 'addon/statusnet/statusnet.php', 'statusnet_cron');
logger("installed statusnet");
}
@ -114,6 +117,7 @@ function statusnet_uninstall() {
unregister_hook('notifier_normal', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
unregister_hook('post_local', 'addon/statusnet/statusnet.php', 'statusnet_post_local');
unregister_hook('jot_networks', 'addon/statusnet/statusnet.php', 'statusnet_jot_nets');
unregister_hook('cron', 'addon/statusnet/statusnet.php', 'statusnet_cron');
// old setting - remove only
unregister_hook('post_local_end', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
@ -135,9 +139,6 @@ function statusnet_jot_nets(&$a,&$b) {
}
}
function statusnet_settings_post ($a,$post) {
if(! local_user())
return;
@ -148,14 +149,17 @@ function statusnet_settings_post ($a,$post) {
/***
* if the statusnet-disconnect checkbox is set, clear the statusnet configuration
*/
del_pconfig( local_user(), 'statusnet', 'consumerkey' );
del_pconfig( local_user(), 'statusnet', 'consumersecret' );
del_pconfig( local_user(), 'statusnet', 'post' );
del_pconfig( local_user(), 'statusnet', 'post_by_default' );
del_pconfig( local_user(), 'statusnet', 'oauthtoken' );
del_pconfig( local_user(), 'statusnet', 'oauthsecret' );
del_pconfig( local_user(), 'statusnet', 'baseapi' );
del_pconfig( local_user(), 'statusnet', 'post_taglinks');
del_pconfig(local_user(), 'statusnet', 'consumerkey');
del_pconfig(local_user(), 'statusnet', 'consumersecret');
del_pconfig(local_user(), 'statusnet', 'post');
del_pconfig(local_user(), 'statusnet', 'post_by_default');
del_pconfig(local_user(), 'statusnet', 'oauthtoken');
del_pconfig(local_user(), 'statusnet', 'oauthsecret');
del_pconfig(local_user(), 'statusnet', 'baseapi');
del_pconfig(local_user(), 'statusnet', 'post_taglinks');
del_pconfig(local_user(), 'statusnet', 'lastid');
del_pconfig(local_user(), 'statusnet', 'mirror_posts');
del_pconfig(local_user(), 'statusnet', 'intelligent_shortening');
} else {
if (isset($_POST['statusnet-preconf-apiurl'])) {
/***
@ -229,6 +233,8 @@ function statusnet_settings_post ($a,$post) {
set_pconfig(local_user(),'statusnet','post',intval($_POST['statusnet-enable']));
set_pconfig(local_user(),'statusnet','post_by_default',intval($_POST['statusnet-default']));
set_pconfig(local_user(),'statusnet','post_taglinks',intval($_POST['statusnet-sendtaglinks']));
set_pconfig(local_user(), 'statusnet', 'mirror_posts', intval($_POST['statusnet-mirror']));
set_pconfig(local_user(), 'statusnet', 'intelligent_shortening', intval($_POST['statusnet-shortening']));
info( t('StatusNet settings updated.') . EOL);
}}}}
}
@ -253,6 +259,12 @@ function statusnet_settings(&$a,&$s) {
$defchecked = (($defenabled) ? ' checked="checked" ' : '');
$linksenabled = get_pconfig(local_user(),'statusnet','post_taglinks');
$linkschecked = (($linksenabled) ? ' checked="checked" ' : '');
$mirrorenabled = get_pconfig(local_user(),'statusnet','mirror_posts');
$mirrorchecked = (($mirrorenabled) ? ' checked="checked" ' : '');
$shorteningenabled = get_pconfig(local_user(),'statusnet','intelligent_shortening');
$shorteningchecked = (($shorteningenabled) ? ' checked="checked" ' : '');
$s .= '<div class="settings-block">';
$s .= '<h3>'. t('StatusNet Posting Settings').'</h3>';
@ -342,6 +354,15 @@ function statusnet_settings(&$a,&$s) {
$s .= '<label id="statusnet-default-label" for="statusnet-default">'. t('Send public postings to StatusNet by default') .'</label>';
$s .= '<input id="statusnet-default" type="checkbox" name="statusnet-default" value="1" ' . $defchecked . '/>';
$s .= '<div class="clear"></div>';
$s .= '<label id="statusnet-mirror-label" for="statusnet-mirror">'.t('Mirror all posts from statusnet that are no replies or repeated messages').'</label>';
$s .= '<input id="statusnet-mirror" type="checkbox" name="statusnet-mirror" value="1" '. $mirrorchecked . '/>';
$s .= '<div class="clear"></div>';
$s .= '<label id="statusnet-shortening-label" for="statusnet-shortening">'.t('Shortening method that optimizes the post').'</label>';
$s .= '<input id="statusnet-shortening" type="checkbox" name="statusnet-shortening" value="1" '. $shorteningchecked . '/>';
$s .= '<div class="clear"></div>';
$s .= '<label id="statusnet-sendtaglinks-label" for="statusnet-sendtaglinks">'.t('Send linked #-tags and @-names to StatusNet').'</label>';
$s .= '<input id="statusnet-sendtaglinks" type="checkbox" name="statusnet-sendtaglinks" value="1" '. $linkschecked . '/>';
$s .= '</div><div class="clear"></div>';
@ -427,6 +448,24 @@ function statusnet_shortenmsg($b, $max_char) {
if ($b["title"] != "")
$body = $b["title"]."\n\n".$body;
if (strpos($body, "[bookmark") !== false) {
// splitting the text in two parts:
// before and after the bookmark
$pos = strpos($body, "[bookmark");
$body1 = substr($body, 0, $pos);
$body2 = substr($body, $pos);
// Removing all quotes after the bookmark
// they are mostly only the content after the bookmark.
$body2 = preg_replace("/\[quote\=([^\]]*)\](.*?)\[\/quote\]/ism",'',$body2);
$body2 = preg_replace("/\[quote\](.*?)\[\/quote\]/ism",'',$body2);
$body = $body1.$body2;
}
// Add some newlines so that the message could be cut better
$body = str_replace(array("[quote", "[bookmark", "[/bookmark]", "[/quote]"),
array("\n[quote", "\n[bookmark", "[/bookmark]\n", "[/quote]\n"), $body);
// remove the recycle signs and the names since they aren't helpful on twitter
// recycle 1
$recycle = html_entity_decode("&#x2672; ", ENT_QUOTES, 'UTF-8');
@ -523,13 +562,24 @@ function statusnet_post_hook(&$a,&$b) {
if(! strstr($b['postopts'],'statusnet'))
return;
// if posts comes from statusnet don't send it back
if($b['app'] == "StatusNet")
return;
logger('statusnet post invoked');
load_pconfig($b['uid'], 'statusnet');
$api = get_pconfig($b['uid'], 'statusnet', 'baseapi');
$ckey = get_pconfig($b['uid'], 'statusnet', 'consumerkey' );
$csecret = get_pconfig($b['uid'], 'statusnet', 'consumersecret' );
$otoken = get_pconfig($b['uid'], 'statusnet', 'oauthtoken' );
$osecret = get_pconfig($b['uid'], 'statusnet', 'oauthsecret' );
$ckey = get_pconfig($b['uid'], 'statusnet', 'consumerkey');
$csecret = get_pconfig($b['uid'], 'statusnet', 'consumersecret');
$otoken = get_pconfig($b['uid'], 'statusnet', 'oauthtoken');
$osecret = get_pconfig($b['uid'], 'statusnet', 'oauthsecret');
$intelligent_shortening = get_pconfig($b['uid'], 'statusnet', 'intelligent_shortening');
// Global setting overrides this
if (get_config('statusnet','intelligent_shortening'))
$intelligent_shortening = get_config('statusnet','intelligent_shortening');
if($ckey && $csecret && $otoken && $osecret) {
@ -697,14 +747,113 @@ function statusnet_plugin_admin(&$a, &$o){
'key' => Array("key[$id]", t("Consumer Key"), "", ""),
);
$t = file_get_contents( dirname(__file__). "/admin.tpl" );
$t = get_markup_template( "admin.tpl", "addon/statusnet/" );
$o = replace_macros($t, array(
'$submit' => t('Submit'),
'$sites' => $sitesform,
));
}
function statusnet_cron($a,$b) {
$last = get_config('statusnet','last_poll');
$poll_interval = intval(get_config('statusnet','poll_interval'));
if(! $poll_interval)
$poll_interval = STATUSNET_DEFAULT_POLL_INTERVAL;
if($last) {
$next = $last + ($poll_interval * 60);
if($next > time()) {
logger('statusnet: poll intervall not reached');
return;
}
}
logger('statusnet: cron_start');
$r = q("SELECT * FROM `pconfig` WHERE `cat` = 'statusnet' AND `k` = 'mirror_posts' AND `v` = '1' ORDER BY RAND() ");
if(count($r)) {
foreach($r as $rr) {
logger('statusnet: fetching for user '.$rr['uid']);
statusnet_fetchtimeline($a, $rr['uid']);
}
}
logger('statusnet: cron_end');
set_config('statusnet','last_poll', time());
}
function statusnet_fetchtimeline($a, $uid) {
$ckey = get_pconfig($uid, 'statusnet', 'consumerkey');
$csecret = get_pconfig($uid, 'statusnet', 'consumersecret');
$api = get_pconfig($uid, 'statusnet', 'baseapi');
$otoken = get_pconfig($uid, 'statusnet', 'oauthtoken');
$osecret = get_pconfig($uid, 'statusnet', 'oauthsecret');
$lastid = get_pconfig($uid, 'statusnet', 'lastid');
$application_name = get_config('statusnet', 'application_name');
if ($application_name == "")
$application_name = $a->get_hostname();
$connection = new StatusNetOAuth($api, $ckey,$csecret,$otoken,$osecret);
$parameters = array("exclude_replies" => true, "trim_user" => true, "contributor_details" => false, "include_rts" => false);
$first_time = ($lastid == "");
if ($lastid <> "")
$parameters["since_id"] = $lastid;
$items = $connection->get('statuses/user_timeline', $parameters);
$posts = array_reverse($items);
foreach ($posts as $post) {
if ($post->id > $lastid)
$lastid = $post->id;
if ($first_time)
continue;
if (is_object($post->retweeted_status))
continue;
if ($post->in_reply_to_status_id != "")
continue;
if (!strpos($post->source, $application_name)) {
$_SESSION["authenticated"] = true;
$_SESSION["uid"] = $uid;
$_REQUEST["type"] = "wall";
$_REQUEST["api_source"] = true;
$_REQUEST["profile_uid"] = $uid;
$_REQUEST["source"] = "StatusNet";
//$_REQUEST["date"] = $post->created_at;
$_REQUEST["body"] = $post->text;
if (is_string($post->place->name))
$_REQUEST["location"] = $post->place->name;
if (is_string($post->place->full_name))
$_REQUEST["location"] = $post->place->full_name;
if (is_array($post->geo->coordinates))
$_REQUEST["coord"] = $post->geo->coordinates[0]." ".$post->geo->coordinates[1];
if (is_array($post->coordinates->coordinates))
$_REQUEST["coord"] = $post->coordinates->coordinates[1]." ".$post->coordinates->coordinates[0];
//print_r($_REQUEST);
if ($_REQUEST["body"] != "") {
logger('statusnet: posting for user '.$uid);
require_once('mod/item.php');
item_post($a);
}
}
}
set_pconfig($uid, 'statusnet', 'lastid', $lastid);
}

0
statusnet/admin.tpl → statusnet/view/admin.tpl Executable file → Normal file
View file

View file

@ -0,0 +1,16 @@
{{foreach $sites as $s}}
{{include file="field_input.tpl" field=$s.sitename}}
{{include file="field_input.tpl" field=$s.apiurl}}
{{include file="field_input.tpl" field=$s.secret}}
{{include file="field_input.tpl" field=$s.key}}
{{if $s.delete}}
{{include file="field_checkbox.tpl" field=$s.delete}}
<hr>
{{else}}
<p>Fill this form to add a new site</p>
{{/if}}
{{/foreach}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>

Binary file not shown.

View file

@ -377,3 +377,4 @@ function tumblr_send(&$a,&$b) {
}
}

Binary file not shown.

View file

@ -3,17 +3,14 @@ By Tobias Diekershoff
http://diekershoff.homeunix.net/friendika/profile/tobias
tobias.diekershoff(at)gmx.net
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This addon is currently under development. If you have any problem !!
!! with it, please contact the Author. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
With this addon to Friendica you can give your user the possibility to post
their *public* messages to Twitter. The messages will be strapped their rich
context and shortened to 140 characters length if necessary. If shortening of
the message was performed a link will be added to the Tweet pointing to the
original message on your server.
The addon can also mirror a users Tweets into the ~friendica wall.
There is a similar addon for forwarding public messages to
"StatusNet":http://status.net [[StatusNet Plugin]].

View file

@ -19,29 +19,20 @@
#twitter-disconnect {
float: left;
}
#twitter-enable-label {
float: left;
width: 250px;
margin-bottom: 5px;
}
#twitter-default-label {
float: left;
width: 250px;
}
#twitter-sendtaglinks-label {
#twitter-default-label,
#twitter-sendtaglinks-label,
#twitter-enable-label,
#twitter-shortening-label,
#twitter-mirror-label,
#twitter-pin-label {
float: left;
width: 250px;
margin-bottom: 25px;
margin-bottom: 10px;
}
#twitter-checkbox {
float: left;
}
#twitter-pin-label {
float: left;
width: 250px;
margin-bottom: 25px;
}
#twitter-pin {
float: left;

View file

@ -36,6 +36,8 @@
* Documentation: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/Twitter_Plugin
*/
define('TWITTER_DEFAULT_POLL_INTERVAL', 5); // given in minutes
function twitter_install() {
// we need some hooks, for the configuration and for sending tweets
register_hook('connector_settings', 'addon/twitter/twitter.php', 'twitter_settings');
@ -43,6 +45,7 @@ function twitter_install() {
register_hook('post_local', 'addon/twitter/twitter.php', 'twitter_post_local');
register_hook('notifier_normal', 'addon/twitter/twitter.php', 'twitter_post_hook');
register_hook('jot_networks', 'addon/twitter/twitter.php', 'twitter_jot_nets');
register_hook('cron', 'addon/twitter/twitter.php', 'twitter_cron');
logger("installed twitter");
}
@ -53,6 +56,7 @@ function twitter_uninstall() {
unregister_hook('post_local', 'addon/twitter/twitter.php', 'twitter_post_local');
unregister_hook('notifier_normal', 'addon/twitter/twitter.php', 'twitter_post_hook');
unregister_hook('jot_networks', 'addon/twitter/twitter.php', 'twitter_jot_nets');
unregister_hook('cron', 'addon/twitter/twitter.php', 'twitter_cron');
// old setting - remove only
unregister_hook('post_local_end', 'addon/twitter/twitter.php', 'twitter_post_hook');
@ -72,8 +76,6 @@ function twitter_jot_nets(&$a,&$b) {
$b .= '<div class="profile-jot-net"><input type="checkbox" name="twitter_enable"' . $selected . ' value="1" /> '
. t('Post to Twitter') . '</div>';
}
}
function twitter_settings_post ($a,$post) {
@ -87,20 +89,23 @@ function twitter_settings_post ($a,$post) {
* if the twitter-disconnect checkbox is set, clear the OAuth key/secret pair
* from the user configuration
*/
del_pconfig( local_user(), 'twitter', 'consumerkey' );
del_pconfig( local_user(), 'twitter', 'consumersecret' );
del_pconfig( local_user(), 'twitter', 'oauthtoken' );
del_pconfig( local_user(), 'twitter', 'oauthsecret' );
del_pconfig( local_user(), 'twitter', 'post' );
del_pconfig( local_user(), 'twitter', 'post_by_default' );
del_pconfig( local_user(), 'twitter', 'post_taglinks');
del_pconfig(local_user(), 'twitter', 'consumerkey');
del_pconfig(local_user(), 'twitter', 'consumersecret');
del_pconfig(local_user(), 'twitter', 'oauthtoken');
del_pconfig(local_user(), 'twitter', 'oauthsecret');
del_pconfig(local_user(), 'twitter', 'post');
del_pconfig(local_user(), 'twitter', 'post_by_default');
del_pconfig(local_user(), 'twitter', 'post_taglinks');
del_pconfig(local_user(), 'twitter', 'lastid');
del_pconfig(local_user(), 'twitter', 'mirror_posts');
del_pconfig(local_user(), 'twitter', 'intelligent_shortening');
} else {
if (isset($_POST['twitter-pin'])) {
// if the user supplied us with a PIN from Twitter, let the magic of OAuth happen
logger('got a Twitter PIN');
require_once('library/twitteroauth.php');
$ckey = get_config('twitter', 'consumerkey' );
$csecret = get_config('twitter', 'consumersecret' );
$ckey = get_config('twitter', 'consumerkey');
$csecret = get_config('twitter', 'consumersecret');
// the token and secret for which the PIN was generated were hidden in the settings
// form as token and token2, we need a new connection to Twitter using these token
// and secret to request a Access Token with the PIN
@ -119,6 +124,8 @@ function twitter_settings_post ($a,$post) {
set_pconfig(local_user(),'twitter','post',intval($_POST['twitter-enable']));
set_pconfig(local_user(),'twitter','post_by_default',intval($_POST['twitter-default']));
set_pconfig(local_user(),'twitter','post_taglinks',intval($_POST['twitter-sendtaglinks']));
set_pconfig(local_user(), 'twitter', 'mirror_posts', intval($_POST['twitter-mirror']));
set_pconfig(local_user(), 'twitter', 'intelligent_shortening', intval($_POST['twitter-shortening']));
info( t('Twitter settings updated.') . EOL);
}}
}
@ -141,6 +148,10 @@ function twitter_settings(&$a,&$s) {
$defchecked = (($defenabled) ? ' checked="checked" ' : '');
$linksenabled = get_pconfig(local_user(),'twitter','post_taglinks');
$linkschecked = (($linksenabled) ? ' checked="checked" ' : '');
$mirrorenabled = get_pconfig(local_user(),'twitter','mirror_posts');
$mirrorchecked = (($mirrorenabled) ? ' checked="checked" ' : '');
$shorteningenabled = get_pconfig(local_user(),'twitter','intelligent_shortening');
$shorteningchecked = (($shorteningenabled) ? ' checked="checked" ' : '');
$s .= '<div class="settings-block">';
$s .= '<h3>'. t('Twitter Posting Settings') .'</h3>';
@ -198,6 +209,15 @@ function twitter_settings(&$a,&$s) {
$s .= '<label id="twitter-default-label" for="twitter-default">'. t('Send public postings to Twitter by default') .'</label>';
$s .= '<input id="twitter-default" type="checkbox" name="twitter-default" value="1" ' . $defchecked . '/>';
$s .= '<div class="clear"></div>';
$s .= '<label id="twitter-mirror-label" for="twitter-mirror">'.t('Mirror all posts from twitter that are no replies or retweets').'</label>';
$s .= '<input id="twitter-mirror" type="checkbox" name="twitter-mirror" value="1" '. $mirrorchecked . '/>';
$s .= '<div class="clear"></div>';
$s .= '<label id="twitter-shortening-label" for="twitter-shortening">'.t('Shortening method that optimizes the tweet').'</label>';
$s .= '<input id="twitter-shortening" type="checkbox" name="twitter-shortening" value="1" '. $shorteningchecked . '/>';
$s .= '<div class="clear"></div>';
$s .= '<label id="twitter-sendtaglinks-label" for="twitter-sendtaglinks">'.t('Send linked #-tags and @-names to Twitter').'</label>';
$s .= '<input id="twitter-sendtaglinks" type="checkbox" name="twitter-sendtaglinks" value="1" '. $linkschecked . '/>';
$s .= '</div><div class="clear"></div>';
@ -286,6 +306,24 @@ function twitter_shortenmsg($b) {
if ($b["title"] != "")
$body = $b["title"]."\n\n".$body;
if (strpos($body, "[bookmark") !== false) {
// splitting the text in two parts:
// before and after the bookmark
$pos = strpos($body, "[bookmark");
$body1 = substr($body, 0, $pos);
$body2 = substr($body, $pos);
// Removing all quotes after the bookmark
// they are mostly only the content after the bookmark.
$body2 = preg_replace("/\[quote\=([^\]]*)\](.*?)\[\/quote\]/ism",'',$body2);
$body2 = preg_replace("/\[quote\](.*?)\[\/quote\]/ism",'',$body2);
$body = $body1.$body2;
}
// Add some newlines so that the message could be cut better
$body = str_replace(array("[quote", "[bookmark", "[/bookmark]", "[/quote]"),
array("\n[quote", "\n[bookmark", "[/bookmark]\n", "[/quote]\n"), $body);
// remove the recycle signs and the names since they aren't helpful on twitter
// recycle 1
$recycle = html_entity_decode("&#x2672; ", ENT_QUOTES, 'UTF-8');
@ -385,15 +423,24 @@ function twitter_post_hook(&$a,&$b) {
if($b['parent'] != $b['id'])
return;
// if post comes from twitter don't send it back
if($b['app'] == "Twitter")
return;
logger('twitter post invoked');
load_pconfig($b['uid'], 'twitter');
$ckey = get_config('twitter', 'consumerkey' );
$csecret = get_config('twitter', 'consumersecret' );
$otoken = get_pconfig($b['uid'], 'twitter', 'oauthtoken' );
$osecret = get_pconfig($b['uid'], 'twitter', 'oauthsecret' );
$ckey = get_config('twitter', 'consumerkey');
$csecret = get_config('twitter', 'consumersecret');
$otoken = get_pconfig($b['uid'], 'twitter', 'oauthtoken');
$osecret = get_pconfig($b['uid'], 'twitter', 'oauthsecret');
$intelligent_shortening = get_pconfig($b['uid'], 'twitter', 'intelligent_shortening');
// Global setting overrides this
if (get_config('twitter','intelligent_shortening'))
$intelligent_shortening = get_config('twitter','intelligent_shortening');
if($ckey && $csecret && $otoken && $osecret) {
logger('twitter: we have customer key and oauth stuff, going to send.', LOGGER_DEBUG);
@ -403,9 +450,6 @@ function twitter_post_hook(&$a,&$b) {
$tweet = new TwitterOAuth($ckey,$csecret,$otoken,$osecret);
// in theory max char is 140 but T. uses t.co to make links
// longer so we give them 10 characters extra
$intelligent_shortening = get_config('twitter','intelligent_shortening');
if (!$intelligent_shortening) {
$max_char = 130; // max. length for a tweet
// we will only work with up to two times the length of the dent
@ -499,16 +543,116 @@ function twitter_post_hook(&$a,&$b) {
function twitter_plugin_admin_post(&$a){
$consumerkey = ((x($_POST,'consumerkey')) ? notags(trim($_POST['consumerkey'])) : '');
$consumersecret = ((x($_POST,'consumersecret')) ? notags(trim($_POST['consumersecret'])): '');
$applicationname = ((x($_POST, 'applicationname')) ? notags(trim($_POST['applicationname'])):'');
set_config('twitter','consumerkey',$consumerkey);
set_config('twitter','consumersecret',$consumersecret);
set_config('twitter','application_name',$applicationname);
info( t('Settings updated.'). EOL );
}
function twitter_plugin_admin(&$a, &$o){
$t = file_get_contents( dirname(__file__). "/admin.tpl" );
$t = get_markup_template( "admin.tpl", "addon/twitter/" );
$o = replace_macros($t, array(
'$submit' => t('Submit'),
// name, label, value, help, [extra values]
'$consumerkey' => array('consumerkey', t('Consumer key'), get_config('twitter', 'consumerkey' ), ''),
'$consumersecret' => array('consumersecret', t('Consumer secret'), get_config('twitter', 'consumersecret' ), '')
'$consumersecret' => array('consumersecret', t('Consumer secret'), get_config('twitter', 'consumersecret' ), ''),
'$applicationname' => array('applicationname', t('Name of the Twitter Application'), get_config('twitter','application_name'),t('set this to avoid mirroring postings from ~friendica back to ~friendica'))
));
}
function twitter_cron($a,$b) {
$last = get_config('twitter','last_poll');
$poll_interval = intval(get_config('twitter','poll_interval'));
if(! $poll_interval)
$poll_interval = TWITTER_DEFAULT_POLL_INTERVAL;
if($last) {
$next = $last + ($poll_interval * 60);
if($next > time()) {
logger('twitter: poll intervall not reached');
return;
}
}
logger('twitter: cron_start');
$r = q("SELECT * FROM `pconfig` WHERE `cat` = 'twitter' AND `k` = 'mirror_posts' AND `v` = '1' ORDER BY RAND() ");
if(count($r)) {
foreach($r as $rr) {
logger('twitter: fetching for user '.$rr['uid']);
twitter_fetchtimeline($a, $rr['uid']);
}
}
logger('twitter: cron_end');
set_config('twitter','last_poll', time());
}
function twitter_fetchtimeline($a, $uid) {
$ckey = get_config('twitter', 'consumerkey');
$csecret = get_config('twitter', 'consumersecret');
$otoken = get_pconfig($uid, 'twitter', 'oauthtoken');
$osecret = get_pconfig($uid, 'twitter', 'oauthsecret');
$lastid = get_pconfig($uid, 'twitter', 'lastid');
$application_name = get_config('twitter', 'application_name');
if ($application_name == "")
$application_name = $a->get_hostname();
require_once('library/twitteroauth.php');
$connection = new TwitterOAuth($ckey,$csecret,$otoken,$osecret);
$parameters = array("exclude_replies" => true, "trim_user" => true, "contributor_details" => false, "include_rts" => false);
$first_time = ($lastid == "");
if ($lastid <> "")
$parameters["since_id"] = $lastid;
$items = $connection->get('statuses/user_timeline', $parameters);
$posts = array_reverse($items);
foreach ($posts as $post) {
if ($post->id_str > $lastid)
$lastid = $post->id_str;
if ($first_time)
continue;
if (!strpos($post->source, $application_name)) {
$_SESSION["authenticated"] = true;
$_SESSION["uid"] = $uid;
$_REQUEST["type"] = "wall";
$_REQUEST["api_source"] = true;
$_REQUEST["profile_uid"] = $uid;
$_REQUEST["source"] = "Twitter";
//$_REQUEST["date"] = $post->created_at;
$_REQUEST["body"] = $post->text;
if (is_string($post->place->name))
$_REQUEST["location"] = $post->place->name;
if (is_string($post->place->full_name))
$_REQUEST["location"] = $post->place->full_name;
if (is_array($post->geo->coordinates))
$_REQUEST["coord"] = $post->geo->coordinates[0]." ".$post->geo->coordinates[1];
if (is_array($post->coordinates->coordinates))
$_REQUEST["coord"] = $post->coordinates->coordinates[1]." ".$post->coordinates->coordinates[0];
//print_r($_REQUEST);
logger('twitter: posting for user '.$uid);
require_once('mod/item.php');
item_post($a);
}
}
set_pconfig($uid, 'twitter', 'lastid', $lastid);
}

1
twitter/admin.tpl → twitter/view/admin.tpl Executable file → Normal file
View file

@ -1,3 +1,4 @@
{{ inc field_input.tpl with $field=$consumerkey }}{{ endinc }}
{{ inc field_input.tpl with $field=$consumersecret }}{{ endinc }}
{{ inc field_input.tpl with $field=$applicationname }}{{ endinc }}
<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>

View file

@ -0,0 +1,4 @@
{{include file="field_input.tpl" field=$consumerkey}}
{{include file="field_input.tpl" field=$consumersecret}}
{{include file="field_input.tpl" field=$applicationname}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>

Binary file not shown.

View file

@ -78,7 +78,7 @@ function uhremotestorage_settings($a, &$s){
'Dropbox' => 'Dropbox',
);
*/
$tpl = file_get_contents(dirname(__file__)."/settings.tpl");
$tpl = get_markup_template("settings.tpl", "addon/uhremotestorage/");
$s .= replace_macros($tpl, array(
'$title' => 'Unhosted remote storage',
'$desc' => sprintf( t('Allow to use your friendica id (%s) to connecto to external unhosted-enabled storage (like ownCloud). See <a href="http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger">RemoteStorage WebFinger</a>'), $uid ),

View file

View file

@ -0,0 +1,9 @@
<div class="settings-block">
<h3>{{$title}}</h3>
<p>{{$desc}}</p>
{{include file="field_input.tpl" field=$url}}
{{include file="field_input.tpl" field=$auth}}
{{include file="field_select.tpl" field=$api}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
</div>

Binary file not shown.

View file

@ -0,0 +1,19 @@
<div class="settings-block">
<h3 class="settings-heading">{{$title}}</h3>
<div class='field noedit'>
<label>{{$label}}</label>
<tt>{{$key}}</tt>
</div>
<div class="settings-submit-wrapper">
<input type="submit" value="{{$submit}}" class="settings-submit" name="widgets-submit" />
</div>
<h4>{{$widgets_h}}</h4>
<ul>
{{foreach $widgets as $w}}
<li><a href="{{$baseurl}}/widgets/{{$w.0}}/?k={{$key}}&p=1">{{$w.1}}</a></li>
{{/foreach}}
</ul>
</div>

View file

@ -0,0 +1,3 @@
<style>body {font-size: 0.8em; margin: 0px; padding: 0px;}</style>
<span class='f9k_like' title="{{$strlike}}">{{$like}} <img src="{{$baseurl}}/images/like.gif" alt="like"/></span>
<span class='f9k_dislike' title="{{$strdislike}}">{{$dislike}} <img src="{{$baseurl}}/images/dislike.gif" alt="dislike"/></span>

View file

@ -52,7 +52,8 @@ function like_widget_content(&$a, $conf){
$o = "";
$t = file_get_contents( dirname(__file__). "/widget_like.tpl" );
# $t = file_get_contents( dirname(__file__). "/widget_like.tpl" );
$t = get_markup_template("widget_like.tpl", "addon/widgets/");
$o .= replace_macros($t, array(
'$like' => $likes,
'$strlike' => sprintf( tt("%d person likes this", "%d people like this", $likes), $likes),

View file

@ -51,7 +51,8 @@ function widgets_settings(&$a,&$o) {
$t = file_get_contents( dirname(__file__). "/settings.tpl" );
# $t = file_get_contents( dirname(__file__). "/settings.tpl" );
$t = get_markup_template("settings.tpl", "addon/widgets/");
$o .= replace_macros($t, array(
'$submit' => t('Generate new key'),
'$baseurl' => $a->get_baseurl(),