Merge with main branch

pull/46/head
Tobias Hößl 2012-04-17 08:47:48 +00:00
commit 7d411b0070
29 changed files with 2402 additions and 1370 deletions

BIN
blogger.tgz Normal file

Binary file not shown.

16
blogger/blogger.css Executable file
View File

@ -0,0 +1,16 @@
#blogger-enable-label, #blogger-username-label, #blogger-password-label, #blogger-bydefault-label {
float: left;
width: 200px;
margin-top: 10px;
}
#blogger-checkbox, #blogger-username, #blogger-password, #blogger-bydefault {
float: left;
margin-top: 10px;
}
#blogger-submit {
margin-top: 15px;
}

200
blogger/blogger.php Executable file
View File

@ -0,0 +1,200 @@
<?php
/**
* Name: Blogger Post Connector
* Description: Post to Blogger (or anything else which uses blogger XMLRPC API)
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*/
function blpost_install() {
register_hook('post_local', 'addon/blpost/blpost.php', 'blpost_post_local');
register_hook('notifier_normal', 'addon/blpost/blpost.php', 'blpost_send');
register_hook('jot_networks', 'addon/blpost/blpost.php', 'blpost_jot_nets');
register_hook('connector_settings', 'addon/blpost/blpost.php', 'blpost_settings');
register_hook('connector_settings_post', 'addon/blpost/blpost.php', 'blpost_settings_post');
}
function blpost_uninstall() {
unregister_hook('post_local', 'addon/blpost/blpost.php', 'blpost_post_local');
unregister_hook('notifier_normal', 'addon/blpost/blpost.php', 'blpost_send');
unregister_hook('jot_networks', 'addon/blpost/blpost.php', 'blpost_jot_nets');
unregister_hook('connector_settings', 'addon/blpost/blpost.php', 'blpost_settings');
unregister_hook('connector_settings_post', 'addon/blpost/blpost.php', 'blpost_settings_post');
// obsolete - remove
unregister_hook('post_local_end', 'addon/blpost/blpost.php', 'blpost_send');
unregister_hook('plugin_settings', 'addon/blpost/blpost.php', 'blpost_settings');
unregister_hook('plugin_settings_post', 'addon/blpost/blpost.php', 'blpost_settings_post');
}
function blpost_jot_nets(&$a,&$b) {
if(! local_user())
return;
$bl_post = get_pconfig(local_user(),'blpost','post');
if(intval($bl_post) == 1) {
$bl_defpost = get_pconfig(local_user(),'blpost','post_by_default');
$selected = ((intval($bl_defpost) == 1) ? ' checked="checked" ' : '');
$b .= '<div class="profile-jot-net"><input type="checkbox" name="blpost_enable" ' . $selected . ' value="1" /> '
. t('Post to blogger') . '</div>';
}
}
function blpost_settings(&$a,&$s) {
if(! local_user())
return;
/* Add our stylesheet to the page so we can make our settings look nice */
$a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="' . $a->get_baseurl() . '/addon/blpost/blpost.css' . '" media="all" />' . "\r\n";
/* Get the current state of our config variables */
$enabled = get_pconfig(local_user(),'blpost','post');
$checked = (($enabled) ? ' checked="checked" ' : '');
$def_enabled = get_pconfig(local_user(),'blpost','post_by_default');
$def_checked = (($def_enabled) ? ' checked="checked" ' : '');
$bl_username = get_pconfig(local_user(), 'blpost', 'bl_username');
$bl_password = get_pconfig(local_user(), 'blpost', 'bl_password');
$bl_blog = get_pconfig(local_user(), 'blpost', 'bl_blog');
/* Add some HTML to the existing form */
$s .= '<div class="settings-block">';
$s .= '<h3>' . t('Blogger Post Settings') . '</h3>';
$s .= '<div id="blpost-enable-wrapper">';
$s .= '<label id="blpost-enable-label" for="blpost-checkbox">' . t('Enable Blogger Post Plugin') . '</label>';
$s .= '<input id="blpost-checkbox" type="checkbox" name="blpost" value="1" ' . $checked . '/>';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="blpost-username-wrapper">';
$s .= '<label id="blpost-username-label" for="blpost-username">' . t('Blogger username') . '</label>';
$s .= '<input id="blpost-username" type="text" name="bl_username" value="' . $bl_username . '" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="blpost-password-wrapper">';
$s .= '<label id="blpost-password-label" for="blpost-password">' . t('Blogger password') . '</label>';
$s .= '<input id="blpost-password" type="password" name="bl_password" value="' . $bl_password . '" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="blpost-blog-wrapper">';
$s .= '<label id="blpost-blog-label" for="blpost-blog">' . t('Blogger API URL') . '</label>';
$s .= '<input id="blpost-blog" type="text" name="bl_blog" value="' . $bl_blog . '" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="blpost-bydefault-wrapper">';
$s .= '<label id="blpost-bydefault-label" for="blpost-bydefault">' . t('Post to Blogger by default') . '</label>';
$s .= '<input id="blpost-bydefault" type="checkbox" name="bl_bydefault" value="1" ' . $def_checked . '/>';
$s .= '</div><div class="clear"></div>';
/* provide a submit button */
$s .= '<div class="settings-submit-wrapper" ><input type="submit" id="blpost-submit" name="blpost-submit" class="settings-submit" value="' . t('Submit') . '" /></div></div>';
}
function blpost_settings_post(&$a,&$b) {
if(x($_POST,'blpost-submit')) {
set_pconfig(local_user(),'blpost','post',intval($_POST['blpost']));
set_pconfig(local_user(),'blpost','post_by_default',intval($_POST['bl_bydefault']));
set_pconfig(local_user(),'blpost','bl_username',trim($_POST['bl_username']));
set_pconfig(local_user(),'blpost','bl_password',trim($_POST['bl_password']));
set_pconfig(local_user(),'blpost','bl_blog',trim($_POST['bl_blog']));
}
}
function blpost_post_local(&$a,&$b) {
// This can probably be changed to allow editing by pointing to a different API endpoint
if($b['edit'])
return;
if((! local_user()) || (local_user() != $b['uid']))
return;
if($b['private'] || $b['parent'])
return;
$bl_post = intval(get_pconfig(local_user(),'blpost','post'));
$bl_enable = (($bl_post && x($_REQUEST,'blpost_enable')) ? intval($_REQUEST['blpost_enable']) : 0);
if($_REQUEST['api_source'] && intval(get_pconfig(local_user(),'blpost','post_by_default')))
$bl_enable = 1;
if(! $bl_enable)
return;
if(strlen($b['postopts']))
$b['postopts'] .= ',';
$b['postopts'] .= 'blpost';
}
function blpost_send(&$a,&$b) {
if($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited']))
return;
if(! strstr($b['postopts'],'blpost'))
return;
if($b['parent'] != $b['id'])
return;
$bl_username = xmlify(get_pconfig($b['uid'],'blpost','bl_username'));
$bl_password = xmlify(get_pconfig($b['uid'],'blpost','bl_password'));
$bl_blog = get_pconfig($b['uid'],'blpost','bl_blog');
if($bl_username && $bl_password && $bl_blog) {
require_once('include/bbcode.php');
$title = '<title>' . (($b['title']) ? $b['title'] : t('Post from Friendica')) . '</title>';
$post = $title . bbcode($b['body']);
$post = xmlify($post);
$xml = <<< EOT
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<methodCall>
<methodName>blogger.newPost</methodName>
<params>
<param><value><string/></value></param>
<param><value><string/></value></param>
<param><value><string>$bl_username</string></value></param>
<param><value><string>$bl_password</string></value></param>
<param><value><string>$post</string></value></param>
<param><value><int>1</int></value></param>
</params>
</methodCall>
EOT;
logger('blpost: data: ' . $xml, LOGGER_DATA);
if($bl_blog !== 'test')
$x = post_url($bl_blog,$xml);
logger('posted to blogger: ' . (($x) ? $x : ''), LOGGER_DEBUG);
}
}

BIN
convpath.tgz Normal file

Binary file not shown.

7
convpath/README Executable file
View File

@ -0,0 +1,7 @@
convpath
This addon converts all internal paths according to the current scheme.
That means that if a page is called via https then all internal links are also converted into https.
Same happens when you call your page with http.

55
convpath/convpath.php Normal file
View File

@ -0,0 +1,55 @@
<?php
/**
* Name: Convert Paths
* Description: Converts all internal paths according to the current scheme (http or https)
* Version: 1.0
* Author: Michael Vogel <https://pirati.ca/profile/heluecht>
*
*/
function convpath_install() {
register_hook('page_end', 'addon/convpath/convpath.php', 'convpath_page_end');
register_hook('page_header', 'addon/convpath/convpath.php', 'convpath_page_header');
}
function convpath_uninstall() {
unregister_hook('page_end', 'addon/convpath/convpath.php', 'convpath_page_end');
unregister_hook('page_header', 'addon/convpath/convpath.php', 'convpath_page_header');
}
function convpath_page_header(&$a, &$o){
$o = convpath_convert($o);
}
function convpath_page_end(&$a, &$o){
$o = convpath_convert($o);
$a->page['aside'] = convpath_convert($a->page['aside']);
}
/*
Converts a given path according to the current scheme
*/
function convpath_convert($path) {
global $a;
if ($path == "")
return("");
$ssl = (substr($a->get_baseurl(), 0, 8) == "https://");
if ($ssl) {
$search = "http://".$a->get_hostname();
$replace = "https://".$a->get_hostname();
} else {
$search = "https://".$a->get_hostname();
$replace = "http://".$a->get_hostname();
}
$searcharr = array("src='".$search, 'src="'.$search);
$replacearr = array("src='".$replace, 'src="'.$replace);
$path = str_replace($searcharr, $replacearr, $path);
//$path = str_replace($search, $replace, $path);
return($path);
}

Binary file not shown.

View File

@ -21,7 +21,7 @@
* in a future release.
*/
/** TODO
/** TODO
* - Implement a method for the administrator to delete all configuration data the plugin has created,
* e.g. the app_access_token
*/
@ -34,6 +34,7 @@ define('FACEBOOK_SESSION_ERR_NOTIFICATION_INTERVAL', 259200); // 3 days
define('FACEBOOK_DEFAULT_POLL_INTERVAL', 60); // given in minutes
define('FACEBOOK_MIN_POLL_INTERVAL', 5);
require_once('include/security.php');
function facebook_install() {
register_hook('post_local', 'addon/facebook/facebook.php', 'facebook_post_local');
@ -70,6 +71,10 @@ function facebook_module() {}
// If a->argv[1] is a nickname, this is a callback from Facebook oauth requests.
// If $_REQUEST["realtime_cb"] is set, this is a callback from the Real-Time Updates API
/**
* @param $a
* @return mixed
*/
function facebook_init(&$a) {
if (x($_REQUEST, "realtime_cb") && x($_REQUEST, "realtime_cb")) {
@ -172,6 +177,7 @@ function facebook_init(&$a) {
$auth_code = (x($_GET, 'code') ? $_GET['code'] : '');
$error = (x($_GET, 'error_description') ? $_GET['error_description'] : '');
if($error)
logger('facebook_init: Error: ' . $error);
@ -206,6 +212,10 @@ function facebook_init(&$a) {
}
/**
* @param $uid
* @return mixed
*/
function fb_get_self($uid) {
$access_token = get_pconfig($uid,'facebook','access_token');
if(! $access_token)
@ -217,6 +227,11 @@ function fb_get_self($uid) {
}
}
/**
* @param $uid
* @param $access_token
* @param $persons
*/
function fb_get_friends_sync_new($uid, $access_token, $persons) {
$persons_todo = array();
foreach ($persons as $person) {
@ -236,6 +251,11 @@ function fb_get_friends_sync_new($uid, $access_token, $persons) {
}
}
/**
* @param $uid
* @param $contact
* @return mixed
*/
function fb_get_friends_sync_parsecontact($uid, $contact) {
$contact->link = 'http://facebook.com/profile.php?id=' . $contact->id;
@ -337,6 +357,12 @@ function fb_get_friends_sync_parsecontact($uid, $contact) {
);
}
/**
* @param $uid
* @param $access_token
* @param $persons
* @return mixed
*/
function fb_get_friends_sync_full($uid, $access_token, $persons) {
if (count($persons) == 0) return;
$nums = Ceil(count($persons) / 50);
@ -355,8 +381,15 @@ function fb_get_friends_sync_full($uid, $access_token, $persons) {
}
}
// if $fullsync is true, only new contacts are searched for
/**
* @param $uid
* @param bool $fullsync
* @return mixed
*/
function fb_get_friends($uid, $fullsync = true) {
$r = q("SELECT `uid` FROM `user` WHERE `uid` = %d AND `account_expired` = 0 LIMIT 1",
@ -394,6 +427,10 @@ function fb_get_friends($uid, $fullsync = true) {
// This is the POST method to the facebook settings page
// Content is posted to Facebook in the function facebook_post_hook()
/**
* @param $a
* @return mixed
*/
function facebook_post(&$a) {
$uid = local_user();
@ -444,6 +481,10 @@ function facebook_post(&$a) {
// Facebook settings form
/**
* @param $a
* @return string
*/
function facebook_content(&$a) {
if(! local_user()) {
@ -545,7 +586,11 @@ function facebook_content(&$a) {
}
/**
* @param $a
* @param $b
* @return mixed
*/
function facebook_cron($a,$b) {
$last = get_config('facebook','last_poll');
@ -626,7 +671,10 @@ function facebook_cron($a,$b) {
}
/**
* @param $a
* @param $b
*/
function facebook_plugin_settings(&$a,&$b) {
$b .= '<div class="settings-block">';
@ -637,7 +685,13 @@ function facebook_plugin_settings(&$a,&$b) {
}
/**
* @param $a
* @param $o
*/
function facebook_plugin_admin(&$a, &$o){
$o = '<input type="hidden" name="form_security_token" value="' . get_form_security_token("fbsave") . '">';
$o .= '<h4>' . t('Facebook API Key') . '</h4>';
@ -679,6 +733,10 @@ function facebook_plugin_admin(&$a, &$o){
}
}
/**
* @param $a
* @param $o
*/
function facebook_plugin_admin_post(&$a, &$o){
check_form_security_token_redirectOnErr('/admin/plugins/facebook', 'fbsave');
@ -698,6 +756,11 @@ function facebook_plugin_admin_post(&$a, &$o){
}
}
/**
* @param $a
* @param $b
* @return mixed
*/
function facebook_jot_nets(&$a,&$b) {
if(! local_user())
return;
@ -712,6 +775,11 @@ function facebook_jot_nets(&$a,&$b) {
}
/**
* @param $a
* @param $b
* @return mixed
*/
function facebook_post_hook(&$a,&$b) {
@ -883,7 +951,7 @@ function facebook_post_hook(&$a,&$b) {
if(preg_match("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/is",$b['body'],$matches))
$image = $matches[3];
if ($image != '')
if ($image == '')
if(preg_match("/\[img\](.*?)\[\/img\]/is",$b['body'],$matches))
$image = $matches[1];
@ -993,10 +1061,14 @@ function facebook_post_hook(&$a,&$b) {
'access_token' => $fb_token,
'message' => $msg
);
if(isset($image))
if(isset($image)) {
$postvars['picture'] = $image;
if(isset($link))
//$postvars['type'] = "photo";
}
if(isset($link)) {
$postvars['link'] = $link;
//$postvars['type'] = "link";
}
if(isset($linkname))
$postvars['name'] = $linkname;
}
@ -1013,11 +1085,18 @@ function facebook_post_hook(&$a,&$b) {
if($reply) {
$url = 'https://graph.facebook.com/' . $reply . '/' . (($likes) ? 'likes' : 'comments');
}
else {
} else if (($link != "") or ($image != "") or ($b['title'] == '') or (strlen($msg) < 500)) {
$url = 'https://graph.facebook.com/me/feed';
if($b['plink'])
$postvars['actions'] = '{"name": "' . t('View on Friendica') . '", "link": "' . $b['plink'] . '"}';
} else {
// if its only a message and a subject and the message is larger than 500 characters then post it as note
$postvars = array(
'access_token' => $fb_token,
'message' => bbcode($b['body']),
'subject' => $b['title'],
);
$url = 'https://graph.facebook.com/me/notes';
}
logger('facebook: post to ' . $url);
@ -1075,6 +1154,10 @@ function facebook_post_hook(&$a,&$b) {
}
}
/**
* @param $app
* @param $data
*/
function facebook_enotify(&$app, &$data) {
if (x($data, 'params') && $data['params']['type'] == NOTIFY_SYSTEM && x($data['params'], 'system_type') && $data['params']['system_type'] == 'facebook_connection_invalid') {
$data['itemlink'] = '/facebook';
@ -1084,6 +1167,11 @@ function facebook_enotify(&$app, &$data) {
}
}
/**
* @param $a
* @param $b
* @return mixed
*/
function facebook_post_local(&$a,&$b) {
// Figure out if Facebook posting is enabled for this post and file it in 'postopts'
@ -1110,6 +1198,11 @@ function facebook_post_local(&$a,&$b) {
}
/**
* @param $a
* @param $b
* @return mixed
*/
function fb_queue_hook(&$a,&$b) {
$qi = q("SELECT * FROM `queue` WHERE `network` = '%s'",
@ -1168,7 +1261,13 @@ function fb_queue_hook(&$a,&$b) {
}
}
/**
* @param $access_token
* @param $since
* @return stdClass
*/
function fb_get_timeline($access_token, &$since) {
$entries = new stdClass();
$entries->data = array();
$newest = 0;
@ -1208,6 +1307,10 @@ function fb_get_timeline($access_token, &$since) {
return($entries);
}
/**
* @param $uid
* @return mixed
*/
function fb_consume_all($uid) {
require_once('include/items.php');
@ -1232,7 +1335,7 @@ function fb_consume_all($uid) {
// Get the last date
$lastdate = get_pconfig($uid,'facebook','lastdate');
// fetch all items since the last date
$j = fb_get_timeline($access_token, &$lastdate);
$j = fb_get_timeline($access_token, $lastdate);
if (isset($j->data)) {
logger('fb_consume_stream: feed: ' . print_r($j,true), LOGGER_DATA);
fb_consume_stream($uid,$j,false);
@ -1243,6 +1346,11 @@ function fb_consume_all($uid) {
logger('fb_consume_stream: feed: got no data from Facebook: ' . print_r($j,true), LOGGER_NORMAL);
}
/**
* @param $uid
* @param $link
* @return string
*/
function fb_get_photo($uid,$link) {
$access_token = get_pconfig($uid,'facebook','access_token');
if(! $access_token || (! stristr($link,'facebook.com/photo.php')))
@ -1251,6 +1359,8 @@ function fb_get_photo($uid,$link) {
$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)
@ -1259,6 +1369,12 @@ function fb_get_photo($uid,$link) {
// return "\n" . '[url=' . $link . ']' . t('link') . '[/url]';
}
/**
* @param $uid
* @param $j
* @param bool $wall
* @return mixed
*/
function fb_consume_stream($uid,$j,$wall = false) {
$a = get_app();
@ -1366,32 +1482,32 @@ function fb_consume_stream($uid,$j,$wall = false) {
logger('facebook: post '.$entry->id.' from '.$from->name);
$datarray['body'] = (x($entry, 'message') ? escape_tags($entry->message) : '');
$datarray['body'] = escape_tags($entry->message);
if(x($entry, 'name') and x($entry, 'link'))
if($entry->name and $entry->link)
$datarray['body'] .= "\n\n[bookmark=".$entry->link."]".$entry->name."[/bookmark]";
elseif (x($entry, 'name'))
elseif ($entry->name)
$datarray['body'] .= "\n\n[b]" . $entry->name."[/b]";
if(x($entry, 'caption')) {
if(!x($entry, 'name') and x($entry, 'link'))
if($entry->caption) {
if(!$entry->name and $entry->link)
$datarray['body'] .= "\n\n[bookmark=".$entry->link."]".$entry->caption."[/bookmark]";
else
$datarray['body'] .= "[i]" . $entry->caption."[/i]\n";
}
if(!x($entry, 'caption') and !x($entry, 'name')) {
if (x($entry, 'link'))
if(!$entry->caption and !$entry->name) {
if ($entry->link)
$datarray['body'] .= "\n[url]".$entry->link."[/url]\n";
else
$datarray['body'] .= "\n";
}
$quote = '';
if(x($entry, 'description'))
$quote = "";
if($entry->description)
$quote = $entry->description;
if (x($entry, 'properties'))
if ($entry->properties)
foreach ($entry->properties as $property)
$quote .= "\n".$property->name.": [url=".$property->href."]".$property->text."[/url]";
@ -1401,22 +1517,31 @@ function fb_consume_stream($uid,$j,$wall = false) {
// Only import the picture when the message is no video
// oembed display a picture of the video as well
if ($entry->type != "video") {
if(x($entry, 'picture') && x($entry, 'link')) {
if($entry->picture && $entry->link) {
$datarray['body'] .= "\n" . '[url=' . $entry->link . '][img]'.$entry->picture.'[/img][/url]';
}
else {
if(x($entry, 'picture'))
if($entry->picture)
$datarray['body'] .= "\n" . '[img]' . $entry->picture . '[/img]';
// if just a link, it may be a wall photo - check
if(x($entry, 'link'))
if($entry->link)
$datarray['body'] .= fb_get_photo($uid,$entry->link);
}
}
if (($datarray['app'] == "Events") and $entry->actions)
foreach ($entry->actions as $action)
if ($action->name == "View")
$datarray['body'] .= " [url=".$action->link."]".$entry->story."[/url]";
// Just as a test - to see if these are the missing entries
//if(trim($datarray['body']) == '')
// $datarray['body'] = $entry->story;
// Adding the "story" text to see if there are useful data in it (testing)
//if (($datarray['app'] != "Events") and $entry->story)
// $datarray['body'] .= "\n".$entry->story;
if(trim($datarray['body']) == '') {
logger('facebook: empty body '.$entry->id.' '.print_r($entry, true));
continue;
@ -1437,11 +1562,13 @@ function fb_consume_stream($uid,$j,$wall = false) {
//if(($datarray['body'] != '') and ($uid == 1))
// $datarray['body'] .= "[noparse]".print_r($entry, true)."[/noparse]";
if ($entry->place->name or $entry->place->location->street or
$entry->place->location->city or $entry->place->location->Denmark) {
$datarray['coord'] = '';
if ($entry->place->name)
$datarray['coord'] = $entry->place->name;
else if ($entry->place->location->street or $entry->place->location->city or $entry->place->location->Denmark) {
$datarray['coord'] .= $entry->place->name;
if ($entry->place->location->street)
$datarray['coord'] = $entry->place->location->street;
$datarray['coord'] .= $entry->place->location->street;
if ($entry->place->location->city)
$datarray['coord'] .= " ".$entry->place->location->city;
if ($entry->place->location->country)
@ -1620,7 +1747,7 @@ function fb_consume_stream($uid,$j,$wall = false) {
'to_email' => $user[0]['email'],
'uid' => $user[0]['uid'],
'item' => $cmntdata,
'link' => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $item,
'link' => $a->get_baseurl() . '/display/' . $user[0]['nickname'] . '/' . $item,
'source_name' => $cmntdata['author-name'],
'source_link' => $cmntdata['author-link'],
'source_photo' => $cmntdata['author-avatar'],
@ -1639,6 +1766,9 @@ function fb_consume_stream($uid,$j,$wall = false) {
}
/**
* @return bool|mixed|string
*/
function fb_get_app_access_token() {
$acc_token = get_config('facebook','app_access_token');
@ -1674,6 +1804,9 @@ function fb_get_app_access_token() {
}
}
/**
*
*/
function facebook_subscription_del_users() {
$a = get_app();
$access_token = fb_get_app_access_token();
@ -1684,6 +1817,9 @@ function facebook_subscription_del_users() {
if (!facebook_check_realtime_active()) del_config('facebook', 'realtime_active');
}
/**
* @param bool $second_try
*/
function facebook_subscription_add_users($second_try = false) {
$a = get_app();
$access_token = fb_get_app_access_token();
@ -1720,6 +1856,9 @@ function facebook_subscription_add_users($second_try = false) {
};
}
/**
* @return null
*/
function facebook_subscriptions_get() {
$access_token = fb_get_app_access_token();
@ -1736,6 +1875,9 @@ function facebook_subscriptions_get() {
}
/**
* @return bool
*/
function facebook_check_realtime_active() {
$ret = facebook_subscriptions_get();
if (is_null($ret)) return false;
@ -1749,6 +1891,13 @@ function facebook_check_realtime_active() {
// DELETE-request to $url
if(! function_exists('facebook_delete_url')) {
/**
* @param $url
* @param null $headers
* @param int $redirects
* @param int $timeout
* @return bool|string
*/
function facebook_delete_url($url,$headers = null, &$redirects = 0, $timeout = 0) {
$a = get_app();
$ch = curl_init($url);
@ -1820,7 +1969,7 @@ if(! function_exists('facebook_delete_url')) {
$url_parsed = @parse_url($url);
if (isset($url_parsed)) {
$redirects++;
return delete_url($url,$headers,$redirects,$timeout);
return facebook_delete_url($url,$headers,$redirects,$timeout);
}
}
$a->set_curl_code($http_code);
@ -1830,4 +1979,4 @@ if(! function_exists('facebook_delete_url')) {
curl_close($ch);
return($body);
}}
}}

BIN
gravatar.tgz Normal file

Binary file not shown.

42
gravatar/README.md Normal file
View File

@ -0,0 +1,42 @@
# Gravatar Plugin
by [Klaus Weidenbach](http://friendica.dszdw.net/profile/klaus)
This addon allows you to look up an avatar image for new users and contacts at [Gravatar](http://www.gravatar.com). This will be used if there have not been found any other avatar images yet for example through OpenID.
Gravatar is a popular, but centralized and proprietary service where people can store an avatar image for their email-addresses. It is widely used on many pages, for example to display an avatar for comment functions, profile pages, etc.
* * *
# Configuration
## Default Avatar Image
If no avatar was found for an email Gravatar can create some pseudo-random generated avatars based on an email hash. You can choose between these presets:
* __Gravatar__: default static Gravatar logo
* __MM__: (mystery-man) a static image
* __Identicon__: a generated geometric pattern based on email hash
* __Monsterid__: a generated 'monster' with different colors, faces, etc. based on email hash
* __Wavatar__: faces with different features and backgrounds based on email hash
* __Retro__: 8-bit arcade-styled pixelated faces based on email hash
See examples at [Gravatar][1].
## Avatar Rating
Gravatar lets users self-rate their images to be used at appropriate audiences. Choose which are appropriate for your friendica site:
* __g__: suitable for display on all wesites with any audience type
* __pg__: may contain rude gestures, provocatively dressed individuals, the lesser swear words, or mild violence
* __r__: may contain such things as harsh profanity, intense violence, nudity, or hard drug use
* __x__: may contain hardcore sexual imagery or extremely disurbing violence
See more information at [Gravatar][1].
## Alternative Configuration
Open the .htconfig.php file and add "gravatar" to the list of activated addons:
$a->config['system']['addon'] = "..., gravatar";
You can add two configuration variables for the addon:
$a->config['gravatar']['default_avatar'] = "identicon";
$a->config['gravatar']['rating'] = "g";
[1]: http://www.gravatar.com/site/implement/images/ "See documentation at Gravatar for more information"

3
gravatar/admin.tpl Normal file
View File

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

104
gravatar/gravatar.php Normal file
View File

@ -0,0 +1,104 @@
<?php
/**
* Name: Gravatar Support
* Description: If there is no avatar image for a new user or contact this plugin will look for one at Gravatar.
* Version: 1.0
* Author: Klaus Weidenbach <http://friendica.dszdw.net/profile/klaus>
*/
/**
* Installs the plugin hook
*/
function gravatar_install() {
register_hook('avatar_lookup', 'addon/gravatar/gravatar.php', 'gravatar_lookup');
logger("installed gravatar");
}
/**
* Removes the plugin hook
*/
function gravatar_uninstall() {
unregister_hook('avatar_lookup', 'addon/gravatar/gravatar.php', 'gravatar_lookup');
logger("uninstalled gravatar");
}
/**
* Looks up the avatar at gravatar.com and returns the URL.
*
* @param $a array
* @param &$b array
*/
function gravatar_lookup($a, &$b) {
$default_avatar = get_config('gravatar', 'default_img');
$rating = get_config('gravatar', 'rating');
// setting default value if nothing configured
if(! $default_avatar)
$default_avatar = 'identicon'; // default image will be a random pattern
if(! $rating)
$rating = 'g'; // suitable for display on all websites with any audience type
$hash = md5(trim(strtolower($b['email'])));
$url = 'http://www.gravatar.com/avatar/' .$hash .'.jpg';
$url .= '?s=' .$b['size'] .'&r=' .$rating;
if ($default_avatar != "gravatar")
$url .= '&d=' .$default_avatar;
$b['url'] = $url;
$b['success'] = true;
}
/**
* Display admin settings for this addon
*/
function gravatar_plugin_admin (&$a, &$o) {
$t = file_get_contents( dirname(__file__)."/admin.tpl");
$default_avatar = get_config('gravatar', 'default_img');
$rating = get_config('gravatar', 'rating');
// set default values for first configuration
if(! $default_avatar)
$default_avatar = 'identicon'; // pseudo-random geometric pattern based on email hash
if(! $rating)
$rating = 'g'; // suitable for display on all websites with any audience type
// Available options for the select boxes
$default_avatars = array(
'mm' => t('generic profile image'),
'identicon' => t('random geometric pattern'),
'monsterid' => t('monster face'),
'wavatar' => t('computer generated face'),
'retro' => t('retro arcade style face'),
);
$ratings = array(
'g' => 'g',
'pg' => 'pg',
'r' => 'r',
'x' => 'x'
);
$o = '<input type="hidden" name="form_security_token" value="' .get_form_security_token("gravatarsave") .'">';
$o .= replace_macros( $t, array(
'$submit' => t('Submit'),
'$default_avatar' => array('avatar', t('Default avatar image'), $default_avatar, t('Select default avatar image if none was found at Gravatar. See README'), $default_avatars),
'$rating' => array('rating', t('Rating of images'), $rating, t('Select the appropriate avatar rating for your site. See README'), $ratings),
));
}
/**
* Save admin settings
*/
function gravatar_plugin_admin_post (&$a) {
check_form_security_token('gravatarsave');
$default_avatar = ((x($_POST, 'avatar')) ? notags(trim($_POST['avatar'])) : 'identicon');
$rating = ((x($_POST, 'rating')) ? notags(trim($_POST['rating'])) : 'g');
set_config('gravatar', 'default_img', $default_avatar);
set_config('gravatar', 'rating', $rating);
info( t('Gravatar settings updated.') .EOL);
}
?>

BIN
irc.tgz

Binary file not shown.

15
irc/irc.css Normal file
View File

@ -0,0 +1,15 @@
/* irc css */
#irc-chans, {
float: left;
width: 200px;
margin-top: 10px;
}
#irc-checkbox {
float: left;
margin-top: 10px;
}
#irc-submit {
margin-top: 15px;
}

View File

@ -10,17 +10,66 @@
* you will then have "irc chatroom" listed at yoursite/apps
* and the app will run at yoursite/irc
* documentation at http://tonybaldwin.me/hax/doku.php?id=friendica:irc
* admin can set popular chans, auto connect chans in settings->plugin settings
*/
function irc_install() {
register_hook('app_menu', 'addon/irc/irc.php', 'irc_app_menu');
register_hook('app_menu', 'addon/irc/irc.php', 'irc_app_menu');
register_hook('plugin_settings', 'addon/irc/irc.php', 'irc_addon_settings');
register_hook('plugin_settings_post', 'addon/irc/irc.php', 'irc_addon_settings_post');
}
function irc_uninstall() {
unregister_hook('app_menu', 'addon/irc/irc.php', 'irc_app_menu');
unregister_hook('app_menu', 'addon/irc/irc.php', 'irc_app_menu');
unregister_hook('plugin_settings', 'addon/irc/irc.php', 'irc_addon_settings');
}
function irc_addon_settings(&$a,&$s) {
if(! is_site_admin())
return;
/* Add our stylesheet to the page so we can make our settings look nice */
$a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="' . $a->get_baseurl() . '/addon/irc/irc.css' . '" media="all" />' . "\r\n";
/* setting popular channels, auto connect channels */
$sitechats = get_config('irc','sitechats'); /* popular channels */
$autochans = get_config('irc','autochans'); /* auto connect chans */
$s .= '<div class="settings-block">';
$s .= '<h3>' . t('IRC Settings') . '</h3>';
$s .= '<div id="irc-chans">';
$s .= '<label id="irc-auto-label" for="autochans">' . t('Channel(s) to auto connect (comma separated)') . '</label>';
$s .= '<input id="autochans" type="text" name="autochans" value="' . $autochans .'" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div id="irc-chans">';
$s .= '<label id="irc-pop-label" for="sitechats">' . t('Popular Channels (comma separated)') . '</label>';
$s .= '<input id="sitechats" type="text" name="sitechats" value="' . $sitechats.'" />';
$s .= '</div><div class="clear"></div>';
$s .= '<div class="settings-submit-wrapper" ><input type="submit" id="irc-submit" name="irc-submit" class="settings-submit" value="' . t('Submit') . '" /></div></div>';
return;
}
function irc_addon_settings_post(&$a,&$b) {
if(! is_site_admin())
return;
if($_POST['irc-submit']) {
set_config('irc','autochans',trim($_POST['autochans']));
set_config('irc','sitechats',trim($_POST['sitechats']));
/* stupid pop-up thing */
info( t('IRC settings saved.') . EOL);
}
}
function irc_app_menu($a,&$b) {
$b['app_menu'][] = '<div class="app-title"><a href="irc">' . t('IRC Chatroom') . '</a></div>';
}
@ -36,11 +85,12 @@ function irc_content(&$a) {
$baseurl = $a->get_baseurl() . '/addon/irc';
$o = '';
$sitechats = get_config('irc','channels');
/* set the list of popular channels */
$sitechats = get_config('irc','sitechats');
if($sitechats)
$chats = explode(',',$sitechats);
else
$chats = array('friendica','chat','chatback','hottub','ircbar','dateroom','teentalk');
$chats = array('friendica','chat','chatback','hottub','ircbar','dateroom','debian');
$a->page['aside'] .= '<div class="widget"><h3>' . t('Popular Channels') . '</h3><ul>';
@ -49,16 +99,14 @@ function irc_content(&$a) {
}
$a->page['aside'] .= '</ul></div>';
/* setting the channel(s) to auto connect */
$autochans = get_config('irc','autochans');
if($autochans)
$channels = $autochans;
else
$channels = ((x($_GET,'channels')) ? $_GET['channels'] : 'friendica');
$channels = ((x($_GET,'channels')) ? $_GET['channels'] : 'friendica');
/* add the chatroom frame and some html
* by altering the "channels=friendica" part of the URL, you can add/remove channels.
* At free-haven.org, I have "?channels=friendica,free-haven", for instance, to open #friendica and #free-haven
*/
/* add the chatroom frame and some html */
$o .= <<< EOT
<h2>IRC chat</h2>
<p><a href="http://tldp.org/HOWTO/IRC/beginners.html" target="_blank">A beginner's guide to using IRC. [en]</a></p>

BIN
mathjax.tgz Normal file

Binary file not shown.

31
mathjax/README Normal file
View File

@ -0,0 +1,31 @@
Addon for Friendika to include MathJax (LaTeX math syntax)
This addon lets your users use LaTeX to type mathematical formulas
within their posts. MathJax takes care about the best method for the
browser to display the formula and provides compatibility to 99%
of the modern browsers.
You can either use the MathJax CDN online, thus loading the required javascript
libraries from the MathJax cloud, or use a local installation of MathJax.
Please see the plugin settings in the admin panel for configuration possibles.
If you don't set up a local MathJax instance, leave the configuration untouched
it will fall back to the MathJax cloud as default value.
If you don't use the admin panel add mathjax to the list of active addons
$a->config['system']['addon'] = [..., mathjax, ...]
To select the source of the included javascript libraries add a line
$a->config['mathjax']['baseurl'] = 'the URL to your MathJax installation';
to your .htconfig.php file. If this line is not there, the addon assumes that
you want to use the MathJax cloud (CDN).
Please note that your usage of the CDN is governed by the "MathJax CDN Terms of
Service" see http://www.mathjax.org/download/mathjax-cdn-terms-of-service/
Author: Tobias Diekershoff
http://diekershoff.homeunix.net/friendika/profile/tobias
email: tobias.diekershoff@gmx.net

2
mathjax/admin.tpl Normal file
View File

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

76
mathjax/mathjax.php Normal file
View File

@ -0,0 +1,76 @@
<?php
/**
* Name: MathJax
* Description: Addon for Friendika to include MathJax (LaTeX math syntax)
* Version: 1.0
* Author: Tobias Diekershoff <http://diekershoff.homeunix.net/friendika/profile/tobias>
* License: 3-clause BSD license
*/
function mathjax_install() {
register_hook('page_header', 'addon/mathjax/mathjax.php', 'mathjax_page_header');
register_hook('plugin_settings', 'addon/mathjax/mathjax.php', 'mathjax_settings');
register_hook('plugin_settings_post', 'addon/mathjax/mathjax.php', 'mathjax_settings_post');
logger('installed js_math plugin');
}
function mathjax_uninstall() {
unregister_hook('page_header', 'addon/mathjax/mathjax.php', 'mathjax_page_header');
unregister_hook('plugin_settings', 'addon/mathjax/mathjax.php', 'mathjax_settings');
unregister_hook('plugin_settings_post', 'addon/mathjax/mathjax.php', 'mathjax_settings_post');
}
function mathjax_settings_post ($a, $post) {
if (! local_user())
return;
// don't check statusnet settings if statusnet submit button is not clicked
if (!x($_POST,'mathjax-submit'))
return;
set_pconfig(local_user(),'mathjax','use',intval($_POST['mathjax_use']));
}
function mathjax_settings (&$a, &$s) {
if (! local_user())
return;
$use = get_pconfig(local_user(),'mathjax','use');
$usetext = (($use) ? ' checked="checked" ' : '');
$s .= '<div class="settings-block">';
$s .= '<h3>MathJax '.t('Settings').'</h3>';
$s .= '<p>'.t('The MathJax addon renders mathematical formulae written using the LaTeX syntax surrounded by the usual $$ or an eqnarray block in the postings of your wall,network tab and private mail.').'</p>';
$s .= '<label id="mathjax_label" for="mathjax_use">'.t('Use the MathJax renderer').'</label>';
$s .= '<input id="mathjax_use" type="checkbox" name="mathjax_use" value="1"'. $usetext .' />';
$s .= '<div class="clear"></div>';
$s .= '<div class="settings-submit-wrapper" ><input type="submit" id="mathjax-submit" name="mathjax-submit" class="settings-submit" value="' . t('Submit') . '" /></div>';
$s .= '</div>';
}
/* we need to add one JavaScript include command to the html output
* note that you have to check the jsmath/easy/load.js too.
*/
function mathjax_page_header($a, &$b) {
// if the visitor of the page is not a local_user, use MathJax
// otherwise check the users settings.
$url = get_config ('mathjax','baseurl');
if(! $url)
$url = 'http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML';
if (! local_user()) {
$b .= '<script type="text/javascript" src="'.$url.'"></script>';
} else {
$use = get_pconfig(local_user(),'mathjax','use');
if ($use) {
$b .= '<script type="text/javascript" src="'.$url.'"></script>';
}
}
}
function mathjax_plugin_admin_post (&$a) {
$baseurl = ((x($_POST, 'baseurl')) ? trim($_POST['baseurl']) : 'http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML');
set_config('mathjax','baseurl',$baseurl);
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(
'$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.')),
));
}

BIN
piwik.tgz

Binary file not shown.

View File

@ -1,5 +1,5 @@
#piwik-optout-link {
padding: 100px 50px;
padding: 50px 0 0 0;
text-align: justify;
font-size: 0.85em;
margin-top:10px;

BIN
planets.tgz Normal file

Binary file not shown.

14
planets/planets.css Executable file
View File

@ -0,0 +1,14 @@
#planets-enable-label {
float: left;
width: 200px;
margin-bottom: 25px;
}
#planets-checkbox {
float: left;
}

160
planets/planets.php Executable file
View File

@ -0,0 +1,160 @@
<?php
/**
* Name: Random Planet, Empirial Version
* Description: Sample Friendica plugin/addon. Set a random planet from the Emprire when posting.
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
* Author: Tony Baldwin <https://free-haven.org/profile/tony>
*/
function planets_install() {
/**
*
* Our demo plugin will attach in three places.
* The first is just prior to storing a local post.
*
*/
register_hook('post_local', 'addon/planets/planets.php', 'planets_post_hook');
/**
*
* Then we'll attach into the plugin settings page, and also the
* settings post hook so that we can create and update
* user preferences.
*
*/
register_hook('plugin_settings', 'addon/planets/planets.php', 'planets_settings');
register_hook('plugin_settings_post', 'addon/planets/planets.php', 'planets_settings_post');
logger("installed planets");
}
function planets_uninstall() {
/**
*
* uninstall unregisters any hooks created with register_hook
* during install. It may also delete configuration settings
* and any other cleanup.
*
*/
unregister_hook('post_local', 'addon/planets/planets.php', 'planets_post_hook');
unregister_hook('plugin_settings', 'addon/planets/planets.php', 'planets_settings');
unregister_hook('plugin_settings_post', 'addon/planets/planets.php', 'planets_settings_post');
logger("removed planets");
}
function planets_post_hook($a, &$item) {
/**
*
* An item was posted on the local system.
* We are going to look for specific items:
* - A status post by a profile owner
* - The profile owner must have allowed our plugin
*
*/
logger('planets invoked');
if(! local_user()) /* non-zero if this is a logged in user of this system */
return;
if(local_user() != $item['uid']) /* Does this person own the post? */
return;
if($item['parent']) /* If the item has a parent, this is a comment or something else, not a status post. */
return;
/* Retrieve our personal config setting */
$active = get_pconfig(local_user(), 'planets', 'enable');
if(! $active)
return;
/**
*
* OK, we're allowed to do our stuff.
* Here's what we are going to do:
* load the list of timezone names, and use that to generate a list of world planets.
* Then we'll pick one of those at random and put it in the "location" field for the post.
*
*/
$planets = array('Alderaan','Tatooine','Dagoba','Polis Massa','Coruscant','Hoth','Endor','Kamino','Rattatak','Mustafar','Iego','Geonosis','Felucia','Dantooine','Ansion','Artaru','Bespin','Boz Pity','Cato Neimoidia','Christophsis','Kashyyk','Kessel','Malastare','Mygeeto','Nar Shaddaa','Ord Mantell','Saleucami','Subterrel','Death Star','Teth','Tund','Utapau','Yavin');
$planet = array_rand($planets,1);
$item['location'] = $planets[$planet];
return;
}
/**
*
* Callback from the settings post function.
* $post contains the $_POST array.
* We will make sure we've got a valid user account
* and if so set our configuration setting for this person.
*
*/
function planets_settings_post($a,$post) {
if(! local_user())
return;
if($_POST['planets-submit'])
set_pconfig(local_user(),'planets','enable',intval($_POST['planets']));
}
/**
*
* Called from the Plugin Setting form.
* Add our own settings info to the page.
*
*/
function planets_settings(&$a,&$s) {
if(! local_user())
return;
/* Add our stylesheet to the page so we can make our settings look nice */
$a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="' . $a->get_baseurl() . '/addon/planets/planets.css' . '" media="all" />' . "\r\n";
/* Get the current state of our config variable */
$enabled = get_pconfig(local_user(),'planets','enable');
$checked = (($enabled) ? ' checked="checked" ' : '');
/* Add some HTML to the existing form */
$s .= '<div class="settings-block">';
$s .= '<h3>' . t('Planets Settings') . '</h3>';
$s .= '<div id="planets-enable-wrapper">';
$s .= '<label id="planets-enable-label" for="planets-checkbox">' . t('Enable Planets Plugin') . '</label>';
$s .= '<input id="planets-checkbox" type="checkbox" name="planets" value="1" ' . $checked . '/>';
$s .= '</div><div class="clear"></div>';
/* provide a submit button */
$s .= '<div class="settings-submit-wrapper" ><input type="submit" name="planets-submit" class="settings-submit" value="' . t('Submit') . '" /></div></div>';
}

Binary file not shown.

View File

@ -8,10 +8,8 @@
*
*
*
* Addons are registered with the system in the
* .htconfig.php file.
*
* $a->config['system']['addon'] = 'plugin1,plugin2,etc.';
* Addons are registered with the system through the admin
* panel.
*
* When registration is detected, the system calls the plugin
* name_install() function, located in 'addon/name/name.php',

BIN
testdrive.tgz Normal file

Binary file not shown.

23
testdrive/README.md Normal file
View File

@ -0,0 +1,23 @@
TestDrive
=========
Testdrive is a Friendica plugin which implements automatic account expiration so that a site may be used as a public
test bed.
When an account is created on the site, it is given a hard expiration date of
$a->config['testdrive']['expiredays'] = 30;
Set this in your .htconfig.php file to allow a 30 day test drive period. By default no expiration period is defined
in case the plugin is activated accidentally.
There is no opportunity to extend an expired account using this plugin. Expiration is final. Other plugins may be created
which charge for service and extend the expiration as long as a balance is maintained. This plugin is purely for creating
a limited use test site.
An email warning will be sent out approximately five days before the expiration occurs. Once it occurs logins and many
system functions are disabled. Five days later the account is removed completely.

89
testdrive/testdrive.php Normal file
View File

@ -0,0 +1,89 @@
<?php
/**
* Name: testdrive
* Description: Sample Friendica plugin/addon for creating a test drive Friendica site with automatic account expiration.
* Version: 1.0
* Author: Mike Macgirvin <http://macgirvin.com/profile/mike>
*/
function testdrive_install() {
register_hook('register_account', 'addon/testdrive/testdrive.php', 'testdrive_register_account');
register_hook('cron', 'addon/testdrive/testdrive.php', 'testdrive_cron');
}
function testdrive_uninstall() {
unregister_hook('register_account', 'addon/testdrive/testdrive.php', 'testdrive_register_account');
unregister_hook('cron', 'addon/testdrive/testdrive.php', 'testdrive_cron');
}
function testdrive_register_account($a,$b) {
$uid = $b;
$days = get_config('testdrive','expiredays');
if(! $days)
return;
$r = q("UPDATE user set account_expires_on = '%s' where uid = %d limit 1",
dbesc(datetime_convert('UTC','UTC','now +' . $days . ' days')),
intval($uid)
);
};
function testdrive_cron($a,$b) {
require_once('include/enotify.php');
$r = q("select * from user where account_expires_on < UTC_TIMESTAMP() + INTERVAL 5 DAY and
expire_notification_sent = '0000-00-00 00:00:00' ");
if(count($r)) {
foreach($r as $rr) {
notification(array(
'uid' => $rr['uid'],
'type' => NOTIFY_SYSTEM,
'system_type' => 'testdrive_expire',
'language' => $rr['language'],
'to_name' => $rr['username'],
'to_email' => $rr['email'],
'source_name' => t('Administrator'),
'source_link' => $a->get_baseurl(),
'source_photo' => $a->get_baseurl() . '/images/person-80.jpg',
));
q("update user set expire_notification_sent = '%s' where uid = %d limit 1",
dbesc(datetime_convert()),
intval($rr['uid'])
);
}
}
$r = q("select * from user where account_expired = 1 and account_expires_on < UTC_TIMESTAMP() - INTERVAL 5 DAY ");
if(count($r)) {
require_once('include/Contact.php');
foreach($r as $rr)
user_remove($rr['uid']);
}
}
function testdrive_enotify(&$a, &$b) {
if (x($b, 'params') && $b['params']['type'] == NOTIFY_SYSTEM
&& x($b['params'], 'system_type') && $b['params']['system_type'] === 'testdrive_expire') {
$b['itemlink'] = $a->get_baseurl();
$b['epreamble'] = $b['preamble'] = sprintf( t('Your account on %s will expire in a few days.'), get_config('system','sitename'));
$b['subject'] = t('Your Friendica test account is about to expire.');
$b['body'] = sprintf( t("Hi %1\$s,\n\nYour test account on %2\$s will expire in less than five days. We hope you enjoyed this test drive and use this opportunity to find a permanent Friendica website for your integrated social communications. A list of public sites is available at http://dir.friendica.com/siteinfo - and for more information on setting up your own Friendica server please see the Friendica project website at http://friendica.com."), $b['params']['to_name'], "[url=" . $app->config["system"]["url"] . "]" . $app->config["sitename"] . "[/url]");
}
}