diff --git a/buglink.tgz b/buglink.tgz new file mode 100644 index 000000000..fce2e54ca Binary files /dev/null and b/buglink.tgz differ diff --git a/buglink/bug-x.gif b/buglink/bug-x.gif new file mode 100644 index 000000000..10936caa7 Binary files /dev/null and b/buglink/bug-x.gif differ diff --git a/buglink/buglink.php b/buglink/buglink.php new file mode 100644 index 000000000..faa97a0cd --- /dev/null +++ b/buglink/buglink.php @@ -0,0 +1,15 @@ + + */ + + +function buglink_install() { register_hook('page_end', 'addon/buglink/buglink.php', 'buglink_active'); } + + +function buglink_uninstall() { unregister_hook('page_end', 'addon/buglink/buglink.php', 'buglink_active'); } + +function buglink_active(&$a,&$b) { $b .= '
' . t('Report Bug') . '
'; } diff --git a/calc/calc.php b/calc/calc.php index 8c079dc7a..a299d45e9 100644 --- a/calc/calc.php +++ b/calc/calc.php @@ -17,7 +17,7 @@ function calc_uninstall() { } function calc_app_menu($a,&$b) { - $b['app_menu'] .= '
Calculator
'; + $b['app_menu'][] = '
Calculator
'; } diff --git a/convert/convert.php b/convert/convert.php index 7a4c90a53..751316503 100644 --- a/convert/convert.php +++ b/convert/convert.php @@ -15,7 +15,7 @@ function convert_uninstall() { } function convert_app_menu($a,&$b) { - $b['app_menu'] .= '
Units Conversion
'; + $b['app_menu'][] = '
Units Conversion
'; } diff --git a/facebook.tgz b/facebook.tgz index 05c7c735f..2eeb5f4f9 100644 Binary files a/facebook.tgz and b/facebook.tgz differ diff --git a/facebook/facebook.php b/facebook/facebook.php index da028dbcd..268f79b16 100644 --- a/facebook/facebook.php +++ b/facebook/facebook.php @@ -48,7 +48,8 @@ define('FACEBOOK_MAXPOSTLEN', 420); function facebook_install() { - register_hook('post_local_end', 'addon/facebook/facebook.php', 'facebook_post_hook'); + register_hook('post_local', 'addon/facebook/facebook.php', 'facebook_post_local'); + register_hook('notifier_normal', 'addon/facebook/facebook.php', 'facebook_post_hook'); register_hook('jot_networks', 'addon/facebook/facebook.php', 'facebook_jot_nets'); register_hook('connector_settings', 'addon/facebook/facebook.php', 'facebook_plugin_settings'); register_hook('cron', 'addon/facebook/facebook.php', 'facebook_cron'); @@ -57,12 +58,16 @@ function facebook_install() { function facebook_uninstall() { - unregister_hook('post_local_end', 'addon/facebook/facebook.php', 'facebook_post_hook'); + unregister_hook('post_local', 'addon/facebook/facebook.php', 'facebook_post_local'); + unregister_hook('notifier_normal', 'addon/facebook/facebook.php', 'facebook_post_hook'); unregister_hook('jot_networks', 'addon/facebook/facebook.php', 'facebook_jot_nets'); unregister_hook('connector_settings', 'addon/facebook/facebook.php', 'facebook_plugin_settings'); - unregister_hook('plugin_settings', 'addon/facebook/facebook.php', 'facebook_plugin_settings'); unregister_hook('cron', 'addon/facebook/facebook.php', 'facebook_cron'); unregister_hook('queue_predeliver', 'addon/facebook/facebook.php', 'fb_queue_hook'); + + // hook moved + unregister_hook('post_local_end', 'addon/facebook/facebook.php', 'facebook_post_hook'); + unregister_hook('plugin_settings', 'addon/facebook/facebook.php', 'facebook_plugin_settings'); } @@ -140,7 +145,7 @@ function fb_get_self($uid) { function fb_get_friends($uid) { - $r = q("SELECT `id` FROM `user` WHERE `uid` = %d AND `account_expired` = 0 LIMIT 1", + $r = q("SELECT `uid` FROM `user` WHERE `uid` = %d AND `account_expired` = 0 LIMIT 1", intval($uid) ); if(! count($r)) @@ -209,13 +214,14 @@ function fb_get_friends($uid) { else { // create contact record - $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `addr`, `alias`, `notify`, `poll`, + $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `addr`, `alias`, `notify`, `poll`, `name`, `nick`, `photo`, `network`, `rel`, `priority`, `writable`, `blocked`, `readonly`, `pending` ) - VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0 ) ", + VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0 ) ", intval($uid), dbesc(datetime_convert()), dbesc($jp->link), + dbesc(normalise_link($jp->link)), dbesc(''), dbesc(''), dbesc($jp->id), @@ -429,6 +435,16 @@ function facebook_cron($a,$b) { foreach($r as $rr) { if(get_pconfig($rr['uid'],'facebook','no_linking')) continue; + $ab = intval(get_config('system','account_abandon_days')); + if($ab > 0) { + $z = q("SELECT `uid` FROM `user` WHERE `uid` = %d AND `login_date` > UTC_TIMESTAMP() - INTERVAL %d DAY LIMIT 1", + intval($rr['uid']), + intval($ab) + ); + if(! count($z)) + continue; + } + // check for new friends once a day $last_friend_check = get_pconfig($rr['uid'],'facebook','friend_check'); if($last_friend_check) @@ -472,6 +488,10 @@ function facebook_jot_nets(&$a,&$b) { function facebook_post_hook(&$a,&$b) { + + if($b['deleted'] || ($b['created'] !== $b['edited'])) + return; + /** * Post to Facebook stream */ @@ -483,18 +503,16 @@ function facebook_post_hook(&$a,&$b) { $reply = false; $likes = false; - if((local_user()) && (local_user() == $b['uid'])) { + $toplevel = (($b['id'] == $b['parent']) ? true : false); - // Facebook is not considered a private network - if($b['prvnets'] && $b['private']) - return; + if(strstr($b['postopts'],'facebook')) { - $linking = ((get_pconfig(local_user(),'facebook','no_linking')) ? 0 : 1); + $linking = ((get_pconfig($b['uid'],'facebook','no_linking')) ? 0 : 1); - if(($b['parent']) && ($linking)) { + if((! $toplevel) && ($linking)) { $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1", intval($b['parent']), - intval(local_user()) + intval($b['uid']) ); if(count($r) && substr($r[0]['uri'],0,4) === 'fb::') $reply = substr($r[0]['uri'],4); @@ -562,24 +580,14 @@ function facebook_post_hook(&$a,&$b) { logger('facebook: have appid+secret'); - $fb_post = intval(get_pconfig(local_user(),'facebook','post')); - $fb_enable = (($fb_post && x($_POST,'facebook_enable')) ? intval($_POST['facebook_enable']) : 0); - $fb_token = get_pconfig(local_user(),'facebook','access_token'); + $fb_token = get_pconfig($b['uid'],'facebook','access_token'); - // if API is used, default to the chosen settings - if($_POST['api_source'] && intval(get_pconfig(local_user(),'facebook','post_by_default'))) - $fb_enable = 1; - - - - - logger('facebook: $fb_post: ' . $fb_post . ' $fb_enable: ' . $fb_enable . ' $fb_token: ' . $fb_token,LOGGER_DEBUG); // post to facebook if it's a public post and we've ticked the 'post to Facebook' box, // or it's a private message with facebook participants // or it's a reply or likes action to an existing facebook post - if($fb_post && $fb_token && ($fb_enable || $b['private'] || $reply)) { + if($fb_token && ($toplevel || $b['private'] || $reply)) { logger('facebook: able to post'); require_once('library/facebook.php'); require_once('include/bbcode.php'); @@ -711,15 +719,8 @@ function facebook_post_hook(&$a,&$b) { else { if(! $likes) { $s = serialize(array('url' => $url, 'item' => $b['id'], 'post' => $postvars)); - q("INSERT INTO `queue` ( `network`, `cid`, `created`, `last`, `content`) - VALUES ( '%s', %d, '%s', '%s', '%s') ", - dbesc(NETWORK_FACEBOOK), - intval($a->contact), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - dbesc($s) - ); - + require_once('include/queue_fn.php'); + add_to_queue($a->contact,NETWORK_FACEBOOK,$s); notice( t('Facebook post failed. Queued for retry.') . EOL); } } @@ -732,6 +733,32 @@ function facebook_post_hook(&$a,&$b) { } +function facebook_post_local(&$a,&$b) { + + // Figure out if Facebook posting is enabled for this post and file it in 'postopts' + // where we will discover it during background delivery. + + // This can only be triggered by a local user posting to their own wall. + + if((local_user()) && (local_user() == $b['uid'])) { + + $fb_post = intval(get_pconfig(local_user(),'facebook','post')); + $fb_enable = (($fb_post && x($_REQUEST,'facebook_enable')) ? intval($_REQUEST['facebook_enable']) : 0); + + // if API is used, default to the chosen settings + if($_REQUEST['api_source'] && intval(get_pconfig(local_user(),'facebook','post_by_default'))) + $fb_enable = 1; + + if(! $fb_enable) + return; + + if(strlen($b['postopts'])) + $b['postopts'] .= ','; + $b['postopts'] .= 'facebook'; + } +} + + function fb_queue_hook(&$a,&$b) { $qi = q("SELECT * FROM `queue` WHERE `network` = '%s'", diff --git a/js_upload.tgz b/js_upload.tgz index bfbbab6ea..96afb12e2 100644 Binary files a/js_upload.tgz and b/js_upload.tgz differ diff --git a/js_upload/js_upload.php b/js_upload/js_upload.php index 1996b8504..c529be366 100644 --- a/js_upload/js_upload.php +++ b/js_upload/js_upload.php @@ -96,6 +96,7 @@ function createUploader() { uploader.setParams( { newalbum : document.getElementById('photos-upload-newalbum').value, album : document.getElementById('photos-upload-album-select').value, + not_visible : document.getElementById('photos-upload-noshare').checked, group_allow : acl.allow_gid.join(','), contact_allow : acl.allow_cid.join(','), group_deny : acl.deny_gid.join(','), @@ -105,6 +106,7 @@ function createUploader() { uploader.setParams( { newalbum : document.getElementById('photos-upload-newalbum').value, album : document.getElementById('photos-upload-album-select').value, + not_visible : document.getElementById('photos-upload-noshare').checked, group_allow : getSelected(document.getElementById('group_allow')).join(','), contact_allow : getSelected(document.getElementById('contact_allow')).join(','), group_deny : getSelected(document.getElementById('group_deny')).join(','), diff --git a/membersince.tgz b/membersince.tgz new file mode 100644 index 000000000..fb44b0081 Binary files /dev/null and b/membersince.tgz differ diff --git a/membersince/membersince.php b/membersince/membersince.php new file mode 100644 index 000000000..25d1207c2 --- /dev/null +++ b/membersince/membersince.php @@ -0,0 +1,17 @@ + + * + */ + +require_once('include/datetime.php'); + +function membersince_install(){ register_hook('profile_advanced','addon/membersince/membersince.php','membersince_display'); } + +function membersince_uninstall(){ unregister_hook('profile_advanced','addon/membersince/membersince.php','membersince_display'); } + +function membersince_display(&$a,&$b) { $b = str_replace('' . "\n" . '
',sprintf( t(' - Member since: %s') . EOL, datetime_convert('UTC',date_default_timezone_get(),$a->profile['register_date'])) . '' . "\n" . '
',$b); } \ No newline at end of file diff --git a/nsfw.tgz b/nsfw.tgz new file mode 100644 index 000000000..f90d2d1cd Binary files /dev/null and b/nsfw.tgz differ diff --git a/nsfw/README b/nsfw/README new file mode 100644 index 000000000..cf2dc2623 --- /dev/null +++ b/nsfw/README @@ -0,0 +1,8 @@ +NSFW + +"Not safe for work" + +Scans the message content for the string 'nsfw' +(case insensitive) and if found replaces the content +with a "click to open/close" link, default is closed. + diff --git a/nsfw/nsfw.css b/nsfw/nsfw.css new file mode 100644 index 000000000..548b63aed --- /dev/null +++ b/nsfw/nsfw.css @@ -0,0 +1,16 @@ + +#nsfw-label { + float: left; + width: 300px; + margin-top: 10px; +} + +#nsfw-words { + float: left; + margin-top: 10px; +} + +#nsfw-submit { + margin-top: 15px; +} + diff --git a/nsfw/nsfw.php b/nsfw/nsfw.php new file mode 100644 index 000000000..718804996 --- /dev/null +++ b/nsfw/nsfw.php @@ -0,0 +1,104 @@ + + * + */ + +function nsfw_install() { + register_hook('prepare_body', 'addon/nsfw/nsfw.php', 'nsfw_prepare_body'); + register_hook('plugin_settings', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings'); + register_hook('plugin_settings_post', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings_post'); + +} + + +function nsfw_uninstall() { + unregister_hook('prepare_body', 'addon/nsfw/nsfw.php', 'nsfw_prepare_body'); + unregister_hook('plugin_settings', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings'); + unregister_hook('plugin_settings_post', 'addon/nsfw/nsfw.php', 'nsfw_addon_settings_post'); + +} + + + + + +function nsfw_addon_settings(&$a,&$s) { + + + if(! local_user()) + return; + + /* Add our stylesheet to the page so we can make our settings look nice */ + + $a->page['htmlhead'] .= '' . "\r\n"; + + + $words = get_pconfig(local_user(),'nsfw','words'); + if(! $words) + $words = 'nsfw,'; + + $s .= '
'; + $s .= '

' . t('"Not Safe For Work" Settings') . '

'; + $s .= '
'; + $s .= ''; + $s .= ''; + $s .= '
'; + + $s .= '
'; + + return; + +} + +function nsfw_addon_settings_post(&$a,&$b) { + + if(! local_user()) + return; + + if($_POST['nsfw-submit']) { + set_pconfig(local_user(),'nsfw','words',trim($_POST['nsfw-words'])); + info( t('NSFW Settings saved.') . EOL); + } +} + +function nsfw_prepare_body(&$a,&$b) { + + $words = null; + if(local_user()) { + $words = get_pconfig(local_user(),'nsfw','words'); + } + if($words) { + $arr = explode(',',$words); + } + else { + $arr = array('nsfw'); + } + + $found = false; + if(count($arr)) { + foreach($arr as $word) { + if(! strlen(trim($word))) { + continue; + } + + if(stristr($b['html'],$word)) { + $found = true; + break; + } + if(stristr($b['item']['tag'], ']' . $word . '[' )) { + $found = true; + break; + } + } + } + if($found) { + $rnd = random_string(8); + $b['html'] = ''; + } +} diff --git a/sniper/sniper.php b/sniper/sniper.php index 8d31e9cd1..cdb5c5021 100644 --- a/sniper/sniper.php +++ b/sniper/sniper.php @@ -16,7 +16,7 @@ function sniper_uninstall() { } function sniper_app_menu($a,&$b) { - $b['app_menu'] .= '
Hot Shot Sniper
'; + $b['app_menu'][] = '
Hot Shot Sniper
'; } diff --git a/statusnet.tgz b/statusnet.tgz index d6bd821fa..93ae0e585 100644 Binary files a/statusnet.tgz and b/statusnet.tgz differ diff --git a/statusnet/statusnet.php b/statusnet/statusnet.php index 4cfa0f03f..c29ea2edc 100644 --- a/statusnet/statusnet.php +++ b/statusnet/statusnet.php @@ -108,7 +108,8 @@ function statusnet_install() { // we need some hooks, for the configuration and for sending tweets register_hook('connector_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings'); register_hook('connector_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post'); - register_hook('post_local_end', 'addon/statusnet/statusnet.php', 'statusnet_post_hook'); + 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'); logger("installed statusnet"); } @@ -117,10 +118,15 @@ function statusnet_install() { function statusnet_uninstall() { unregister_hook('connector_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings'); unregister_hook('connector_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post'); + 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'); + + // old setting - remove only + unregister_hook('post_local_end', 'addon/statusnet/statusnet.php', 'statusnet_post_hook'); unregister_hook('plugin_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings'); unregister_hook('plugin_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post'); - unregister_hook('post_local_end', 'addon/statusnet/statusnet.php', 'statusnet_post_hook'); - unregister_hook('jot_networks', 'addon/statusnet/statusnet.php', 'statusnet_jot_nets'); + } function statusnet_jot_nets(&$a,&$b) { @@ -349,72 +355,77 @@ function statusnet_settings(&$a,&$s) { } +function statusnet_post_local(&$a,&$b) { + if($b['edit']) + return; + + if((local_user()) && (local_user() == $b['uid']) && (! $b['private'])) { + + $statusnet_post = get_pconfig(local_user(),'statusnet','post'); + $statusnet_enable = (($statusnet_post && x($_REQUEST,'statusnet_enable')) ? intval($_REQUEST['statusnet_enable']) : 0); + + // if API is used, default to the chosen settings + if($_REQUEST['api_source'] && intval(get_pconfig(local_user(),'statusnet','post_by_default'))) + $statusnet_enable = 1; + + if(! $statusnet_enable) + return; + + if(strlen($b['postopts'])) + $b['postopts'] .= ','; + $b['postopts'] .= 'statusnet'; + } +} + function statusnet_post_hook(&$a,&$b) { /** * Post to statusnet */ - logger('StatusNet post invoked'); + if($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited'])) + return; - if((local_user()) && (local_user() == $b['uid']) && (! $b['private'])) { + if(! strstr($b['postopts'],'statusnet')) + return; - // mike 2-9-11 there was a restriction to only allow this for top level posts - // now relaxed so should allow one's own comments to be forwarded through the connector as well. + logger('StatusNet post invoked'); - // Status.Net is not considered a private network - if($b['prvnets']) - return; - load_pconfig(local_user(), 'statusnet'); + load_pconfig($b['uid'], 'statusnet'); - $api = get_pconfig(local_user(), 'statusnet', 'baseapi'); - $ckey = get_pconfig(local_user(), 'statusnet', 'consumerkey' ); - $csecret = get_pconfig(local_user(), 'statusnet', 'consumersecret' ); - $otoken = get_pconfig(local_user(), 'statusnet', 'oauthtoken' ); - $osecret = get_pconfig(local_user(), 'statusnet', 'oauthsecret' ); + $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' ); - if($ckey && $csecret && $otoken && $osecret) { + if($ckey && $csecret && $otoken && $osecret) { - $statusnet_post = get_pconfig(local_user(),'statusnet','post'); - $statusnet_enable = (($statusnet_post && x($_POST,'statusnet_enable')) ? intval($_POST['statusnet_enable']) : 0); - // if API is used, default to the chosen settings - if($_POST['api_source'] && intval(get_pconfig(local_user(),'statusnet','post_by_default'))) - $statusnet_enable = 1; - - if($statusnet_enable && $statusnet_post) { - require_once('include/bbcode.php'); - $dent = new StatusNetOAuth($api,$ckey,$csecret,$otoken,$osecret); - $max_char = $dent->get_maxlength(); // max. length for a dent - $msg = strip_tags(bbcode($b['body'])); - // quotes not working - let's try this - $msg = html_entity_decode($msg); - if ( strlen($msg) > $max_char) { - $shortlink = ""; - require_once('library/slinky.php'); - // post url = base url + /display/ + owner + post id - // we construct this from the Owner link and replace - // profile by display - this will cause an error when - // /profile/ is in the owner url twice but I don't - // think this will be very common... - $posturl = str_replace('/profile/','/display/',$b['owner-link']).'/'.$b['id']; - $slinky = new Slinky( $posturl ); - // setup a cascade of shortening services - // try to get a short link from these services - // in the order ur1.ca, trim, id.gd, tinyurl - $slinky->set_cascade( array( new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) ); - $shortlink = $slinky->short(); - // the new message will be shortened such that "... $shortlink" - // will fit into the character limit - $msg = substr($msg, 0, $max_char-strlen($shortlink)-4); - $msg .= '... ' . $shortlink; - } - // and now tweet it :-) - if(strlen($msg)) - $dent->post('statuses/update', array('status' => $msg)); - } + require_once('include/bbcode.php'); + $dent = new StatusNetOAuth($api,$ckey,$csecret,$otoken,$osecret); + $max_char = $dent->get_maxlength(); // max. length for a dent + $msg = strip_tags(bbcode($b['body'])); + // quotes not working - let's try this + $msg = html_entity_decode($msg); + if ( strlen($msg) > $max_char) { + $shortlink = ""; + require_once('library/slinky.php'); + $slinky = new Slinky( $b['plink'] ); + // setup a cascade of shortening services + // try to get a short link from these services + // in the order ur1.ca, trim, id.gd, tinyurl + $slinky->set_cascade( array( new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) ); + $shortlink = $slinky->short(); + // the new message will be shortened such that "... $shortlink" + // will fit into the character limit + $msg = substr($msg, 0, $max_char-strlen($shortlink)-4); + $msg .= '... ' . $shortlink; } - } + // and now tweet it :-) + if(strlen($msg)) + $dent->post('statuses/update', array('status' => $msg)); + } } function statusnet_plugin_admin_post(&$a){ diff --git a/tictac/tictac.php b/tictac/tictac.php index d6cec08a0..1dd1ccb0e 100644 --- a/tictac/tictac.php +++ b/tictac/tictac.php @@ -17,7 +17,7 @@ function tictac_uninstall() { } function tictac_app_menu($a,&$b) { - $b['app_menu'] .= '
' . t('Three Dimensional Tic-Tac-Toe') . '
'; + $b['app_menu'][] = '
' . t('Three Dimensional Tic-Tac-Toe') . '
'; } diff --git a/twitter.tgz b/twitter.tgz index b01692ad6..f4fcc79c7 100644 Binary files a/twitter.tgz and b/twitter.tgz differ diff --git a/twitter/twitter.php b/twitter/twitter.php index 6535ff636..6f13a443b 100644 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -45,7 +45,8 @@ function twitter_install() { // we need some hooks, for the configuration and for sending tweets register_hook('connector_settings', 'addon/twitter/twitter.php', 'twitter_settings'); register_hook('connector_settings_post', 'addon/twitter/twitter.php', 'twitter_settings_post'); - register_hook('post_local_end', 'addon/twitter/twitter.php', 'twitter_post_hook'); + 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'); logger("installed twitter"); } @@ -54,10 +55,15 @@ function twitter_install() { function twitter_uninstall() { unregister_hook('connector_settings', 'addon/twitter/twitter.php', 'twitter_settings'); unregister_hook('connector_settings_post', 'addon/twitter/twitter.php', 'twitter_settings_post'); + 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'); + + // old setting - remove only + unregister_hook('post_local_end', 'addon/twitter/twitter.php', 'twitter_post_hook'); unregister_hook('plugin_settings', 'addon/twitter/twitter.php', 'twitter_settings'); unregister_hook('plugin_settings_post', 'addon/twitter/twitter.php', 'twitter_settings_post'); - unregister_hook('post_local_end', 'addon/twitter/twitter.php', 'twitter_post_hook'); - unregister_hook('jot_networks', 'addon/twitter/twitter.php', 'twitter_jot_nets'); + } function twitter_jot_nets(&$a,&$b) { @@ -200,71 +206,82 @@ function twitter_settings(&$a,&$s) { } +function twitter_post_local(&$a,&$b) { + + if($b['edit']) + return; + + if((local_user()) && (local_user() == $b['uid']) && (! $b['private']) && (! $b['parent']) ) { + + $twitter_post = intval(get_pconfig(local_user(),'twitter','post')); + $twitter_enable = (($twitter_post && x($_REQUEST,'twitter_enable')) ? intval($_REQUEST['twitter_enable']) : 0); + + // if API is used, default to the chosen settings + if($_REQUEST['api_source'] && intval(get_pconfig(local_user(),'twitter','post_by_default'))) + $twitter_enable = 1; + + if(! $twitter_enable) + return; + + if(strlen($b['postopts'])) + $b['postopts'] .= ','; + $b['postopts'] .= 'twitter'; + } +} + + function twitter_post_hook(&$a,&$b) { /** * Post to Twitter */ - logger('twitter post invoked'); + if($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited'])) + return; - if((local_user()) && (local_user() == $b['uid']) && (! $b['private']) && (! $b['parent']) ) { + if(! strstr($b['postopts'],'twitter')) + return; - // Twitter is not considered a private network - if($b['prvnets']) - return; + if($b['parent'] != $b['id']) + return; + + logger('twitter post invoked'); - load_pconfig(local_user(), 'twitter'); + load_pconfig($b['uid'], 'twitter'); - $ckey = get_config('twitter', 'consumerkey' ); - $csecret = get_config('twitter', 'consumersecret' ); - $otoken = get_pconfig(local_user(), 'twitter', 'oauthtoken' ); - $osecret = get_pconfig(local_user(), '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' ); - if($ckey && $csecret && $otoken && $osecret) { + if($ckey && $csecret && $otoken && $osecret) { + logger('twitter: we have customer key and oauth stuff, going to send.', LOGGER_DEBUG); - $twitter_post = intval(get_pconfig(local_user(),'twitter','post')); - $twitter_enable = (($twitter_post && x($_POST,'twitter_enable')) ? intval($_POST['twitter_enable']) : 0); - - // if API is used, default to the chosen settings - if($_POST['api_source'] && intval(get_pconfig(local_user(),'twitter','post_by_default'))) - $twitter_enable = 1; - - if($twitter_post && $twitter_enable) { - logger('Posting to Twitter', LOGGER_DEBUG); - require_once('library/twitteroauth.php'); - require_once('include/bbcode.php'); - $tweet = new TwitterOAuth($ckey,$csecret,$otoken,$osecret); - $max_char = 140; // max. length for a tweet - $msg = strip_tags(bbcode($b['body'])); - if ( strlen($msg) > $max_char) { - $shortlink = ""; - require_once('library/slinky.php'); - // post url = base url + /display/ + owner + post id - // we construct this from the Owner link and replace - // profile by display - this will cause an error when - // /profile/ is in the owner url twice but I don't - // think this will be very common... - $posturl = str_replace('/profile/','/display/',$b['owner-link']).'/'.$b['id']; - $slinky = new Slinky( $posturl ); - // setup a cascade of shortening services - // try to get a short link from these services - // in the order ur1.ca, trim, id.gd, tinyurl - $slinky->set_cascade( array( new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) ); - $shortlink = $slinky->short(); - // the new message will be shortened such that "... $shortlink" - // will fit into the character limit - $msg = substr($msg, 0, $max_char-strlen($shortlink)-4); - $msg .= '... ' . $shortlink; - } - // and now tweet it :-) - if(strlen($msg)) { - $result = $tweet->post('statuses/update', array('status' => $msg)); - logger('twitter_post returns: ' . $result); - } - - } + require_once('library/twitteroauth.php'); + require_once('include/bbcode.php'); + $tweet = new TwitterOAuth($ckey,$csecret,$otoken,$osecret); + $max_char = 138; // max. length for a tweet + $msg = strip_tags(bbcode($b['body'])); + if ( strlen($msg) > $max_char) { + logger('Twitter: have to shorten the message to fit 140 chars', LOGGER_DEBUG); + $shortlink = ""; + require_once('library/slinky.php'); + $slinky = new Slinky( $b['plink'] ); + // setup a cascade of shortening services + // try to get a short link from these services + // in the order ur1.ca, trim, id.gd, tinyurl + $slinky->set_cascade( array( new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) ); + $shortlink = $slinky->short(); + // the new message will be shortened such that "... $shortlink" + // will fit into the character limit + $msg = substr($msg, 0, $max_char-strlen($shortlink)-4); + $msg .= '... ' . $shortlink; + } + // and now tweet it :-) + if(strlen($msg)) { + $result = $tweet->post('statuses/update', array('status' => $msg)); + logger('twitter_post send', LOGGER_DEBUG); } } } diff --git a/widgets.tgz b/widgets.tgz index c3ccc4ac5..4f46fd439 100644 Binary files a/widgets.tgz and b/widgets.tgz differ diff --git a/wppost.tgz b/wppost.tgz index 091f1a59a..c76b41380 100644 Binary files a/wppost.tgz and b/wppost.tgz differ diff --git a/wppost/wppost.php b/wppost/wppost.php index 9aac6c380..235aa8234 100644 --- a/wppost/wppost.php +++ b/wppost/wppost.php @@ -7,17 +7,25 @@ */ function wppost_install() { - register_hook('post_local_end', 'addon/wppost/wppost.php', 'wppost_send'); - register_hook('jot_networks', 'addon/wppost/wppost.php', 'wppost_jot_nets'); - register_hook('plugin_settings', 'addon/wppost/wppost.php', 'wppost_settings'); - register_hook('plugin_settings_post', 'addon/wppost/wppost.php', 'wppost_settings_post'); + register_hook('post_local', 'addon/wppost/wppost.php', 'wppost_post_local'); + register_hook('notifier_normal', 'addon/wppost/wppost.php', 'wppost_send'); + register_hook('jot_networks', 'addon/wppost/wppost.php', 'wppost_jot_nets'); + register_hook('connector_settings', 'addon/wppost/wppost.php', 'wppost_settings'); + register_hook('connector_settings_post', 'addon/wppost/wppost.php', 'wppost_settings_post'); } function wppost_uninstall() { - unregister_hook('post_local_end', 'addon/wppost/wppost.php', 'wppost_send'); + unregister_hook('post_local', 'addon/wppost/wppost.php', 'wppost_post_local'); + unregister_hook('notifier_normal', 'addon/wppost/wppost.php', 'wppost_send'); unregister_hook('jot_networks', 'addon/wppost/wppost.php', 'wppost_jot_nets'); + unregister_hook('connector_settings', 'addon/wppost/wppost.php', 'wppost_settings'); + unregister_hook('connector_settings_post', 'addon/wppost/wppost.php', 'wppost_settings_post'); + + // obsolete - remove + unregister_hook('post_local_end', 'addon/wppost/wppost.php', 'wppost_send'); unregister_hook('plugin_settings', 'addon/wppost/wppost.php', 'wppost_settings'); unregister_hook('plugin_settings_post', 'addon/wppost/wppost.php', 'wppost_settings_post'); + } @@ -109,31 +117,54 @@ function wppost_settings_post(&$a,&$b) { } +function wppost_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; + + $wp_post = intval(get_pconfig(local_user(),'wppost','post')); + + $wp_enable = (($wp_post && x($_REQUEST,'wppost_enable')) ? intval($_REQUEST['wppost_enable']) : 0); + + if($_REQUEST['api_source'] && intval(get_pconfig(local_user(),'wppost','post_by_default'))) + $wp_enable = 1; + + if(! $wp_enable) + return; + + if(strlen($b['postopts'])) + $b['postopts'] .= ','; + $b['postopts'] .= 'wppost'; +} + function wppost_send(&$a,&$b) { - if((! local_user()) || (local_user() != $b['uid'])) - return; + if($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited'])) + return; - if($b['prvnets'] && $b['private']) - return; + if(! strstr($b['postopts'],'wppost')) + return; - if($b['parent']) - return; + if($b['parent'] != $b['id']) + return; - $wp_username = get_pconfig(local_user(),'wppost','wp_username'); - $wp_password = get_pconfig(local_user(),'wppost','wp_password'); - $wp_blog = get_pconfig(local_user(),'wppost','wp_blog'); - $wp_post = intval(get_pconfig(local_user(),'wppost','post')); - $wp_enable = (($wp_post && x($_POST,'wppost_enable')) ? intval($_POST['wppost_enable']) : 0); + $wp_username = get_pconfig($b['uid'],'wppost','wp_username'); + $wp_password = get_pconfig($b['uid'],'wppost','wp_password'); + $wp_blog = get_pconfig($b['uid'],'wppost','wp_blog'); - if($_POST['api_source'] && intval(get_pconfig(local_user(),'wppost','post_by_default'))) - $wp_enable = 1; - - if($wp_username && $wp_password && $wp_blog && $wp_post && $wp_enable) { + if($wp_username && $wp_password && $wp_blog) { require_once('include/bbcode.php');