2010-12-31 02:28:33 -05:00
< ? php
2011-02-06 11:27:16 -05:00
/* Twitter Plugin for Friendika
*
* Author : Tobias Diekershoff
* tobias . diekershoff @ gmx . net
*
* License : 3 - clause BSD license ( same as Friendika )
*
* Configuration :
* To use this plugin you need a OAuth Consumer key pair ( key & secret )
* you can get it from Twitter at https :// twitter . com / apps
*
* Register your Friendika site as " Client " application with " Read & Write " access
* we do not need " Twitter as login " . When you ' ve registered the app you get the
* OAuth Consumer key and secret pair for your application / site .
*
* Add this key pair to your global . htconfig . php
*
* $a -> config [ 'twitter' ][ 'consumerkey' ] = 'your consumer_key here' ;
* $a -> config [ 'twitter' ][ 'consumersecret' ] = 'your consumer_secret here' ;
*
* To activate the plugin itself add it to the $a -> config [ 'system' ][ 'addon' ]
* setting . After this , your user can configure their Twitter account settings
* from " Settings -> Plugin Settings " .
*
2011-02-06 11:37:04 -05:00
* Requirements : PHP5 , curl [ Slinky library ]
*
2011-02-06 11:27:16 -05:00
* Documentation : http :// diekershoff . homeunix . net / redmine / wiki / friendikaplugin / Twitter_Plugin
*/
/* __TODO__
*
* - what about multimedia content ?
* so far we just strip HTML tags from the message
*/
2010-12-31 02:28:33 -05:00
function twitter_install () {
2011-02-06 11:27:16 -05:00
// we need some hooks, for the configuration and for sending tweets
register_hook ( 'plugin_settings' , 'addon/twitter/twitter.php' , 'twitter_settings' );
register_hook ( 'plugin_settings_post' , 'addon/twitter/twitter.php' , 'twitter_settings_post' );
2010-12-31 02:28:33 -05:00
register_hook ( 'post_local_end' , 'addon/twitter/twitter.php' , 'twitter_post_hook' );
2011-02-11 05:35:19 -05:00
register_hook ( 'jot_networks' , 'addon/twitter/twitter.php' , 'twitter_jot_nets' );
2011-02-06 11:27:16 -05:00
logger ( " installed twitter " );
2010-12-31 02:28:33 -05:00
}
function twitter_uninstall () {
2011-02-06 11:27:16 -05:00
unregister_hook ( 'plugin_settings' , 'addon/twitter/twitter.php' , 'twitter_settings' );
unregister_hook ( 'plugin_settings_post' , 'addon/twitter/twitter.php' , 'twitter_settings_post' );
2010-12-31 02:28:33 -05:00
unregister_hook ( 'post_local_end' , 'addon/twitter/twitter.php' , 'twitter_post_hook' );
2011-02-11 05:35:19 -05:00
unregister_hook ( 'jot_networks' , 'addon/twitter/twitter.php' , 'twitter_jot_nets' );
}
function twitter_jot_nets ( & $a , & $b ) {
if ( ! local_user ())
return ;
$tw_post = get_pconfig ( local_user (), 'twitter' , 'post' );
if ( intval ( $tw_post ) == 1 ) {
$tw_defpost = get_pconfig ( local_user (), 'twitter' , 'post_by_default' );
$selected = (( intval ( $tw_defpost == 1 )) ? ' selected="selected" ' : '' );
2011-02-11 07:32:38 -05:00
$b .= '<div class="profile-jot-net"><input type="checkbox" name="twitter_enable"' . $selected . 'value="1" /> '
2011-02-11 05:35:19 -05:00
. t ( 'Post to Twitter' ) . '</div>' ;
}
2010-12-31 02:28:33 -05:00
}
2011-02-06 11:27:16 -05:00
function twitter_settings_post ( $a , $post ) {
if ( ! local_user ())
return ;
if ( isset ( $_POST [ 'twitter-disconnect' ])) {
/***
* if the twitter - disconnect checkbox is set , clear the OAuth key / secret pair
* from the user configuration
* TODO can we revoke the access tokens at Twitter and do we need to do so ?
*/
del_pconfig ( local_user (), 'twitter' , 'consumerkey' );
del_pconfig ( local_user (), 'twitter' , 'consumersecret' );
del_pconfig ( local_user (), 'twitter' , 'post' );
} 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' );
2011-02-21 23:19:33 -05:00
require_once ( 'library/twitteroauth.php' );
2011-02-06 11:27:16 -05:00
$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
$connection = new TwitterOAuth ( $ckey , $csecret , $_POST [ 'twitter-token' ], $_POST [ 'twitter-token2' ]);
$token = $connection -> getAccessToken ( $_POST [ 'twitter-pin' ] );
// ok, now that we have the Access Token, save them in the user config
set_pconfig ( local_user (), 'twitter' , 'oauthtoken' , $token [ 'oauth_token' ]);
set_pconfig ( local_user (), 'twitter' , 'oauthsecret' , $token [ 'oauth_token_secret' ]);
set_pconfig ( local_user (), 'twitter' , 'post' , 1 );
// reload the Addon Settings page, if we don't do it see Bug #42
header ( 'Location: ' . $a -> get_baseurl () . '/settings/addon' );
} else {
// if no PIN is supplied in the POST variables, the user has changed the setting
// to post a tweet for every new __public__ posting to the wall
2011-02-08 08:38:51 -05:00
set_pconfig ( local_user (), 'twitter' , 'post' , intval ( $_POST [ 'twitter-enable' ]));
2011-02-06 11:27:16 -05:00
}}
}
function twitter_settings ( & $a , & $s ) {
if ( ! local_user ())
return ;
$a -> page [ 'htmlhead' ] .= '<link rel="stylesheet" type="text/css" href="' . $a -> get_baseurl () . '/addon/twitter/twitter.css' . '" media="all" />' . " \r \n " ;
/***
* 1 ) Check that we have global consumer key & secret
* 2 ) If no OAuthtoken & stuff is present , generate button to get some
* 3 ) Checkbox for " Send public notices (140 chars only)
*/
$ckey = get_config ( 'twitter' , 'consumerkey' );
$csecret = get_config ( 'twitter' , 'consumersecret' );
$otoken = get_pconfig ( local_user (), 'twitter' , 'oauthtoken' );
$osecret = get_pconfig ( local_user (), 'twitter' , 'oauthsecret' );
$enabled = get_pconfig ( local_user (), 'twitter' , 'post' );
$checked = (( $enabled ) ? ' checked="checked" ' : '' );
2011-02-23 21:24:29 -05:00
$s .= '<div class="settings-block">' ;
2011-02-09 03:40:56 -05:00
$s .= '<h3>' . t ( 'Twitter Posting Settings' ) . '</h3>' ;
2011-02-06 11:27:16 -05:00
if ( ( ! $ckey ) && ( ! $csecret ) ) {
/***
* no global consumer keys
* display warning and skip personal config
*/
2011-02-09 03:40:56 -05:00
$s .= '<p>' . t ( 'No consumer key pair for Twitter found. Please contact your site administrator.' ) . '</p>' ;
2011-02-06 11:27:16 -05:00
} else {
/***
* ok we have a consumer key pair now look into the OAuth stuff
*/
if ( ( ! $otoken ) && ( ! $osecret ) ) {
/***
* the user has not yet connected the account to twitter ...
* get a temporary OAuth key / secret pair and display a button with
* which the user can request a PIN to connect the account to a
* account at Twitter .
*/
require_once ( 'addon/twitter/twitteroauth.php' );
$connection = new TwitterOAuth ( $ckey , $csecret );
$request_token = $connection -> getRequestToken ();
$token = $request_token [ 'oauth_token' ];
/***
* make some nice form
*/
2011-02-09 03:40:56 -05:00
$s .= '<p>' . t ( 'At this Friendika instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter.' ) . '</p>' ;
2011-02-08 08:38:51 -05:00
$s .= '<a href="' . $connection -> getAuthorizeURL ( $token ) . '" target="_twitter"><img src="addon/twitter/lighter.png" alt="' . t ( 'Log in with Twitter' ) . '"></a>' ;
2011-02-06 11:27:16 -05:00
$s .= '<div id="twitter-pin-wrapper">' ;
2011-02-09 03:40:56 -05:00
$s .= '<label id="twitter-pin-label" for="twitter-pin">' . t ( 'Copy the PIN from Twitter here' ) . '</label>' ;
2011-02-06 11:27:16 -05:00
$s .= '<input id="twitter-pin" type="text" name="twitter-pin" />' ;
$s .= '<input id="twitter-token" type="hidden" name="twitter-token" value="' . $token . '" />' ;
$s .= '<input id="twitter-token2" type="hidden" name="twitter-token2" value="' . $request_token [ 'oauth_token_secret' ] . '" />' ;
2011-02-23 21:24:29 -05:00
$s .= '</div><div class="clear"></div>' ;
$s .= '<div class="settings-submit-wrapper" ><input type="submit" name="submit" class="settings-submit" value="' . t ( 'Submit' ) . '" /></div>' ;
2011-02-06 11:27:16 -05:00
} else {
/***
* we have an OAuth key / secret pair for the user
* so let ' s give a chance to disable the postings to Twitter
*/
2011-02-27 01:40:14 -05:00
require_once ( 'library/twitteroauth.php' );
2011-02-06 11:27:16 -05:00
$connection = new TwitterOAuth ( $ckey , $csecret , $otoken , $osecret );
$details = $connection -> get ( 'account/verify_credentials' );
2011-02-09 03:40:56 -05:00
$s .= '<div id="twitter-info" ><img id="twitter-avatar" src="' . $details -> profile_image_url . '" /><p id="twitter-info-block">' . t ( 'Currently connected to: ' ) . '<a href="https://twitter.com/' . $details -> screen_name . '" target="_twitter">' . $details -> screen_name . '</a><br /><em>' . $details -> description . '</em></p></div>' ;
$s .= '<p>' . t ( 'If enabled all your <strong>public</strong> postings will be posted to the associated Twitter account as well.' ) . '</p>' ;
2011-02-06 11:27:16 -05:00
$s .= '<div id="twitter-enable-wrapper">' ;
2011-02-09 03:40:56 -05:00
$s .= '<label id="twitter-enable-label" for="twitter-checkbox">' . t ( 'Send public postings to Twitter' ) . '</label>' ;
2011-02-08 08:38:51 -05:00
$s .= '<input id="twitter-checkbox" type="checkbox" name="twitter-enable" value="1" ' . $checked . '/>' ;
2011-02-06 11:27:16 -05:00
$s .= '</div><div class="clear"></div>' ;
$s .= '<div id="twitter-disconnect-wrapper">' ;
2011-02-09 03:40:56 -05:00
$s .= '<label id="twitter-disconnect-label" for="twitter-disconnect">' . t ( 'Clear OAuth configuration' ) . '</label>' ;
2011-02-06 11:27:16 -05:00
$s .= '<input id="twitter-disconnect" type="checkbox" name="twitter-disconnect" value="1" />' ;
$s .= '</div><div class="clear"></div>' ;
$s .= '<div class="settings-submit-wrapper" ><input type="submit" name="submit" class="settings-submit" value="' . t ( 'Submit' ) . '" /></div>' ;
}
}
2011-02-23 21:24:29 -05:00
$s .= '</div><div class="clear"></div></div>' ;
2011-02-06 11:27:16 -05:00
}
2010-12-31 02:28:33 -05:00
function twitter_post_hook ( & $a , & $b ) {
/**
* Post to Twitter
*/
2011-02-06 11:27:16 -05:00
logger ( 'twitter post invoked' );
2011-02-09 03:40:56 -05:00
if (( local_user ()) && ( local_user () == $b [ 'uid' ]) && ( ! $b [ 'private' ]) && ( ! $b [ 'parent' ]) ) {
2010-12-31 02:28:33 -05:00
load_pconfig ( local_user (), 'twitter' );
2011-02-06 11:27:16 -05:00
$ckey = get_config ( 'twitter' , 'consumerkey' );
$csecret = get_config ( 'twitter' , 'consumersecret' );
2010-12-31 02:28:33 -05:00
$otoken = get_pconfig ( local_user (), 'twitter' , 'oauthtoken' );
$osecret = get_pconfig ( local_user (), 'twitter' , 'oauthsecret' );
if ( $ckey && $csecret && $otoken && $osecret ) {
2011-02-23 21:24:29 -05:00
$twitter_post = intval ( get_pconfig ( local_user (), 'twitter' , 'post' ));
$twitter_enable = (( $twitter_post && x ( $_POST , 'twitter_enable' )) ? intval ( $_POST [ 'twitter_enable' ]) : 0 );
2010-12-31 02:28:33 -05:00
2011-02-11 05:35:19 -05:00
if ( $twitter_post && $twitter_enable ) {
2011-02-23 21:24:29 -05:00
require_once ( 'library/twitteroauth.php' );
2010-12-31 02:28:33 -05:00
require_once ( 'include/bbcode.php' );
$tweet = new TwitterOAuth ( $ckey , $csecret , $otoken , $osecret );
2011-02-06 11:27:16 -05:00
$max_char = 140 ; // max. length for a tweet
$msg = strip_tags ( bbcode ( $b [ 'body' ]));
2011-02-10 06:51:42 -05:00
if ( strlen ( $msg ) > $max_char ) {
$shortlink = " " ;
2011-02-21 23:19:33 -05:00
require_once ( 'library/slinky.php' );
2011-02-10 06:51:42 -05:00
// 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...
2011-02-06 11:27:16 -05:00
$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 () ) );
2011-02-10 06:51:42 -05:00
$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 ))
$tweet -> post ( 'statuses/update' , array ( 'status' => $msg ));
2010-12-31 02:28:33 -05:00
}
}
2011-02-10 06:51:42 -05:00
}
2010-12-31 02:28:33 -05:00
}