2013-05-09 11:11:17 +02:00
< ? php
/**
* Name : pump . io Post Connector
2015-11-14 09:22:32 +01:00
* Description : Bidirectional ( posting , relaying and reading ) connector for pump . io .
2013-09-15 15:30:56 +02:00
* Version : 0.2
2013-05-09 11:11:17 +02:00
* Author : Michael Vogel < http :// pirati . ca / profile / heluecht >
*/
2018-01-25 03:29:09 +01:00
2018-07-22 18:01:05 +02:00
use Friendica\App ;
2018-02-15 03:43:40 +01:00
use Friendica\Content\Text\BBCode ;
2018-03-07 22:48:34 +01:00
use Friendica\Content\Text\HTML ;
2017-11-07 00:55:24 +01:00
use Friendica\Core\Config ;
2018-12-26 08:28:16 +01:00
use Friendica\Core\Hook ;
2018-01-22 20:03:11 +01:00
use Friendica\Core\L10n ;
2018-10-30 00:40:18 +01:00
use Friendica\Core\Logger ;
2017-11-07 00:55:24 +01:00
use Friendica\Core\PConfig ;
2018-08-11 22:40:48 +02:00
use Friendica\Core\Protocol ;
2017-11-13 05:33:14 +01:00
use Friendica\Core\Worker ;
2018-07-20 14:20:48 +02:00
use Friendica\Database\DBA ;
2019-12-16 00:47:24 +01:00
use Friendica\DI ;
2017-12-08 06:18:01 +01:00
use Friendica\Model\Contact ;
2017-12-09 19:50:29 +01:00
use Friendica\Model\Group ;
2018-01-19 06:36:01 +01:00
use Friendica\Model\Item ;
2018-01-25 03:29:09 +01:00
use Friendica\Model\User ;
2019-10-24 00:25:42 +02:00
use Friendica\Protocol\Activity ;
2019-10-25 00:41:37 +02:00
use Friendica\Protocol\ActivityNamespace ;
2019-06-23 19:56:21 +02:00
use Friendica\Util\ConfigFileLoader ;
2018-01-27 03:39:02 +01:00
use Friendica\Util\DateTimeFormat ;
2018-02-15 03:38:37 +01:00
use Friendica\Util\Network ;
2018-11-08 17:45:19 +01:00
use Friendica\Util\Strings ;
2018-11-05 13:47:04 +01:00
use Friendica\Util\XML ;
2017-11-13 05:33:14 +01:00
require 'addon/pumpio/oauth/http.php' ;
require 'addon/pumpio/oauth/oauth_client.php' ;
require_once " mod/share.php " ;
2017-11-07 00:55:24 +01:00
2013-05-09 14:36:50 +02:00
define ( 'PUMPIO_DEFAULT_POLL_INTERVAL' , 5 ); // given in minutes
2018-06-28 07:21:13 +02:00
function pumpio_install ()
{
2018-12-26 08:28:16 +01:00
Hook :: register ( 'load_config' , 'addon/pumpio/pumpio.php' , 'pumpio_load_config' );
Hook :: register ( 'hook_fork' , 'addon/pumpio/pumpio.php' , 'hook_fork' );
Hook :: register ( 'post_local' , 'addon/pumpio/pumpio.php' , 'pumpio_post_local' );
Hook :: register ( 'notifier_normal' , 'addon/pumpio/pumpio.php' , 'pumpio_send' );
Hook :: register ( 'jot_networks' , 'addon/pumpio/pumpio.php' , 'pumpio_jot_nets' );
Hook :: register ( 'connector_settings' , 'addon/pumpio/pumpio.php' , 'pumpio_settings' );
Hook :: register ( 'connector_settings_post' , 'addon/pumpio/pumpio.php' , 'pumpio_settings_post' );
Hook :: register ( 'cron' , 'addon/pumpio/pumpio.php' , 'pumpio_cron' );
Hook :: register ( 'check_item_notification' , 'addon/pumpio/pumpio.php' , 'pumpio_check_item_notification' );
2013-05-09 11:11:17 +02:00
}
2013-09-04 00:04:00 +02:00
2018-06-28 07:21:13 +02:00
function pumpio_uninstall ()
{
2018-12-26 08:28:16 +01:00
Hook :: unregister ( 'load_config' , 'addon/pumpio/pumpio.php' , 'pumpio_load_config' );
Hook :: unregister ( 'hook_fork' , 'addon/pumpio/pumpio.php' , 'pumpio_hook_fork' );
Hook :: unregister ( 'post_local' , 'addon/pumpio/pumpio.php' , 'pumpio_post_local' );
Hook :: unregister ( 'notifier_normal' , 'addon/pumpio/pumpio.php' , 'pumpio_send' );
Hook :: unregister ( 'jot_networks' , 'addon/pumpio/pumpio.php' , 'pumpio_jot_nets' );
Hook :: unregister ( 'connector_settings' , 'addon/pumpio/pumpio.php' , 'pumpio_settings' );
Hook :: unregister ( 'connector_settings_post' , 'addon/pumpio/pumpio.php' , 'pumpio_settings_post' );
Hook :: unregister ( 'cron' , 'addon/pumpio/pumpio.php' , 'pumpio_cron' );
Hook :: unregister ( 'check_item_notification' , 'addon/pumpio/pumpio.php' , 'pumpio_check_item_notification' );
2013-05-09 11:11:17 +02:00
}
function pumpio_module () {}
2018-07-22 18:01:05 +02:00
function pumpio_content ( App $a )
2018-06-28 07:21:13 +02:00
{
2018-06-24 07:02:09 +02:00
if ( ! local_user ()) {
2018-01-22 20:03:11 +01:00
notice ( L10n :: t ( 'Permission denied.' ) . EOL );
2013-05-09 11:11:17 +02:00
return '' ;
}
2014-05-03 11:53:48 +02:00
require_once ( " mod/settings.php " );
settings_init ( $a );
2013-09-27 23:33:35 +02:00
2018-06-28 07:21:13 +02:00
if ( isset ( $a -> argv [ 1 ])) {
2013-05-09 11:11:17 +02:00
switch ( $a -> argv [ 1 ]) {
case " connect " :
$o = pumpio_connect ( $a );
break ;
default :
$o = print_r ( $a -> argv , true );
break ;
}
2018-06-28 07:21:13 +02:00
} else {
2013-05-09 11:11:17 +02:00
$o = pumpio_connect ( $a );
2018-06-28 07:21:13 +02:00
}
2013-05-09 11:11:17 +02:00
return $o ;
}
2018-06-28 07:21:13 +02:00
function pumpio_check_item_notification ( $a , & $notification_data )
{
2020-01-18 16:50:56 +01:00
$hostname = DI :: pConfig () -> get ( $notification_data [ " uid " ], 'pumpio' , 'host' );
$username = DI :: pConfig () -> get ( $notification_data [ " uid " ], " pumpio " , " user " );
2016-02-13 13:44:57 +01:00
2018-06-28 07:21:13 +02:00
$notification_data [ " profiles " ][] = " https:// " . $hostname . " / " . $username ;
2016-02-13 13:44:57 +01:00
}
2018-07-22 18:01:05 +02:00
function pumpio_registerclient ( App $a , $host )
2018-06-28 07:21:13 +02:00
{
2013-05-09 11:11:17 +02:00
$url = " https:// " . $host . " /api/client/register " ;
2018-01-15 14:15:33 +01:00
$params = [];
2013-05-09 11:11:17 +02:00
2017-11-07 00:55:24 +01:00
$application_name = Config :: get ( 'pumpio' , 'application_name' );
2013-05-09 14:36:50 +02:00
2018-06-28 07:21:13 +02:00
if ( $application_name == " " ) {
2019-12-16 00:47:24 +01:00
$application_name = DI :: baseUrl () -> getHostname ();
2018-06-28 07:21:13 +02:00
}
2013-05-09 14:36:50 +02:00
2018-07-10 14:38:36 +02:00
$adminlist = explode ( " , " , str_replace ( " " , " " , Config :: get ( 'config' , 'admin_email' )));
2015-04-06 14:04:40 +02:00
2014-06-10 20:13:11 +02:00
$params [ " type " ] = " client_associate " ;
2015-04-06 14:04:40 +02:00
$params [ " contacts " ] = $adminlist [ 0 ];
2014-06-10 20:13:11 +02:00
$params [ " application_type " ] = " native " ;
$params [ " application_name " ] = $application_name ;
2019-12-16 01:05:14 +01:00
$params [ " logo_url " ] = DI :: baseUrl () -> get () . " /images/friendica-256.png " ;
$params [ " redirect_uris " ] = DI :: baseUrl () -> get () . " /pumpio/connect " ;
2013-05-09 11:11:17 +02:00
2018-10-30 14:48:09 +01:00
Logger :: log ( " pumpio_registerclient: " . $url . " parameters " . print_r ( $params , true ), Logger :: DEBUG );
2013-09-29 09:33:24 +02:00
2014-06-10 20:13:11 +02:00
$ch = curl_init ( $url );
curl_setopt ( $ch , CURLOPT_HEADER , false );
2018-06-28 07:21:13 +02:00
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , true );
2014-06-10 20:13:11 +02:00
curl_setopt ( $ch , CURLOPT_POST , 1 );
2018-06-28 07:21:13 +02:00
curl_setopt ( $ch , CURLOPT_POSTFIELDS , $params );
2014-06-10 20:13:11 +02:00
curl_setopt ( $ch , CURLOPT_USERAGENT , " Friendica " );
2013-05-09 11:11:17 +02:00
2014-06-10 20:13:11 +02:00
$s = curl_exec ( $ch );
$curl_info = curl_getinfo ( $ch );
2013-05-09 11:11:17 +02:00
2014-06-10 20:13:11 +02:00
if ( $curl_info [ " http_code " ] == " 200 " ) {
$values = json_decode ( $s );
2018-10-30 14:48:09 +01:00
Logger :: log ( " pumpio_registerclient: success " . print_r ( $values , true ), Logger :: DEBUG );
2018-06-28 07:21:13 +02:00
return $values ;
2014-06-10 20:13:11 +02:00
}
2018-10-30 14:48:09 +01:00
Logger :: log ( " pumpio_registerclient: failed: " . print_r ( $curl_info , true ), Logger :: DEBUG );
2018-06-28 07:21:13 +02:00
return false ;
2013-09-29 09:33:24 +02:00
2013-05-09 11:11:17 +02:00
}
2018-07-22 18:01:05 +02:00
function pumpio_connect ( App $a )
2018-06-28 07:21:13 +02:00
{
2013-05-09 11:11:17 +02:00
// Define the needed keys
2020-01-18 16:50:56 +01:00
$consumer_key = DI :: pConfig () -> get ( local_user (), 'pumpio' , 'consumer_key' );
$consumer_secret = DI :: pConfig () -> get ( local_user (), 'pumpio' , 'consumer_secret' );
$hostname = DI :: pConfig () -> get ( local_user (), 'pumpio' , 'host' );
2013-05-09 11:11:17 +02:00
2017-06-09 03:20:27 +02:00
if ((( $consumer_key == " " ) || ( $consumer_secret == " " )) && ( $hostname != " " )) {
2018-10-30 00:40:18 +01:00
Logger :: log ( " pumpio_connect: register client " );
2013-05-09 14:36:50 +02:00
$clientdata = pumpio_registerclient ( $a , $hostname );
2020-01-18 16:54:49 +01:00
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'consumer_key' , $clientdata -> client_id );
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'consumer_secret' , $clientdata -> client_secret );
2013-05-09 11:11:17 +02:00
2020-01-18 16:50:56 +01:00
$consumer_key = DI :: pConfig () -> get ( local_user (), 'pumpio' , 'consumer_key' );
$consumer_secret = DI :: pConfig () -> get ( local_user (), 'pumpio' , 'consumer_secret' );
2013-09-27 23:33:35 +02:00
2018-10-30 14:48:09 +01:00
Logger :: log ( " pumpio_connect: ckey: " . $consumer_key . " csecrect: " . $consumer_secret , Logger :: DEBUG );
2013-05-09 11:11:17 +02:00
}
2017-06-09 03:20:27 +02:00
if (( $consumer_key == " " ) || ( $consumer_secret == " " )) {
2018-10-30 00:40:18 +01:00
Logger :: log ( " pumpio_connect: " . sprintf ( " Unable to register the client at the pump.io server '%s'. " , $hostname ));
2013-09-27 23:33:35 +02:00
2018-01-24 04:59:20 +01:00
$o .= L10n :: t ( " Unable to register the client at the pump.io server '%s'. " , $hostname );
2018-06-28 07:21:13 +02:00
return $o ;
2013-09-27 23:33:35 +02:00
}
2013-05-09 11:11:17 +02:00
// The callback URL is the script that gets called after the user authenticates with pumpio
2019-12-16 01:05:14 +01:00
$callback_url = DI :: baseUrl () -> get () . " /pumpio/connect " ;
2013-05-09 11:11:17 +02:00
// Let's begin. First we need a Request Token. The request token is required to send the user
// to pumpio's login page.
2018-01-31 05:42:22 +01:00
// Create a new instance of the oauth_client_class library. For this step, all we need to give the library is our
2013-05-09 11:11:17 +02:00
// Consumer Key and Consumer Secret
$client = new oauth_client_class ;
2018-08-29 19:09:19 +02:00
$client -> debug = 0 ;
2013-05-09 11:11:17 +02:00
$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 )) {
2018-10-30 14:48:09 +01:00
Logger :: log ( " pumpio_connect: otoken: " . $client -> access_token . " osecrect: " . $client -> access_token_secret , Logger :: DEBUG );
2020-01-18 16:54:49 +01:00
DI :: pConfig () -> set ( local_user (), " pumpio " , " oauth_token " , $client -> access_token );
DI :: pConfig () -> set ( local_user (), " pumpio " , " oauth_token_secret " , $client -> access_token_secret );
2013-05-09 11:11:17 +02:00
}
}
$success = $client -> Finalize ( $success );
}
2018-06-28 07:21:13 +02:00
if ( $client -> exit ) {
2014-06-10 20:13:11 +02:00
$o = 'Could not connect to pumpio. Refresh the page or try again later.' ;
2018-06-28 07:21:13 +02:00
}
2013-05-09 11:11:17 +02:00
2018-06-24 07:02:09 +02:00
if ( $success ) {
2018-10-30 00:40:18 +01:00
Logger :: log ( " pumpio_connect: authenticated " );
2018-08-29 19:09:19 +02:00
$o = L10n :: t ( " You are now authenticated to pumpio. " );
2019-12-16 01:05:14 +01:00
$o .= '<br /><a href="' . DI :: baseUrl () -> get () . '/settings/connectors">' . L10n :: t ( " return to the connector page " ) . '</a>' ;
2013-09-29 09:33:24 +02:00
} else {
2018-10-30 00:40:18 +01:00
Logger :: log ( " pumpio_connect: could not connect " );
2013-09-29 09:33:24 +02:00
$o = 'Could not connect to pumpio. Refresh the page or try again later.' ;
}
2013-05-09 11:11:17 +02:00
2018-06-28 07:21:13 +02:00
return $o ;
2013-05-09 11:11:17 +02:00
}
2019-03-25 03:44:50 +01:00
function pumpio_jot_nets ( App $a , array & $jotnets_fields )
2018-06-28 07:21:13 +02:00
{
2018-07-22 18:01:05 +02:00
if ( ! local_user ()) {
2014-06-10 20:13:11 +02:00
return ;
2018-06-28 07:21:13 +02:00
}
2014-06-10 20:13:11 +02:00
2020-01-18 16:50:56 +01:00
if ( DI :: pConfig () -> get ( local_user (), 'pumpio' , 'post' )) {
2019-03-25 03:44:50 +01:00
$jotnets_fields [] = [
'type' => 'checkbox' ,
'field' => [
'pumpio_enable' ,
L10n :: t ( 'Post to pumpio' ),
2020-01-18 16:50:56 +01:00
DI :: pConfig () -> get ( local_user (), 'pumpio' , 'post_by_default' )
2019-03-25 03:44:50 +01:00
]
];
2014-06-10 20:13:11 +02:00
}
2013-05-09 11:11:17 +02:00
}
2018-07-22 18:01:05 +02:00
function pumpio_settings ( App $a , & $s )
2018-06-28 07:21:13 +02:00
{
if ( ! local_user ()) {
2014-06-10 20:13:11 +02:00
return ;
2018-06-28 07:21:13 +02:00
}
2013-09-03 08:22:46 +02:00
2014-06-10 20:13:11 +02:00
/* Add our stylesheet to the page so we can make our settings look nice */
2013-05-09 11:11:17 +02:00
2019-12-30 20:02:08 +01:00
DI :: page ()[ 'htmlhead' ] .= '<link rel="stylesheet" type="text/css" href="' . DI :: baseUrl () -> get () . '/addon/pumpio/pumpio.css' . '" media="all" />' . " \r \n " ;
2013-05-09 11:11:17 +02:00
2014-06-10 20:13:11 +02:00
/* Get the current state of our config variables */
2013-05-09 14:36:50 +02:00
2020-01-18 16:50:56 +01:00
$import_enabled = DI :: pConfig () -> get ( local_user (), 'pumpio' , 'import' );
2014-06-10 20:13:11 +02:00
$import_checked = (( $import_enabled ) ? ' checked="checked" ' : '' );
2013-05-09 15:08:08 +02:00
2020-01-18 16:50:56 +01:00
$enabled = DI :: pConfig () -> get ( local_user (), 'pumpio' , 'post' );
2014-06-10 20:13:11 +02:00
$checked = (( $enabled ) ? ' checked="checked" ' : '' );
$css = (( $enabled ) ? '' : '-disabled' );
2013-05-09 11:11:17 +02:00
2020-01-18 16:50:56 +01:00
$def_enabled = DI :: pConfig () -> get ( local_user (), 'pumpio' , 'post_by_default' );
2014-06-10 20:13:11 +02:00
$def_checked = (( $def_enabled ) ? ' checked="checked" ' : '' );
2013-05-09 11:11:17 +02:00
2020-01-18 16:50:56 +01:00
$public_enabled = DI :: pConfig () -> get ( local_user (), 'pumpio' , 'public' );
2014-06-10 20:13:11 +02:00
$public_checked = (( $public_enabled ) ? ' checked="checked" ' : '' );
2013-05-09 11:11:17 +02:00
2020-01-18 16:50:56 +01:00
$mirror_enabled = DI :: pConfig () -> get ( local_user (), 'pumpio' , 'mirror' );
2014-06-10 20:13:11 +02:00
$mirror_checked = (( $mirror_enabled ) ? ' checked="checked" ' : '' );
2013-05-09 11:11:17 +02:00
2020-01-18 16:50:56 +01:00
$servername = DI :: pConfig () -> get ( local_user (), " pumpio " , " host " );
$username = DI :: pConfig () -> get ( local_user (), " pumpio " , " user " );
2013-05-09 14:36:50 +02:00
2014-06-10 20:13:11 +02:00
/* Add some HTML to the existing form */
2013-05-09 15:08:08 +02:00
2014-06-10 20:13:11 +02:00
$s .= '<span id="settings_pumpio_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_pumpio_expanded\'); openClose(\'settings_pumpio_inflated\');">' ;
2018-01-22 20:03:11 +01:00
$s .= '<img class="connector' . $css . '" src="images/pumpio.png" /><h3 class="connector">' . L10n :: t ( 'Pump.io Import/Export/Mirror' ) . '</h3>' ;
2014-06-10 20:13:11 +02:00
$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\');">' ;
2018-01-22 20:03:11 +01:00
$s .= '<img class="connector' . $css . '" src="images/pumpio.png" /><h3 class="connector">' . L10n :: t ( 'Pump.io Import/Export/Mirror' ) . '</h3>' ;
2014-06-10 20:13:11 +02:00
$s .= '</span>' ;
2013-05-09 11:11:17 +02:00
2014-06-10 20:13:11 +02:00
$s .= '<div id="pumpio-username-wrapper">' ;
2018-01-22 20:03:11 +01:00
$s .= '<label id="pumpio-username-label" for="pumpio-username">' . L10n :: t ( 'pump.io username (without the servername)' ) . '</label>' ;
2014-06-10 20:13:11 +02:00
$s .= '<input id="pumpio-username" type="text" name="pumpio_user" value="' . $username . '" />' ;
$s .= '</div><div class="clear"></div>' ;
2013-09-03 08:22:46 +02:00
2014-06-10 20:13:11 +02:00
$s .= '<div id="pumpio-servername-wrapper">' ;
2018-01-22 20:03:11 +01:00
$s .= '<label id="pumpio-servername-label" for="pumpio-servername">' . L10n :: t ( 'pump.io servername (without "http://" or "https://" )' ) . '</label>' ;
2014-06-10 20:13:11 +02:00
$s .= '<input id="pumpio-servername" type="text" name="pumpio_host" value="' . $servername . '" />' ;
$s .= '</div><div class="clear"></div>' ;
2013-06-23 03:30:22 +02:00
2017-06-09 03:20:27 +02:00
if (( $username != '' ) && ( $servername != '' )) {
2020-01-18 16:50:56 +01:00
$oauth_token = DI :: pConfig () -> get ( local_user (), " pumpio " , " oauth_token " );
$oauth_token_secret = DI :: pConfig () -> get ( local_user (), " pumpio " , " oauth_token_secret " );
2013-06-23 03:30:22 +02:00
2014-06-10 20:13:11 +02:00
$s .= '<div id="pumpio-password-wrapper">' ;
2017-06-09 03:20:27 +02:00
if (( $oauth_token == " " ) || ( $oauth_token_secret == " " )) {
2014-06-10 20:13:11 +02:00
$s .= '<div id="pumpio-authenticate-wrapper">' ;
2019-12-16 01:05:14 +01:00
$s .= '<a href="' . DI :: baseUrl () -> get () . '/pumpio/connect">' . L10n :: t ( " Authenticate your pump.io connection " ) . '</a>' ;
2014-06-10 20:13:11 +02:00
$s .= '</div><div class="clear"></div>' ;
} else {
$s .= '<div id="pumpio-import-wrapper">' ;
2018-01-22 20:03:11 +01:00
$s .= '<label id="pumpio-import-label" for="pumpio-import">' . L10n :: t ( 'Import the remote timeline' ) . '</label>' ;
2014-06-10 20:13:11 +02:00
$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">' ;
2018-01-22 20:03:11 +01:00
$s .= '<label id="pumpio-enable-label" for="pumpio-checkbox">' . L10n :: t ( 'Enable pump.io Post Addon' ) . '</label>' ;
2014-06-10 20:13:11 +02:00
$s .= '<input id="pumpio-checkbox" type="checkbox" name="pumpio" value="1" ' . $checked . '/>' ;
$s .= '</div><div class="clear"></div>' ;
$s .= '<div id="pumpio-bydefault-wrapper">' ;
2018-01-22 20:03:11 +01:00
$s .= '<label id="pumpio-bydefault-label" for="pumpio-bydefault">' . L10n :: t ( 'Post to pump.io by default' ) . '</label>' ;
2014-06-10 20:13:11 +02:00
$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">' ;
2018-01-22 20:03:11 +01:00
$s .= '<label id="pumpio-public-label" for="pumpio-public">' . L10n :: t ( 'Should posts be public?' ) . '</label>' ;
2014-06-10 20:13:11 +02:00
$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">' ;
2018-01-22 20:03:11 +01:00
$s .= '<label id="pumpio-mirror-label" for="pumpio-mirror">' . L10n :: t ( 'Mirror all public posts' ) . '</label>' ;
2014-06-10 20:13:11 +02:00
$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">' ;
2018-01-22 20:03:11 +01:00
$s .= '<label id="pumpio-delete-label" for="pumpio-delete">' . L10n :: t ( 'Check to delete this preset' ) . '</label>' ;
2014-06-10 20:13:11 +02:00
$s .= '<input id="pumpio-delete" type="checkbox" name="pumpio_delete" value="1" />' ;
$s .= '</div><div class="clear"></div>' ;
}
2013-06-23 03:30:22 +02:00
$s .= '</div><div class="clear"></div>' ;
}
2013-05-09 11:11:17 +02:00
2014-06-10 20:13:11 +02:00
/* provide a submit button */
2013-05-09 11:11:17 +02:00
2018-01-22 20:03:11 +01:00
$s .= '<div class="settings-submit-wrapper" ><input type="submit" id="pumpio-submit" name="pumpio-submit" class="settings-submit" value="' . L10n :: t ( 'Save Settings' ) . '" /></div></div>' ;
2013-05-09 11:11:17 +02:00
}
2018-07-22 18:01:05 +02:00
function pumpio_settings_post ( App $a , array & $b )
2018-06-28 07:21:13 +02:00
{
2018-07-22 18:01:05 +02:00
if ( ! empty ( $_POST [ 'pumpio-submit' ])) {
if ( ! empty ( $_POST [ 'pumpio_delete' ])) {
2020-01-18 16:54:49 +01:00
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'consumer_key' , '' );
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'consumer_secret' , '' );
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'oauth_token' , '' );
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'oauth_token_secret' , '' );
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'post' , false );
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'import' , false );
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'host' , '' );
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'user' , '' );
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'public' , false );
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'mirror' , false );
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'post_by_default' , false );
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'lastdate' , 0 );
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'last_id' , '' );
2013-06-23 03:30:22 +02:00
} else {
// filtering the username if it is filled wrong
$user = $_POST [ 'pumpio_user' ];
if ( strstr ( $user , " @ " )) {
$pos = strpos ( $user , " @ " );
2018-07-22 18:01:05 +02:00
2018-06-28 07:21:13 +02:00
if ( $pos > 0 ) {
2013-06-23 03:30:22 +02:00
$user = substr ( $user , 0 , $pos );
2018-06-28 07:21:13 +02:00
}
2013-06-23 03:30:22 +02:00
}
2013-05-09 11:11:17 +02:00
2013-06-23 03:30:22 +02:00
// Filtering the hostname if someone is entering it with "http"
$host = $_POST [ 'pumpio_host' ];
$host = trim ( $host );
2018-01-15 14:15:33 +01:00
$host = str_replace ([ " https:// " , " http:// " ], [ " " , " " ], $host );
2013-06-23 03:30:22 +02:00
2020-01-18 16:54:49 +01:00
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'post' , $_POST [ 'pumpio' ] ? ? false );
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'import' , $_POST [ 'pumpio_import' ] ? ? false );
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'host' , $host );
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'user' , $user );
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'public' , $_POST [ 'pumpio_public' ] ? ? false );
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'mirror' , $_POST [ 'pumpio_mirror' ] ? ? false );
DI :: pConfig () -> set ( local_user (), 'pumpio' , 'post_by_default' , $_POST [ 'pumpio_bydefault' ] ? ? false );
2018-08-29 19:09:19 +02:00
if ( ! empty ( $_POST [ 'pumpio_mirror' ])) {
2020-01-18 16:56:45 +01:00
DI :: pConfig () -> delete ( local_user (), 'pumpio' , 'lastdate' );
2018-06-28 07:21:13 +02:00
}
2013-06-23 03:30:22 +02:00
}
2013-05-09 11:11:17 +02:00
}
}
2019-03-24 12:54:26 +01:00
function pumpio_load_config ( App $a , ConfigFileLoader $loader )
2018-06-28 05:18:58 +02:00
{
2019-02-10 20:10:59 +01:00
$a -> getConfigCache () -> load ( $loader -> loadAddonConfig ( 'pumpio' ));
2018-06-28 05:18:58 +02:00
}
2018-11-10 17:20:19 +01:00
function pumpio_hook_fork ( App $a , array & $b )
{
if ( $b [ 'name' ] != 'notifier_normal' ) {
return ;
}
$post = $b [ 'data' ];
// Deleting and editing is not supported by the addon (deleting could, but isn't by now)
if ( $post [ 'deleted' ] || ( $post [ 'created' ] !== $post [ 'edited' ])) {
$b [ 'execute' ] = false ;
return ;
}
// if post comes from pump.io don't send it back
if ( $post [ 'app' ] == " pump.io " ) {
$b [ 'execute' ] = false ;
return ;
}
2020-01-18 16:50:56 +01:00
if ( DI :: pConfig () -> get ( $post [ 'uid' ], 'pumpio' , 'import' )) {
2018-11-10 17:20:19 +01:00
// Don't fork if it isn't a reply to a pump.io post
if (( $post [ 'parent' ] != $post [ 'id' ]) && ! Item :: exists ([ 'id' => $post [ 'parent' ], 'network' => Protocol :: PUMPIO ])) {
Logger :: log ( 'No pump.io parent found for item ' . $post [ 'id' ]);
$b [ 'execute' ] = false ;
return ;
}
} else {
// Comments are never exported when we don't import the pumpio timeline
if ( ! strstr ( $post [ 'postopts' ], 'pumpio' ) || ( $post [ 'parent' ] != $post [ 'id' ]) || $post [ 'private' ]) {
$b [ 'execute' ] = false ;
return ;
}
}
}
2018-07-22 18:01:05 +02:00
function pumpio_post_local ( App $a , array & $b )
2018-06-28 07:21:13 +02:00
{
2017-09-06 18:16:33 +02:00
if ( ! local_user () || ( local_user () != $b [ 'uid' ])) {
2013-05-09 11:11:17 +02:00
return ;
2017-09-06 18:16:33 +02:00
}
2013-05-09 11:11:17 +02:00
2020-01-18 16:50:56 +01:00
$pumpio_post = intval ( DI :: pConfig () -> get ( local_user (), 'pumpio' , 'post' ));
2013-05-09 11:11:17 +02:00
2018-07-22 18:01:05 +02:00
$pumpio_enable = (( $pumpio_post && ! empty ( $_REQUEST [ 'pumpio_enable' ])) ? intval ( $_REQUEST [ 'pumpio_enable' ]) : 0 );
2013-05-09 11:11:17 +02:00
2020-01-18 16:50:56 +01:00
if ( $b [ 'api_source' ] && intval ( DI :: pConfig () -> get ( local_user (), 'pumpio' , 'post_by_default' ))) {
2013-05-09 11:11:17 +02:00
$pumpio_enable = 1 ;
2017-09-06 18:16:33 +02:00
}
2013-05-09 11:11:17 +02:00
2017-09-06 18:16:33 +02:00
if ( ! $pumpio_enable ) {
2013-05-09 11:11:17 +02:00
return ;
2017-09-06 18:16:33 +02:00
}
2013-05-09 11:11:17 +02:00
2017-09-06 18:16:33 +02:00
if ( strlen ( $b [ 'postopts' ])) {
2013-05-09 11:11:17 +02:00
$b [ 'postopts' ] .= ',' ;
2017-09-06 18:16:33 +02:00
}
2013-05-09 11:11:17 +02:00
$b [ 'postopts' ] .= 'pumpio' ;
}
2018-07-22 18:01:05 +02:00
function pumpio_send ( App $a , array & $b )
2018-06-28 07:21:13 +02:00
{
2020-01-18 16:50:56 +01:00
if ( ! DI :: pConfig () -> get ( $b [ " uid " ], 'pumpio' , 'import' ) && ( $b [ 'deleted' ] || $b [ 'private' ] || ( $b [ 'created' ] !== $b [ 'edited' ]))) {
2018-07-22 18:01:05 +02:00
return ;
2013-09-05 08:35:37 +02:00
}
2018-10-30 14:48:09 +01:00
Logger :: log ( " pumpio_send: parameter " . print_r ( $b , true ), Logger :: DATA );
2013-05-09 11:11:17 +02:00
2018-06-24 07:02:09 +02:00
if ( $b [ 'parent' ] != $b [ 'id' ]) {
2013-09-03 08:22:46 +02:00
// Looking if its a reply to a pumpio post
2018-08-11 22:40:48 +02:00
$condition = [ 'id' => $b [ 'parent' ], 'network' => Protocol :: PUMPIO ];
2018-06-18 07:15:46 +02:00
$orig_post = Item :: selectFirst ([], $condition );
2013-09-03 08:22:46 +02:00
2018-07-21 14:46:13 +02:00
if ( ! DBA :: isResult ( $orig_post )) {
2018-10-30 00:40:18 +01:00
Logger :: log ( " pumpio_send: no pumpio post " . $b [ " parent " ]);
2013-09-03 08:22:46 +02:00
return ;
2013-09-12 23:20:26 +02:00
} else {
2013-09-03 08:22:46 +02:00
$iscomment = true ;
}
} else {
$iscomment = false ;
2013-05-09 11:11:17 +02:00
2013-09-08 17:09:01 +02:00
$receiver = pumpio_getreceiver ( $a , $b );
2013-09-03 08:22:46 +02:00
2018-10-30 00:40:18 +01:00
Logger :: log ( " pumpio_send: receiver " . print_r ( $receiver , true ));
2013-09-08 17:09:01 +02:00
2018-06-28 07:21:13 +02:00
if ( ! count ( $receiver ) && ( $b [ 'private' ] || ! strstr ( $b [ 'postopts' ], 'pumpio' ))) {
2013-09-03 08:22:46 +02:00
return ;
2018-01-10 04:27:40 +01:00
}
2017-11-26 00:56:18 +01:00
// Dont't post if the post doesn't belong to us.
// This is a check for forum postings
2018-07-20 14:20:48 +02:00
$self = DBA :: selectFirst ( 'contact' , [ 'id' ], [ 'uid' => $b [ 'uid' ], 'self' => true ]);
2017-11-26 00:56:18 +01:00
if ( $b [ 'contact-id' ] != $self [ 'id' ]) {
return ;
}
2013-09-03 08:22:46 +02:00
}
2013-05-09 11:11:17 +02:00
2019-10-24 00:25:42 +02:00
if ( $b [ 'verb' ] == Activity :: LIKE ) {
2018-06-28 07:21:13 +02:00
if ( $b [ 'deleted' ]) {
2013-09-12 23:20:26 +02:00
pumpio_action ( $a , $b [ " uid " ], $b [ " thr-parent " ], " unlike " );
2018-06-28 07:21:13 +02:00
} else {
2013-09-12 23:20:26 +02:00
pumpio_action ( $a , $b [ " uid " ], $b [ " thr-parent " ], " like " );
2018-06-28 07:21:13 +02:00
}
2013-09-12 23:20:26 +02:00
return ;
}
2019-10-24 00:25:42 +02:00
if ( $b [ 'verb' ] == Activity :: DISLIKE ) {
2013-09-12 23:20:26 +02:00
return ;
2018-06-28 07:21:13 +02:00
}
2013-09-12 23:20:26 +02:00
2019-10-24 00:25:42 +02:00
if (( $b [ 'verb' ] == Activity :: POST ) && ( $b [ 'created' ] !== $b [ 'edited' ]) && ! $b [ 'deleted' ]) {
2018-06-28 18:39:25 +02:00
pumpio_action ( $a , $b [ " uid " ], $b [ " uri " ], " update " , $b [ " body " ]);
2018-06-28 07:21:13 +02:00
}
2013-09-12 23:20:26 +02:00
2019-10-24 00:25:42 +02:00
if (( $b [ 'verb' ] == Activity :: POST ) && $b [ 'deleted' ]) {
2018-06-28 18:39:25 +02:00
pumpio_action ( $a , $b [ " uid " ], $b [ " uri " ], " delete " );
2018-06-28 07:21:13 +02:00
}
2013-09-12 23:20:26 +02:00
2018-06-28 07:21:13 +02:00
if ( $b [ 'deleted' ] || ( $b [ 'created' ] !== $b [ 'edited' ])) {
2013-09-12 23:20:26 +02:00
return ;
2018-06-28 07:21:13 +02:00
}
2013-09-12 23:20:26 +02:00
2013-05-09 14:36:50 +02:00
// if post comes from pump.io don't send it back
2018-06-28 07:21:13 +02:00
if ( $b [ 'app' ] == " pump.io " ) {
2013-05-09 14:36:50 +02:00
return ;
2018-06-28 07:21:13 +02:00
}
2013-05-09 14:36:50 +02:00
2014-04-29 14:23:39 +02:00
// To-Do;
// Support for native shares
// http://<hostname>/api/<type>/shares?id=<the-object-id>
2013-09-05 08:35:37 +02:00
2020-01-18 16:50:56 +01:00
$oauth_token = DI :: pConfig () -> get ( $b [ 'uid' ], " pumpio " , " oauth_token " );
$oauth_token_secret = DI :: pConfig () -> get ( $b [ 'uid' ], " pumpio " , " oauth_token_secret " );
$consumer_key = DI :: pConfig () -> get ( $b [ 'uid' ], " pumpio " , " consumer_key " );
$consumer_secret = DI :: pConfig () -> get ( $b [ 'uid' ], " pumpio " , " consumer_secret " );
2013-05-09 11:11:17 +02:00
2020-01-18 16:50:56 +01:00
$host = DI :: pConfig () -> get ( $b [ 'uid' ], " pumpio " , " host " );
$user = DI :: pConfig () -> get ( $b [ 'uid' ], " pumpio " , " user " );
$public = DI :: pConfig () -> get ( $b [ 'uid' ], " pumpio " , " public " );
2013-05-09 11:11:17 +02:00
2018-06-24 07:02:09 +02:00
if ( $oauth_token && $oauth_token_secret ) {
2013-05-09 11:11:17 +02:00
$title = trim ( $b [ 'title' ]);
2018-02-15 03:43:40 +01:00
$content = BBCode :: convert ( $b [ 'body' ], false , 4 );
2013-07-20 14:58:42 +02:00
2018-01-15 14:15:33 +01:00
$params = [];
2013-05-09 11:11:17 +02:00
2013-05-15 22:22:16 +02:00
$params [ " verb " ] = " post " ;
2013-09-03 08:22:46 +02:00
if ( ! $iscomment ) {
2018-01-15 14:15:33 +01:00
$params [ " object " ] = [
2018-06-28 18:39:25 +02:00
'objectType' => " note " ,
'content' => $content ];
2014-11-10 23:00:39 +01:00
2018-07-10 14:30:23 +02:00
if ( ! empty ( $title )) {
2014-11-10 23:00:39 +01:00
$params [ " object " ][ " displayName " ] = $title ;
2018-06-28 07:21:13 +02:00
}
2013-09-03 08:22:46 +02:00
2018-07-10 14:30:23 +02:00
if ( ! empty ( $receiver [ " to " ])) {
2013-09-08 17:09:01 +02:00
$params [ " to " ] = $receiver [ " to " ];
2018-06-28 07:21:13 +02:00
}
2013-09-08 17:09:01 +02:00
2018-07-10 14:30:23 +02:00
if ( ! empty ( $receiver [ " bto " ])) {
2013-09-08 17:09:01 +02:00
$params [ " bto " ] = $receiver [ " bto " ];
2018-06-28 07:21:13 +02:00
}
2013-09-08 17:09:01 +02:00
2018-07-10 14:30:23 +02:00
if ( ! empty ( $receiver [ " cc " ])) {
2013-09-08 17:09:01 +02:00
$params [ " cc " ] = $receiver [ " cc " ];
2018-06-28 07:21:13 +02:00
}
2013-09-08 17:09:01 +02:00
2018-07-10 14:30:23 +02:00
if ( ! empty ( $receiver [ " bcc " ])) {
2013-09-08 17:09:01 +02:00
$params [ " bcc " ] = $receiver [ " bcc " ];
2018-06-28 07:21:13 +02:00
}
2013-09-03 08:22:46 +02:00
} else {
2018-01-15 14:15:33 +01:00
$inReplyTo = [ " id " => $orig_post [ " uri " ],
2018-06-28 18:43:06 +02:00
" objectType " => " note " ];
2013-09-03 08:22:46 +02:00
2019-10-25 00:34:46 +02:00
if (( $orig_post [ " object-type " ] != " " ) && ( strstr ( $orig_post [ " object-type " ], ActivityNamespace :: ACTIVITY_SCHEMA ))) {
$inReplyTo [ " objectType " ] = str_replace ( ActivityNamespace :: ACTIVITY_SCHEMA , '' , $orig_post [ " object-type " ]);
2018-06-28 07:21:13 +02:00
}
2014-07-22 00:40:02 +02:00
2018-01-15 14:15:33 +01:00
$params [ " object " ] = [
2018-06-28 18:39:25 +02:00
'objectType' => " comment " ,
'content' => $content ,
'inReplyTo' => $inReplyTo ];
2014-11-10 23:00:39 +01:00
2018-06-28 07:21:13 +02:00
if ( $title != " " ) {
2014-11-10 23:00:39 +01:00
$params [ " object " ][ " displayName " ] = $title ;
2018-06-28 07:21:13 +02:00
}
2013-09-03 08:22:46 +02:00
}
2013-05-09 14:36:50 +02:00
2013-05-09 11:11:17 +02: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 23:34:54 +02:00
$username = $user . '@' . $host ;
2013-09-03 08:22:46 +02:00
$url = 'https://' . $host . '/api/user/' . $user . '/feed' ;
2018-06-28 07:21:13 +02:00
if ( pumpio_reachable ( $url )) {
2018-01-15 14:15:33 +01:00
$success = $client -> CallAPI ( $url , 'POST' , $params , [ 'FailOnAccessError' => true , 'RequestContentType' => 'application/json' ], $user );
2018-06-28 07:21:13 +02:00
} else {
2015-11-03 00:42:04 +01:00
$success = false ;
2018-06-28 07:21:13 +02:00
}
2013-09-03 08:22:46 +02:00
2018-06-24 07:02:09 +02:00
if ( $success ) {
2018-06-28 07:21:13 +02:00
if ( $user -> generator -> displayName ) {
2020-01-18 16:54:49 +01:00
DI :: pConfig () -> set ( $b [ " uid " ], " pumpio " , " application_name " , $user -> generator -> displayName );
2018-06-28 07:21:13 +02:00
}
2015-03-22 08:55:45 +01:00
2013-09-03 08:22:46 +02:00
$post_id = $user -> object -> id ;
2018-10-30 00:40:18 +01:00
Logger :: log ( 'pumpio_send ' . $username . ': success ' . $post_id );
2018-06-24 07:02:09 +02:00
if ( $post_id && $iscomment ) {
2018-10-30 00:40:18 +01:00
Logger :: log ( 'pumpio_send ' . $username . ': Update extid ' . $post_id . " for post id " . $b [ 'id' ]);
2018-02-06 15:24:24 +01:00
Item :: update ([ 'extid' => $post_id ], [ 'id' => $b [ 'id' ]]);
2013-09-03 08:22:46 +02:00
}
} else {
2018-10-30 00:40:18 +01:00
Logger :: log ( 'pumpio_send ' . $username . ': ' . $url . ' general error: ' . print_r ( $user , true ));
2019-04-04 16:14:55 +02:00
Worker :: defer ();
2013-09-03 08:22:46 +02:00
}
2013-05-09 11:11:17 +02:00
}
}
2018-07-22 18:01:05 +02:00
function pumpio_action ( App $a , $uid , $uri , $action , $content = " " )
2018-06-28 07:21:13 +02:00
{
2013-09-12 23:20:26 +02:00
// Don't do likes and other stuff if you don't import the timeline
2020-01-18 16:50:56 +01:00
if ( ! DI :: pConfig () -> get ( $uid , 'pumpio' , 'import' )) {
2013-09-12 23:20:26 +02:00
return ;
2018-06-28 07:21:13 +02:00
}
2013-09-12 23:20:26 +02:00
2020-01-18 16:50:56 +01:00
$ckey = DI :: pConfig () -> get ( $uid , 'pumpio' , 'consumer_key' );
$csecret = DI :: pConfig () -> get ( $uid , 'pumpio' , 'consumer_secret' );
$otoken = DI :: pConfig () -> get ( $uid , 'pumpio' , 'oauth_token' );
$osecret = DI :: pConfig () -> get ( $uid , 'pumpio' , 'oauth_token_secret' );
$hostname = DI :: pConfig () -> get ( $uid , 'pumpio' , 'host' );
$username = DI :: pConfig () -> get ( $uid , " pumpio " , " user " );
2013-09-05 08:35:37 +02:00
2018-06-23 12:51:45 +02:00
$orig_post = Item :: selectFirst ([], [ 'uri' => $uri , 'uid' => $uid ]);
2013-09-05 08:35:37 +02:00
2018-07-21 14:46:13 +02:00
if ( ! DBA :: isResult ( $orig_post )) {
2013-09-05 08:35:37 +02:00
return ;
2018-06-18 07:15:46 +02:00
}
2013-09-05 08:35:37 +02:00
2018-06-28 07:21:13 +02:00
if ( $orig_post [ " extid " ] && ! strstr ( $orig_post [ " extid " ], " /proxy/ " )) {
2013-09-05 08:35:37 +02:00
$uri = $orig_post [ " extid " ];
2018-06-28 07:21:13 +02:00
} else {
2013-09-05 08:35:37 +02:00
$uri = $orig_post [ " uri " ];
2018-06-28 07:21:13 +02:00
}
2013-09-05 08:35:37 +02:00
2019-10-25 00:34:46 +02:00
if (( $orig_post [ " object-type " ] != " " ) && ( strstr ( $orig_post [ " object-type " ], ActivityNamespace :: ACTIVITY_SCHEMA ))) {
$objectType = str_replace ( ActivityNamespace :: ACTIVITY_SCHEMA , '' , $orig_post [ " object-type " ]);
2018-06-28 07:21:13 +02:00
} elseif ( strstr ( $uri , " /api/comment/ " )) {
2013-09-05 08:35:37 +02:00
$objectType = " comment " ;
2018-06-28 07:21:13 +02:00
} elseif ( strstr ( $uri , " /api/note/ " )) {
2013-09-05 08:35:37 +02:00
$objectType = " note " ;
2018-06-28 07:21:13 +02:00
} elseif ( strstr ( $uri , " /api/image/ " )) {
2013-09-05 08:35:37 +02:00
$objectType = " image " ;
2018-06-28 07:21:13 +02:00
}
2013-09-05 08:35:37 +02:00
$params [ " verb " ] = $action ;
2018-01-15 14:15:33 +01:00
$params [ " object " ] = [ 'id' => $uri ,
2013-09-07 13:10:51 +02:00
" objectType " => $objectType ,
2018-01-15 14:15:33 +01:00
" content " => $content ];
2013-09-05 08:35:37 +02: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' ;
2018-06-28 07:21:13 +02:00
if ( pumpio_reachable ( $url )) {
2018-01-15 14:15:33 +01:00
$success = $client -> CallAPI ( $url , 'POST' , $params , [ 'FailOnAccessError' => true , 'RequestContentType' => 'application/json' ], $user );
2018-06-28 07:21:13 +02:00
} else {
2015-11-03 00:42:04 +01:00
$success = false ;
2018-06-28 07:21:13 +02:00
}
2013-09-05 08:35:37 +02:00
2018-06-28 07:21:13 +02:00
if ( $success ) {
2018-10-30 00:40:18 +01:00
Logger :: log ( 'pumpio_action ' . $username . ' ' . $action . ': success ' . $uri );
2018-06-28 07:21:13 +02:00
} else {
2018-10-30 00:40:18 +01:00
Logger :: log ( 'pumpio_action ' . $username . ' ' . $action . ': general error: ' . $uri . ' ' . print_r ( $user , true ));
2019-04-04 16:14:55 +02:00
Worker :: defer ();
2013-09-05 08:35:37 +02:00
}
}
2018-07-22 18:01:05 +02:00
function pumpio_sync ( App $a )
2018-06-28 07:21:13 +02:00
{
2018-07-10 14:30:23 +02:00
$r = q ( " SELECT * FROM `addon` WHERE `installed` = 1 AND `name` = 'pumpio' " );
2015-09-26 11:17:12 +02:00
2018-07-21 14:46:13 +02:00
if ( ! DBA :: isResult ( $r )) {
2015-09-26 11:17:12 +02:00
return ;
2018-06-28 07:21:13 +02:00
}
2015-09-26 11:17:12 +02:00
2018-06-28 07:21:13 +02:00
$last = Config :: get ( 'pumpio' , 'last_poll' );
2014-06-10 20:13:11 +02:00
2018-06-28 07:21:13 +02:00
$poll_interval = intval ( Config :: get ( 'pumpio' , 'poll_interval' , PUMPIO_DEFAULT_POLL_INTERVAL ));
2014-06-10 20:13:11 +02:00
2018-06-24 07:02:09 +02:00
if ( $last ) {
2014-06-10 20:13:11 +02:00
$next = $last + ( $poll_interval * 60 );
2018-06-24 07:02:09 +02:00
if ( $next > time ()) {
2018-10-30 00:40:18 +01:00
Logger :: log ( 'pumpio: poll intervall not reached' );
2014-06-10 20:13:11 +02:00
return ;
}
}
2018-10-30 00:40:18 +01:00
Logger :: log ( 'pumpio: cron_start' );
2014-06-10 20:13:11 +02:00
$r = q ( " SELECT * FROM `pconfig` WHERE `cat` = 'pumpio' AND `k` = 'mirror' AND `v` = '1' ORDER BY RAND() " );
2018-07-21 14:46:13 +02:00
if ( DBA :: isResult ( $r )) {
2018-06-28 07:21:13 +02:00
foreach ( $r as $rr ) {
2018-10-30 00:40:18 +01:00
Logger :: log ( 'pumpio: mirroring user ' . $rr [ 'uid' ]);
2014-06-10 20:13:11 +02:00
pumpio_fetchtimeline ( $a , $rr [ 'uid' ]);
}
}
2013-05-09 14:36:50 +02:00
2018-06-28 07:21:13 +02:00
$abandon_days = intval ( Config :: get ( 'system' , 'account_abandon_days' ));
if ( $abandon_days < 1 ) {
2015-01-09 07:07:07 +01:00
$abandon_days = 0 ;
2018-06-28 07:21:13 +02:00
}
2015-01-09 07:07:07 +01:00
2018-01-27 03:39:02 +01:00
$abandon_limit = date ( DateTimeFormat :: MYSQL , time () - $abandon_days * 86400 );
2015-01-09 07:07:07 +01:00
2013-09-03 08:22:46 +02:00
$r = q ( " SELECT * FROM `pconfig` WHERE `cat` = 'pumpio' AND `k` = 'import' AND `v` = '1' ORDER BY RAND() " );
2018-07-21 14:46:13 +02:00
if ( DBA :: isResult ( $r )) {
2018-06-28 07:21:13 +02:00
foreach ( $r as $rr ) {
2015-01-09 07:07:07 +01:00
if ( $abandon_days != 0 ) {
$user = q ( " SELECT `login_date` FROM `user` WHERE uid=%d AND `login_date` >= '%s' " , $rr [ 'uid' ], $abandon_limit );
2018-07-21 14:46:13 +02:00
if ( ! DBA :: isResult ( $user )) {
2018-10-30 00:40:18 +01:00
Logger :: log ( 'abandoned account: timeline from user ' . $rr [ 'uid' ] . ' will not be imported' );
2015-01-09 07:07:07 +01:00
continue ;
}
}
2018-10-30 00:40:18 +01:00
Logger :: log ( 'pumpio: importing timeline from user ' . $rr [ 'uid' ]);
2013-09-03 08:22:46 +02:00
pumpio_fetchinbox ( $a , $rr [ 'uid' ]);
2013-09-15 10:47:08 +02:00
// check for new contacts once a day
2020-01-18 16:50:56 +01:00
$last_contact_check = DI :: pConfig () -> get ( $rr [ 'uid' ], 'pumpio' , 'contact_check' );
2018-06-28 07:21:13 +02:00
if ( $last_contact_check ) {
2013-09-15 10:47:08 +02:00
$next_contact_check = $last_contact_check + 86400 ;
2018-06-28 07:21:13 +02:00
} else {
2013-09-15 10:47:08 +02:00
$next_contact_check = 0 ;
2018-06-28 07:21:13 +02:00
}
2013-09-15 10:47:08 +02:00
2018-06-24 07:02:09 +02:00
if ( $next_contact_check <= time ()) {
2013-09-15 10:47:08 +02:00
pumpio_getallusers ( $a , $rr [ " uid " ]);
2020-01-18 16:54:49 +01:00
DI :: pConfig () -> set ( $rr [ 'uid' ], 'pumpio' , 'contact_check' , time ());
2013-09-15 10:47:08 +02:00
}
2013-09-03 08:22:46 +02:00
}
}
2018-10-30 00:40:18 +01:00
Logger :: log ( 'pumpio: cron_end' );
2013-05-09 14:36:50 +02:00
2018-06-28 07:21:13 +02:00
Config :: set ( 'pumpio' , 'last_poll' , time ());
2013-05-09 14:36:50 +02:00
}
2018-07-22 18:01:05 +02:00
function pumpio_cron ( App $a , $b )
2018-06-28 07:21:13 +02:00
{
2017-11-05 16:07:52 +01:00
Worker :: add ( PRIORITY_MEDIUM , " addon/pumpio/pumpio_sync.php " );
2015-09-13 19:08:10 +02:00
}
2018-07-22 18:01:05 +02:00
function pumpio_fetchtimeline ( App $a , $uid )
2018-06-28 07:21:13 +02:00
{
2020-01-18 16:50:56 +01:00
$ckey = DI :: pConfig () -> get ( $uid , 'pumpio' , 'consumer_key' );
$csecret = DI :: pConfig () -> get ( $uid , 'pumpio' , 'consumer_secret' );
$otoken = DI :: pConfig () -> get ( $uid , 'pumpio' , 'oauth_token' );
$osecret = DI :: pConfig () -> get ( $uid , 'pumpio' , 'oauth_token_secret' );
$lastdate = DI :: pConfig () -> get ( $uid , 'pumpio' , 'lastdate' );
$hostname = DI :: pConfig () -> get ( $uid , 'pumpio' , 'host' );
$username = DI :: pConfig () -> get ( $uid , " pumpio " , " user " );
2013-05-09 14:36:50 +02:00
2015-03-22 08:55:45 +01: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.
2020-01-18 16:50:56 +01:00
$application_name = DI :: pConfig () -> get ( $uid , 'pumpio' , 'application_name' );
2018-06-28 07:21:13 +02:00
if ( $application_name == " " ) {
2017-11-07 00:55:24 +01:00
$application_name = Config :: get ( 'pumpio' , 'application_name' );
2018-06-28 07:21:13 +02:00
}
if ( $application_name == " " ) {
2019-12-16 00:47:24 +01:00
$application_name = DI :: baseUrl () -> getHostname ();
2018-06-28 07:21:13 +02:00
}
2013-05-09 14:36:50 +02:00
2013-05-16 22:58:48 +02:00
$first_time = ( $lastdate == " " );
2013-05-09 14:36:50 +02: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 22:22:16 +02:00
$client -> client_secret = $csecret ;
2013-05-09 14:36:50 +02:00
$client -> access_token = $otoken ;
$client -> access_token_secret = $osecret ;
2013-05-15 22:22:16 +02:00
$url = 'https://' . $hostname . '/api/user/' . $username . '/feed/major' ;
2018-10-30 00:40:18 +01:00
Logger :: log ( 'pumpio: fetching for user ' . $uid . ' ' . $url . ' C:' . $client -> client_id . ' CS:' . $client -> client_secret . ' T:' . $client -> access_token . ' TS:' . $client -> access_token_secret );
2013-05-15 22:22:16 +02:00
2018-07-10 14:30:23 +02:00
$useraddr = $username . '@' . $hostname ;
2013-07-19 23:34:54 +02:00
2018-06-28 07:21:13 +02:00
if ( pumpio_reachable ( $url )) {
2018-01-15 14:15:33 +01:00
$success = $client -> CallAPI ( $url , 'GET' , [], [ 'FailOnAccessError' => true ], $user );
2018-06-28 07:21:13 +02:00
} else {
2015-11-03 00:42:04 +01:00
$success = false ;
2018-08-01 19:28:55 +02:00
$user = [];
2018-06-28 07:21:13 +02:00
}
2013-05-15 22:22:16 +02:00
if ( ! $success ) {
2018-10-30 00:40:18 +01:00
Logger :: log ( 'pumpio: error fetching posts for user ' . $uid . " " . $useraddr . " " . print_r ( $user , true ));
2013-05-15 22:22:16 +02:00
return ;
}
2013-05-09 14:36:50 +02:00
2013-05-09 15:08:08 +02:00
$posts = array_reverse ( $user -> items );
$initiallastdate = $lastdate ;
2013-05-16 22:58:48 +02:00
$lastdate = '' ;
2013-05-09 14:36:50 +02:00
if ( count ( $posts )) {
foreach ( $posts as $post ) {
2018-06-28 07:21:13 +02:00
if ( $post -> published <= $initiallastdate ) {
2013-05-09 14:36:50 +02:00
continue ;
2018-06-28 07:21:13 +02:00
}
2013-05-09 14:36:50 +02:00
2018-06-28 07:21:13 +02:00
if ( $lastdate < $post -> published ) {
2014-05-15 23:20:11 +02:00
$lastdate = $post -> published ;
2018-06-28 07:21:13 +02:00
}
2013-05-09 15:08:08 +02:00
2018-06-28 07:21:13 +02:00
if ( $first_time ) {
2013-05-16 22:58:48 +02:00
continue ;
2018-06-28 07:21:13 +02:00
}
2013-05-09 15:08:08 +02:00
2018-01-15 14:15:33 +01:00
$receiptians = [];
2018-06-28 07:21:13 +02:00
if ( @ is_array ( $post -> cc )) {
2013-05-16 23:36:05 +02:00
$receiptians = array_merge ( $receiptians , $post -> cc );
2018-06-28 07:21:13 +02:00
}
2013-05-16 23:36:05 +02:00
2018-06-28 07:21:13 +02:00
if ( @ is_array ( $post -> to )) {
2013-05-16 23:36:05 +02:00
$receiptians = array_merge ( $receiptians , $post -> to );
2018-06-28 07:21:13 +02:00
}
2013-05-16 23:36:05 +02:00
$public = false ;
2018-06-28 07:21:13 +02:00
foreach ( $receiptians AS $receiver ) {
if ( is_string ( $receiver -> objectType ) && ( $receiver -> id == " http://activityschema.org/collection/public " )) {
$public = true ;
}
}
2013-05-16 23:36:05 +02:00
2017-06-09 03:20:27 +02:00
if ( $public && ! stristr ( $post -> generator -> displayName , $application_name )) {
2013-05-09 14:36:50 +02:00
$_SESSION [ " authenticated " ] = true ;
$_SESSION [ " uid " ] = $uid ;
2013-07-19 23:34:54 +02:00
unset ( $_REQUEST );
2013-05-09 14:36:50 +02:00
$_REQUEST [ " api_source " ] = true ;
$_REQUEST [ " profile_uid " ] = $uid ;
$_REQUEST [ " source " ] = " pump.io " ;
2016-12-09 17:23:42 +01:00
if ( isset ( $post -> object -> id )) {
2018-08-11 22:40:48 +02:00
$_REQUEST [ 'message_id' ] = Protocol :: PUMPIO . " : " . $post -> object -> id ;
2016-12-09 17:23:42 +01:00
}
2018-06-28 07:21:13 +02:00
if ( $post -> object -> displayName != " " ) {
2018-03-07 22:48:34 +01:00
$_REQUEST [ " title " ] = HTML :: toBBCode ( $post -> object -> displayName );
2018-06-28 07:21:13 +02:00
} else {
2013-07-19 23:34:54 +02:00
$_REQUEST [ " title " ] = " " ;
2018-06-28 07:21:13 +02:00
}
2013-05-16 22:58:48 +02:00
2018-03-07 22:48:34 +01:00
$_REQUEST [ " body " ] = HTML :: toBBCode ( $post -> object -> content );
2013-05-09 14:36:50 +02:00
2013-11-30 21:22:41 +01:00
// To-Do: Picture has to be cached and stored locally
if ( $post -> object -> fullImage -> url != " " ) {
2018-06-28 07:21:13 +02:00
if ( $post -> object -> fullImage -> pump_io -> proxyURL != " " ) {
2013-11-30 21:22:41 +01:00
$_REQUEST [ " body " ] = " [url= " . $post -> object -> fullImage -> pump_io -> proxyURL . " ][img] " . $post -> object -> image -> pump_io -> proxyURL . " [/img][/url] \n " . $_REQUEST [ " body " ];
2018-06-28 07:21:13 +02:00
} else {
2013-11-30 21:22:41 +01:00
$_REQUEST [ " body " ] = " [url= " . $post -> object -> fullImage -> url . " ][img] " . $post -> object -> image -> url . " [/img][/url] \n " . $_REQUEST [ " body " ];
2018-06-28 07:21:13 +02:00
}
2013-11-30 21:22:41 +01:00
}
2013-05-16 22:58:48 +02:00
2018-10-30 00:40:18 +01:00
Logger :: log ( 'pumpio: posting for user ' . $uid );
2013-05-09 14:36:50 +02:00
require_once ( 'mod/item.php' );
2013-09-08 17:31:28 +02:00
2013-05-09 14:36:50 +02:00
item_post ( $a );
2018-10-30 00:40:18 +01:00
Logger :: log ( 'pumpio: posting done - user ' . $uid );
2013-05-09 14:36:50 +02:00
}
}
}
2018-06-28 07:21:13 +02:00
if ( $lastdate != 0 ) {
2020-01-18 16:54:49 +01:00
DI :: pConfig () -> set ( $uid , 'pumpio' , 'lastdate' , $lastdate );
2018-06-28 07:21:13 +02:00
}
2013-05-09 14:36:50 +02:00
}
2013-09-03 08:22:46 +02:00
2018-07-22 18:01:05 +02:00
function pumpio_dounlike ( App $a , $uid , $self , $post , $own_id )
2018-06-28 07:21:13 +02:00
{
2013-09-06 08:35:40 +02:00
// Searching for the unliked post
// Two queries for speed issues
2018-06-23 12:51:45 +02:00
$orig_post = Item :: selectFirst ([], [ 'uri' => $post -> object -> id , 'uid' => $uid ]);
2018-07-21 14:46:13 +02:00
if ( ! DBA :: isResult ( $orig_post )) {
2018-06-23 12:51:45 +02:00
$orig_post = Item :: selectFirst ([], [ 'extid' => $post -> object -> id , 'uid' => $uid ]);
2018-07-21 14:46:13 +02:00
if ( ! DBA :: isResult ( $orig_post )) {
2013-09-06 08:35:40 +02:00
return ;
2018-06-18 07:15:46 +02:00
}
2013-09-06 08:35:40 +02:00
}
2013-09-03 08:22:46 +02:00
2013-09-06 08:35:40 +02:00
$contactid = 0 ;
2013-09-03 08:22:46 +02:00
2018-11-08 17:45:19 +01:00
if ( Strings :: compareLink ( $post -> actor -> url , $own_id )) {
2013-09-06 08:35:40 +02:00
$contactid = $self [ 0 ][ 'id' ];
} else {
2017-01-17 20:01:27 +01:00
$r = q ( " SELECT * FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1 " ,
2018-11-08 17:45:19 +01:00
DBA :: escape ( Strings :: normaliseLink ( $post -> actor -> url )),
2013-09-06 08:35:40 +02:00
intval ( $uid )
);
2013-09-03 08:22:46 +02:00
2018-07-21 14:46:13 +02:00
if ( DBA :: isResult ( $r )) {
2013-09-06 08:35:40 +02:00
$contactid = $r [ 0 ][ 'id' ];
2018-06-28 07:21:13 +02:00
}
2013-09-03 08:22:46 +02:00
2018-06-28 07:21:13 +02:00
if ( $contactid == 0 ) {
2013-09-06 08:35:40 +02:00
$contactid = $orig_post [ 'contact-id' ];
2018-06-28 07:21:13 +02:00
}
2013-09-06 08:35:40 +02:00
}
2013-09-03 08:22:46 +02:00
2019-10-24 00:25:42 +02:00
Item :: delete ([ 'verb' => Activity :: LIKE , 'uid' => $uid , 'contact-id' => $contactid , 'thr-parent' => $orig_post [ 'uri' ]]);
2013-09-06 08:35:40 +02:00
2018-07-21 14:46:13 +02:00
if ( DBA :: isResult ( $r )) {
2018-10-30 00:40:18 +01:00
Logger :: log ( " pumpio_dounlike: unliked existing like. User " . $own_id . " " . $uid . " Contact: " . $contactid . " Url " . $orig_post [ 'uri' ]);
2018-06-28 07:21:13 +02:00
} else {
2018-10-30 00:40:18 +01:00
Logger :: log ( " pumpio_dounlike: not found. User " . $own_id . " " . $uid . " Contact: " . $contactid . " Url " . $orig_post [ 'uri' ]);
2018-06-28 07:21:13 +02:00
}
2013-09-06 08:35:40 +02:00
}
2018-07-22 18:01:05 +02:00
function pumpio_dolike ( App $a , $uid , $self , $post , $own_id , $threadcompletion = true )
2018-06-28 07:21:13 +02:00
{
2014-11-10 23:00:39 +01:00
require_once ( 'include/items.php' );
2013-09-06 08:35:40 +02:00
2018-07-10 14:30:23 +02:00
if ( empty ( $post -> object -> id )) {
2018-10-30 14:48:09 +01:00
Logger :: log ( 'Got empty like: ' . print_r ( $post , true ), Logger :: DEBUG );
2017-01-15 13:23:40 +01:00
return ;
}
2013-09-06 08:35:40 +02:00
// Searching for the liked post
2013-09-03 08:22:46 +02:00
// Two queries for speed issues
2018-06-23 12:51:45 +02:00
$orig_post = Item :: selectFirst ([], [ 'uri' => $post -> object -> id , 'uid' => $uid ]);
2018-07-21 14:46:13 +02:00
if ( ! DBA :: isResult ( $orig_post )) {
2018-06-23 12:51:45 +02:00
$orig_post = Item :: selectFirst ([], [ 'extid' => $post -> object -> id , 'uid' => $uid ]);
2018-07-21 14:46:13 +02:00
if ( ! DBA :: isResult ( $orig_post )) {
2013-09-03 08:22:46 +02:00
return ;
2018-06-18 07:15:46 +02:00
}
2013-09-03 08:22:46 +02:00
}
2014-11-10 23:00:39 +01:00
// thread completion
2018-06-28 07:21:13 +02:00
if ( $threadcompletion ) {
2014-11-10 23:00:39 +01:00
pumpio_fetchallcomments ( $a , $uid , $post -> object -> id );
2018-06-28 07:21:13 +02:00
}
2014-11-10 23:00:39 +01:00
2013-09-06 08:35:40 +02:00
$contactid = 0 ;
2018-11-08 17:45:19 +01:00
if ( Strings :: compareLink ( $post -> actor -> url , $own_id )) {
2013-09-06 08:35:40 +02:00
$contactid = $self [ 0 ][ 'id' ];
2013-09-07 13:10:51 +02:00
$post -> actor -> displayName = $self [ 0 ][ 'name' ];
$post -> actor -> url = $self [ 0 ][ 'url' ];
$post -> actor -> image -> url = $self [ 0 ][ 'photo' ];
2013-09-06 08:35:40 +02:00
} else {
2017-01-15 13:23:40 +01:00
$r = q ( " SELECT * FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1 " ,
2018-11-08 17:45:19 +01:00
DBA :: escape ( Strings :: normaliseLink ( $post -> actor -> url )),
2013-09-06 08:35:40 +02:00
intval ( $uid )
);
2018-07-21 14:46:13 +02:00
if ( DBA :: isResult ( $r )) {
2013-09-06 08:35:40 +02:00
$contactid = $r [ 0 ][ 'id' ];
2018-06-28 07:21:13 +02:00
}
2013-09-06 08:35:40 +02:00
2018-06-28 07:21:13 +02:00
if ( $contactid == 0 ) {
2013-09-06 08:35:40 +02:00
$contactid = $orig_post [ 'contact-id' ];
2018-06-28 07:21:13 +02:00
}
2013-09-06 08:35:40 +02:00
}
2019-10-24 00:25:42 +02:00
$condition = [ 'verb' => Activity :: LIKE , 'uid' => $uid , 'contact-id' => $contactid , 'thr-parent' => $orig_post [ 'uri' ]];
2018-08-15 07:23:53 +02:00
if ( Item :: exists ( $condition )) {
2018-10-30 00:40:18 +01:00
Logger :: log ( " pumpio_dolike: found existing like. User " . $own_id . " " . $uid . " Contact: " . $contactid . " Url " . $orig_post [ 'uri' ]);
2013-09-03 08:22:46 +02:00
return ;
2013-09-06 08:35:40 +02:00
}
2013-09-03 08:22:46 +02:00
2018-01-15 14:15:33 +01:00
$likedata = [];
2013-09-03 08:22:46 +02:00
$likedata [ 'parent' ] = $orig_post [ 'id' ];
2019-10-24 00:25:42 +02:00
$likedata [ 'verb' ] = Activity :: LIKE ;
2018-06-28 07:21:13 +02:00
$likedata [ 'gravity' ] = GRAVITY_ACTIVITY ;
2013-09-03 08:22:46 +02:00
$likedata [ 'uid' ] = $uid ;
$likedata [ 'wall' ] = 0 ;
2018-08-11 22:40:48 +02:00
$likedata [ 'network' ] = Protocol :: PUMPIO ;
2018-06-16 08:46:25 +02:00
$likedata [ 'uri' ] = Item :: newURI ( $uid );
2013-09-03 08:22:46 +02:00
$likedata [ 'parent-uri' ] = $orig_post [ " uri " ];
2013-09-06 08:35:40 +02:00
$likedata [ 'contact-id' ] = $contactid ;
2013-09-03 08:22:46 +02:00
$likedata [ 'app' ] = $post -> generator -> displayName ;
$likedata [ 'author-name' ] = $post -> actor -> displayName ;
$likedata [ 'author-link' ] = $post -> actor -> url ;
2018-07-31 20:10:34 +02:00
if ( ! empty ( $post -> actor -> image )) {
$likedata [ 'author-avatar' ] = $post -> actor -> image -> url ;
}
2013-09-03 08:22:46 +02:00
$author = '[url=' . $likedata [ 'author-link' ] . ']' . $likedata [ 'author-name' ] . '[/url]' ;
$objauthor = '[url=' . $orig_post [ 'author-link' ] . ']' . $orig_post [ 'author-name' ] . '[/url]' ;
2018-01-22 20:03:11 +01:00
$post_type = L10n :: t ( 'status' );
2013-09-03 08:22:46 +02:00
$plink = '[url=' . $orig_post [ 'plink' ] . ']' . $post_type . '[/url]' ;
2019-10-25 00:10:19 +02:00
$likedata [ 'object-type' ] = Activity\ObjectType :: NOTE ;
2013-09-03 08:22:46 +02:00
2018-01-24 04:59:20 +01:00
$likedata [ 'body' ] = L10n :: t ( '%1$s likes %2$s\'s %3$s' , $author , $objauthor , $plink );
2013-09-03 08:22:46 +02:00
2019-10-25 00:10:19 +02:00
$likedata [ 'object' ] = '<object><type>' . Activity\ObjectType :: NOTE . '</type><local>1</local>' .
2018-11-05 13:47:04 +01:00
'<id>' . $orig_post [ 'uri' ] . '</id><link>' . XML :: escape ( '<link rel="alternate" type="text/html" href="' . XML :: escape ( $orig_post [ 'plink' ]) . '" />' ) . '</link><title>' . $orig_post [ 'title' ] . '</title><content>' . $orig_post [ 'body' ] . '</content></object>' ;
2013-09-03 08:22:46 +02:00
2018-01-28 12:19:38 +01:00
$ret = Item :: insert ( $likedata );
2013-09-06 08:35:40 +02:00
2018-10-30 00:40:18 +01:00
Logger :: log ( " pumpio_dolike: " . $ret . " User " . $own_id . " " . $uid . " Contact: " . $contactid . " Url " . $orig_post [ 'uri' ]);
2013-09-03 08:22:46 +02:00
}
2018-06-28 07:21:13 +02:00
function pumpio_get_contact ( $uid , $contact , $no_insert = false )
{
2017-11-19 23:09:54 +01:00
$cid = Contact :: getIdForURL ( $contact -> url , $uid );
2016-07-02 11:22:31 +02:00
2018-06-28 07:21:13 +02:00
if ( $no_insert ) {
return $cid ;
}
2015-01-09 07:07:07 +01:00
2017-01-17 20:01:27 +01:00
$r = q ( " SELECT * FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' LIMIT 1 " ,
2018-11-08 17:45:19 +01:00
intval ( $uid ), DBA :: escape ( Strings :: normaliseLink ( $contact -> url )));
2013-09-03 08:22:46 +02:00
2018-07-21 14:46:13 +02:00
if ( ! DBA :: isResult ( $r )) {
2013-09-03 08:22:46 +02:00
// create contact record
2017-01-17 20:01:27 +01:00
q ( " INSERT INTO `contact` (`uid`, `created`, `url`, `nurl`, `addr`, `alias`, `notify`, `poll`,
2013-09-03 08:22:46 +02:00
`name` , `nick` , `photo` , `network` , `rel` , `priority` ,
2017-03-09 07:58:36 +01: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 08:22:46 +02:00
intval ( $uid ),
2018-07-21 15:13:02 +02:00
DBA :: escape ( DateTimeFormat :: utcNow ()),
DBA :: escape ( $contact -> url ),
2018-11-08 17:45:19 +01:00
DBA :: escape ( Strings :: normaliseLink ( $contact -> url )),
2018-07-21 15:13:02 +02:00
DBA :: escape ( str_replace ( " acct: " , " " , $contact -> id )),
DBA :: escape ( '' ),
DBA :: escape ( $contact -> id ), // What is it for?
DBA :: escape ( 'pump.io ' . $contact -> id ), // What is it for?
DBA :: escape ( $contact -> displayName ),
DBA :: escape ( $contact -> preferredUsername ),
DBA :: escape ( $contact -> image -> url ),
2018-08-11 22:40:48 +02:00
DBA :: escape ( Protocol :: PUMPIO ),
2018-07-28 07:34:38 +02:00
intval ( Contact :: FRIEND ),
2013-09-03 08:22:46 +02:00
intval ( 1 ),
2018-07-21 15:13:02 +02:00
DBA :: escape ( $contact -> location -> displayName ),
DBA :: escape ( $contact -> summary ),
2013-09-03 08:22:46 +02:00
intval ( 1 )
);
2017-01-17 20:01:27 +01:00
$r = q ( " SELECT * FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1 " ,
2018-11-08 17:45:19 +01:00
DBA :: escape ( Strings :: normaliseLink ( $contact -> url )),
2013-09-03 08:22:46 +02:00
intval ( $uid )
);
2018-07-21 14:46:13 +02:00
if ( ! DBA :: isResult ( $r )) {
2018-06-28 07:21:13 +02:00
return false ;
2017-01-17 20:01:27 +01:00
}
2013-09-03 08:22:46 +02:00
2017-01-17 20:01:27 +01:00
$contact_id = $r [ 0 ][ 'id' ];
2013-09-03 08:22:46 +02:00
2017-12-09 19:50:29 +01:00
Group :: addMember ( User :: getDefaultGroup ( $uid ), $contact_id );
2013-09-03 08:22:46 +02:00
} else {
2016-07-02 11:22:31 +02:00
$contact_id = $r [ 0 ][ " id " ];
2015-01-09 07:07:07 +01:00
2016-07-02 11:22:31 +02:00
/* if ( DB_UPDATE_VERSION >= " 1177 " )
2015-01-09 07:07:07 +01: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 11:22:31 +02:00
*/
2013-09-03 08:22:46 +02:00
}
2018-07-15 20:40:20 +02:00
if ( ! empty ( $contact -> image -> url )) {
Contact :: updateAvatar ( $contact -> image -> url , $uid , $contact_id );
}
2016-07-02 11:22:31 +02:00
2018-06-28 07:21:13 +02:00
return $contact_id ;
2013-09-03 08:22:46 +02:00
}
2018-07-22 18:01:05 +02:00
function pumpio_dodelete ( App $a , $uid , $self , $post , $own_id )
2018-06-28 07:21:13 +02:00
{
2013-09-03 08:22:46 +02:00
// Two queries for speed issues
2018-05-29 07:24:25 +02:00
$condition = [ 'uri' => $post -> object -> id , 'uid' => $uid ];
2018-08-15 07:23:53 +02:00
if ( Item :: exists ( $condition )) {
2018-05-29 14:36:44 +02:00
Item :: delete ( $condition );
return true ;
2018-05-29 07:24:25 +02:00
}
2013-09-03 08:22:46 +02:00
2018-05-29 07:24:25 +02:00
$condition = [ 'extid' => $post -> object -> id , 'uid' => $uid ];
2018-08-15 07:23:53 +02:00
if ( Item :: exists ( $condition )) {
2018-05-29 14:36:44 +02:00
Item :: delete ( $condition );
return true ;
2018-05-29 07:24:25 +02:00
}
2018-05-29 14:36:44 +02:00
return false ;
2013-09-03 08:22:46 +02:00
}
2018-07-22 18:01:05 +02:00
function pumpio_dopost ( App $a , $client , $uid , $self , $post , $own_id , $threadcompletion = true )
2018-06-28 07:21:13 +02:00
{
2013-09-03 08:22:46 +02:00
require_once ( 'include/items.php' );
2018-06-28 07:21:13 +02:00
if (( $post -> verb == " like " ) || ( $post -> verb == " favorite " )) {
2013-09-27 23:33:35 +02:00
return pumpio_dolike ( $a , $uid , $self , $post , $own_id );
2018-06-28 07:21:13 +02:00
}
2013-09-03 08:22:46 +02:00
2018-06-28 07:21:13 +02:00
if (( $post -> verb == " unlike " ) || ( $post -> verb == " unfavorite " )) {
2013-09-27 23:33:35 +02:00
return pumpio_dounlike ( $a , $uid , $self , $post , $own_id );
2018-06-28 07:21:13 +02:00
}
2013-09-05 08:35:37 +02:00
2018-06-28 07:21:13 +02:00
if ( $post -> verb == " delete " ) {
2013-09-27 23:33:35 +02:00
return pumpio_dodelete ( $a , $uid , $self , $post , $own_id );
2018-06-28 07:21:13 +02:00
}
2013-09-03 08:22:46 +02:00
if ( $post -> verb != " update " ) {
// Two queries for speed issues
2018-08-15 07:23:53 +02:00
if ( Item :: exists ([ 'uri' => $post -> object -> id , 'uid' => $uid ])) {
2013-09-12 23:20:26 +02:00
return false ;
2018-06-18 07:15:46 +02:00
}
2018-08-15 07:23:53 +02:00
if ( Item :: exists ([ 'extid' => $post -> object -> id , 'uid' => $uid ])) {
2013-09-12 23:20:26 +02:00
return false ;
2018-06-18 07:15:46 +02:00
}
2013-09-03 08:22:46 +02:00
}
2013-09-06 08:35:40 +02:00
// Only handle these three types
2018-06-28 07:21:13 +02:00
if ( ! strstr ( " post|share|update " , $post -> verb )) {
2013-09-12 23:20:26 +02:00
return false ;
2018-06-28 07:21:13 +02:00
}
2013-09-06 08:35:40 +02:00
2018-01-15 14:15:33 +01:00
$receiptians = [];
2018-06-28 07:21:13 +02:00
if ( @ is_array ( $post -> cc )) {
2013-09-03 08:22:46 +02:00
$receiptians = array_merge ( $receiptians , $post -> cc );
2018-06-28 07:21:13 +02:00
}
2013-09-03 08:22:46 +02:00
2018-06-28 07:21:13 +02:00
if ( @ is_array ( $post -> to )) {
2013-09-03 08:22:46 +02:00
$receiptians = array_merge ( $receiptians , $post -> to );
2018-06-28 07:21:13 +02:00
}
2013-09-03 08:22:46 +02:00
2018-07-15 20:40:20 +02:00
$public = false ;
2018-06-28 07:21:13 +02:00
foreach ( $receiptians AS $receiver ) {
if ( is_string ( $receiver -> objectType ) && ( $receiver -> id == " http://activityschema.org/collection/public " )) {
$public = true ;
}
}
2013-09-03 08:22:46 +02:00
2018-01-15 14:15:33 +01:00
$postarray = [];
2018-08-11 22:40:48 +02:00
$postarray [ 'network' ] = Protocol :: PUMPIO ;
2013-09-03 08:22:46 +02:00
$postarray [ 'uid' ] = $uid ;
$postarray [ 'wall' ] = 0 ;
$postarray [ 'uri' ] = $post -> object -> id ;
2019-10-25 00:34:46 +02:00
$postarray [ 'object-type' ] = ActivityNamespace :: ACTIVITY_SCHEMA . strtolower ( $post -> object -> objectType );
2013-09-03 08:22:46 +02:00
if ( $post -> object -> objectType != " comment " ) {
2013-09-06 08:35:40 +02:00
$contact_id = pumpio_get_contact ( $uid , $post -> actor );
2018-06-28 07:21:13 +02:00
if ( ! $contact_id ) {
2013-09-06 08:35:40 +02:00
$contact_id = $self [ 0 ][ 'id' ];
2018-06-28 07:21:13 +02:00
}
2013-09-06 08:35:40 +02:00
2013-09-03 08:22:46 +02:00
$postarray [ 'parent-uri' ] = $post -> object -> id ;
2014-11-10 23:00:39 +01:00
if ( ! $public ) {
$postarray [ 'private' ] = 1 ;
$postarray [ 'allow_cid' ] = '<' . $self [ 0 ][ 'id' ] . '>' ;
}
2013-09-03 08:22:46 +02:00
} else {
2016-07-02 11:22:31 +02:00
$contact_id = pumpio_get_contact ( $uid , $post -> actor , true );
2013-09-06 08:35:40 +02:00
2018-11-08 17:45:19 +01:00
if ( Strings :: compareLink ( $post -> actor -> url , $own_id )) {
2013-09-06 08:35:40 +02:00
$contact_id = $self [ 0 ][ 'id' ];
2013-09-07 13:10:51 +02:00
$post -> actor -> displayName = $self [ 0 ][ 'name' ];
$post -> actor -> url = $self [ 0 ][ 'url' ];
$post -> actor -> image -> url = $self [ 0 ][ 'photo' ];
2016-07-02 11:22:31 +02:00
} elseif ( $contact_id == 0 ) {
2013-09-07 13:10:51 +02:00
// Take an existing contact, the contact of the note or - as a fallback - the id of the user
2017-01-17 20:01:27 +01:00
$r = q ( " SELECT * FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1 " ,
2018-11-08 17:45:19 +01:00
DBA :: escape ( Strings :: normaliseLink ( $post -> actor -> url )),
2013-09-06 08:35:40 +02:00
intval ( $uid )
);
2018-07-21 14:46:13 +02:00
if ( DBA :: isResult ( $r )) {
2013-09-06 08:35:40 +02:00
$contact_id = $r [ 0 ][ 'id' ];
2018-06-28 07:21:13 +02:00
} else {
2017-01-17 20:01:27 +01:00
$r = q ( " SELECT * FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1 " ,
2018-11-08 17:45:19 +01:00
DBA :: escape ( Strings :: normaliseLink ( $post -> actor -> url )),
2013-09-07 13:10:51 +02:00
intval ( $uid )
);
2013-09-06 08:35:40 +02:00
2018-07-21 14:46:13 +02:00
if ( DBA :: isResult ( $r )) {
2013-09-07 13:10:51 +02:00
$contact_id = $r [ 0 ][ 'id' ];
2018-06-28 07:21:13 +02:00
} else {
2013-09-07 13:10:51 +02:00
$contact_id = $self [ 0 ][ 'id' ];
2018-06-28 07:21:13 +02:00
}
2013-09-07 13:10:51 +02:00
}
2013-09-06 08:35:40 +02:00
}
2013-09-03 08:22:46 +02:00
2013-10-10 12:10:40 +02:00
$reply = new stdClass ;
2013-09-03 08:22:46 +02:00
$reply -> verb = " note " ;
2018-07-10 14:30:23 +02:00
if ( isset ( $post -> cc )) {
$reply -> cc = $post -> cc ;
}
2018-08-17 05:23:00 +02:00
if ( isset ( $post -> to )) {
$reply -> to = $post -> to ;
}
2013-10-10 12:10:40 +02:00
$reply -> object = new stdClass ;
2013-09-03 08:22:46 +02: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 12:10:40 +02:00
$reply -> generator = new stdClass ;
2013-09-03 08:22:46 +02: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 23:00:39 +01:00
pumpio_dopost ( $a , $client , $uid , $self , $reply , $own_id , false );
2013-09-03 08:22:46 +02:00
$postarray [ 'parent-uri' ] = $post -> object -> inReplyTo -> id ;
}
2018-08-12 07:52:21 +02:00
// When there is no content there is no need to continue
if ( empty ( $post -> object -> content )) {
return false ;
}
2018-07-10 14:30:23 +02:00
if ( ! empty ( $post -> object -> pump_io -> proxyURL )) {
2013-09-12 23:20:26 +02:00
$postarray [ 'extid' ] = $post -> object -> pump_io -> proxyURL ;
2018-06-28 07:21:13 +02:00
}
2013-09-12 23:20:26 +02:00
2013-09-03 08:22:46 +02:00
$postarray [ 'contact-id' ] = $contact_id ;
2019-10-24 00:25:42 +02:00
$postarray [ 'verb' ] = Activity :: POST ;
2013-09-03 08:22:46 +02:00
$postarray [ 'owner-name' ] = $post -> actor -> displayName ;
$postarray [ 'owner-link' ] = $post -> actor -> url ;
2018-07-31 20:10:34 +02:00
$postarray [ 'author-name' ] = $postarray [ 'owner-name' ];
$postarray [ 'author-link' ] = $postarray [ 'owner-link' ];
if ( ! empty ( $post -> actor -> image )) {
$postarray [ 'owner-avatar' ] = $post -> actor -> image -> url ;
$postarray [ 'author-avatar' ] = $postarray [ 'owner-avatar' ];
}
2013-09-03 08:22:46 +02:00
$postarray [ 'plink' ] = $post -> object -> url ;
$postarray [ 'app' ] = $post -> generator -> displayName ;
2018-07-31 18:22:05 +02:00
$postarray [ 'title' ] = '' ;
2018-03-07 22:48:34 +01:00
$postarray [ 'body' ] = HTML :: toBBCode ( $post -> object -> content );
2016-05-15 23:18:18 +02:00
$postarray [ 'object' ] = json_encode ( $post );
2013-09-03 08:22:46 +02:00
2018-07-10 14:30:23 +02:00
if ( ! empty ( $post -> object -> fullImage -> url )) {
2013-09-03 08:22:46 +02:00
$postarray [ " body " ] = " [url= " . $post -> object -> fullImage -> url . " ][img] " . $post -> object -> image -> url . " [/img][/url] \n " . $postarray [ " body " ];
2018-06-28 07:21:13 +02:00
}
2013-09-03 08:22:46 +02:00
2018-07-10 14:30:23 +02:00
if ( ! empty ( $post -> object -> displayName )) {
2013-09-03 08:22:46 +02:00
$postarray [ 'title' ] = $post -> object -> displayName ;
2018-06-28 07:21:13 +02:00
}
2013-09-03 08:22:46 +02:00
2018-01-27 03:39:02 +01:00
$postarray [ 'created' ] = DateTimeFormat :: utc ( $post -> published );
2018-06-28 07:21:13 +02:00
if ( isset ( $post -> updated )) {
2018-01-27 03:39:02 +01:00
$postarray [ 'edited' ] = DateTimeFormat :: utc ( $post -> updated );
2018-06-28 07:21:13 +02:00
} elseif ( isset ( $post -> received )) {
2018-01-27 03:39:02 +01:00
$postarray [ 'edited' ] = DateTimeFormat :: utc ( $post -> received );
2018-06-28 07:21:13 +02:00
} else {
2016-07-02 11:22:31 +02:00
$postarray [ 'edited' ] = $postarray [ 'created' ];
2018-06-28 07:21:13 +02:00
}
2013-09-03 08:22:46 +02:00
if ( $post -> verb == " share " ) {
2018-06-28 07:21:13 +02:00
if ( isset ( $post -> object -> author -> displayName ) && ( $post -> object -> author -> displayName != " " )) {
$share_author = $post -> object -> author -> displayName ;
} elseif ( isset ( $post -> object -> author -> preferredUsername ) && ( $post -> object -> author -> preferredUsername != " " )) {
$share_author = $post -> object -> author -> preferredUsername ;
2013-10-20 12:29:39 +02:00
} else {
2018-06-28 07:21:13 +02:00
$share_author = $post -> object -> author -> url ;
2013-10-20 12:29:39 +02:00
}
2018-06-28 07:21:13 +02:00
2018-08-17 05:23:00 +02:00
if ( isset ( $post -> object -> created )) {
$created = DateTimeFormat :: utc ( $post -> object -> created );
} else {
$created = '' ;
}
2018-06-28 07:21:13 +02:00
$postarray [ 'body' ] = share_header ( $share_author , $post -> object -> author -> url ,
$post -> object -> author -> image -> url , " " ,
2018-08-17 05:23:00 +02:00
$created , $post -> links -> self -> href ) .
2018-06-28 07:21:13 +02:00
$postarray [ 'body' ] . " [/share] " ;
2013-09-03 08:22:46 +02:00
}
2018-06-28 07:21:13 +02:00
if ( trim ( $postarray [ 'body' ]) == " " ) {
2013-09-12 23:20:26 +02:00
return false ;
2018-06-28 07:21:13 +02:00
}
2013-09-03 08:22:46 +02:00
2018-01-28 12:19:38 +01:00
$top_item = Item :: insert ( $postarray );
2015-04-26 14:43:42 +02:00
$postarray [ " id " ] = $top_item ;
2013-09-03 08:22:46 +02:00
2017-06-09 03:20:27 +02:00
if (( $top_item == 0 ) && ( $post -> verb == " update " )) {
2018-02-06 15:24:24 +01:00
$fields = [ 'title' => $postarray [ " title " ], 'body' => $postarray [ " body " ], 'changed' => $postarray [ " edited " ]];
$condition = [ 'uri' => $postarray [ " uri " ], 'uid' => $uid ];
Item :: update ( $fields , $condition );
2013-09-03 08:22:46 +02:00
}
2018-06-28 07:21:13 +02:00
if (( $post -> object -> objectType == " comment " ) && $threadcompletion ) {
pumpio_fetchallcomments ( $a , $uid , $postarray [ 'parent-uri' ]);
2013-09-03 08:22:46 +02:00
}
2013-09-12 23:20:26 +02:00
return $top_item ;
2013-09-03 08:22:46 +02:00
}
2018-07-22 18:01:05 +02:00
function pumpio_fetchinbox ( App $a , $uid )
2018-06-28 07:21:13 +02:00
{
2020-01-18 16:50:56 +01:00
$ckey = DI :: pConfig () -> get ( $uid , 'pumpio' , 'consumer_key' );
$csecret = DI :: pConfig () -> get ( $uid , 'pumpio' , 'consumer_secret' );
$otoken = DI :: pConfig () -> get ( $uid , 'pumpio' , 'oauth_token' );
$osecret = DI :: pConfig () -> get ( $uid , 'pumpio' , 'oauth_token_secret' );
$lastdate = DI :: pConfig () -> get ( $uid , 'pumpio' , 'lastdate' );
$hostname = DI :: pConfig () -> get ( $uid , 'pumpio' , 'host' );
$username = DI :: pConfig () -> get ( $uid , " pumpio " , " user " );
2013-09-03 08:22:46 +02:00
2013-09-06 08:35:40 +02:00
$own_id = " https:// " . $hostname . " / " . $username ;
2013-09-03 08:22:46 +02:00
$self = q ( " SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1 " ,
intval ( $uid ));
2016-12-09 17:23:42 +01: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 " ,
2018-08-11 22:40:48 +02:00
DBA :: escape ( Protocol :: PUMPIO ),
2014-11-10 23:00:39 +01:00
intval ( $uid )
);
2014-06-10 20:13:11 +02:00
$client = new oauth_client_class ;
$client -> oauth_version = '1.0a' ;
$client -> authorization_header = true ;
$client -> url_parameters = false ;
2013-09-03 08:22:46 +02:00
2014-06-10 20:13:11 +02:00
$client -> client_id = $ckey ;
$client -> client_secret = $csecret ;
$client -> access_token = $otoken ;
$client -> access_token_secret = $osecret ;
2013-09-03 08:22:46 +02:00
2020-01-18 16:50:56 +01:00
$last_id = DI :: pConfig () -> get ( $uid , 'pumpio' , 'last_id' );
2013-09-03 08:22:46 +02:00
$url = 'https://' . $hostname . '/api/user/' . $username . '/inbox' ;
2018-06-28 07:21:13 +02:00
if ( $last_id != " " ) {
2013-09-03 08:22:46 +02:00
$url .= '?since=' . urlencode ( $last_id );
2018-06-28 07:21:13 +02:00
}
2013-09-03 08:22:46 +02:00
2018-06-28 07:21:13 +02:00
if ( pumpio_reachable ( $url )) {
2018-01-15 14:15:33 +01:00
$success = $client -> CallAPI ( $url , 'GET' , [], [ 'FailOnAccessError' => true ], $user );
2018-06-28 07:21:13 +02:00
} else {
2015-11-03 00:42:04 +01:00
$success = false ;
2018-06-28 07:21:13 +02:00
}
2013-09-03 08:22:46 +02:00
2018-07-10 14:30:23 +02:00
if ( ! $success ) {
return ;
}
2018-12-03 07:52:46 +01:00
if ( ! empty ( $user -> items )) {
2018-06-28 07:21:13 +02:00
$posts = array_reverse ( $user -> items );
2013-10-02 08:38:56 +02:00
2018-06-28 07:21:13 +02:00
if ( count ( $posts )) {
foreach ( $posts as $post ) {
$last_id = $post -> id ;
pumpio_dopost ( $a , $client , $uid , $self , $post , $own_id , true );
}
}
2013-10-02 08:38:56 +02:00
}
2013-09-03 08:22:46 +02:00
2018-07-22 18:01:05 +02:00
foreach ( $lastitems as $item ) {
2014-11-10 23:00:39 +01:00
pumpio_fetchallcomments ( $a , $uid , $item [ " uri " ]);
2018-06-28 07:21:13 +02:00
}
2014-11-10 23:00:39 +01:00
2020-01-18 16:54:49 +01:00
DI :: pConfig () -> set ( $uid , 'pumpio' , 'last_id' , $last_id );
2013-09-03 08:22:46 +02:00
}
2018-07-22 18:01:05 +02:00
function pumpio_getallusers ( App & $a , $uid )
2018-06-28 07:21:13 +02:00
{
2020-01-18 16:50:56 +01:00
$ckey = DI :: pConfig () -> get ( $uid , 'pumpio' , 'consumer_key' );
$csecret = DI :: pConfig () -> get ( $uid , 'pumpio' , 'consumer_secret' );
$otoken = DI :: pConfig () -> get ( $uid , 'pumpio' , 'oauth_token' );
$osecret = DI :: pConfig () -> get ( $uid , 'pumpio' , 'oauth_token_secret' );
$hostname = DI :: pConfig () -> get ( $uid , 'pumpio' , 'host' );
$username = DI :: pConfig () -> get ( $uid , " pumpio " , " user " );
2014-06-10 20:13:11 +02: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 08:22:46 +02:00
$url = 'https://' . $hostname . '/api/user/' . $username . '/following' ;
2018-06-28 07:21:13 +02:00
if ( pumpio_reachable ( $url )) {
2018-07-22 18:01:05 +02:00
$success = $client -> CallAPI ( $url , 'GET' , [], [ 'FailOnAccessError' => true ], $users );
2018-06-28 07:21:13 +02:00
} else {
2015-11-03 00:42:04 +01:00
$success = false ;
2018-06-28 07:21:13 +02:00
}
2013-09-03 08:22:46 +02:00
2018-08-01 21:14:28 +02:00
if ( empty ( $users )) {
return ;
}
2013-09-03 08:22:46 +02:00
if ( $users -> totalItems > count ( $users -> items )) {
$url = 'https://' . $hostname . '/api/user/' . $username . '/following?count=' . $users -> totalItems ;
2018-06-28 07:21:13 +02:00
if ( pumpio_reachable ( $url )) {
2018-07-22 18:01:05 +02:00
$success = $client -> CallAPI ( $url , 'GET' , [], [ 'FailOnAccessError' => true ], $users );
2018-06-28 07:21:13 +02:00
} else {
2015-11-03 00:42:04 +01:00
$success = false ;
2018-06-28 07:21:13 +02:00
}
2013-09-03 08:22:46 +02:00
}
2018-07-22 08:41:30 +02:00
if ( ! empty ( $users -> items )) {
2018-07-22 18:01:05 +02:00
foreach ( $users -> items as $user ) {
2017-08-20 22:51:07 +02:00
pumpio_get_contact ( $uid , $user );
}
}
2013-09-03 08:22:46 +02:00
}
2018-07-22 18:01:05 +02:00
function pumpio_getreceiver ( App $a , array $b )
2018-06-28 07:21:13 +02:00
{
2018-01-15 14:15:33 +01:00
$receiver = [];
2013-09-08 17:09:01 +02:00
if ( ! $b [ " private " ]) {
2018-06-28 07:21:13 +02:00
if ( ! strstr ( $b [ 'postopts' ], 'pumpio' )) {
2013-09-08 17:09:01 +02:00
return $receiver ;
2018-06-28 07:21:13 +02:00
}
2013-09-08 17:09:01 +02:00
2020-01-18 16:50:56 +01:00
$public = DI :: pConfig () -> get ( $b [ 'uid' ], " pumpio " , " public " );
2013-09-08 17:09:01 +02:00
2018-06-28 07:21:13 +02:00
if ( $public ) {
2018-01-15 14:15:33 +01:00
$receiver [ " to " ][] = [
2013-09-08 17:09:01 +02:00
" objectType " => " collection " ,
2018-01-15 14:15:33 +01:00
" id " => " http://activityschema.org/collection/public " ];
2018-06-28 07:21:13 +02:00
}
2013-09-08 17:09:01 +02:00
} 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 " ]),
2018-08-11 22:40:48 +02:00
DBA :: escape ( Protocol :: PUMPIO )
2013-09-08 17:09:01 +02:00
);
2018-07-21 14:46:13 +02:00
if ( DBA :: isResult ( $r )) {
2018-01-15 14:15:33 +01:00
$receiver [ " bcc " ][] = [
2013-09-08 17:09:01 +02:00
" displayName " => $r [ 0 ][ " name " ],
" objectType " => " person " ,
" preferredUsername " => $r [ 0 ][ " nick " ],
2018-01-15 14:15:33 +01:00
" url " => $r [ 0 ][ " url " ]];
2013-09-12 23:20:26 +02:00
}
2013-09-08 17:09:01 +02:00
}
foreach ( $gids AS $gid ) {
$gid = trim ( $gid , " <> " );
$r = q ( " SELECT `contact`.`name`, `contact`.`nick`, `contact`.`url`, `contact`.`network` " .
2017-12-15 04:52:08 +01:00
" FROM `group_member`, `contact` WHERE `group_member`.`gid` = %d " .
2013-09-08 17:09:01 +02:00
" AND `contact`.`id` = `group_member`.`contact-id` AND `contact`.`network` = '%s' " ,
intval ( $gid ),
2018-08-11 22:40:48 +02:00
DBA :: escape ( Protocol :: PUMPIO )
2013-09-08 17:09:01 +02:00
);
foreach ( $r AS $row )
2018-01-15 14:15:33 +01:00
$receiver [ " bcc " ][] = [
2013-09-08 17:09:01 +02:00
" displayName " => $row [ " name " ],
" objectType " => " person " ,
" preferredUsername " => $row [ " nick " ],
2018-01-15 14:15:33 +01:00
" url " => $row [ " url " ]];
2013-09-08 17:09:01 +02:00
}
}
2013-09-12 23:20:26 +02:00
if ( $b [ " inform " ] != " " ) {
$inform = explode ( " , " , $b [ " inform " ]);
foreach ( $inform AS $cid ) {
2018-06-28 07:21:13 +02:00
if ( substr ( $cid , 0 , 4 ) != " cid: " ) {
2013-09-12 23:20:26 +02:00
continue ;
2018-06-28 07:21:13 +02:00
}
2013-09-12 23:20:26 +02:00
$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 " ]),
2018-08-11 22:40:48 +02:00
DBA :: escape ( Protocol :: PUMPIO )
2013-09-12 23:20:26 +02:00
);
2018-07-21 14:46:13 +02:00
if ( DBA :: isResult ( $r )) {
2018-06-28 07:21:13 +02:00
$receiver [ " to " ][] = [
" displayName " => $r [ 0 ][ " name " ],
" objectType " => " person " ,
" preferredUsername " => $r [ 0 ][ " nick " ],
" url " => $r [ 0 ][ " url " ]];
2013-09-12 23:20:26 +02:00
}
}
}
2013-09-08 17:09:01 +02:00
return $receiver ;
}
2018-07-22 18:01:05 +02:00
function pumpio_fetchallcomments ( App $a , $uid , $id )
2018-06-28 07:21:13 +02:00
{
2020-01-18 16:50:56 +01:00
$ckey = DI :: pConfig () -> get ( $uid , 'pumpio' , 'consumer_key' );
$csecret = DI :: pConfig () -> get ( $uid , 'pumpio' , 'consumer_secret' );
$otoken = DI :: pConfig () -> get ( $uid , 'pumpio' , 'oauth_token' );
$osecret = DI :: pConfig () -> get ( $uid , 'pumpio' , 'oauth_token_secret' );
$hostname = DI :: pConfig () -> get ( $uid , 'pumpio' , 'host' );
$username = DI :: pConfig () -> get ( $uid , " pumpio " , " user " );
2013-09-12 23:20:26 +02:00
2018-10-30 00:40:18 +01:00
Logger :: log ( " pumpio_fetchallcomments: completing comment for user " . $uid . " post id " . $id );
2013-09-12 23:20:26 +02:00
2014-11-10 23:00:39 +01:00
$own_id = " https:// " . $hostname . " / " . $username ;
2013-09-12 23:20:26 +02:00
$self = q ( " SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1 " ,
intval ( $uid ));
2014-11-10 23:00:39 +01:00
// Fetching the original post
2018-06-18 07:15:46 +02:00
$condition = [ " `uri` = ? AND `uid` = ? AND `extid` != '' " , $id , $uid ];
$item = Item :: selectFirst ([ 'extid' ], $condition );
2018-07-21 14:46:13 +02:00
if ( ! DBA :: isResult ( $item )) {
2014-11-10 23:00:39 +01:00
return false ;
2018-06-18 07:15:46 +02:00
}
2013-09-12 23:20:26 +02:00
2018-06-18 07:15:46 +02:00
$url = $item [ " extid " ];
2013-09-12 23:20:26 +02: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 ;
2018-10-30 00:40:18 +01:00
Logger :: log ( " pumpio_fetchallcomments: fetching comment for user " . $uid . " url " . $url );
2013-09-12 23:20:26 +02:00
2018-06-28 07:21:13 +02:00
if ( pumpio_reachable ( $url )) {
2018-01-15 14:15:33 +01:00
$success = $client -> CallAPI ( $url , 'GET' , [], [ 'FailOnAccessError' => true ], $item );
2018-06-28 07:21:13 +02:00
} else {
2015-11-03 00:42:04 +01:00
$success = false ;
2018-06-28 07:21:13 +02:00
}
2013-09-12 23:20:26 +02:00
2018-06-28 07:21:13 +02:00
if ( ! $success ) {
2013-09-12 23:20:26 +02:00
return ;
2018-06-28 07:21:13 +02:00
}
2013-09-12 23:20:26 +02:00
2014-11-10 23:00:39 +01: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 ;
2018-07-26 21:20:12 +02:00
if ( ! empty ( $item -> displayName )) {
$like -> actor -> displayName = $item -> displayName ;
}
2018-07-10 14:30:23 +02:00
//$like->actor->preferredUsername = $item->preferredUsername;
//$like->actor->image = $item->image;
2014-11-10 23:00:39 +01:00
$like -> actor -> url = $item -> url ;
$like -> generator = new stdClass ;
$like -> generator -> displayName = " pumpio " ;
pumpio_dolike ( $a , $uid , $self , $post , $own_id , false );
}
}
2018-06-28 07:21:13 +02:00
if ( $item -> replies -> totalItems == 0 ) {
2013-09-12 23:20:26 +02:00
return ;
2018-06-28 07:21:13 +02:00
}
2013-09-12 23:20:26 +02:00
foreach ( $item -> replies -> items AS $item ) {
2018-06-28 07:21:13 +02:00
if ( $item -> id == $id ) {
2013-09-12 23:20:26 +02:00
continue ;
2018-06-28 07:21:13 +02:00
}
2013-09-12 23:20:26 +02:00
// Checking if the comment already exists - Two queries for speed issues
2018-08-15 07:23:53 +02:00
if ( Item :: exists ([ 'uri' => $item -> id , 'uid' => $uid ])) {
2013-09-12 23:20:26 +02:00
continue ;
2018-06-18 07:15:46 +02:00
}
2013-09-12 23:20:26 +02:00
2018-08-15 07:23:53 +02:00
if ( Item :: exists ([ 'extid' => $item -> id , 'uid' => $uid ])) {
2013-09-12 23:20:26 +02:00
continue ;
2018-06-18 07:15:46 +02:00
}
2013-09-12 23:20:26 +02:00
2014-11-10 23:00:39 +01:00
$post = new stdClass ;
2013-09-12 23:20:26 +02:00
$post -> verb = " post " ;
$post -> actor = $item -> author ;
$post -> published = $item -> published ;
$post -> received = $item -> updated ;
2014-11-10 23:00:39 +01:00
$post -> generator = new stdClass ;
2013-09-12 23:20:26 +02:00
$post -> generator -> displayName = " pumpio " ;
2014-11-10 23:00:39 +01:00
// To-Do: Check for public post
2013-09-12 23:20:26 +02:00
unset ( $item -> author );
unset ( $item -> published );
unset ( $item -> updated );
$post -> object = $item ;
2018-10-30 00:40:18 +01:00
Logger :: log ( " pumpio_fetchallcomments: posting comment " . $post -> object -> id . " " . print_r ( $post , true ));
2013-09-27 23:33:35 +02:00
pumpio_dopost ( $a , $client , $uid , $self , $post , $own_id , false );
2013-09-12 23:20:26 +02:00
}
}
2018-06-28 07:21:13 +02:00
function pumpio_reachable ( $url )
{
2019-06-10 14:34:53 +02:00
return Network :: curl ( $url , false , [ 'timeout' => 10 ]) -> isSuccess ();
2015-11-03 00:42:04 +01:00
}
2013-09-03 08:22:46 +02:00
/*
2013-09-12 23:20:26 +02:00
To - Do :
2013-09-06 08:35:40 +02:00
- edit own notes
- delete own notes
2013-09-03 08:22:46 +02:00
*/