2013-05-09 09:11:17 +00:00
< ? php
/**
* Name : pump . io Post Connector
2015-11-14 08:22:32 +00:00
* Description : Bidirectional ( posting , relaying and reading ) connector for pump . io .
2013-09-15 13:30:56 +00:00
* Version : 0.2
2013-05-09 09:11:17 +00:00
* Author : Michael Vogel < http :// pirati . ca / profile / heluecht >
*/
2017-11-06 23:55:24 +00:00
use Friendica\Core\Config ;
use Friendica\Core\PConfig ;
2017-11-13 04:33:14 +00:00
use Friendica\Core\Worker ;
2017-11-13 17:20:30 +00:00
use Friendica\Model\GlobalContact ;
2017-11-19 22:09:54 +00:00
use Friendica\Object\Contact ;
2017-11-13 04:33:14 +00:00
require 'addon/pumpio/oauth/http.php' ;
require 'addon/pumpio/oauth/oauth_client.php' ;
require_once 'include/enotify.php' ;
require_once " mod/share.php " ;
2017-11-06 23:55:24 +00:00
2013-05-09 12:36:50 +00:00
define ( 'PUMPIO_DEFAULT_POLL_INTERVAL' , 5 ); // given in minutes
2013-05-09 09:11:17 +00:00
function pumpio_install () {
2014-06-10 18:13:11 +00:00
register_hook ( 'post_local' , 'addon/pumpio/pumpio.php' , 'pumpio_post_local' );
register_hook ( 'notifier_normal' , 'addon/pumpio/pumpio.php' , 'pumpio_send' );
register_hook ( 'jot_networks' , 'addon/pumpio/pumpio.php' , 'pumpio_jot_nets' );
register_hook ( 'connector_settings' , 'addon/pumpio/pumpio.php' , 'pumpio_settings' );
register_hook ( 'connector_settings_post' , 'addon/pumpio/pumpio.php' , 'pumpio_settings_post' );
register_hook ( 'cron' , 'addon/pumpio/pumpio.php' , 'pumpio_cron' );
register_hook ( 'queue_predeliver' , 'addon/pumpio/pumpio.php' , 'pumpio_queue_hook' );
2016-02-13 12:44:57 +00:00
register_hook ( 'check_item_notification' , 'addon/pumpio/pumpio.php' , 'pumpio_check_item_notification' );
2013-05-09 09:11:17 +00:00
}
2013-09-03 22:04:00 +00:00
2013-05-09 09:11:17 +00:00
function pumpio_uninstall () {
2014-06-10 18:13:11 +00:00
unregister_hook ( 'post_local' , 'addon/pumpio/pumpio.php' , 'pumpio_post_local' );
unregister_hook ( 'notifier_normal' , 'addon/pumpio/pumpio.php' , 'pumpio_send' );
unregister_hook ( 'jot_networks' , 'addon/pumpio/pumpio.php' , 'pumpio_jot_nets' );
unregister_hook ( 'connector_settings' , 'addon/pumpio/pumpio.php' , 'pumpio_settings' );
unregister_hook ( 'connector_settings_post' , 'addon/pumpio/pumpio.php' , 'pumpio_settings_post' );
unregister_hook ( 'cron' , 'addon/pumpio/pumpio.php' , 'pumpio_cron' );
unregister_hook ( 'queue_predeliver' , 'addon/pumpio/pumpio.php' , 'pumpio_queue_hook' );
2016-02-13 12:44:57 +00:00
unregister_hook ( 'check_item_notification' , 'addon/pumpio/pumpio.php' , 'pumpio_check_item_notification' );
2013-05-09 09:11:17 +00:00
}
function pumpio_module () {}
function pumpio_content ( & $a ) {
if ( ! local_user ()) {
notice ( t ( 'Permission denied.' ) . EOL );
return '' ;
}
2014-05-03 09:53:48 +00:00
require_once ( " mod/settings.php " );
settings_init ( $a );
2013-09-27 21:33:35 +00:00
2013-05-09 09:11:17 +00:00
if ( isset ( $a -> argv [ 1 ]))
switch ( $a -> argv [ 1 ]) {
case " connect " :
$o = pumpio_connect ( $a );
break ;
default :
$o = print_r ( $a -> argv , true );
break ;
}
else
$o = pumpio_connect ( $a );
return $o ;
}
2016-02-13 12:44:57 +00:00
function pumpio_check_item_notification ( $a , & $notification_data ) {
2017-11-06 23:55:24 +00:00
$hostname = PConfig :: get ( $notification_data [ " uid " ], 'pumpio' , 'host' );
$username = PConfig :: get ( $notification_data [ " uid " ], " pumpio " , " user " );
2016-02-13 12:44:57 +00:00
$notification_data [ " profiles " ][] = " https:// " . $hostname . " / " . $username ;
}
2013-09-27 21:33:35 +00:00
function pumpio_registerclient ( & $a , $host ) {
2013-05-09 09:11:17 +00:00
$url = " https:// " . $host . " /api/client/register " ;
2014-06-10 18:13:11 +00:00
$params = array ();
2013-05-09 09:11:17 +00:00
2017-11-06 23:55:24 +00:00
$application_name = Config :: get ( 'pumpio' , 'application_name' );
2013-05-09 12:36:50 +00:00
if ( $application_name == " " )
$application_name = $a -> get_hostname ();
2015-04-06 12:04:40 +00:00
$adminlist = explode ( " , " , str_replace ( " " , " " , $a -> config [ 'admin_email' ]));
2014-06-10 18:13:11 +00:00
$params [ " type " ] = " client_associate " ;
2015-04-06 12:04:40 +00:00
$params [ " contacts " ] = $adminlist [ 0 ];
2014-06-10 18:13:11 +00:00
$params [ " application_type " ] = " native " ;
$params [ " application_name " ] = $application_name ;
$params [ " logo_url " ] = $a -> get_baseurl () . " /images/friendica-256.png " ;
$params [ " redirect_uris " ] = $a -> get_baseurl () . " /pumpio/connect " ;
2013-05-09 09:11:17 +00:00
2013-09-29 10:12:17 +00:00
logger ( " pumpio_registerclient: " . $url . " parameters " . print_r ( $params , true ), LOGGER_DEBUG );
2013-09-29 07:33:24 +00:00
2014-06-10 18:13:11 +00:00
$ch = curl_init ( $url );
curl_setopt ( $ch , CURLOPT_HEADER , false );
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , true );
curl_setopt ( $ch , CURLOPT_POST , 1 );
curl_setopt ( $ch , CURLOPT_POSTFIELDS , $params );
curl_setopt ( $ch , CURLOPT_USERAGENT , " Friendica " );
2013-05-09 09:11:17 +00:00
2014-06-10 18:13:11 +00:00
$s = curl_exec ( $ch );
$curl_info = curl_getinfo ( $ch );
2013-05-09 09:11:17 +00:00
2014-06-10 18:13:11 +00:00
if ( $curl_info [ " http_code " ] == " 200 " ) {
$values = json_decode ( $s );
2013-09-29 10:12:17 +00:00
logger ( " pumpio_registerclient: success " . print_r ( $values , true ), LOGGER_DEBUG );
2013-05-09 09:11:17 +00:00
return ( $values );
2014-06-10 18:13:11 +00:00
}
2013-09-29 10:12:17 +00:00
logger ( " pumpio_registerclient: failed: " . print_r ( $curl_info , true ), LOGGER_DEBUG );
2013-05-09 09:11:17 +00:00
return ( false );
2013-09-29 07:33:24 +00:00
2013-05-09 09:11:17 +00:00
}
2013-09-27 21:33:35 +00:00
function pumpio_connect ( & $a ) {
2013-05-09 09:11:17 +00:00
// Start a session. This is necessary to hold on to a few keys the callback script will also need
session_start ();
// Define the needed keys
2017-11-06 23:55:24 +00:00
$consumer_key = PConfig :: get ( local_user (), 'pumpio' , 'consumer_key' );
$consumer_secret = PConfig :: get ( local_user (), 'pumpio' , 'consumer_secret' );
$hostname = PConfig :: get ( local_user (), 'pumpio' , 'host' );
2013-05-09 09:11:17 +00:00
2017-06-09 01:20:27 +00:00
if ((( $consumer_key == " " ) || ( $consumer_secret == " " )) && ( $hostname != " " )) {
2013-09-27 21:33:35 +00:00
logger ( " pumpio_connect: register client " );
2013-05-09 12:36:50 +00:00
$clientdata = pumpio_registerclient ( $a , $hostname );
2017-11-06 23:55:24 +00:00
PConfig :: set ( local_user (), 'pumpio' , 'consumer_key' , $clientdata -> client_id );
PConfig :: set ( local_user (), 'pumpio' , 'consumer_secret' , $clientdata -> client_secret );
2013-05-09 09:11:17 +00:00
2017-11-06 23:55:24 +00:00
$consumer_key = PConfig :: get ( local_user (), 'pumpio' , 'consumer_key' );
$consumer_secret = PConfig :: get ( local_user (), 'pumpio' , 'consumer_secret' );
2013-09-27 21:33:35 +00:00
2013-09-29 07:33:24 +00:00
logger ( " pumpio_connect: ckey: " . $consumer_key . " csecrect: " . $consumer_secret , LOGGER_DEBUG );
2013-05-09 09:11:17 +00:00
}
2017-06-09 01:20:27 +00:00
if (( $consumer_key == " " ) || ( $consumer_secret == " " )) {
2013-09-27 21:33:35 +00:00
logger ( " pumpio_connect: " . sprintf ( " Unable to register the client at the pump.io server '%s'. " , $hostname ));
$o .= sprintf ( t ( " Unable to register the client at the pump.io server '%s'. " ), $hostname );
return ( $o );
}
2013-05-09 09:11:17 +00:00
// The callback URL is the script that gets called after the user authenticates with pumpio
$callback_url = $a -> get_baseurl () . " /pumpio/connect " ;
// Let's begin. First we need a Request Token. The request token is required to send the user
// to pumpio's login page.
// Create a new instance of the TumblrOAuth library. For this step, all we need to give the library is our
// Consumer Key and Consumer Secret
$client = new oauth_client_class ;
$client -> debug = 1 ;
$client -> server = '' ;
$client -> oauth_version = '1.0a' ;
$client -> request_token_url = 'https://' . $hostname . '/oauth/request_token' ;
$client -> dialog_url = 'https://' . $hostname . '/oauth/authorize' ;
$client -> access_token_url = 'https://' . $hostname . '/oauth/access_token' ;
$client -> url_parameters = false ;
$client -> authorization_header = true ;
$client -> redirect_uri = $callback_url ;
$client -> client_id = $consumer_key ;
$client -> client_secret = $consumer_secret ;
if (( $success = $client -> Initialize ())) {
if (( $success = $client -> Process ())) {
if ( strlen ( $client -> access_token )) {
2013-09-29 07:33:24 +00:00
logger ( " pumpio_connect: otoken: " . $client -> access_token . " osecrect: " . $client -> access_token_secret , LOGGER_DEBUG );
2017-11-06 23:55:24 +00:00
PConfig :: set ( local_user (), " pumpio " , " oauth_token " , $client -> access_token );
PConfig :: set ( local_user (), " pumpio " , " oauth_token_secret " , $client -> access_token_secret );
2013-05-09 09:11:17 +00:00
}
}
$success = $client -> Finalize ( $success );
}
2014-06-10 18:13:11 +00:00
if ( $client -> exit )
$o = 'Could not connect to pumpio. Refresh the page or try again later.' ;
2013-05-09 09:11:17 +00:00
2014-06-10 18:13:11 +00:00
if ( $success ) {
2013-09-29 07:33:24 +00:00
logger ( " pumpio_connect: authenticated " );
2013-05-09 09:11:17 +00:00
$o .= t ( " You are now authenticated to pumpio. " );
$o .= '<br /><a href="' . $a -> get_baseurl () . '/settings/connectors">' . t ( " return to the connector page " ) . '</a>' ;
2013-09-29 07:33:24 +00:00
} else {
logger ( " pumpio_connect: could not connect " );
$o = 'Could not connect to pumpio. Refresh the page or try again later.' ;
}
2013-05-09 09:11:17 +00:00
return ( $o );
}
function pumpio_jot_nets ( & $a , & $b ) {
2014-06-10 18:13:11 +00:00
if ( ! local_user ())
return ;
2017-11-06 23:55:24 +00:00
$pumpio_post = PConfig :: get ( local_user (), 'pumpio' , 'post' );
2014-06-10 18:13:11 +00:00
if ( intval ( $pumpio_post ) == 1 ) {
2017-11-06 23:55:24 +00:00
$pumpio_defpost = PConfig :: get ( local_user (), 'pumpio' , 'post_by_default' );
2014-06-10 18:13:11 +00:00
$selected = (( intval ( $pumpio_defpost ) == 1 ) ? ' checked="checked" ' : '' );
$b .= '<div class="profile-jot-net"><input type="checkbox" name="pumpio_enable"' . $selected . ' value="1" /> '
. t ( 'Post to pumpio' ) . '</div>' ;
}
2013-05-09 09:11:17 +00:00
}
function pumpio_settings ( & $a , & $s ) {
2014-06-10 18:13:11 +00:00
if ( ! local_user ())
return ;
2013-09-03 06:22:46 +00:00
2014-06-10 18:13:11 +00:00
/* Add our stylesheet to the page so we can make our settings look nice */
2013-05-09 09:11:17 +00:00
2014-06-10 18:13:11 +00:00
$a -> page [ 'htmlhead' ] .= '<link rel="stylesheet" type="text/css" href="' . $a -> get_baseurl () . '/addon/pumpio/pumpio.css' . '" media="all" />' . " \r \n " ;
2013-05-09 09:11:17 +00:00
2014-06-10 18:13:11 +00:00
/* Get the current state of our config variables */
2013-05-09 12:36:50 +00:00
2017-11-06 23:55:24 +00:00
$import_enabled = PConfig :: get ( local_user (), 'pumpio' , 'import' );
2014-06-10 18:13:11 +00:00
$import_checked = (( $import_enabled ) ? ' checked="checked" ' : '' );
2013-05-09 13:08:08 +00:00
2017-11-06 23:55:24 +00:00
$enabled = PConfig :: get ( local_user (), 'pumpio' , 'post' );
2014-06-10 18:13:11 +00:00
$checked = (( $enabled ) ? ' checked="checked" ' : '' );
$css = (( $enabled ) ? '' : '-disabled' );
2013-05-09 09:11:17 +00:00
2017-11-06 23:55:24 +00:00
$def_enabled = PConfig :: get ( local_user (), 'pumpio' , 'post_by_default' );
2014-06-10 18:13:11 +00:00
$def_checked = (( $def_enabled ) ? ' checked="checked" ' : '' );
2013-05-09 09:11:17 +00:00
2017-11-06 23:55:24 +00:00
$public_enabled = PConfig :: get ( local_user (), 'pumpio' , 'public' );
2014-06-10 18:13:11 +00:00
$public_checked = (( $public_enabled ) ? ' checked="checked" ' : '' );
2013-05-09 09:11:17 +00:00
2017-11-06 23:55:24 +00:00
$mirror_enabled = PConfig :: get ( local_user (), 'pumpio' , 'mirror' );
2014-06-10 18:13:11 +00:00
$mirror_checked = (( $mirror_enabled ) ? ' checked="checked" ' : '' );
2013-05-09 09:11:17 +00:00
2017-11-06 23:55:24 +00:00
$servername = PConfig :: get ( local_user (), " pumpio " , " host " );
$username = PConfig :: get ( local_user (), " pumpio " , " user " );
2013-05-09 12:36:50 +00:00
2014-06-10 18:13:11 +00:00
/* Add some HTML to the existing form */
2013-05-09 13:08:08 +00:00
2014-06-10 18:13:11 +00:00
$s .= '<span id="settings_pumpio_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_pumpio_expanded\'); openClose(\'settings_pumpio_inflated\');">' ;
$s .= '<img class="connector' . $css . '" src="images/pumpio.png" /><h3 class="connector">' . t ( 'Pump.io Import/Export/Mirror' ) . '</h3>' ;
$s .= '</span>' ;
$s .= '<div id="settings_pumpio_expanded" class="settings-block" style="display: none;">' ;
$s .= '<span class="fakelink" onclick="openClose(\'settings_pumpio_expanded\'); openClose(\'settings_pumpio_inflated\');">' ;
$s .= '<img class="connector' . $css . '" src="images/pumpio.png" /><h3 class="connector">' . t ( 'Pump.io Import/Export/Mirror' ) . '</h3>' ;
$s .= '</span>' ;
2013-05-09 09:11:17 +00:00
2014-06-10 18:13:11 +00:00
$s .= '<div id="pumpio-username-wrapper">' ;
$s .= '<label id="pumpio-username-label" for="pumpio-username">' . t ( 'pump.io username (without the servername)' ) . '</label>' ;
$s .= '<input id="pumpio-username" type="text" name="pumpio_user" value="' . $username . '" />' ;
$s .= '</div><div class="clear"></div>' ;
2013-09-03 06:22:46 +00:00
2014-06-10 18:13:11 +00:00
$s .= '<div id="pumpio-servername-wrapper">' ;
$s .= '<label id="pumpio-servername-label" for="pumpio-servername">' . t ( 'pump.io servername (without "http://" or "https://" )' ) . '</label>' ;
$s .= '<input id="pumpio-servername" type="text" name="pumpio_host" value="' . $servername . '" />' ;
$s .= '</div><div class="clear"></div>' ;
2013-06-23 01:30:22 +00:00
2017-06-09 01:20:27 +00:00
if (( $username != '' ) && ( $servername != '' )) {
2013-06-23 01:30:22 +00:00
2017-11-06 23:55:24 +00:00
$oauth_token = PConfig :: get ( local_user (), " pumpio " , " oauth_token " );
$oauth_token_secret = PConfig :: get ( local_user (), " pumpio " , " oauth_token_secret " );
2013-06-23 01:30:22 +00:00
2014-06-10 18:13:11 +00:00
$s .= '<div id="pumpio-password-wrapper">' ;
2017-06-09 01:20:27 +00:00
if (( $oauth_token == " " ) || ( $oauth_token_secret == " " )) {
2014-06-10 18:13:11 +00:00
$s .= '<div id="pumpio-authenticate-wrapper">' ;
$s .= '<a href="' . $a -> get_baseurl () . '/pumpio/connect">' . t ( " Authenticate your pump.io connection " ) . '</a>' ;
$s .= '</div><div class="clear"></div>' ;
} else {
$s .= '<div id="pumpio-import-wrapper">' ;
$s .= '<label id="pumpio-import-label" for="pumpio-import">' . t ( 'Import the remote timeline' ) . '</label>' ;
$s .= '<input id="pumpio-import" type="checkbox" name="pumpio_import" value="1" ' . $import_checked . '/>' ;
$s .= '</div><div class="clear"></div>' ;
$s .= '<div id="pumpio-enable-wrapper">' ;
$s .= '<label id="pumpio-enable-label" for="pumpio-checkbox">' . t ( 'Enable pump.io Post Plugin' ) . '</label>' ;
$s .= '<input id="pumpio-checkbox" type="checkbox" name="pumpio" value="1" ' . $checked . '/>' ;
$s .= '</div><div class="clear"></div>' ;
$s .= '<div id="pumpio-bydefault-wrapper">' ;
$s .= '<label id="pumpio-bydefault-label" for="pumpio-bydefault">' . t ( 'Post to pump.io by default' ) . '</label>' ;
$s .= '<input id="pumpio-bydefault" type="checkbox" name="pumpio_bydefault" value="1" ' . $def_checked . '/>' ;
$s .= '</div><div class="clear"></div>' ;
$s .= '<div id="pumpio-public-wrapper">' ;
$s .= '<label id="pumpio-public-label" for="pumpio-public">' . t ( 'Should posts be public?' ) . '</label>' ;
$s .= '<input id="pumpio-public" type="checkbox" name="pumpio_public" value="1" ' . $public_checked . '/>' ;
$s .= '</div><div class="clear"></div>' ;
$s .= '<div id="pumpio-mirror-wrapper">' ;
$s .= '<label id="pumpio-mirror-label" for="pumpio-mirror">' . t ( 'Mirror all public posts' ) . '</label>' ;
$s .= '<input id="pumpio-mirror" type="checkbox" name="pumpio_mirror" value="1" ' . $mirror_checked . '/>' ;
$s .= '</div><div class="clear"></div>' ;
$s .= '<div id="pumpio-delete-wrapper">' ;
$s .= '<label id="pumpio-delete-label" for="pumpio-delete">' . t ( 'Check to delete this preset' ) . '</label>' ;
$s .= '<input id="pumpio-delete" type="checkbox" name="pumpio_delete" value="1" />' ;
$s .= '</div><div class="clear"></div>' ;
}
2013-06-23 01:30:22 +00:00
$s .= '</div><div class="clear"></div>' ;
}
2013-05-09 09:11:17 +00:00
2014-06-10 18:13:11 +00:00
/* provide a submit button */
2013-05-09 09:11:17 +00:00
2014-06-10 18:13:11 +00:00
$s .= '<div class="settings-submit-wrapper" ><input type="submit" id="pumpio-submit" name="pumpio-submit" class="settings-submit" value="' . t ( 'Save Settings' ) . '" /></div></div>' ;
2013-05-09 09:11:17 +00:00
}
function pumpio_settings_post ( & $a , & $b ) {
if ( x ( $_POST , 'pumpio-submit' )) {
2013-06-23 01:30:22 +00:00
if ( x ( $_POST , 'pumpio_delete' )) {
2017-11-06 23:55:24 +00:00
PConfig :: set ( local_user (), 'pumpio' , 'consumer_key' , '' );
PConfig :: set ( local_user (), 'pumpio' , 'consumer_secret' , '' );
PConfig :: set ( local_user (), 'pumpio' , 'oauth_token' , '' );
PConfig :: set ( local_user (), 'pumpio' , 'oauth_token_secret' , '' );
PConfig :: set ( local_user (), 'pumpio' , 'post' , false );
PConfig :: set ( local_user (), 'pumpio' , 'import' , false );
PConfig :: set ( local_user (), 'pumpio' , 'host' , '' );
PConfig :: set ( local_user (), 'pumpio' , 'user' , '' );
PConfig :: set ( local_user (), 'pumpio' , 'public' , false );
PConfig :: set ( local_user (), 'pumpio' , 'mirror' , false );
PConfig :: set ( local_user (), 'pumpio' , 'post_by_default' , false );
PConfig :: set ( local_user (), 'pumpio' , 'lastdate' , 0 );
PConfig :: set ( local_user (), 'pumpio' , 'last_id' , '' );
2013-06-23 01:30:22 +00:00
} else {
// filtering the username if it is filled wrong
$user = $_POST [ 'pumpio_user' ];
if ( strstr ( $user , " @ " )) {
$pos = strpos ( $user , " @ " );
if ( $pos > 0 )
$user = substr ( $user , 0 , $pos );
}
2013-05-09 09:11:17 +00:00
2013-06-23 01:30:22 +00:00
// Filtering the hostname if someone is entering it with "http"
$host = $_POST [ 'pumpio_host' ];
$host = trim ( $host );
$host = str_replace ( array ( " https:// " , " http:// " ), array ( " " , " " ), $host );
2017-11-06 23:55:24 +00:00
PConfig :: set ( local_user (), 'pumpio' , 'post' , intval ( $_POST [ 'pumpio' ]));
PConfig :: set ( local_user (), 'pumpio' , 'import' , $_POST [ 'pumpio_import' ]);
PConfig :: set ( local_user (), 'pumpio' , 'host' , $host );
PConfig :: set ( local_user (), 'pumpio' , 'user' , $user );
PConfig :: set ( local_user (), 'pumpio' , 'public' , $_POST [ 'pumpio_public' ]);
PConfig :: set ( local_user (), 'pumpio' , 'mirror' , $_POST [ 'pumpio_mirror' ]);
PConfig :: set ( local_user (), 'pumpio' , 'post_by_default' , intval ( $_POST [ 'pumpio_bydefault' ]));
2013-09-29 19:56:37 +00:00
2014-05-16 05:50:09 +00:00
if ( ! $_POST [ 'pumpio_mirror' ])
2017-11-11 06:23:15 +00:00
PConfig :: delete ( local_user (), 'pumpio' , 'lastdate' );
2014-05-16 05:50:09 +00:00
2014-05-03 09:53:48 +00:00
//header("Location: ".$a->get_baseurl()."/pumpio/connect");
2013-06-23 01:30:22 +00:00
}
2013-05-09 09:11:17 +00:00
}
}
2017-09-06 16:16:33 +00:00
function pumpio_post_local ( & $a , & $b ) {
2013-05-09 09:11:17 +00:00
2017-09-06 16:16:33 +00:00
if ( ! local_user () || ( local_user () != $b [ 'uid' ])) {
2013-05-09 09:11:17 +00:00
return ;
2017-09-06 16:16:33 +00:00
}
2013-05-09 09:11:17 +00:00
2017-11-06 23:55:24 +00:00
$pumpio_post = intval ( PConfig :: get ( local_user (), 'pumpio' , 'post' ));
2013-05-09 09:11:17 +00:00
$pumpio_enable = (( $pumpio_post && x ( $_REQUEST , 'pumpio_enable' )) ? intval ( $_REQUEST [ 'pumpio_enable' ]) : 0 );
2017-11-06 23:55:24 +00:00
if ( $b [ 'api_source' ] && intval ( PConfig :: get ( local_user (), 'pumpio' , 'post_by_default' ))) {
2013-05-09 09:11:17 +00:00
$pumpio_enable = 1 ;
2017-09-06 16:16:33 +00:00
}
2013-05-09 09:11:17 +00:00
2017-09-06 16:16:33 +00:00
if ( ! $pumpio_enable ) {
2013-05-09 09:11:17 +00:00
return ;
2017-09-06 16:16:33 +00:00
}
2013-05-09 09:11:17 +00:00
2017-09-06 16:16:33 +00:00
if ( strlen ( $b [ 'postopts' ])) {
2013-05-09 09:11:17 +00:00
$b [ 'postopts' ] .= ',' ;
2017-09-06 16:16:33 +00:00
}
2013-05-09 09:11:17 +00:00
$b [ 'postopts' ] .= 'pumpio' ;
}
function pumpio_send ( & $a , & $b ) {
2013-09-05 06:35:37 +00:00
2017-11-06 23:55:24 +00:00
if ( ! PConfig :: get ( $b [ " uid " ], 'pumpio' , 'import' )) {
2013-09-12 21:20:26 +00:00
if ( $b [ 'deleted' ] || $b [ 'private' ] || ( $b [ 'created' ] !== $b [ 'edited' ]))
return ;
2013-09-05 06:35:37 +00:00
}
2013-10-02 20:19:28 +00:00
logger ( " pumpio_send: parameter " . print_r ( $b , true ), LOGGER_DATA );
2013-05-09 09:11:17 +00:00
2013-09-03 06:22:46 +00:00
if ( $b [ 'parent' ] != $b [ 'id' ]) {
// Looking if its a reply to a pumpio post
$r = q ( " SELECT item.* FROM item, contact WHERE item.id = %d AND item.uid = %d AND contact.id = `contact-id` AND contact.network='%s'LIMIT 1 " ,
intval ( $b [ " parent " ]),
intval ( $b [ " uid " ]),
dbesc ( NETWORK_PUMPIO ));
2013-09-12 21:20:26 +00:00
if ( ! count ( $r )) {
logger ( " pumpio_send: no pumpio post " . $b [ " parent " ]);
2013-09-03 06:22:46 +00:00
return ;
2013-09-12 21:20:26 +00:00
} else {
2013-09-03 06:22:46 +00:00
$iscomment = true ;
$orig_post = $r [ 0 ];
}
} else {
$iscomment = false ;
2013-05-09 09:11:17 +00:00
2013-09-08 15:09:01 +00:00
$receiver = pumpio_getreceiver ( $a , $b );
2013-09-03 06:22:46 +00:00
2013-09-08 15:09:01 +00:00
logger ( " pumpio_send: receiver " . print_r ( $receiver , true ));
2017-06-09 01:20:27 +00:00
if ( ! count ( $receiver ) && ( $b [ 'private' ] || ! strstr ( $b [ 'postopts' ], 'pumpio' )))
2013-09-03 06:22:46 +00:00
return ;
2017-11-25 23:56:18 +00:00
// Dont't post if the post doesn't belong to us.
// This is a check for forum postings
$self = dba :: select ( 'contact' , array ( 'id' ), array ( 'uid' => $b [ 'uid' ], 'self' => true ), array ( 'limit' => 1 ));
if ( $b [ 'contact-id' ] != $self [ 'id' ]) {
return ;
}
2013-09-03 06:22:46 +00:00
}
2013-05-09 09:11:17 +00:00
2013-09-12 21:20:26 +00:00
if ( $b [ 'verb' ] == ACTIVITY_LIKE ) {
if ( $b [ 'deleted' ])
pumpio_action ( $a , $b [ " uid " ], $b [ " thr-parent " ], " unlike " );
else
pumpio_action ( $a , $b [ " uid " ], $b [ " thr-parent " ], " like " );
return ;
}
if ( $b [ 'verb' ] == ACTIVITY_DISLIKE )
return ;
2017-06-09 01:20:27 +00:00
if (( $b [ 'verb' ] == ACTIVITY_POST ) && ( $b [ 'created' ] !== $b [ 'edited' ]) && ! $b [ 'deleted' ])
2013-09-12 21:20:26 +00:00
pumpio_action ( $a , $b [ " uid " ], $b [ " uri " ], " update " , $b [ " body " ]);
2017-06-09 01:20:27 +00:00
if (( $b [ 'verb' ] == ACTIVITY_POST ) && $b [ 'deleted' ])
2013-09-12 21:20:26 +00:00
pumpio_action ( $a , $b [ " uid " ], $b [ " uri " ], " delete " );
if ( $b [ 'deleted' ] || ( $b [ 'created' ] !== $b [ 'edited' ]))
return ;
2013-05-09 12:36:50 +00:00
// if post comes from pump.io don't send it back
if ( $b [ 'app' ] == " pump.io " )
return ;
2014-04-29 12:23:39 +00:00
// To-Do;
// Support for native shares
// http://<hostname>/api/<type>/shares?id=<the-object-id>
2013-09-05 06:35:37 +00:00
2017-11-06 23:55:24 +00:00
$oauth_token = PConfig :: get ( $b [ 'uid' ], " pumpio " , " oauth_token " );
$oauth_token_secret = PConfig :: get ( $b [ 'uid' ], " pumpio " , " oauth_token_secret " );
$consumer_key = PConfig :: get ( $b [ 'uid' ], " pumpio " , " consumer_key " );
$consumer_secret = PConfig :: get ( $b [ 'uid' ], " pumpio " , " consumer_secret " );
2013-05-09 09:11:17 +00:00
2017-11-06 23:55:24 +00:00
$host = PConfig :: get ( $b [ 'uid' ], " pumpio " , " host " );
$user = PConfig :: get ( $b [ 'uid' ], " pumpio " , " user " );
$public = PConfig :: get ( $b [ 'uid' ], " pumpio " , " public " );
2013-05-09 09:11:17 +00:00
if ( $oauth_token && $oauth_token_secret ) {
require_once ( 'include/bbcode.php' );
$title = trim ( $b [ 'title' ]);
2014-01-26 08:53:12 +00:00
$content = bbcode ( $b [ 'body' ], false , false , 4 );
2013-07-20 12:58:42 +00:00
2013-05-15 20:22:16 +00:00
$params = array ();
2013-05-09 09:11:17 +00:00
2013-05-15 20:22:16 +00:00
$params [ " verb " ] = " post " ;
2013-09-03 06:22:46 +00:00
if ( ! $iscomment ) {
$params [ " object " ] = array (
'objectType' => " note " ,
2014-11-10 22:00:39 +00:00
'content' => $content );
if ( $title != " " )
$params [ " object " ][ " displayName " ] = $title ;
2013-09-03 06:22:46 +00:00
2013-09-08 15:09:01 +00:00
if ( count ( $receiver [ " to " ]))
$params [ " to " ] = $receiver [ " to " ];
if ( count ( $receiver [ " bto " ]))
$params [ " bto " ] = $receiver [ " bto " ];
if ( count ( $receiver [ " cc " ]))
$params [ " cc " ] = $receiver [ " cc " ];
if ( count ( $receiver [ " bcc " ]))
$params [ " bcc " ] = $receiver [ " bcc " ];
2013-09-03 06:22:46 +00:00
} else {
$inReplyTo = array ( " id " => $orig_post [ " uri " ],
" objectType " => " note " );
2017-06-09 01:20:27 +00:00
if (( $orig_post [ " object-type " ] != " " ) && ( strstr ( $orig_post [ " object-type " ], NAMESPACE_ACTIVITY_SCHEMA )))
2014-07-21 22:40:02 +00:00
$inReplyTo [ " objectType " ] = str_replace ( NAMESPACE_ACTIVITY_SCHEMA , '' , $orig_post [ " object-type " ]);
2013-09-03 06:22:46 +00:00
$params [ " object " ] = array (
'objectType' => " comment " ,
2014-11-10 22:00:39 +00:00
'content' => $content ,
2013-09-03 06:22:46 +00:00
'inReplyTo' => $inReplyTo );
2014-11-10 22:00:39 +00:00
if ( $title != " " )
$params [ " object " ][ " displayName " ] = $title ;
2013-09-03 06:22:46 +00:00
}
2013-05-09 12:36:50 +00:00
2013-05-09 09:11:17 +00:00
$client = new oauth_client_class ;
$client -> oauth_version = '1.0a' ;
$client -> url_parameters = false ;
$client -> authorization_header = true ;
$client -> access_token = $oauth_token ;
$client -> access_token_secret = $oauth_token_secret ;
$client -> client_id = $consumer_key ;
$client -> client_secret = $consumer_secret ;
2013-07-19 21:34:54 +00:00
$username = $user . '@' . $host ;
2013-09-03 06:22:46 +00:00
$url = 'https://' . $host . '/api/user/' . $user . '/feed' ;
2015-11-02 23:42:04 +00:00
if ( pumpio_reachable ( $url ))
$success = $client -> CallAPI ( $url , 'POST' , $params , array ( 'FailOnAccessError' => true , 'RequestContentType' => 'application/json' ), $user );
else
$success = false ;
2013-09-03 06:22:46 +00:00
if ( $success ) {
2015-03-22 07:55:45 +00:00
if ( $user -> generator -> displayName )
2017-11-06 23:55:24 +00:00
PConfig :: set ( $b [ " uid " ], " pumpio " , " application_name " , $user -> generator -> displayName );
2015-03-22 07:55:45 +00:00
2013-09-03 06:22:46 +00:00
$post_id = $user -> object -> id ;
logger ( 'pumpio_send ' . $username . ': success ' . $post_id );
2017-06-09 01:20:27 +00:00
if ( $post_id && $iscomment ) {
2013-09-03 06:22:46 +00:00
logger ( 'pumpio_send ' . $username . ': Update extid ' . $post_id . " for post id " . $b [ 'id' ]);
2013-10-18 22:27:22 +00:00
q ( " UPDATE `item` SET `extid` = '%s' WHERE `id` = %d " ,
2013-09-03 06:22:46 +00:00
dbesc ( $post_id ),
intval ( $b [ 'id' ])
);
}
} else {
2013-09-05 06:35:37 +00:00
logger ( 'pumpio_send ' . $username . ': ' . $url . ' general error: ' . print_r ( $user , true ));
2013-05-09 09:11:17 +00:00
2013-09-03 22:04:00 +00:00
$r = q ( " SELECT `id` FROM `contact` WHERE `uid` = %d AND `self` " , $b [ 'uid' ]);
if ( count ( $r ))
$a -> contact = $r [ 0 ][ " id " ];
2013-09-03 06:22:46 +00:00
$s = serialize ( array ( 'url' => $url , 'item' => $b [ 'id' ], 'post' => $params ));
require_once ( 'include/queue_fn.php' );
add_to_queue ( $a -> contact , NETWORK_PUMPIO , $s );
notice ( t ( 'Pump.io post failed. Queued for retry.' ) . EOL );
}
2013-05-09 09:11:17 +00:00
}
}
2014-08-25 12:19:09 +00:00
function pumpio_action ( & $a , $uid , $uri , $action , $content = " " ) {
2013-09-12 21:20:26 +00:00
// Don't do likes and other stuff if you don't import the timeline
2017-11-06 23:55:24 +00:00
if ( ! PConfig :: get ( $uid , 'pumpio' , 'import' ))
2013-09-12 21:20:26 +00:00
return ;
2017-11-06 23:55:24 +00:00
$ckey = PConfig :: get ( $uid , 'pumpio' , 'consumer_key' );
$csecret = PConfig :: get ( $uid , 'pumpio' , 'consumer_secret' );
$otoken = PConfig :: get ( $uid , 'pumpio' , 'oauth_token' );
$osecret = PConfig :: get ( $uid , 'pumpio' , 'oauth_token_secret' );
$hostname = PConfig :: get ( $uid , 'pumpio' , 'host' );
$username = PConfig :: get ( $uid , " pumpio " , " user " );
2013-09-05 06:35:37 +00:00
$r = q ( " SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $uri ),
intval ( $uid )
);
if ( ! count ( $r ))
return ;
$orig_post = $r [ 0 ];
2017-06-09 01:20:27 +00:00
if ( $orig_post [ " extid " ] && ! strstr ( $orig_post [ " extid " ], " /proxy/ " ))
2013-09-05 06:35:37 +00:00
$uri = $orig_post [ " extid " ];
else
$uri = $orig_post [ " uri " ];
2017-06-09 01:20:27 +00:00
if (( $orig_post [ " object-type " ] != " " ) && ( strstr ( $orig_post [ " object-type " ], NAMESPACE_ACTIVITY_SCHEMA )))
2014-07-21 22:40:02 +00:00
$objectType = str_replace ( NAMESPACE_ACTIVITY_SCHEMA , '' , $orig_post [ " object-type " ]);
elseif ( strstr ( $uri , " /api/comment/ " ))
2013-09-05 06:35:37 +00:00
$objectType = " comment " ;
elseif ( strstr ( $uri , " /api/note/ " ))
$objectType = " note " ;
elseif ( strstr ( $uri , " /api/image/ " ))
$objectType = " image " ;
$params [ " verb " ] = $action ;
2013-09-07 11:10:51 +00:00
$params [ " object " ] = array ( 'id' => $uri ,
" objectType " => $objectType ,
" content " => $content );
2013-09-05 06:35:37 +00:00
$client = new oauth_client_class ;
$client -> oauth_version = '1.0a' ;
$client -> authorization_header = true ;
$client -> url_parameters = false ;
$client -> client_id = $ckey ;
$client -> client_secret = $csecret ;
$client -> access_token = $otoken ;
$client -> access_token_secret = $osecret ;
$url = 'https://' . $hostname . '/api/user/' . $username . '/feed' ;
2015-11-02 23:42:04 +00:00
if ( pumpio_reachable ( $url ))
$success = $client -> CallAPI ( $url , 'POST' , $params , array ( 'FailOnAccessError' => true , 'RequestContentType' => 'application/json' ), $user );
else
$success = false ;
2013-09-05 06:35:37 +00:00
if ( $success )
2013-09-07 11:10:51 +00:00
logger ( 'pumpio_action ' . $username . ' ' . $action . ': success ' . $uri );
2013-09-05 06:35:37 +00:00
else {
2013-09-07 11:10:51 +00:00
logger ( 'pumpio_action ' . $username . ' ' . $action . ': general error: ' . $uri . ' ' . print_r ( $user , true ));
2013-09-05 06:35:37 +00:00
$r = q ( " SELECT `id` FROM `contact` WHERE `uid` = %d AND `self` " , $b [ 'uid' ]);
if ( count ( $r ))
$a -> contact = $r [ 0 ][ " id " ];
$s = serialize ( array ( 'url' => $url , 'item' => $orig_post [ " id " ], 'post' => $params ));
require_once ( 'include/queue_fn.php' );
add_to_queue ( $a -> contact , NETWORK_PUMPIO , $s );
notice ( t ( 'Pump.io like failed. Queued for retry.' ) . EOL );
}
}
2015-09-13 17:08:10 +00:00
function pumpio_sync ( & $a ) {
2015-09-26 09:17:12 +00:00
$r = q ( " SELECT * FROM `addon` WHERE `installed` = 1 AND `name` = 'pumpio' " ,
$plugin );
if ( ! count ( $r ))
return ;
2017-11-06 23:55:24 +00:00
$last = Config :: get ( 'pumpio' , 'last_poll' );
2014-06-10 18:13:11 +00:00
2017-11-06 23:55:24 +00:00
$poll_interval = intval ( Config :: get ( 'pumpio' , 'poll_interval' ));
2014-06-10 18:13:11 +00:00
if ( ! $poll_interval )
$poll_interval = PUMPIO_DEFAULT_POLL_INTERVAL ;
if ( $last ) {
$next = $last + ( $poll_interval * 60 );
if ( $next > time ()) {
logger ( 'pumpio: poll intervall not reached' );
return ;
}
}
logger ( 'pumpio: cron_start' );
$r = q ( " SELECT * FROM `pconfig` WHERE `cat` = 'pumpio' AND `k` = 'mirror' AND `v` = '1' ORDER BY RAND() " );
if ( count ( $r )) {
foreach ( $r as $rr ) {
logger ( 'pumpio: mirroring user ' . $rr [ 'uid' ]);
pumpio_fetchtimeline ( $a , $rr [ 'uid' ]);
}
}
2013-05-09 12:36:50 +00:00
2017-11-06 23:55:24 +00:00
$abandon_days = intval ( Config :: get ( 'system' , 'account_abandon_days' ));
2015-01-09 06:07:07 +00:00
if ( $abandon_days < 1 )
$abandon_days = 0 ;
$abandon_limit = date ( " Y-m-d H:i:s " , time () - $abandon_days * 86400 );
2013-09-03 06:22:46 +00:00
$r = q ( " SELECT * FROM `pconfig` WHERE `cat` = 'pumpio' AND `k` = 'import' AND `v` = '1' ORDER BY RAND() " );
if ( count ( $r )) {
foreach ( $r as $rr ) {
2015-01-09 06:07:07 +00:00
if ( $abandon_days != 0 ) {
$user = q ( " SELECT `login_date` FROM `user` WHERE uid=%d AND `login_date` >= '%s' " , $rr [ 'uid' ], $abandon_limit );
if ( ! count ( $user )) {
logger ( 'abandoned account: timeline from user ' . $rr [ 'uid' ] . ' will not be imported' );
continue ;
}
}
2013-09-03 06:22:46 +00:00
logger ( 'pumpio: importing timeline from user ' . $rr [ 'uid' ]);
pumpio_fetchinbox ( $a , $rr [ 'uid' ]);
2013-09-15 08:47:08 +00:00
// check for new contacts once a day
2017-11-06 23:55:24 +00:00
$last_contact_check = PConfig :: get ( $rr [ 'uid' ], 'pumpio' , 'contact_check' );
2013-09-15 08:47:08 +00:00
if ( $last_contact_check )
$next_contact_check = $last_contact_check + 86400 ;
else
$next_contact_check = 0 ;
if ( $next_contact_check <= time ()) {
pumpio_getallusers ( $a , $rr [ " uid " ]);
2017-11-06 23:55:24 +00:00
PConfig :: set ( $rr [ 'uid' ], 'pumpio' , 'contact_check' , time ());
2013-09-15 08:47:08 +00:00
}
2013-09-03 06:22:46 +00:00
}
}
logger ( 'pumpio: cron_end' );
2013-05-09 12:36:50 +00:00
2017-11-06 23:55:24 +00:00
Config :: set ( 'pumpio' , 'last_poll' , time ());
2013-05-09 12:36:50 +00:00
}
2015-09-13 17:08:10 +00:00
function pumpio_cron ( & $a , $b ) {
2017-11-05 15:07:52 +00:00
Worker :: add ( PRIORITY_MEDIUM , " addon/pumpio/pumpio_sync.php " );
2015-09-13 17:08:10 +00:00
}
2013-09-27 21:33:35 +00:00
function pumpio_fetchtimeline ( & $a , $uid ) {
2017-11-06 23:55:24 +00:00
$ckey = PConfig :: get ( $uid , 'pumpio' , 'consumer_key' );
$csecret = PConfig :: get ( $uid , 'pumpio' , 'consumer_secret' );
$otoken = PConfig :: get ( $uid , 'pumpio' , 'oauth_token' );
$osecret = PConfig :: get ( $uid , 'pumpio' , 'oauth_token_secret' );
$lastdate = PConfig :: get ( $uid , 'pumpio' , 'lastdate' );
$hostname = PConfig :: get ( $uid , 'pumpio' , 'host' );
$username = PConfig :: get ( $uid , " pumpio " , " user " );
2013-05-09 12:36:50 +00:00
2015-03-22 07:55:45 +00:00
// get the application name for the pump.io app
// 1st try personal config, then system config and fallback to the
// hostname of the node if neither one is set.
2017-11-06 23:55:24 +00:00
$application_name = PConfig :: get ( $uid , 'pumpio' , 'application_name' );
2015-03-22 07:55:45 +00:00
if ( $application_name == " " )
2017-11-06 23:55:24 +00:00
$application_name = Config :: get ( 'pumpio' , 'application_name' );
2013-05-09 12:36:50 +00:00
if ( $application_name == " " )
$application_name = $a -> get_hostname ();
2013-05-16 20:58:48 +00:00
$first_time = ( $lastdate == " " );
2013-05-09 12:36:50 +00:00
$client = new oauth_client_class ;
$client -> oauth_version = '1.0a' ;
$client -> authorization_header = true ;
$client -> url_parameters = false ;
$client -> client_id = $ckey ;
2013-05-15 20:22:16 +00:00
$client -> client_secret = $csecret ;
2013-05-09 12:36:50 +00:00
$client -> access_token = $otoken ;
$client -> access_token_secret = $osecret ;
2013-05-15 20:22:16 +00:00
$url = 'https://' . $hostname . '/api/user/' . $username . '/feed/major' ;
logger ( 'pumpio: fetching for user ' . $uid . ' ' . $url . ' C:' . $client -> client_id . ' CS:' . $client -> client_secret . ' T:' . $client -> access_token . ' TS:' . $client -> access_token_secret );
2013-07-19 21:34:54 +00:00
$username = $user . '@' . $host ;
2015-11-02 23:42:04 +00:00
if ( pumpio_reachable ( $url ))
$success = $client -> CallAPI ( $url , 'GET' , array (), array ( 'FailOnAccessError' => true ), $user );
else
$success = false ;
2013-05-15 20:22:16 +00:00
if ( ! $success ) {
2013-07-19 21:34:54 +00:00
logger ( 'pumpio: error fetching posts for user ' . $uid . " " . $username . " " . print_r ( $user , true ));
2013-05-15 20:22:16 +00:00
return ;
}
2013-05-09 12:36:50 +00:00
2013-05-09 13:08:08 +00:00
$posts = array_reverse ( $user -> items );
$initiallastdate = $lastdate ;
2013-05-16 20:58:48 +00:00
$lastdate = '' ;
2013-05-09 12:36:50 +00:00
if ( count ( $posts )) {
foreach ( $posts as $post ) {
2014-05-15 21:20:11 +00:00
if ( $post -> published <= $initiallastdate )
2013-05-09 12:36:50 +00:00
continue ;
2014-05-15 21:20:11 +00:00
if ( $lastdate < $post -> published )
$lastdate = $post -> published ;
2013-05-09 13:08:08 +00:00
2013-05-16 20:58:48 +00:00
if ( $first_time )
continue ;
2013-05-09 13:08:08 +00:00
2013-05-16 21:36:05 +00:00
$receiptians = array ();
if ( @ is_array ( $post -> cc ))
$receiptians = array_merge ( $receiptians , $post -> cc );
if ( @ is_array ( $post -> to ))
$receiptians = array_merge ( $receiptians , $post -> to );
$public = false ;
foreach ( $receiptians AS $receiver )
if ( is_string ( $receiver -> objectType ))
if ( $receiver -> id == " http://activityschema.org/collection/public " )
$public = true ;
2017-06-09 01:20:27 +00:00
if ( $public && ! stristr ( $post -> generator -> displayName , $application_name )) {
2013-05-09 12:36:50 +00:00
require_once ( 'include/html2bbcode.php' );
$_SESSION [ " authenticated " ] = true ;
$_SESSION [ " uid " ] = $uid ;
2013-07-19 21:34:54 +00:00
unset ( $_REQUEST );
2013-05-09 12:36:50 +00:00
$_REQUEST [ " type " ] = " wall " ;
$_REQUEST [ " api_source " ] = true ;
$_REQUEST [ " profile_uid " ] = $uid ;
$_REQUEST [ " source " ] = " pump.io " ;
2016-12-09 16:23:42 +00:00
if ( isset ( $post -> object -> id )) {
$_REQUEST [ 'message_id' ] = NETWORK_PUMPIO . " : " . $post -> object -> id ;
}
2013-05-16 20:58:48 +00:00
if ( $post -> object -> displayName != " " )
$_REQUEST [ " title " ] = html2bbcode ( $post -> object -> displayName );
2013-07-19 21:34:54 +00:00
else
$_REQUEST [ " title " ] = " " ;
2013-05-16 20:58:48 +00:00
2013-05-09 12:36:50 +00:00
$_REQUEST [ " body " ] = html2bbcode ( $post -> object -> content );
2013-11-30 20:22:41 +00:00
// To-Do: Picture has to be cached and stored locally
if ( $post -> object -> fullImage -> url != " " ) {
if ( $post -> object -> fullImage -> pump_io -> proxyURL != " " )
$_REQUEST [ " body " ] = " [url= " . $post -> object -> fullImage -> pump_io -> proxyURL . " ][img] " . $post -> object -> image -> pump_io -> proxyURL . " [/img][/url] \n " . $_REQUEST [ " body " ];
else
$_REQUEST [ " body " ] = " [url= " . $post -> object -> fullImage -> url . " ][img] " . $post -> object -> image -> url . " [/img][/url] \n " . $_REQUEST [ " body " ];
}
2013-05-16 20:58:48 +00:00
2013-05-09 12:36:50 +00:00
logger ( 'pumpio: posting for user ' . $uid );
require_once ( 'mod/item.php' );
2013-09-08 15:31:28 +00:00
2013-05-09 12:36:50 +00:00
item_post ( $a );
2013-05-16 20:58:48 +00:00
logger ( 'pumpio: posting done - user ' . $uid );
2013-05-09 12:36:50 +00:00
}
}
}
2013-05-09 13:08:08 +00:00
if ( $lastdate != 0 )
2017-11-06 23:55:24 +00:00
PConfig :: set ( $uid , 'pumpio' , 'lastdate' , $lastdate );
2013-05-09 12:36:50 +00:00
}
2013-09-03 06:22:46 +00:00
2013-09-06 06:35:40 +00:00
function pumpio_dounlike ( & $a , $uid , $self , $post , $own_id ) {
// Searching for the unliked post
// Two queries for speed issues
$r = q ( " SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $post -> object -> id ),
intval ( $uid )
);
2013-09-05 06:35:37 +00:00
2013-09-06 06:35:40 +00:00
if ( count ( $r ))
$orig_post = $r [ 0 ];
else {
$r = q ( " SELECT * FROM `item` WHERE `extid` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $post -> object -> id ),
intval ( $uid )
);
2013-09-03 06:22:46 +00:00
2013-09-06 06:35:40 +00:00
if ( ! count ( $r ))
return ;
else
$orig_post = $r [ 0 ];
}
2013-09-03 06:22:46 +00:00
2013-09-06 06:35:40 +00:00
$contactid = 0 ;
2013-09-03 06:22:46 +00:00
2013-09-06 06:35:40 +00:00
if ( link_compare ( $post -> actor -> url , $own_id )) {
$contactid = $self [ 0 ][ 'id' ];
} else {
2017-01-17 19:01:27 +00:00
$r = q ( " SELECT * FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1 " ,
dbesc ( normalise_link ( $post -> actor -> url )),
2013-09-06 06:35:40 +00:00
intval ( $uid )
);
2013-09-03 06:22:46 +00:00
2013-09-06 06:35:40 +00:00
if ( count ( $r ))
$contactid = $r [ 0 ][ 'id' ];
2013-09-03 06:22:46 +00:00
2013-09-06 06:35:40 +00:00
if ( $contactid == 0 )
$contactid = $orig_post [ 'contact-id' ];
}
2013-09-03 06:22:46 +00:00
2013-09-06 06:35:40 +00:00
$ r = q ( " UPDATE `item` SET `deleted` = 1, `unseen` = 1, `changed` = '%s' WHERE `verb` = '%s' AND `uid` = %d AND `contact-id` = %d AND `thr-parent` = '%s' " ,
dbesc ( datetime_convert ()),
dbesc ( ACTIVITY_LIKE ),
intval ( $uid ),
intval ( $contactid ),
dbesc ( $orig_post [ 'uri' ])
);
if ( count ( $r ))
logger ( " pumpio_dounlike: unliked existing like. User " . $own_id . " " . $uid . " Contact: " . $contactid . " Url " . $orig_post [ 'uri' ]);
else
logger ( " pumpio_dounlike: not found. User " . $own_id . " " . $uid . " Contact: " . $contactid . " Url " . $orig_post [ 'uri' ]);
}
2014-11-10 22:00:39 +00:00
function pumpio_dolike ( & $a , $uid , $self , $post , $own_id , $threadcompletion = true ) {
require_once ( 'include/items.php' );
2013-09-06 06:35:40 +00:00
2017-01-15 12:23:40 +00:00
if ( $post -> object -> id == " " ) {
logger ( 'Got empty like: ' . print_r ( $post , true ), LOGGER_DEBUG );
return ;
}
2013-09-06 06:35:40 +00:00
// Searching for the liked post
2013-09-03 06:22:46 +00:00
// Two queries for speed issues
2016-02-13 12:44:57 +00:00
$r = q ( " SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d AND `network` = '%s' LIMIT 1 " ,
2013-09-03 06:22:46 +00:00
dbesc ( $post -> object -> id ),
2016-02-13 12:44:57 +00:00
intval ( $uid ),
dbesc ( NETWORK_PUMPIO )
2013-09-03 06:22:46 +00:00
);
if ( count ( $r ))
$orig_post = $r [ 0 ];
else {
2016-02-13 12:44:57 +00:00
$r = q ( " SELECT * FROM `item` WHERE `extid` = '%s' AND `uid` = %d AND `network` = '%s' LIMIT 1 " ,
2013-09-03 06:22:46 +00:00
dbesc ( $post -> object -> id ),
2016-02-13 12:44:57 +00:00
intval ( $uid ),
dbesc ( NETWORK_PUMPIO )
2013-09-03 06:22:46 +00:00
);
if ( ! count ( $r ))
return ;
else
$orig_post = $r [ 0 ];
}
2014-11-10 22:00:39 +00:00
// thread completion
if ( $threadcompletion )
pumpio_fetchallcomments ( $a , $uid , $post -> object -> id );
2013-09-06 06:35:40 +00:00
$contactid = 0 ;
if ( link_compare ( $post -> actor -> url , $own_id )) {
$contactid = $self [ 0 ][ 'id' ];
2013-09-07 11:10:51 +00:00
$post -> actor -> displayName = $self [ 0 ][ 'name' ];
$post -> actor -> url = $self [ 0 ][ 'url' ];
$post -> actor -> image -> url = $self [ 0 ][ 'photo' ];
2013-09-06 06:35:40 +00:00
} else {
2017-01-15 12:23:40 +00:00
$r = q ( " SELECT * FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1 " ,
dbesc ( normalise_link ( $post -> actor -> url )),
2013-09-06 06:35:40 +00:00
intval ( $uid )
);
if ( count ( $r ))
$contactid = $r [ 0 ][ 'id' ];
if ( $contactid == 0 )
$contactid = $orig_post [ 'contact-id' ];
}
$r = q ( " SELECT parent FROM `item` WHERE `verb` = '%s' AND `uid` = %d AND `contact-id` = %d AND `thr-parent` = '%s' LIMIT 1 " ,
2013-09-03 06:22:46 +00:00
dbesc ( ACTIVITY_LIKE ),
intval ( $uid ),
2013-09-06 06:35:40 +00:00
intval ( $contactid ),
dbesc ( $orig_post [ 'uri' ])
2013-09-03 06:22:46 +00:00
);
2013-09-06 06:35:40 +00:00
if ( count ( $r )) {
logger ( " pumpio_dolike: found existing like. User " . $own_id . " " . $uid . " Contact: " . $contactid . " Url " . $orig_post [ 'uri' ]);
2013-09-03 06:22:46 +00:00
return ;
2013-09-06 06:35:40 +00:00
}
2013-09-03 06:22:46 +00:00
$likedata = array ();
$likedata [ 'parent' ] = $orig_post [ 'id' ];
$likedata [ 'verb' ] = ACTIVITY_LIKE ;
$likedata [ 'gravity' ] = 3 ;
$likedata [ 'uid' ] = $uid ;
$likedata [ 'wall' ] = 0 ;
$likedata [ 'uri' ] = item_new_uri ( $a -> get_baseurl (), $uid );
$likedata [ 'parent-uri' ] = $orig_post [ " uri " ];
2013-09-06 06:35:40 +00:00
$likedata [ 'contact-id' ] = $contactid ;
2013-09-03 06:22:46 +00:00
$likedata [ 'app' ] = $post -> generator -> displayName ;
$likedata [ 'author-name' ] = $post -> actor -> displayName ;
$likedata [ 'author-link' ] = $post -> actor -> url ;
$likedata [ 'author-avatar' ] = $post -> actor -> image -> url ;
$author = '[url=' . $likedata [ 'author-link' ] . ']' . $likedata [ 'author-name' ] . '[/url]' ;
$objauthor = '[url=' . $orig_post [ 'author-link' ] . ']' . $orig_post [ 'author-name' ] . '[/url]' ;
$post_type = t ( 'status' );
$plink = '[url=' . $orig_post [ 'plink' ] . ']' . $post_type . '[/url]' ;
$likedata [ 'object-type' ] = ACTIVITY_OBJ_NOTE ;
$likedata [ 'body' ] = sprintf ( t ( '%1$s likes %2$s\'s %3$s' ), $author , $objauthor , $plink );
$likedata [ 'object' ] = '<object><type>' . ACTIVITY_OBJ_NOTE . '</type><local>1</local>' .
'<id>' . $orig_post [ 'uri' ] . '</id><link>' . xmlify ( '<link rel="alternate" type="text/html" href="' . xmlify ( $orig_post [ 'plink' ]) . '" />' ) . '</link><title>' . $orig_post [ 'title' ] . '</title><content>' . $orig_post [ 'body' ] . '</content></object>' ;
2013-09-06 06:35:40 +00:00
$ret = item_store ( $likedata );
logger ( " pumpio_dolike: " . $ret . " User " . $own_id . " " . $uid . " Contact: " . $contactid . " Url " . $orig_post [ 'uri' ]);
2013-09-03 06:22:46 +00:00
}
2016-07-02 09:22:31 +00:00
function pumpio_get_contact ( $uid , $contact , $no_insert = false ) {
2013-09-03 06:22:46 +00:00
2017-11-13 17:20:30 +00:00
GlobalContact :: update ( array ( " url " => $contact -> url , " network " => NETWORK_PUMPIO , " generation " => 2 ,
2017-01-17 19:01:27 +00:00
" photo " => $contact -> image -> url , " name " => $contact -> displayName , " hide " => true ,
" nick " => $contact -> preferredUsername , " location " => $contact -> location -> displayName ,
" about " => $contact -> summary , " addr " => str_replace ( " acct: " , " " , $contact -> id )));
2017-11-19 22:09:54 +00:00
$cid = Contact :: getIdForURL ( $contact -> url , $uid );
2016-07-02 09:22:31 +00:00
if ( $no_insert )
return ( $cid );
2015-01-09 06:07:07 +00:00
2017-01-17 19:01:27 +00:00
$r = q ( " SELECT * FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' LIMIT 1 " ,
intval ( $uid ), dbesc ( normalise_link ( $contact -> url )));
2013-09-03 06:22:46 +00:00
2017-01-17 19:01:27 +00:00
if ( ! count ( $r )) {
2013-09-03 06:22:46 +00:00
// create contact record
2017-01-17 19:01:27 +00:00
q ( " INSERT INTO `contact` (`uid`, `created`, `url`, `nurl`, `addr`, `alias`, `notify`, `poll`,
2013-09-03 06:22:46 +00:00
`name` , `nick` , `photo` , `network` , `rel` , `priority` ,
2017-03-09 06:58:36 +00:00
`location` , `about` , `writable` , `blocked` , `readonly` , `pending` )
VALUES ( % d , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , % d , % d , '%s' , '%s' , % d , 0 , 0 , 0 ) " ,
2013-09-03 06:22:46 +00:00
intval ( $uid ),
dbesc ( datetime_convert ()),
dbesc ( $contact -> url ),
dbesc ( normalise_link ( $contact -> url )),
dbesc ( str_replace ( " acct: " , " " , $contact -> id )),
dbesc ( '' ),
2013-09-15 13:30:56 +00:00
dbesc ( $contact -> id ), // What is it for?
dbesc ( 'pump.io ' . $contact -> id ), // What is it for?
2013-09-03 06:22:46 +00:00
dbesc ( $contact -> displayName ),
dbesc ( $contact -> preferredUsername ),
dbesc ( $contact -> image -> url ),
dbesc ( NETWORK_PUMPIO ),
intval ( CONTACT_IS_FRIEND ),
intval ( 1 ),
2017-03-09 06:58:36 +00:00
dbesc ( $contact -> location -> displayName ),
dbesc ( $contact -> summary ),
2013-09-03 06:22:46 +00:00
intval ( 1 )
);
2017-01-17 19:01:27 +00:00
$r = q ( " SELECT * FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( normalise_link ( $contact -> url )),
2013-09-03 06:22:46 +00:00
intval ( $uid )
);
2017-01-17 19:01:27 +00:00
if ( ! count ( $r )) {
2013-09-03 06:22:46 +00:00
return ( false );
2017-01-17 19:01:27 +00:00
}
2013-09-03 06:22:46 +00:00
2017-01-17 19:01:27 +00:00
$contact_id = $r [ 0 ][ 'id' ];
2013-09-03 06:22:46 +00:00
$g = q ( " select def_gid from user where uid = %d limit 1 " ,
intval ( $uid )
);
if ( $g && intval ( $g [ 0 ][ 'def_gid' ])) {
require_once ( 'include/group.php' );
group_add_member ( $uid , '' , $contact_id , $g [ 0 ][ 'def_gid' ]);
}
} else {
2016-07-02 09:22:31 +00:00
$contact_id = $r [ 0 ][ " id " ];
2015-01-09 06:07:07 +00:00
2016-07-02 09:22:31 +00:00
/* if ( DB_UPDATE_VERSION >= " 1177 " )
2015-01-09 06:07:07 +00:00
q ( " UPDATE `contact` SET `location` = '%s',
`about` = '%s'
WHERE `id` = % d " ,
dbesc ( $contact -> location -> displayName ),
dbesc ( $contact -> summary ),
intval ( $r [ 0 ][ 'id' ])
);
2016-07-02 09:22:31 +00:00
*/
2013-09-03 06:22:46 +00:00
}
2017-11-29 22:38:05 +00:00
Contact :: updateAvatar ( $contact -> image -> url , $uid , $contact_id );
2016-07-02 09:22:31 +00:00
return ( $contact_id );
2013-09-03 06:22:46 +00:00
}
2013-09-06 06:35:40 +00:00
function pumpio_dodelete ( & $a , $uid , $self , $post , $own_id ) {
2013-09-03 06:22:46 +00:00
// Two queries for speed issues
$r = q ( " SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $post -> object -> id ),
intval ( $uid )
);
2013-09-12 21:20:26 +00:00
if ( count ( $r ))
return drop_item ( $r [ 0 ][ " id " ], $false );
2013-09-03 06:22:46 +00:00
$r = q ( " SELECT * FROM `item` WHERE `extid` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $post -> object -> id ),
intval ( $uid )
);
2013-09-12 21:20:26 +00:00
if ( count ( $r ))
return drop_item ( $r [ 0 ][ " id " ], $false );
2013-09-03 06:22:46 +00:00
}
2014-11-10 22:00:39 +00:00
function pumpio_dopost ( & $a , $client , $uid , $self , $post , $own_id , $threadcompletion = true ) {
2013-09-03 06:22:46 +00:00
require_once ( 'include/items.php' );
2014-03-16 18:13:57 +00:00
require_once ( 'include/html2bbcode.php' );
2013-09-03 06:22:46 +00:00
2017-06-09 01:20:27 +00:00
if (( $post -> verb == " like " ) || ( $post -> verb == " favorite " ))
2013-09-27 21:33:35 +00:00
return pumpio_dolike ( $a , $uid , $self , $post , $own_id );
2013-09-03 06:22:46 +00:00
2017-06-09 01:20:27 +00:00
if (( $post -> verb == " unlike " ) || ( $post -> verb == " unfavorite " ))
2013-09-27 21:33:35 +00:00
return pumpio_dounlike ( $a , $uid , $self , $post , $own_id );
2013-09-05 06:35:37 +00:00
2013-09-12 21:20:26 +00:00
if ( $post -> verb == " delete " )
2013-09-27 21:33:35 +00:00
return pumpio_dodelete ( $a , $uid , $self , $post , $own_id );
2013-09-03 06:22:46 +00:00
if ( $post -> verb != " update " ) {
// Two queries for speed issues
$r = q ( " SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $post -> object -> id ),
intval ( $uid )
);
if ( count ( $r ))
2013-09-12 21:20:26 +00:00
return false ;
2013-09-03 06:22:46 +00:00
$r = q ( " SELECT * FROM `item` WHERE `extid` = '%s' AND `uid` = %d LIMIT 1 " ,
dbesc ( $post -> object -> id ),
intval ( $uid )
);
if ( count ( $r ))
2013-09-12 21:20:26 +00:00
return false ;
2013-09-03 06:22:46 +00:00
}
2013-09-06 06:35:40 +00:00
// Only handle these three types
if ( ! strstr ( " post|share|update " , $post -> verb ))
2013-09-12 21:20:26 +00:00
return false ;
2013-09-06 06:35:40 +00:00
2013-09-03 06:22:46 +00:00
$receiptians = array ();
if ( @ is_array ( $post -> cc ))
$receiptians = array_merge ( $receiptians , $post -> cc );
if ( @ is_array ( $post -> to ))
$receiptians = array_merge ( $receiptians , $post -> to );
foreach ( $receiptians AS $receiver )
if ( is_string ( $receiver -> objectType ))
if ( $receiver -> id == " http://activityschema.org/collection/public " )
$public = true ;
$postarray = array ();
2015-03-09 19:03:48 +00:00
$postarray [ 'network' ] = NETWORK_PUMPIO ;
2013-09-03 06:22:46 +00:00
$postarray [ 'gravity' ] = 0 ;
$postarray [ 'uid' ] = $uid ;
$postarray [ 'wall' ] = 0 ;
$postarray [ 'uri' ] = $post -> object -> id ;
2014-07-21 22:40:02 +00:00
$postarray [ 'object-type' ] = NAMESPACE_ACTIVITY_SCHEMA . strtolower ( $post -> object -> objectType );
2013-09-03 06:22:46 +00:00
if ( $post -> object -> objectType != " comment " ) {
2013-09-06 06:35:40 +00:00
$contact_id = pumpio_get_contact ( $uid , $post -> actor );
if ( ! $contact_id )
$contact_id = $self [ 0 ][ 'id' ];
2013-09-03 06:22:46 +00:00
$postarray [ 'parent-uri' ] = $post -> object -> id ;
2014-11-10 22:00:39 +00:00
if ( ! $public ) {
$postarray [ 'private' ] = 1 ;
$postarray [ 'allow_cid' ] = '<' . $self [ 0 ][ 'id' ] . '>' ;
}
2013-09-03 06:22:46 +00:00
} else {
2016-07-02 09:22:31 +00:00
$contact_id = pumpio_get_contact ( $uid , $post -> actor , true );
2013-09-06 06:35:40 +00:00
2016-07-02 09:22:31 +00:00
if ( link_compare ( $post -> actor -> url , $own_id )) {
2013-09-06 06:35:40 +00:00
$contact_id = $self [ 0 ][ 'id' ];
2013-09-07 11:10:51 +00:00
$post -> actor -> displayName = $self [ 0 ][ 'name' ];
$post -> actor -> url = $self [ 0 ][ 'url' ];
$post -> actor -> image -> url = $self [ 0 ][ 'photo' ];
2016-07-02 09:22:31 +00:00
} elseif ( $contact_id == 0 ) {
2013-09-07 11:10:51 +00:00
// Take an existing contact, the contact of the note or - as a fallback - the id of the user
2017-01-17 19:01:27 +00:00
$r = q ( " SELECT * FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1 " ,
dbesc ( normalise_link ( $post -> actor -> url )),
2013-09-06 06:35:40 +00:00
intval ( $uid )
);
if ( count ( $r ))
$contact_id = $r [ 0 ][ 'id' ];
2013-09-07 11:10:51 +00:00
else {
2017-01-17 19:01:27 +00:00
$r = q ( " SELECT * FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1 " ,
dbesc ( normalise_link ( $post -> actor -> url )),
2013-09-07 11:10:51 +00:00
intval ( $uid )
);
2013-09-06 06:35:40 +00:00
2013-09-07 11:10:51 +00:00
if ( count ( $r ))
$contact_id = $r [ 0 ][ 'id' ];
else
$contact_id = $self [ 0 ][ 'id' ];
}
2013-09-06 06:35:40 +00:00
}
2013-09-03 06:22:46 +00:00
2013-10-10 10:10:40 +00:00
$reply = new stdClass ;
2013-09-03 06:22:46 +00:00
$reply -> verb = " note " ;
$reply -> cc = $post -> cc ;
$reply -> to = $post -> to ;
2013-10-10 10:10:40 +00:00
$reply -> object = new stdClass ;
2013-09-03 06:22:46 +00:00
$reply -> object -> objectType = $post -> object -> inReplyTo -> objectType ;
$reply -> object -> content = $post -> object -> inReplyTo -> content ;
$reply -> object -> id = $post -> object -> inReplyTo -> id ;
$reply -> actor = $post -> object -> inReplyTo -> author ;
$reply -> url = $post -> object -> inReplyTo -> url ;
2013-10-10 10:10:40 +00:00
$reply -> generator = new stdClass ;
2013-09-03 06:22:46 +00:00
$reply -> generator -> displayName = " pumpio " ;
$reply -> published = $post -> object -> inReplyTo -> published ;
$reply -> received = $post -> object -> inReplyTo -> updated ;
$reply -> url = $post -> object -> inReplyTo -> url ;
2014-11-10 22:00:39 +00:00
pumpio_dopost ( $a , $client , $uid , $self , $reply , $own_id , false );
2013-09-03 06:22:46 +00:00
$postarray [ 'parent-uri' ] = $post -> object -> inReplyTo -> id ;
}
2013-09-12 21:20:26 +00:00
if ( $post -> object -> pump_io -> proxyURL )
$postarray [ 'extid' ] = $post -> object -> pump_io -> proxyURL ;
2013-09-03 06:22:46 +00:00
$postarray [ 'contact-id' ] = $contact_id ;
$postarray [ 'verb' ] = ACTIVITY_POST ;
$postarray [ 'owner-name' ] = $post -> actor -> displayName ;
$postarray [ 'owner-link' ] = $post -> actor -> url ;
$postarray [ 'owner-avatar' ] = $post -> actor -> image -> url ;
$postarray [ 'author-name' ] = $post -> actor -> displayName ;
$postarray [ 'author-link' ] = $post -> actor -> url ;
$postarray [ 'author-avatar' ] = $post -> actor -> image -> url ;
$postarray [ 'plink' ] = $post -> object -> url ;
$postarray [ 'app' ] = $post -> generator -> displayName ;
$postarray [ 'body' ] = html2bbcode ( $post -> object -> content );
2016-05-15 21:18:18 +00:00
$postarray [ 'object' ] = json_encode ( $post );
2013-09-03 06:22:46 +00:00
if ( $post -> object -> fullImage -> url != " " )
$postarray [ " body " ] = " [url= " . $post -> object -> fullImage -> url . " ][img] " . $post -> object -> image -> url . " [/img][/url] \n " . $postarray [ " body " ];
if ( $post -> object -> displayName != " " )
$postarray [ 'title' ] = $post -> object -> displayName ;
$postarray [ 'created' ] = datetime_convert ( 'UTC' , 'UTC' , $post -> published );
2016-07-02 09:22:31 +00:00
if ( isset ( $post -> updated ))
$postarray [ 'edited' ] = datetime_convert ( 'UTC' , 'UTC' , $post -> updated );
elseif ( isset ( $post -> received ))
$postarray [ 'edited' ] = datetime_convert ( 'UTC' , 'UTC' , $post -> received );
else
$postarray [ 'edited' ] = $postarray [ 'created' ];
2013-09-03 06:22:46 +00:00
if ( $post -> verb == " share " ) {
2017-11-06 23:55:24 +00:00
if ( ! intval ( Config :: get ( 'system' , 'wall-to-wall_share' ))) {
2017-06-09 01:20:27 +00:00
if ( isset ( $post -> object -> author -> displayName ) && ( $post -> object -> author -> displayName != " " ))
2016-07-02 09:22:31 +00:00
$share_author = $post -> object -> author -> displayName ;
2017-06-09 01:20:27 +00:00
elseif ( isset ( $post -> object -> author -> preferredUsername ) && ( $post -> object -> author -> preferredUsername != " " ))
2016-07-02 09:22:31 +00:00
$share_author = $post -> object -> author -> preferredUsername ;
else
$share_author = $post -> object -> author -> url ;
$postarray [ 'body' ] = share_header ( $share_author , $post -> object -> author -> url ,
$post -> object -> author -> image -> url , " " ,
datetime_convert ( 'UTC' , 'UTC' , $post -> object -> created ),
$post -> links -> self -> href ) .
$postarray [ 'body' ] . " [/share] " ;
/*
$postarray [ 'body' ] = " [share author=' " . $share_author .
2014-06-10 18:13:11 +00:00
" ' profile=' " . $post -> object -> author -> url .
" ' avatar=' " . $post -> object -> author -> image -> url .
2015-04-06 12:04:40 +00:00
" ' posted=' " . datetime_convert ( 'UTC' , 'UTC' , $post -> object -> created ) .
2014-06-10 18:13:11 +00:00
" ' link=' " . $post -> links -> self -> href . " '] " . $postarray [ 'body' ] . " [/share] " ;
2016-07-02 09:22:31 +00:00
*/
2013-10-20 10:29:39 +00:00
} else {
// Let shares look like wall-to-wall posts
$postarray [ 'author-name' ] = $post -> object -> author -> displayName ;
$postarray [ 'author-link' ] = $post -> object -> author -> url ;
$postarray [ 'author-avatar' ] = $post -> object -> author -> image -> url ;
}
2013-09-03 06:22:46 +00:00
}
if ( trim ( $postarray [ 'body' ]) == " " )
2013-09-12 21:20:26 +00:00
return false ;
2013-09-03 06:22:46 +00:00
$top_item = item_store ( $postarray );
2015-04-26 12:43:42 +00:00
$postarray [ " id " ] = $top_item ;
2013-09-03 06:22:46 +00:00
2017-06-09 01:20:27 +00:00
if (( $top_item == 0 ) && ( $post -> verb == " update " )) {
2013-09-03 06:22:46 +00:00
$r = q ( " UPDATE `item` SET `title` = '%s', `body` = '%s' , `changed` = '%s' WHERE `uri` = '%s' AND `uid` = %d " ,
dbesc ( $postarray [ " title " ]),
dbesc ( $postarray [ " body " ]),
dbesc ( $postarray [ " edited " ]),
dbesc ( $postarray [ " uri " ]),
intval ( $uid )
);
}
if ( $post -> object -> objectType == " comment " ) {
2013-09-27 21:33:35 +00:00
if ( $threadcompletion )
pumpio_fetchallcomments ( $a , $uid , $postarray [ 'parent-uri' ]);
2013-09-03 06:22:46 +00:00
$user = q ( " SELECT * FROM `user` WHERE `uid` = %d AND `account_expired` = 0 LIMIT 1 " ,
intval ( $uid )
);
if ( ! count ( $user ))
2013-09-12 21:20:26 +00:00
return $top_item ;
2013-09-03 06:22:46 +00:00
$importer_url = $a -> get_baseurl () . '/profile/' . $user [ 0 ][ 'nickname' ];
2013-09-12 21:20:26 +00:00
if ( link_compare ( $own_id , $postarray [ 'author-link' ]))
return $top_item ;
2013-09-03 06:22:46 +00:00
2016-02-13 12:44:57 +00:00
if ( ! function_exists ( " check_item_notification " )) {
$myconv = q ( " SELECT `author-link`, `author-avatar`, `parent` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `parent` != 0 AND `deleted` = 0 " ,
dbesc ( $postarray [ 'parent-uri' ]),
intval ( $uid )
);
if ( count ( $myconv )) {
foreach ( $myconv as $conv ) {
// now if we find a match, it means we're in this conversation
2017-06-09 01:20:27 +00:00
if ( ! link_compare ( $conv [ 'author-link' ], $importer_url ) && ! link_compare ( $conv [ 'author-link' ], $own_id ))
2016-02-13 12:44:57 +00:00
continue ;
require_once ( 'include/enotify.php' );
$conv_parent = $conv [ 'parent' ];
notification ( array (
'type' => NOTIFY_COMMENT ,
'notify_flags' => $user [ 0 ][ 'notify-flags' ],
'language' => $user [ 0 ][ 'language' ],
'to_name' => $user [ 0 ][ 'username' ],
'to_email' => $user [ 0 ][ 'email' ],
'uid' => $user [ 0 ][ 'uid' ],
'item' => $postarray ,
'link' => $a -> get_baseurl () . '/display/' . urlencode ( get_item_guid ( $top_item )),
'source_name' => $postarray [ 'author-name' ],
'source_link' => $postarray [ 'author-link' ],
'source_photo' => $postarray [ 'author-avatar' ],
'verb' => ACTIVITY_POST ,
'otype' => 'item' ,
'parent' => $conv_parent ,
));
// only send one notification
break ;
}
2013-09-03 06:22:46 +00:00
}
}
}
2013-09-12 21:20:26 +00:00
return $top_item ;
2013-09-03 06:22:46 +00:00
}
2013-09-27 21:33:35 +00:00
function pumpio_fetchinbox ( & $a , $uid ) {
2013-09-03 06:22:46 +00:00
2017-11-06 23:55:24 +00:00
$ckey = PConfig :: get ( $uid , 'pumpio' , 'consumer_key' );
$csecret = PConfig :: get ( $uid , 'pumpio' , 'consumer_secret' );
$otoken = PConfig :: get ( $uid , 'pumpio' , 'oauth_token' );
$osecret = PConfig :: get ( $uid , 'pumpio' , 'oauth_token_secret' );
$lastdate = PConfig :: get ( $uid , 'pumpio' , 'lastdate' );
$hostname = PConfig :: get ( $uid , 'pumpio' , 'host' );
$username = PConfig :: get ( $uid , " pumpio " , " user " );
2013-09-03 06:22:46 +00:00
2013-09-06 06:35:40 +00:00
$own_id = " https:// " . $hostname . " / " . $username ;
2013-09-03 06:22:46 +00:00
$self = q ( " SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1 " ,
intval ( $uid ));
2016-12-09 16:23:42 +00:00
$lastitems = q ( " SELECT `uri` FROM `thread`
INNER JOIN `item` ON `item` . `id` = `thread` . `iid`
WHERE `thread` . `network` = '%s' AND `thread` . `uid` = % d AND `item` . `extid` != ''
ORDER BY `thread` . `commented` DESC LIMIT 10 " ,
2014-11-10 22:00:39 +00:00
dbesc ( NETWORK_PUMPIO ),
intval ( $uid )
);
2014-06-10 18:13:11 +00:00
$client = new oauth_client_class ;
$client -> oauth_version = '1.0a' ;
$client -> authorization_header = true ;
$client -> url_parameters = false ;
2013-09-03 06:22:46 +00:00
2014-06-10 18:13:11 +00:00
$client -> client_id = $ckey ;
$client -> client_secret = $csecret ;
$client -> access_token = $otoken ;
$client -> access_token_secret = $osecret ;
2013-09-03 06:22:46 +00:00
2017-11-06 23:55:24 +00:00
$last_id = PConfig :: get ( $uid , 'pumpio' , 'last_id' );
2013-09-03 06:22:46 +00:00
$url = 'https://' . $hostname . '/api/user/' . $username . '/inbox' ;
if ( $last_id != " " )
$url .= '?since=' . urlencode ( $last_id );
2015-11-02 23:42:04 +00:00
if ( pumpio_reachable ( $url ))
$success = $client -> CallAPI ( $url , 'GET' , array (), array ( 'FailOnAccessError' => true ), $user );
else
$success = false ;
2013-09-03 06:22:46 +00:00
2013-10-02 06:38:56 +00:00
if ( $user -> items ) {
$posts = array_reverse ( $user -> items );
if ( count ( $posts ))
foreach ( $posts as $post ) {
$last_id = $post -> id ;
2014-11-10 22:00:39 +00:00
pumpio_dopost ( $a , $client , $uid , $self , $post , $own_id , true );
2013-10-02 06:38:56 +00:00
}
}
2013-09-03 06:22:46 +00:00
2014-11-10 22:00:39 +00:00
foreach ( $lastitems AS $item )
pumpio_fetchallcomments ( $a , $uid , $item [ " uri " ]);
2017-11-06 23:55:24 +00:00
PConfig :: set ( $uid , 'pumpio' , 'last_id' , $last_id );
2013-09-03 06:22:46 +00:00
}
2013-09-27 21:33:35 +00:00
function pumpio_getallusers ( & $a , $uid ) {
2017-11-06 23:55:24 +00:00
$ckey = PConfig :: get ( $uid , 'pumpio' , 'consumer_key' );
$csecret = PConfig :: get ( $uid , 'pumpio' , 'consumer_secret' );
$otoken = PConfig :: get ( $uid , 'pumpio' , 'oauth_token' );
$osecret = PConfig :: get ( $uid , 'pumpio' , 'oauth_token_secret' );
$hostname = PConfig :: get ( $uid , 'pumpio' , 'host' );
$username = PConfig :: get ( $uid , " pumpio " , " user " );
2014-06-10 18:13:11 +00:00
$client = new oauth_client_class ;
$client -> oauth_version = '1.0a' ;
$client -> authorization_header = true ;
$client -> url_parameters = false ;
$client -> client_id = $ckey ;
$client -> client_secret = $csecret ;
$client -> access_token = $otoken ;
$client -> access_token_secret = $osecret ;
2013-09-03 06:22:46 +00:00
$url = 'https://' . $hostname . '/api/user/' . $username . '/following' ;
2015-11-02 23:42:04 +00:00
if ( pumpio_reachable ( $url ))
$success = $client -> CallAPI ( $url , 'GET' , array (), array ( 'FailOnAccessError' => true ), $users );
else
$success = false ;
2013-09-03 06:22:46 +00:00
if ( $users -> totalItems > count ( $users -> items )) {
$url = 'https://' . $hostname . '/api/user/' . $username . '/following?count=' . $users -> totalItems ;
2015-11-02 23:42:04 +00:00
if ( pumpio_reachable ( $url ))
$success = $client -> CallAPI ( $url , 'GET' , array (), array ( 'FailOnAccessError' => true ), $users );
else
$success = false ;
2013-09-03 06:22:46 +00:00
}
2017-08-20 20:51:07 +00:00
if ( is_array ( $users -> items )) {
foreach ( $users -> items AS $user ) {
pumpio_get_contact ( $uid , $user );
}
}
2013-09-03 06:22:46 +00:00
}
2013-09-03 22:04:00 +00:00
function pumpio_queue_hook ( & $a , & $b ) {
$qi = q ( " SELECT * FROM `queue` WHERE `network` = '%s' " ,
dbesc ( NETWORK_PUMPIO )
);
if ( ! count ( $qi ))
return ;
require_once ( 'include/queue_fn.php' );
foreach ( $qi as $x ) {
if ( $x [ 'network' ] !== NETWORK_PUMPIO )
continue ;
2013-09-05 06:35:37 +00:00
logger ( 'pumpio_queue: run' );
2013-09-03 22:04:00 +00:00
2017-06-09 01:20:27 +00:00
$r = q ( " SELECT `user`.* FROM `user` LEFT JOIN `contact` ON `contact`.`uid` = `user`.`uid`
2013-09-03 22:04:00 +00:00
WHERE `contact` . `self` = 1 AND `contact` . `id` = % d LIMIT 1 " ,
intval ( $x [ 'cid' ])
);
if ( ! count ( $r ))
continue ;
2013-09-27 21:33:35 +00:00
$userdata = $r [ 0 ];
//logger('pumpio_queue: fetching userdata '.print_r($userdata, true));
2013-09-03 22:04:00 +00:00
2017-11-06 23:55:24 +00:00
$oauth_token = PConfig :: get ( $userdata [ 'uid' ], " pumpio " , " oauth_token " );
$oauth_token_secret = PConfig :: get ( $userdata [ 'uid' ], " pumpio " , " oauth_token_secret " );
$consumer_key = PConfig :: get ( $userdata [ 'uid' ], " pumpio " , " consumer_key " );
$consumer_secret = PConfig :: get ( $userdata [ 'uid' ], " pumpio " , " consumer_secret " );
2013-09-03 22:04:00 +00:00
2017-11-06 23:55:24 +00:00
$host = PConfig :: get ( $userdata [ 'uid' ], " pumpio " , " host " );
$user = PConfig :: get ( $userdata [ 'uid' ], " pumpio " , " user " );
2013-09-03 22:04:00 +00:00
$success = false ;
2017-06-09 01:20:27 +00:00
if ( $oauth_token && $oauth_token_secret &&
$consumer_key && $consumer_secret ) {
2013-09-03 22:04:00 +00:00
$username = $user . '@' . $host ;
logger ( 'pumpio_queue: able to post for user ' . $username );
$z = unserialize ( $x [ 'content' ]);
$client = new oauth_client_class ;
$client -> oauth_version = '1.0a' ;
$client -> url_parameters = false ;
$client -> authorization_header = true ;
$client -> access_token = $oauth_token ;
$client -> access_token_secret = $oauth_token_secret ;
$client -> client_id = $consumer_key ;
$client -> client_secret = $consumer_secret ;
2015-11-02 23:42:04 +00:00
if ( pumpio_reachable ( $z [ 'url' ]))
$success = $client -> CallAPI ( $z [ 'url' ], 'POST' , $z [ 'post' ], array ( 'FailOnAccessError' => true , 'RequestContentType' => 'application/json' ), $user );
else
$success = false ;
2013-09-03 22:04:00 +00:00
if ( $success ) {
$post_id = $user -> object -> id ;
logger ( 'pumpio_queue: send ' . $username . ': success ' . $post_id );
2017-06-09 01:20:27 +00:00
if ( $post_id && $iscomment ) {
2013-09-03 22:04:00 +00:00
logger ( 'pumpio_send ' . $username . ': Update extid ' . $post_id . " for post id " . $z [ 'item' ]);
2013-10-18 22:27:22 +00:00
q ( " UPDATE `item` SET `extid` = '%s' WHERE `id` = %d " ,
2013-09-03 22:04:00 +00:00
dbesc ( $post_id ),
intval ( $z [ 'item' ])
);
}
remove_queue_item ( $x [ 'id' ]);
} else
2013-09-05 06:35:37 +00:00
logger ( 'pumpio_queue: send ' . $username . ': ' . $url . ' general error: ' . print_r ( $user , true ));
2013-09-03 22:04:00 +00:00
} else
2013-09-27 21:33:35 +00:00
logger ( " pumpio_queue: Error getting tokens for user " . $userdata [ 'uid' ]);
2013-09-03 22:04:00 +00:00
if ( ! $success ) {
logger ( 'pumpio_queue: delayed' );
update_queue_time ( $x [ 'id' ]);
}
}
}
2013-09-03 06:22:46 +00:00
2013-09-27 21:33:35 +00:00
function pumpio_getreceiver ( & $a , $b ) {
2013-09-08 15:09:01 +00:00
$receiver = array ();
if ( ! $b [ " private " ]) {
if ( ! strstr ( $b [ 'postopts' ], 'pumpio' ))
return $receiver ;
2017-11-06 23:55:24 +00:00
$public = PConfig :: get ( $b [ 'uid' ], " pumpio " , " public " );
2013-09-08 15:09:01 +00:00
2014-06-10 18:13:11 +00:00
if ( $public )
2013-09-08 15:09:01 +00:00
$receiver [ " to " ][] = Array (
" objectType " => " collection " ,
" id " => " http://activityschema.org/collection/public " );
} else {
$cids = explode ( " >< " , $b [ " allow_cid " ]);
$gids = explode ( " >< " , $b [ " allow_gid " ]);
foreach ( $cids AS $cid ) {
$cid = trim ( $cid , " <> " );
$r = q ( " SELECT `name`, `nick`, `url` FROM `contact` WHERE `id` = %d AND `uid` = %d AND `network` = '%s' AND `blocked` = 0 AND `readonly` = 0 LIMIT 1 " ,
intval ( $cid ),
intval ( $b [ " uid " ]),
dbesc ( NETWORK_PUMPIO )
);
2013-09-12 21:20:26 +00:00
if ( count ( $r )) {
2013-09-08 15:09:01 +00:00
$receiver [ " bcc " ][] = Array (
" displayName " => $r [ 0 ][ " name " ],
" objectType " => " person " ,
" preferredUsername " => $r [ 0 ][ " nick " ],
" url " => $r [ 0 ][ " url " ]);
2013-09-12 21:20:26 +00:00
}
2013-09-08 15:09:01 +00:00
}
foreach ( $gids AS $gid ) {
$gid = trim ( $gid , " <> " );
$r = q ( " SELECT `contact`.`name`, `contact`.`nick`, `contact`.`url`, `contact`.`network` " .
" FROM `group_member`, `contact` WHERE `group_member`.`gid` = %d AND `group_member`.`uid` = %d " .
" AND `contact`.`id` = `group_member`.`contact-id` AND `contact`.`network` = '%s' " ,
intval ( $gid ),
intval ( $b [ " uid " ]),
dbesc ( NETWORK_PUMPIO )
);
foreach ( $r AS $row )
$receiver [ " bcc " ][] = Array (
" displayName " => $row [ " name " ],
" objectType " => " person " ,
" preferredUsername " => $row [ " nick " ],
" url " => $row [ " url " ]);
}
}
2013-09-12 21:20:26 +00:00
if ( $b [ " inform " ] != " " ) {
$inform = explode ( " , " , $b [ " inform " ]);
foreach ( $inform AS $cid ) {
if ( substr ( $cid , 0 , 4 ) != " cid: " )
continue ;
$cid = str_replace ( " cid: " , " " , $cid );
$r = q ( " SELECT `name`, `nick`, `url` FROM `contact` WHERE `id` = %d AND `uid` = %d AND `network` = '%s' AND `blocked` = 0 AND `readonly` = 0 LIMIT 1 " ,
intval ( $cid ),
intval ( $b [ " uid " ]),
dbesc ( NETWORK_PUMPIO )
);
if ( count ( $r )) {
$receiver [ " to " ][] = Array (
" displayName " => $r [ 0 ][ " name " ],
" objectType " => " person " ,
" preferredUsername " => $r [ 0 ][ " nick " ],
" url " => $r [ 0 ][ " url " ]);
}
}
}
2013-09-08 15:09:01 +00:00
return $receiver ;
}
2013-09-27 21:33:35 +00:00
function pumpio_fetchallcomments ( & $a , $uid , $id ) {
2017-11-06 23:55:24 +00:00
$ckey = PConfig :: get ( $uid , 'pumpio' , 'consumer_key' );
$csecret = PConfig :: get ( $uid , 'pumpio' , 'consumer_secret' );
$otoken = PConfig :: get ( $uid , 'pumpio' , 'oauth_token' );
$osecret = PConfig :: get ( $uid , 'pumpio' , 'oauth_token_secret' );
$hostname = PConfig :: get ( $uid , 'pumpio' , 'host' );
$username = PConfig :: get ( $uid , " pumpio " , " user " );
2013-09-12 21:20:26 +00:00
2014-11-10 22:00:39 +00:00
logger ( " pumpio_fetchallcomments: completing comment for user " . $uid . " post id " . $id );
2013-09-12 21:20:26 +00:00
2014-11-10 22:00:39 +00:00
$own_id = " https:// " . $hostname . " / " . $username ;
2013-09-12 21:20:26 +00:00
$self = q ( " SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1 " ,
intval ( $uid ));
2014-11-10 22:00:39 +00:00
// Fetching the original post
$r = q ( " SELECT `extid` FROM `item` WHERE `uri` = '%s' AND `uid` = %d AND `extid` != '' LIMIT 1 " ,
dbesc ( $id ),
2013-09-12 21:20:26 +00:00
intval ( $uid )
);
2014-11-10 22:00:39 +00:00
if ( ! count ( $r ))
return false ;
2013-09-12 21:20:26 +00:00
2014-11-10 22:00:39 +00:00
$url = $r [ 0 ][ " extid " ];
2013-09-12 21:20:26 +00:00
$client = new oauth_client_class ;
$client -> oauth_version = '1.0a' ;
$client -> authorization_header = true ;
$client -> url_parameters = false ;
$client -> client_id = $ckey ;
$client -> client_secret = $csecret ;
$client -> access_token = $otoken ;
$client -> access_token_secret = $osecret ;
logger ( " pumpio_fetchallcomments: fetching comment for user " . $uid . " url " . $url );
2015-11-02 23:42:04 +00:00
if ( pumpio_reachable ( $url ))
$success = $client -> CallAPI ( $url , 'GET' , array (), array ( 'FailOnAccessError' => true ), $item );
else
$success = false ;
2013-09-12 21:20:26 +00:00
if ( ! $success )
return ;
2014-11-10 22:00:39 +00:00
if ( $item -> likes -> totalItems != 0 ) {
foreach ( $item -> likes -> items AS $post ) {
$like = new stdClass ;
$like -> object = new stdClass ;
$like -> object -> id = $item -> id ;
$like -> actor = new stdClass ;
$like -> actor -> displayName = $item -> displayName ;
$like -> actor -> preferredUsername = $item -> preferredUsername ;
$like -> actor -> url = $item -> url ;
$like -> actor -> image = $item -> image ;
$like -> generator = new stdClass ;
$like -> generator -> displayName = " pumpio " ;
pumpio_dolike ( $a , $uid , $self , $post , $own_id , false );
}
}
2013-09-12 21:20:26 +00:00
if ( $item -> replies -> totalItems == 0 )
return ;
foreach ( $item -> replies -> items AS $item ) {
if ( $item -> id == $id )
continue ;
// Checking if the comment already exists - Two queries for speed issues
$r = q ( " SELECT extid FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1 " ,
2014-11-10 22:00:39 +00:00
dbesc ( $item -> id ),
2013-09-12 21:20:26 +00:00
intval ( $uid )
);
if ( count ( $r ))
continue ;
$r = q ( " SELECT extid FROM `item` WHERE `extid` = '%s' AND `uid` = %d LIMIT 1 " ,
2014-11-10 22:00:39 +00:00
dbesc ( $item -> id ),
2013-09-12 21:20:26 +00:00
intval ( $uid )
);
if ( count ( $r ))
continue ;
2014-11-10 22:00:39 +00:00
$post = new stdClass ;
2013-09-12 21:20:26 +00:00
$post -> verb = " post " ;
$post -> actor = $item -> author ;
$post -> published = $item -> published ;
$post -> received = $item -> updated ;
2014-11-10 22:00:39 +00:00
$post -> generator = new stdClass ;
2013-09-12 21:20:26 +00:00
$post -> generator -> displayName = " pumpio " ;
2014-11-10 22:00:39 +00:00
// To-Do: Check for public post
2013-09-12 21:20:26 +00:00
unset ( $item -> author );
unset ( $item -> published );
unset ( $item -> updated );
$post -> object = $item ;
2014-11-10 22:00:39 +00:00
logger ( " pumpio_fetchallcomments: posting comment " . $post -> object -> id . " " . print_r ( $post , true ));
2013-09-27 21:33:35 +00:00
pumpio_dopost ( $a , $client , $uid , $self , $post , $own_id , false );
2013-09-12 21:20:26 +00:00
}
}
2015-11-02 23:42:04 +00:00
function pumpio_reachable ( $url ) {
$data = z_fetch_url ( $url , false , $redirects , array ( 'timeout' => 10 ));
2015-11-03 00:10:07 +00:00
return ( intval ( $data [ 'return_code' ]) != 0 );
2015-11-02 23:42:04 +00:00
}
2013-09-03 06:22:46 +00:00
/*
2013-09-12 21:20:26 +00:00
To - Do :
2013-09-06 06:35:40 +00:00
- edit own notes
- delete own notes
2013-09-03 06:22:46 +00:00
*/