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 >
*/
2018-01-25 02:29:09 +00:00
2018-02-15 02:43:40 +00:00
use Friendica\Content\Text\BBCode ;
2018-03-07 21:48:34 +00:00
use Friendica\Content\Text\HTML ;
2021-10-03 17:35:20 +00:00
use Friendica\Core\Addon ;
2018-12-26 07:28:16 +00:00
use Friendica\Core\Hook ;
2018-10-29 23:40:18 +00:00
use Friendica\Core\Logger ;
2018-08-11 20:40:48 +00:00
use Friendica\Core\Protocol ;
2021-11-21 22:10:13 +00:00
use Friendica\Core\Renderer ;
2017-11-13 04:33:14 +00:00
use Friendica\Core\Worker ;
2018-07-20 12:20:48 +00:00
use Friendica\Database\DBA ;
2019-12-15 23:47:24 +00:00
use Friendica\DI ;
2017-12-08 05:18:01 +00:00
use Friendica\Model\Contact ;
2023-06-03 19:55:09 +00:00
use Friendica\Model\Circle ;
2018-01-19 05:36:01 +00:00
use Friendica\Model\Item ;
2021-01-17 00:00:32 +00:00
use Friendica\Model\Post ;
2018-01-25 02:29:09 +00:00
use Friendica\Model\User ;
2022-04-02 19:16:21 +00:00
use Friendica\Network\HTTPClient\Client\HttpClientAccept ;
2021-10-23 10:50:29 +00:00
use Friendica\Network\HTTPClient\Client\HttpClientOptions ;
2019-10-23 22:25:42 +00:00
use Friendica\Protocol\Activity ;
2019-10-24 22:41:37 +00:00
use Friendica\Protocol\ActivityNamespace ;
2023-01-01 19:21:56 +00:00
use Friendica\Core\Config\Util\ConfigFileManager ;
2018-01-27 02:39:02 +00:00
use Friendica\Util\DateTimeFormat ;
2018-11-08 16:45:19 +00:00
use Friendica\Util\Strings ;
2018-11-05 12:47:04 +00:00
use Friendica\Util\XML ;
2017-11-13 04:33:14 +00:00
require 'addon/pumpio/oauth/http.php' ;
require 'addon/pumpio/oauth/oauth_client.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
2018-06-28 05:21:13 +00:00
function pumpio_install ()
{
2018-12-26 07:28:16 +00: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 09:11:17 +00:00
}
2013-09-03 22:04:00 +00:00
2022-06-24 21:27:58 +00:00
/**
* This is a statement rather than an actual function definition . The simple
* existence of this method is checked to figure out if the addon offers a
* module .
*/
2013-05-09 09:11:17 +00:00
function pumpio_module () {}
2023-01-14 02:16:09 +00:00
function pumpio_content ()
2018-06-28 05:21:13 +00:00
{
2022-10-20 21:51:49 +00:00
if ( ! DI :: userSession () -> getLocalUserId ()) {
2022-10-17 21:00:03 +00:00
DI :: sysmsg () -> addNotice ( DI :: l10n () -> t ( 'Permission denied.' ));
2013-05-09 09:11:17 +00:00
return '' ;
}
2021-07-25 12:29:43 +00:00
if ( isset ( DI :: args () -> getArgv ()[ 1 ])) {
switch ( DI :: args () -> getArgv ()[ 1 ]) {
2022-06-23 15:27:42 +00:00
case 'connect' :
2023-01-14 02:16:09 +00:00
$o = pumpio_connect ();
2013-05-09 09:11:17 +00:00
break ;
2022-06-23 15:27:42 +00:00
2013-05-09 09:11:17 +00:00
default :
2021-07-25 12:29:43 +00:00
$o = print_r ( DI :: args () -> getArgv (), true );
2013-05-09 09:11:17 +00:00
break ;
}
2018-06-28 05:21:13 +00:00
} else {
2023-01-14 02:16:09 +00:00
$o = pumpio_connect ();
2018-06-28 05:21:13 +00:00
}
2013-05-09 09:11:17 +00:00
return $o ;
}
2023-01-14 02:16:09 +00:00
function pumpio_check_item_notification ( array & $notification_data )
2018-06-28 05:21:13 +00:00
{
2022-06-23 15:27:42 +00:00
$hostname = DI :: pConfig () -> get ( $notification_data [ 'uid' ], 'pumpio' , 'host' );
$username = DI :: pConfig () -> get ( $notification_data [ 'uid' ], 'pumpio' , 'user' );
2016-02-13 12:44:57 +00:00
2022-06-23 15:27:42 +00:00
$notification_data [ 'profiles' ][] = 'https://' . $hostname . '/' . $username ;
2016-02-13 12:44:57 +00:00
}
2023-01-14 02:16:09 +00:00
function pumpio_registerclient ( $host )
2018-06-28 05:21:13 +00:00
{
2022-06-23 15:27:42 +00:00
$url = 'https://' . $host . '/api/client/register' ;
2013-05-09 09:11:17 +00:00
2018-01-15 13:15:33 +00:00
$params = [];
2013-05-09 09:11:17 +00:00
2020-01-19 20:21:12 +00:00
$application_name = DI :: config () -> get ( 'pumpio' , 'application_name' );
2013-05-09 12:36:50 +00:00
2022-06-23 15:27:42 +00:00
if ( $application_name == '' ) {
2023-02-18 19:57:09 +00:00
$application_name = DI :: baseUrl () -> getHost ();
2018-06-28 05:21:13 +00:00
}
2013-05-09 12:36:50 +00:00
2022-11-18 17:00:03 +00:00
$firstAdmin = User :: getFirstAdmin ([ 'email' ]);
2015-04-06 12:04:40 +00:00
2022-06-23 15:27:42 +00:00
$params [ 'type' ] = 'client_associate' ;
2022-11-18 17:00:03 +00:00
$params [ 'contacts' ] = $firstAdmin [ 'email' ];
2022-06-23 15:27:42 +00:00
$params [ 'application_type' ] = 'native' ;
$params [ 'application_name' ] = $application_name ;
2023-02-18 19:57:09 +00:00
$params [ 'logo_url' ] = DI :: baseUrl () . '/images/friendica-256.png' ;
$params [ 'redirect_uris' ] = DI :: baseUrl () . '/pumpio/connect' ;
2013-05-09 09:11:17 +00:00
2022-06-23 15:27:42 +00:00
Logger :: info ( 'pumpio_registerclient: ' . $url . ' parameters' , $params );
2013-09-29 07:33:24 +00:00
2022-06-23 15:27:42 +00:00
// @TODO Rewrite this to our own HTTP client
2014-06-10 18:13:11 +00:00
$ch = curl_init ( $url );
curl_setopt ( $ch , CURLOPT_HEADER , false );
2018-06-28 05:21:13 +00:00
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , true );
2014-06-10 18:13:11 +00:00
curl_setopt ( $ch , CURLOPT_POST , 1 );
2018-06-28 05:21:13 +00:00
curl_setopt ( $ch , CURLOPT_POSTFIELDS , $params );
2022-06-23 15:27:42 +00:00
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
2022-06-23 15:27:42 +00:00
if ( $curl_info [ 'http_code' ] == '200' ) {
2014-06-10 18:13:11 +00:00
$values = json_decode ( $s );
2022-12-15 03:29:54 +00:00
Logger :: info ( 'pumpio_registerclient: success ' , ( array ) $values );
2018-06-28 05:21:13 +00:00
return $values ;
2014-06-10 18:13:11 +00:00
}
2022-06-23 15:27:42 +00:00
Logger :: info ( 'pumpio_registerclient: failed: ' , $curl_info );
2018-06-28 05:21:13 +00:00
return false ;
2013-09-29 07:33:24 +00:00
2013-05-09 09:11:17 +00:00
}
2023-01-14 02:16:09 +00:00
function pumpio_connect ()
2018-06-28 05:21:13 +00:00
{
2013-05-09 09:11:17 +00:00
// Define the needed keys
2022-10-20 21:51:49 +00:00
$consumer_key = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'consumer_key' );
$consumer_secret = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'consumer_secret' );
$hostname = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'host' );
2013-05-09 09:11:17 +00:00
2022-06-23 15:27:42 +00:00
if ((( $consumer_key == '' ) || ( $consumer_secret == '' )) && ( $hostname != '' )) {
Logger :: notice ( 'pumpio_connect: register client' );
2023-01-14 02:16:09 +00:00
$clientdata = pumpio_registerclient ( $hostname );
2022-10-20 21:51:49 +00:00
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'consumer_key' , $clientdata -> client_id );
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'consumer_secret' , $clientdata -> client_secret );
2013-05-09 09:11:17 +00:00
2022-10-20 21:51:49 +00:00
$consumer_key = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'consumer_key' );
$consumer_secret = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'consumer_secret' );
2013-09-27 21:33:35 +00:00
2022-06-23 15:27:42 +00:00
Logger :: info ( 'pumpio_connect: ckey: ' . $consumer_key . ' csecrect: ' . $consumer_secret );
2013-05-09 09:11:17 +00:00
}
2022-06-23 15:27:42 +00:00
if (( $consumer_key == '' ) || ( $consumer_secret == '' )) {
Logger :: notice ( 'pumpio_connect: ' . sprintf ( 'Unable to register the client at the pump.io server "%s".' , $hostname ));
2013-09-27 21:33:35 +00:00
2020-10-05 06:51:07 +00:00
return DI :: l10n () -> t ( " Unable to register the client at the pump.io server '%s'. " , $hostname );
2013-09-27 21:33:35 +00:00
}
2013-05-09 09:11:17 +00:00
// The callback URL is the script that gets called after the user authenticates with pumpio
2023-02-18 19:57:09 +00:00
$callback_url = DI :: baseUrl () . '/pumpio/connect' ;
2013-05-09 09:11:17 +00: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 04:42:22 +00: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 09:11:17 +00:00
// Consumer Key and Consumer Secret
$client = new oauth_client_class ;
2018-08-29 17:09:19 +00:00
$client -> debug = 0 ;
2013-05-09 09:11:17 +00: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 )) {
2022-06-23 15:27:42 +00:00
Logger :: info ( 'pumpio_connect: otoken: ' . $client -> access_token . ', osecrect: ' . $client -> access_token_secret );
2022-10-20 21:51:49 +00:00
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'oauth_token' , $client -> access_token );
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'oauth_token_secret' , $client -> access_token_secret );
2013-05-09 09:11:17 +00:00
}
}
$success = $client -> Finalize ( $success );
}
2018-06-28 05:21:13 +00:00
if ( $client -> exit ) {
2014-06-10 18:13:11 +00:00
$o = 'Could not connect to pumpio. Refresh the page or try again later.' ;
2018-06-28 05:21:13 +00:00
}
2013-05-09 09:11:17 +00:00
2018-06-24 05:02:09 +00:00
if ( $success ) {
2022-06-23 15:27:42 +00:00
Logger :: notice ( 'pumpio_connect: authenticated' );
$o = DI :: l10n () -> t ( 'You are now authenticated to pumpio.' );
2023-02-18 19:57:09 +00:00
$o .= '<br /><a href="' . DI :: baseUrl () . '/settings/connectors">' . DI :: l10n () -> t ( 'return to the connector page' ) . '</a>' ;
2013-09-29 07:33:24 +00:00
} else {
2022-06-23 15:27:42 +00:00
Logger :: notice ( 'pumpio_connect: could not connect' );
2013-09-29 07:33:24 +00:00
$o = 'Could not connect to pumpio. Refresh the page or try again later.' ;
}
2013-05-09 09:11:17 +00:00
2018-06-28 05:21:13 +00:00
return $o ;
2013-05-09 09:11:17 +00:00
}
2023-01-14 02:16:09 +00:00
function pumpio_jot_nets ( array & $jotnets_fields )
2018-06-28 05:21:13 +00:00
{
2022-10-20 21:51:49 +00:00
if ( ! DI :: userSession () -> getLocalUserId ()) {
2014-06-10 18:13:11 +00:00
return ;
2018-06-28 05:21:13 +00:00
}
2014-06-10 18:13:11 +00:00
2022-10-20 21:51:49 +00:00
if ( DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'post' )) {
2019-03-25 02:44:50 +00:00
$jotnets_fields [] = [
'type' => 'checkbox' ,
'field' => [
'pumpio_enable' ,
2020-01-18 19:52:33 +00:00
DI :: l10n () -> t ( 'Post to pumpio' ),
2022-10-20 21:51:49 +00:00
DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'post_by_default' )
2019-03-25 02:44:50 +00:00
]
];
2014-06-10 18:13:11 +00:00
}
2013-05-09 09:11:17 +00:00
}
2023-01-14 02:16:09 +00:00
function pumpio_settings ( array & $data )
2018-06-28 05:21:13 +00:00
{
2022-10-20 21:51:49 +00:00
if ( ! DI :: userSession () -> getLocalUserId ()) {
2014-06-10 18:13:11 +00:00
return ;
2018-06-28 05:21:13 +00:00
}
2013-09-03 06:22:46 +00:00
2022-10-20 21:51:49 +00:00
$pumpio_host = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'host' );
$pumpio_user = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'user' );
$oauth_token = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'oauth_token' );
$oauth_token_secret = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'oauth_token_secret' );
2013-06-23 01:30:22 +00:00
2022-10-20 21:51:49 +00:00
$import_enabled = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'import' , false );
$enabled = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'post' , false );
$def_enabled = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'post_by_default' , false );
$public_enabled = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'public' , false );
$mirror_enabled = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'mirror' , false );
2013-05-09 09:11:17 +00:00
2021-11-21 22:10:13 +00:00
$submit = [ 'pumpio-submit' => DI :: l10n () -> t ( 'Save Settings' )];
if ( $oauth_token && $oauth_token_secret ) {
$submit [ 'pumpio-delete' ] = DI :: l10n () -> t ( 'Delete this preset' );
}
2013-05-09 09:11:17 +00:00
2021-11-21 22:10:13 +00:00
$t = Renderer :: getMarkupTemplate ( 'connector_settings.tpl' , 'addon/pumpio/' );
$html = Renderer :: replaceMacros ( $t , [
'$l10n' => [
'authenticate' => DI :: l10n () -> t ( 'Authenticate your pump.io connection' ),
],
'$pumpio_host' => $pumpio_host ,
'$pumpio_user' => $pumpio_user ,
'$oauth_token' => $oauth_token ,
'$oauth_token_secret' => $oauth_token_secret ,
2023-02-18 19:57:09 +00:00
'$authenticate_url' => DI :: baseUrl () . '/pumpio/connect' ,
2021-11-21 22:10:13 +00:00
'$servername' => [ 'pumpio_host' , DI :: l10n () -> t ( 'Pump.io servername (without "http://" or "https://" )' ), $pumpio_host ],
'$username' => [ 'pumpio_user' , DI :: l10n () -> t ( 'Pump.io username (without the servername)' ), $pumpio_user ],
'$import' => [ 'pumpio_import' , DI :: l10n () -> t ( 'Import the remote timeline' ), $import_enabled ],
'$enabled' => [ 'pumpio' , DI :: l10n () -> t ( 'Enable Pump.io Post Addon' ), $enabled ],
'$bydefault' => [ 'pumpio_bydefault' , DI :: l10n () -> t ( 'Post to Pump.io by default' ), $def_enabled ],
'$public' => [ 'pumpio_public' , DI :: l10n () -> t ( 'Should posts be public?' ), $public_enabled ],
'$mirror' => [ 'pumpio_mirror' , DI :: l10n () -> t ( 'Mirror all public posts' ), $mirror_enabled ],
]);
$data = [
'connector' => 'pumpio' ,
'title' => DI :: l10n () -> t ( 'Pump.io Import/Export/Mirror' ),
'image' => 'images/pumpio.png' ,
'enabled' => $enabled ,
'html' => $html ,
'submit' => $submit ,
];
2013-05-09 09:11:17 +00:00
}
2023-01-14 02:16:09 +00:00
function pumpio_settings_post ( array & $b )
2018-06-28 05:21:13 +00:00
{
2021-11-21 22:10:13 +00:00
if ( ! empty ( $_POST [ 'pumpio_delete' ])) {
2022-10-20 21:51:49 +00:00
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'consumer_key' , '' );
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'consumer_secret' , '' );
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'oauth_token' , '' );
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'oauth_token_secret' , '' );
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'post' , false );
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'import' , false );
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'host' , '' );
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'user' , '' );
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'public' , false );
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'mirror' , false );
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'post_by_default' , false );
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'lastdate' , 0 );
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'last_id' , '' );
2021-11-21 22:10:13 +00:00
} elseif ( ! empty ( $_POST [ 'pumpio-submit' ])) {
// filtering the username if it is filled wrong
$user = $_POST [ 'pumpio_user' ];
2022-06-23 15:27:42 +00:00
if ( strstr ( $user , '@' )) {
$pos = strpos ( $user , '@' );
2021-11-21 22:10:13 +00:00
if ( $pos > 0 ) {
$user = substr ( $user , 0 , $pos );
2013-06-23 01:30:22 +00:00
}
2021-11-21 22:10:13 +00:00
}
2013-05-09 09:11:17 +00:00
2021-11-21 22:10:13 +00:00
// Filtering the hostname if someone is entering it with "http"
$host = $_POST [ 'pumpio_host' ];
$host = trim ( $host );
2022-06-23 15:27:42 +00:00
$host = str_replace ([ 'https://' , 'http://' ], [ '' , '' ], $host );
2021-11-21 22:10:13 +00:00
2022-10-20 21:51:49 +00:00
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'post' , $_POST [ 'pumpio' ] ? ? false );
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'import' , $_POST [ 'pumpio_import' ] ? ? false );
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'host' , $host );
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'user' , $user );
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'public' , $_POST [ 'pumpio_public' ] ? ? false );
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'mirror' , $_POST [ 'pumpio_mirror' ] ? ? false );
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'post_by_default' , $_POST [ 'pumpio_bydefault' ] ? ? false );
2021-11-21 22:10:13 +00:00
if ( ! empty ( $_POST [ 'pumpio_mirror' ])) {
2022-10-20 21:51:49 +00:00
DI :: pConfig () -> delete ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'lastdate' );
2013-06-23 01:30:22 +00:00
}
2013-05-09 09:11:17 +00:00
}
}
2023-01-14 02:16:09 +00:00
function pumpio_load_config ( ConfigFileManager $loader )
2018-06-28 03:18:58 +00:00
{
2023-01-14 02:16:09 +00:00
DI :: app () -> getConfigCache () -> load ( $loader -> loadAddonConfig ( 'pumpio' ), \Friendica\Core\Config\ValueObject\Cache :: SOURCE_STATIC );
2018-06-28 03:18:58 +00:00
}
2023-01-14 02:16:09 +00:00
function pumpio_hook_fork ( array & $b )
2018-11-10 16:20:19 +00:00
{
2022-06-23 15:27:42 +00:00
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 ;
}
if ( DI :: pConfig () -> get ( $post [ 'uid' ], 'pumpio' , 'import' )) {
// Don't fork if it isn't a reply to a pump.io post
2024-11-16 05:42:00 +00:00
if (( $post [ 'gravity' ] != Item :: GRAVITY_PARENT ) && ! Post :: exists ([ 'id' => $post [ 'parent' ], 'network' => Protocol :: PUMPIO ])) {
2022-06-23 15:27:42 +00:00
Logger :: notice ( '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
2024-11-16 05:42:00 +00:00
if ( ! strstr ( $post [ 'postopts' ], 'pumpio' ) || ( $post [ 'gravity' ] != Item :: GRAVITY_PARENT ) || ( $post [ 'private' ] == Item :: PRIVATE )) {
2022-06-23 15:27:42 +00:00
$b [ 'execute' ] = false ;
return ;
}
}
2018-11-10 16:20:19 +00:00
}
2023-01-14 02:16:09 +00:00
function pumpio_post_local ( array & $b )
2018-06-28 05:21:13 +00:00
{
2022-10-20 21:51:49 +00:00
if ( ! DI :: userSession () -> getLocalUserId () || ( DI :: userSession () -> getLocalUserId () != $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
2022-10-20 21:51:49 +00:00
$pumpio_post = intval ( DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'pumpio' , 'post' ));
2013-05-09 09:11:17 +00:00
2018-07-22 16:01:05 +00:00
$pumpio_enable = (( $pumpio_post && ! empty ( $_REQUEST [ 'pumpio_enable' ])) ? intval ( $_REQUEST [ 'pumpio_enable' ]) : 0 );
2013-05-09 09:11:17 +00:00
2022-10-20 21:51:49 +00:00
if ( $b [ 'api_source' ] && intval ( DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), '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' ;
}
2023-01-14 02:16:09 +00:00
function pumpio_send ( array & $b )
2018-06-28 05:21:13 +00:00
{
2022-06-23 15:27:42 +00:00
if ( ! DI :: pConfig () -> get ( $b [ 'uid' ], 'pumpio' , 'import' ) && ( $b [ 'deleted' ] || $b [ 'private' ] || ( $b [ 'created' ] !== $b [ 'edited' ]))) {
2018-07-22 16:01:05 +00:00
return ;
2013-09-05 06:35:37 +00:00
}
2022-06-23 15:27:42 +00:00
Logger :: debug ( 'pumpio_send: parameter ' , $b );
2013-05-09 09:11:17 +00:00
2022-10-29 22:14:12 +00:00
$b [ 'body' ] = Post\Media :: addAttachmentsToBody ( $b [ 'uri-id' ], DI :: contentItem () -> addSharedPost ( $b ));
2021-05-01 08:59:14 +00:00
2018-06-24 05:02:09 +00:00
if ( $b [ 'parent' ] != $b [ 'id' ]) {
2013-09-03 06:22:46 +00:00
// Looking if its a reply to a pumpio post
2018-08-11 20:40:48 +00:00
$condition = [ 'id' => $b [ 'parent' ], 'network' => Protocol :: PUMPIO ];
2021-01-17 00:00:32 +00:00
$orig_post = Post :: selectFirst ([], $condition );
2013-09-03 06:22:46 +00:00
2018-07-21 12:46:13 +00:00
if ( ! DBA :: isResult ( $orig_post )) {
2022-06-23 15:27:42 +00:00
Logger :: notice ( '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 ;
}
} else {
$iscomment = false ;
2013-05-09 09:11:17 +00:00
2023-01-14 02:16:09 +00:00
$receiver = pumpio_getreceiver ( $b );
2013-09-03 06:22:46 +00:00
2022-06-23 15:27:42 +00:00
Logger :: notice ( 'pumpio_send: receiver ' , $receiver );
2013-09-08 15:09:01 +00:00
2024-11-17 02:19:06 +00:00
if ( ! count ( $receiver ) && ( $b [ 'private' ] == Item :: PRIVATE ) || ! strstr ( $b [ 'postopts' ], 'pumpio' )) {
2013-09-03 06:22:46 +00:00
return ;
2018-01-10 03:27:40 +00:00
}
2017-11-25 23:56:18 +00:00
// Dont't post if the post doesn't belong to us.
2023-06-03 19:57:29 +00:00
// This is a check for group postings
2021-10-03 17:35:20 +00:00
$self = User :: getOwnerDataById ( $b [ 'uid' ]);
2017-11-25 23:56:18 +00:00
if ( $b [ 'contact-id' ] != $self [ 'id' ]) {
return ;
}
2013-09-03 06:22:46 +00:00
}
2013-05-09 09:11:17 +00:00
2019-10-23 22:25:42 +00:00
if ( $b [ 'verb' ] == Activity :: LIKE ) {
2018-06-28 05:21:13 +00:00
if ( $b [ 'deleted' ]) {
2023-01-14 02:16:09 +00:00
pumpio_action ( $b [ 'uid' ], $b [ 'thr-parent' ], 'unlike' );
2018-06-28 05:21:13 +00:00
} else {
2023-01-14 02:16:09 +00:00
pumpio_action ( $b [ 'uid' ], $b [ 'thr-parent' ], 'like' );
2018-06-28 05:21:13 +00:00
}
2013-09-12 21:20:26 +00:00
return ;
}
2019-10-23 22:25:42 +00:00
if ( $b [ 'verb' ] == Activity :: DISLIKE ) {
2013-09-12 21:20:26 +00:00
return ;
2018-06-28 05:21:13 +00:00
}
2013-09-12 21:20:26 +00:00
2019-10-23 22:25:42 +00:00
if (( $b [ 'verb' ] == Activity :: POST ) && ( $b [ 'created' ] !== $b [ 'edited' ]) && ! $b [ 'deleted' ]) {
2023-01-14 02:16:09 +00:00
pumpio_action ( $b [ 'uid' ], $b [ 'uri' ], 'update' , $b [ 'body' ]);
2018-06-28 05:21:13 +00:00
}
2013-09-12 21:20:26 +00:00
2019-10-23 22:25:42 +00:00
if (( $b [ 'verb' ] == Activity :: POST ) && $b [ 'deleted' ]) {
2023-01-14 02:16:09 +00:00
pumpio_action ( $b [ 'uid' ], $b [ 'uri' ], 'delete' );
2018-06-28 05:21:13 +00:00
}
2013-09-12 21:20:26 +00:00
2018-06-28 05:21:13 +00:00
if ( $b [ 'deleted' ] || ( $b [ 'created' ] !== $b [ 'edited' ])) {
2013-09-12 21:20:26 +00:00
return ;
2018-06-28 05:21:13 +00:00
}
2013-09-12 21:20:26 +00:00
2013-05-09 12:36:50 +00:00
// if post comes from pump.io don't send it back
2022-06-23 15:27:42 +00:00
if ( $b [ 'app' ] == 'pump.io' ) {
2013-05-09 12:36:50 +00:00
return ;
2018-06-28 05:21:13 +00:00
}
2013-05-09 12:36:50 +00:00
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
2022-10-19 13:47:48 +00:00
$oauth_token = DI :: pConfig () -> get ( $b [ 'uid' ], 'pumpio' , 'oauth_token' );
2022-06-23 15:27:42 +00:00
$oauth_token_secret = DI :: pConfig () -> get ( $b [ 'uid' ], 'pumpio' , 'oauth_token_secret' );
2022-10-19 13:47:48 +00:00
$consumer_key = DI :: pConfig () -> get ( $b [ 'uid' ], 'pumpio' , 'consumer_key' );
$consumer_secret = DI :: pConfig () -> get ( $b [ 'uid' ], 'pumpio' , 'consumer_secret' );
2013-05-09 09:11:17 +00:00
2022-10-19 13:47:48 +00:00
$host = DI :: pConfig () -> get ( $b [ 'uid' ], 'pumpio' , 'host' );
$user = DI :: pConfig () -> get ( $b [ 'uid' ], 'pumpio' , 'user' );
2022-06-23 15:27:42 +00:00
$public = DI :: pConfig () -> get ( $b [ 'uid' ], 'pumpio' , 'public' );
2013-05-09 09:11:17 +00:00
2018-06-24 05:02:09 +00:00
if ( $oauth_token && $oauth_token_secret ) {
2013-05-09 09:11:17 +00:00
$title = trim ( $b [ 'title' ]);
2021-07-10 07:40:39 +00:00
$content = BBCode :: convertForUriId ( $b [ 'uri-id' ], $b [ 'body' ], BBCode :: CONNECTORS );
2013-07-20 12:58:42 +00:00
2018-01-15 13:15:33 +00:00
$params = [];
2013-05-09 09:11:17 +00:00
2022-06-23 15:27:42 +00:00
$params [ 'verb' ] = 'post' ;
2013-05-15 20:22:16 +00:00
2013-09-03 06:22:46 +00:00
if ( ! $iscomment ) {
2022-06-23 15:27:42 +00:00
$params [ 'object' ] = [
'objectType' => 'note' ,
2018-06-28 16:39:25 +00:00
'content' => $content ];
2014-11-10 22:00:39 +00:00
2018-07-10 12:30:23 +00:00
if ( ! empty ( $title )) {
2022-06-23 15:27:42 +00:00
$params [ 'object' ][ 'displayName' ] = $title ;
2018-06-28 05:21:13 +00:00
}
2013-09-03 06:22:46 +00:00
2022-06-23 15:27:42 +00:00
if ( ! empty ( $receiver [ 'to' ])) {
$params [ 'to' ] = $receiver [ 'to' ];
2018-06-28 05:21:13 +00:00
}
2013-09-08 15:09:01 +00:00
2022-06-23 15:27:42 +00:00
if ( ! empty ( $receiver [ 'bto' ])) {
$params [ 'bto' ] = $receiver [ 'bto' ];
2018-06-28 05:21:13 +00:00
}
2013-09-08 15:09:01 +00:00
2022-06-23 15:27:42 +00:00
if ( ! empty ( $receiver [ 'cc' ])) {
$params [ 'cc' ] = $receiver [ 'cc' ];
2018-06-28 05:21:13 +00:00
}
2013-09-08 15:09:01 +00:00
2022-06-23 15:27:42 +00:00
if ( ! empty ( $receiver [ 'bcc' ])) {
$params [ 'bcc' ] = $receiver [ 'bcc' ];
2018-06-28 05:21:13 +00:00
}
2013-09-03 06:22:46 +00:00
} else {
2022-06-23 15:27:42 +00:00
$inReplyTo = [
'id' => $orig_post [ 'uri' ],
'objectType' => 'note' ,
];
2013-09-03 06:22:46 +00:00
2022-06-23 15:27:42 +00: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 05:21:13 +00:00
}
2014-07-21 22:40:02 +00:00
2022-06-23 15:27:42 +00:00
$params [ 'object' ] = [
'objectType' => 'comment' ,
2018-06-28 16:39:25 +00:00
'content' => $content ,
'inReplyTo' => $inReplyTo ];
2014-11-10 22:00:39 +00:00
2022-06-23 15:27:42 +00:00
if ( $title != '' ) {
$params [ 'object' ][ 'displayName' ] = $title ;
2018-06-28 05:21:13 +00:00
}
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 ;
2022-06-23 15:27:42 +00:00
$username = $user . '@' . $host ;
$url = 'https://' . $host . '/api/user/' . $user . '/feed' ;
2013-09-03 06:22:46 +00:00
2018-06-28 05:21:13 +00:00
if ( pumpio_reachable ( $url )) {
2022-06-23 15:27:42 +00:00
$success = $client -> CallAPI ( $url , 'POST' , $params , [ 'FailOnAccessError' => true , 'RequestContentType' => 'application/json' ], $user );
2018-06-28 05:21:13 +00:00
} else {
2015-11-02 23:42:04 +00:00
$success = false ;
2018-06-28 05:21:13 +00:00
}
2013-09-03 06:22:46 +00:00
2018-06-24 05:02:09 +00:00
if ( $success ) {
2018-06-28 05:21:13 +00:00
if ( $user -> generator -> displayName ) {
2022-06-23 15:27:42 +00:00
DI :: pConfig () -> set ( $b [ 'uid' ], 'pumpio' , 'application_name' , $user -> generator -> displayName );
2018-06-28 05:21:13 +00:00
}
2015-03-22 07:55:45 +00:00
2013-09-03 06:22:46 +00:00
$post_id = $user -> object -> id ;
2022-06-23 15:27:42 +00:00
Logger :: notice ( 'pumpio_send ' . $username . ': success ' . $post_id );
2018-06-24 05:02:09 +00:00
if ( $post_id && $iscomment ) {
2022-06-23 15:27:42 +00:00
Logger :: notice ( 'pumpio_send ' . $username . ': Update extid ' . $post_id . ' for post id ' . $b [ 'id' ]);
2018-02-06 14:24:24 +00:00
Item :: update ([ 'extid' => $post_id ], [ 'id' => $b [ 'id' ]]);
2013-09-03 06:22:46 +00:00
}
} else {
2021-10-03 17:35:20 +00:00
Logger :: notice ( 'pumpio_send ' . $username . ': ' . $url . ' general error: ' . print_r ( $user , true ));
2019-04-04 14:14:55 +00:00
Worker :: defer ();
2013-09-03 06:22:46 +00:00
}
2013-05-09 09:11:17 +00:00
}
}
2023-01-14 02:16:09 +00:00
function pumpio_action ( int $uid , string $uri , string $action , string $content = '' )
2018-06-28 05:21:13 +00:00
{
2013-09-12 21:20:26 +00:00
// Don't do likes and other stuff if you don't import the timeline
2020-01-18 15:50:56 +00:00
if ( ! DI :: pConfig () -> get ( $uid , 'pumpio' , 'import' )) {
2013-09-12 21:20:26 +00:00
return ;
2018-06-28 05:21:13 +00:00
}
2013-09-12 21:20:26 +00:00
2022-06-23 15:27:42 +00: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' );
2020-01-18 15:50:56 +00:00
$hostname = DI :: pConfig () -> get ( $uid , 'pumpio' , 'host' );
2022-06-23 15:27:42 +00:00
$username = DI :: pConfig () -> get ( $uid , 'pumpio' , 'user' );
2013-09-05 06:35:37 +00:00
2021-01-17 00:00:32 +00:00
$orig_post = Post :: selectFirst ([], [ 'uri' => $uri , 'uid' => $uid ]);
2013-09-05 06:35:37 +00:00
2018-07-21 12:46:13 +00:00
if ( ! DBA :: isResult ( $orig_post )) {
2013-09-05 06:35:37 +00:00
return ;
2018-06-18 05:15:46 +00:00
}
2013-09-05 06:35:37 +00:00
2022-06-23 15:27:42 +00:00
if ( $orig_post [ 'extid' ] && ! strstr ( $orig_post [ 'extid' ], '/proxy/' )) {
$uri = $orig_post [ 'extid' ];
2018-06-28 05:21:13 +00:00
} else {
2022-06-23 15:27:42 +00:00
$uri = $orig_post [ 'uri' ];
2018-06-28 05:21:13 +00:00
}
2013-09-05 06:35:37 +00:00
2024-11-30 20:12:23 +00:00
$objectType = '' ;
2022-06-23 15:27:42 +00:00
if (( $orig_post [ 'object-type' ] != '' ) && ( strstr ( $orig_post [ 'object-type' ], ActivityNamespace :: ACTIVITY_SCHEMA ))) {
$objectType = str_replace ( ActivityNamespace :: ACTIVITY_SCHEMA , '' , $orig_post [ 'object-type' ]);
} elseif ( strstr ( $uri , '/api/comment/' )) {
$objectType = 'comment' ;
} elseif ( strstr ( $uri , '/api/note/' )) {
$objectType = 'note' ;
} elseif ( strstr ( $uri , '/api/image/' )) {
$objectType = 'image' ;
2018-06-28 05:21:13 +00:00
}
2013-09-05 06:35:37 +00:00
2022-06-23 15:27:42 +00:00
$params [ 'verb' ] = $action ;
$params [ 'object' ] = [
'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' ;
2018-06-28 05:21:13 +00:00
if ( pumpio_reachable ( $url )) {
2022-06-23 15:27:42 +00:00
$success = $client -> CallAPI ( $url , 'POST' , $params , [ 'FailOnAccessError' => true , 'RequestContentType' => 'application/json' ], $user );
2018-06-28 05:21:13 +00:00
} else {
2015-11-02 23:42:04 +00:00
$success = false ;
2018-06-28 05:21:13 +00:00
}
2013-09-05 06:35:37 +00:00
2018-06-28 05:21:13 +00:00
if ( $success ) {
2021-10-03 17:35:20 +00:00
Logger :: notice ( 'pumpio_action ' . $username . ' ' . $action . ': success ' . $uri );
2018-06-28 05:21:13 +00:00
} else {
2021-10-03 17:35:20 +00:00
Logger :: notice ( 'pumpio_action ' . $username . ' ' . $action . ': general error: ' . $uri );
2019-04-04 14:14:55 +00:00
Worker :: defer ();
2013-09-05 06:35:37 +00:00
}
}
2023-01-14 02:16:09 +00:00
function pumpio_sync ()
2018-06-28 05:21:13 +00:00
{
2021-10-03 17:35:20 +00:00
if ( ! Addon :: isEnabled ( 'pumpio' )) {
2015-09-26 09:17:12 +00:00
return ;
2018-06-28 05:21:13 +00:00
}
2015-09-26 09:17:12 +00:00
2022-12-29 19:51:04 +00:00
$last = DI :: keyValue () -> get ( 'pumpio_last_poll' );
2014-06-10 18:13:11 +00:00
2020-01-19 20:21:12 +00:00
$poll_interval = intval ( DI :: config () -> get ( 'pumpio' , 'poll_interval' , PUMPIO_DEFAULT_POLL_INTERVAL ));
2014-06-10 18:13:11 +00:00
2018-06-24 05:02:09 +00:00
if ( $last ) {
2014-06-10 18:13:11 +00:00
$next = $last + ( $poll_interval * 60 );
2018-06-24 05:02:09 +00:00
if ( $next > time ()) {
2021-10-03 17:35:20 +00:00
Logger :: notice ( 'pumpio: poll intervall not reached' );
2014-06-10 18:13:11 +00:00
return ;
}
}
2021-10-03 17:35:20 +00:00
Logger :: notice ( 'pumpio: cron_start' );
2014-06-10 18:13:11 +00:00
2021-10-03 20:00:22 +00:00
$pconfigs = DBA :: selectToArray ( 'pconfig' , [ 'uid' ], [ 'cat' => 'pumpio' , 'k' => 'mirror' , 'v' => '1' ]);
2021-10-03 18:58:52 +00:00
foreach ( $pconfigs as $rr ) {
Logger :: notice ( 'pumpio: mirroring user ' . $rr [ 'uid' ]);
2023-01-14 02:16:09 +00:00
pumpio_fetchtimeline ( $rr [ 'uid' ]);
2014-06-10 18:13:11 +00:00
}
2013-05-09 12:36:50 +00:00
2020-01-19 20:21:12 +00:00
$abandon_days = intval ( DI :: config () -> get ( 'system' , 'account_abandon_days' ));
2018-06-28 05:21:13 +00:00
if ( $abandon_days < 1 ) {
2015-01-09 06:07:07 +00:00
$abandon_days = 0 ;
2018-06-28 05:21:13 +00:00
}
2015-01-09 06:07:07 +00:00
2018-01-27 02:39:02 +00:00
$abandon_limit = date ( DateTimeFormat :: MYSQL , time () - $abandon_days * 86400 );
2015-01-09 06:07:07 +00:00
2021-10-03 20:00:22 +00:00
$pconfigs = DBA :: selectToArray ( 'pconfig' , [ 'uid' ], [ 'cat' => 'pumpio' , 'k' => 'import' , 'v' => '1' ]);
2021-10-03 18:58:52 +00:00
foreach ( $pconfigs as $rr ) {
2021-10-03 20:04:36 +00:00
if ( $abandon_days != 0 ) {
if ( DBA :: exists ( 'user' , [ " uid = ? AND `login_date` >= ? " , $rr [ 'uid' ], $abandon_limit ])) {
Logger :: notice ( 'abandoned account: timeline from user ' . $rr [ 'uid' ] . ' will not be imported' );
continue ;
2015-01-09 06:07:07 +00:00
}
2021-10-03 20:04:36 +00:00
}
2015-01-09 06:07:07 +00:00
2021-10-03 20:04:36 +00:00
Logger :: notice ( 'pumpio: importing timeline from user ' . $rr [ 'uid' ]);
2023-01-14 02:16:09 +00:00
pumpio_fetchinbox ( $rr [ 'uid' ]);
2013-09-15 08:47:08 +00:00
2021-10-03 20:04:36 +00:00
// check for new contacts once a day
$last_contact_check = DI :: pConfig () -> get ( $rr [ 'uid' ], 'pumpio' , 'contact_check' );
if ( $last_contact_check ) {
$next_contact_check = $last_contact_check + 86400 ;
} else {
$next_contact_check = 0 ;
}
2013-09-15 08:47:08 +00:00
2021-10-03 20:04:36 +00:00
if ( $next_contact_check <= time ()) {
2023-01-14 02:16:09 +00:00
pumpio_getallusers ( $rr [ 'uid' ]);
2021-10-03 20:01:43 +00:00
DI :: pConfig () -> set ( $rr [ 'uid' ], 'pumpio' , 'contact_check' , time ());
}
2013-09-03 06:22:46 +00:00
}
2021-10-03 17:35:20 +00:00
Logger :: notice ( 'pumpio: cron_end' );
2013-05-09 12:36:50 +00:00
2022-12-29 19:51:04 +00:00
DI :: keyValue () -> set ( 'pumpio_last_poll' , time ());
2013-05-09 12:36:50 +00:00
}
2023-01-14 02:16:09 +00:00
function pumpio_cron ( $b )
2018-06-28 05:21:13 +00:00
{
2022-10-17 05:50:23 +00:00
Worker :: add ( Worker :: PRIORITY_MEDIUM , 'addon/pumpio/pumpio_sync.php' );
2015-09-13 17:08:10 +00:00
}
2023-01-14 02:16:09 +00:00
function pumpio_fetchtimeline ( int $uid )
2018-06-28 05:21:13 +00:00
{
2022-10-19 13:47:48 +00: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' );
2020-01-18 15:50:56 +00:00
$lastdate = DI :: pConfig () -> get ( $uid , 'pumpio' , 'lastdate' );
$hostname = DI :: pConfig () -> get ( $uid , 'pumpio' , 'host' );
2022-06-23 15:27:42 +00:00
$username = DI :: 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.
2020-01-18 15:50:56 +00:00
$application_name = DI :: pConfig () -> get ( $uid , 'pumpio' , 'application_name' );
2022-06-23 15:27:42 +00:00
if ( $application_name == '' ) {
2020-01-19 20:21:12 +00:00
$application_name = DI :: config () -> get ( 'pumpio' , 'application_name' );
2018-06-28 05:21:13 +00:00
}
2022-06-23 15:27:42 +00:00
if ( $application_name == '' ) {
2023-02-18 19:57:09 +00:00
$application_name = DI :: baseUrl () -> getHost ();
2018-06-28 05:21:13 +00:00
}
2013-05-09 12:36:50 +00:00
2022-06-23 15:27:42 +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' ;
2022-06-23 15:27:42 +00:00
Logger :: notice ( '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 20:22:16 +00:00
2018-07-10 12:30:23 +00:00
$useraddr = $username . '@' . $hostname ;
2013-07-19 21:34:54 +00:00
2018-06-28 05:21:13 +00:00
if ( pumpio_reachable ( $url )) {
2022-06-23 15:27:42 +00:00
$success = $client -> CallAPI ( $url , 'GET' , [], [ 'FailOnAccessError' => true ], $user );
2018-06-28 05:21:13 +00:00
} else {
2015-11-02 23:42:04 +00:00
$success = false ;
2018-08-01 17:28:55 +00:00
$user = [];
2018-06-28 05:21:13 +00:00
}
2013-05-15 20:22:16 +00:00
if ( ! $success ) {
2022-06-23 15:27:42 +00:00
Logger :: notice ( 'pumpio: error fetching posts for user ' . $uid . ' ' . $useraddr . ' ' , $user );
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 ) {
2018-06-28 05:21:13 +00:00
if ( $post -> published <= $initiallastdate ) {
2013-05-09 12:36:50 +00:00
continue ;
2018-06-28 05:21:13 +00:00
}
2013-05-09 12:36:50 +00:00
2018-06-28 05:21:13 +00:00
if ( $lastdate < $post -> published ) {
2014-05-15 21:20:11 +00:00
$lastdate = $post -> published ;
2018-06-28 05:21:13 +00:00
}
2013-05-09 13:08:08 +00:00
2018-06-28 05:21:13 +00:00
if ( $first_time ) {
2013-05-16 20:58:48 +00:00
continue ;
2018-06-28 05:21:13 +00:00
}
2013-05-09 13:08:08 +00:00
2018-01-15 13:15:33 +00:00
$receiptians = [];
2018-06-28 05:21:13 +00:00
if ( @ is_array ( $post -> cc )) {
2013-05-16 21:36:05 +00:00
$receiptians = array_merge ( $receiptians , $post -> cc );
2018-06-28 05:21:13 +00:00
}
2013-05-16 21:36:05 +00:00
2018-06-28 05:21:13 +00:00
if ( @ is_array ( $post -> to )) {
2013-05-16 21:36:05 +00:00
$receiptians = array_merge ( $receiptians , $post -> to );
2018-06-28 05:21:13 +00:00
}
2013-05-16 21:36:05 +00:00
$public = false ;
2022-06-23 15:27:42 +00:00
foreach ( $receiptians as $receiver ) {
if ( is_string ( $receiver -> objectType ) && ( $receiver -> id == 'http://activityschema.org/collection/public' )) {
2018-06-28 05:21:13 +00:00
$public = true ;
}
}
2013-05-16 21:36:05 +00:00
2017-06-09 01:20:27 +00:00
if ( $public && ! stristr ( $post -> generator -> displayName , $application_name )) {
2022-11-23 06:25:28 +00:00
$postarray [ 'uid' ] = $uid ;
$postarray [ 'app' ] = 'pump.io' ;
2016-12-09 16:23:42 +00:00
2022-06-23 15:27:42 +00:00
if ( $post -> object -> displayName != '' ) {
2022-11-23 06:25:28 +00:00
$postarray [ 'title' ] = HTML :: toBBCode ( $post -> object -> displayName );
2018-06-28 05:21:13 +00:00
} else {
2022-11-23 06:25:28 +00:00
$postarray [ 'title' ] = '' ;
2018-06-28 05:21:13 +00:00
}
2013-05-16 20:58:48 +00:00
2022-11-23 06:25:28 +00:00
$postarray [ 'body' ] = HTML :: toBBCode ( $post -> object -> content );
2013-05-09 12:36:50 +00:00
2013-11-30 20:22:41 +00:00
// To-Do: Picture has to be cached and stored locally
2022-06-23 15:27:42 +00:00
if ( $post -> object -> fullImage -> url != '' ) {
if ( $post -> object -> fullImage -> pump_io -> proxyURL != '' ) {
2022-11-23 06:25:28 +00:00
$postarray [ 'body' ] = '[url=' . $post -> object -> fullImage -> pump_io -> proxyURL . '][img]' . $post -> object -> image -> pump_io -> proxyURL . " [/img][/url] \n " . $postarray [ 'body' ];
2018-06-28 05:21:13 +00:00
} else {
2022-11-23 06:25:28 +00:00
$postarray [ 'body' ] = '[url=' . $post -> object -> fullImage -> url . '][img]' . $post -> object -> image -> url . " [/img][/url] \n " . $postarray [ 'body' ];
2018-06-28 05:21:13 +00:00
}
2013-11-30 20:22:41 +00:00
}
2013-05-16 20:58:48 +00:00
2022-06-23 15:27:42 +00:00
Logger :: notice ( 'pumpio: posting for user ' . $uid );
2013-05-09 12:36:50 +00:00
2022-11-23 06:25:28 +00:00
Item :: insert ( $postarray , true );
2013-09-08 15:31:28 +00:00
2022-06-23 15:27:42 +00:00
Logger :: notice ( 'pumpio: posting done - user ' . $uid );
2013-05-09 12:36:50 +00:00
}
}
}
2018-06-28 05:21:13 +00:00
if ( $lastdate != 0 ) {
2020-01-18 15:54:49 +00:00
DI :: pConfig () -> set ( $uid , 'pumpio' , 'lastdate' , $lastdate );
2018-06-28 05:21:13 +00:00
}
2013-05-09 12:36:50 +00:00
}
2013-09-03 06:22:46 +00:00
2023-01-14 02:16:09 +00:00
function pumpio_dounlike ( int $uid , array $self , $post , string $own_id )
2018-06-28 05:21:13 +00:00
{
2013-09-06 06:35:40 +00:00
// Searching for the unliked post
// Two queries for speed issues
2021-01-17 00:00:32 +00:00
$orig_post = Post :: selectFirst ([], [ 'uri' => $post -> object -> id , 'uid' => $uid ]);
2018-07-21 12:46:13 +00:00
if ( ! DBA :: isResult ( $orig_post )) {
2021-01-17 00:00:32 +00:00
$orig_post = Post :: selectFirst ([], [ 'extid' => $post -> object -> id , 'uid' => $uid ]);
2018-07-21 12:46:13 +00:00
if ( ! DBA :: isResult ( $orig_post )) {
2013-09-06 06:35:40 +00:00
return ;
2018-06-18 05:15:46 +00:00
}
2013-09-06 06:35:40 +00:00
}
2013-09-03 06:22:46 +00:00
2013-09-06 06:35:40 +00:00
$contactid = 0 ;
2024-11-30 20:12:23 +00:00
$contact = [];
2013-09-03 06:22:46 +00:00
2018-11-08 16:45:19 +00:00
if ( Strings :: compareLink ( $post -> actor -> url , $own_id )) {
2021-10-03 17:35:20 +00:00
$contactid = $self [ 'id' ];
2013-09-06 06:35:40 +00:00
} else {
2021-10-03 17:35:20 +00:00
$contact = Contact :: selectFirst ([], [ 'nurl' => Strings :: normaliseLink ( $post -> actor -> url ), 'uid' => $uid , 'blocked' => false , 'readonly' => false ]);
if ( DBA :: isResult ( $contact )) {
$contactid = $contact [ 'id' ];
2018-06-28 05:21:13 +00:00
}
2013-09-03 06:22:46 +00:00
2018-06-28 05:21:13 +00:00
if ( $contactid == 0 ) {
2013-09-06 06:35:40 +00:00
$contactid = $orig_post [ 'contact-id' ];
2018-06-28 05:21:13 +00:00
}
2013-09-06 06:35:40 +00:00
}
2013-09-03 06:22:46 +00:00
2020-03-10 22:54:36 +00:00
Item :: markForDeletion ([ 'verb' => Activity :: LIKE , 'uid' => $uid , 'contact-id' => $contactid , 'thr-parent' => $orig_post [ 'uri' ]]);
2013-09-06 06:35:40 +00:00
2021-10-03 17:35:20 +00:00
if ( DBA :: isResult ( $contact )) {
2022-06-23 15:27:42 +00:00
Logger :: notice ( 'pumpio_dounlike: unliked existing like. User ' . $own_id . ' ' . $uid . ' Contact: ' . $contactid . ' URI ' . $orig_post [ 'uri' ]);
2018-06-28 05:21:13 +00:00
} else {
2022-06-23 15:27:42 +00:00
Logger :: notice ( 'pumpio_dounlike: not found. User ' . $own_id . ' ' . $uid . ' Contact: ' . $contactid . ' Url ' . $orig_post [ 'uri' ]);
2018-06-28 05:21:13 +00:00
}
2013-09-06 06:35:40 +00:00
}
2023-01-14 02:16:09 +00:00
function pumpio_dolike ( int $uid , array $self , $post , string $own_id , $threadcompletion = true )
2018-06-28 05:21:13 +00:00
{
2018-07-10 12:30:23 +00:00
if ( empty ( $post -> object -> id )) {
2021-10-03 17:35:20 +00:00
Logger :: info ( 'Got empty like: ' . print_r ( $post , true ));
2017-01-15 12:23:40 +00:00
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
2021-01-17 00:00:32 +00:00
$orig_post = Post :: selectFirst ([], [ 'uri' => $post -> object -> id , 'uid' => $uid ]);
2018-07-21 12:46:13 +00:00
if ( ! DBA :: isResult ( $orig_post )) {
2021-01-17 00:00:32 +00:00
$orig_post = Post :: selectFirst ([], [ 'extid' => $post -> object -> id , 'uid' => $uid ]);
2018-07-21 12:46:13 +00:00
if ( ! DBA :: isResult ( $orig_post )) {
2013-09-03 06:22:46 +00:00
return ;
2018-06-18 05:15:46 +00:00
}
2013-09-03 06:22:46 +00:00
}
2014-11-10 22:00:39 +00:00
// thread completion
2018-06-28 05:21:13 +00:00
if ( $threadcompletion ) {
2023-01-14 02:16:09 +00:00
pumpio_fetchallcomments ( $uid , $post -> object -> id );
2018-06-28 05:21:13 +00:00
}
2014-11-10 22:00:39 +00:00
2013-09-06 06:35:40 +00:00
$contactid = 0 ;
2018-11-08 16:45:19 +00:00
if ( Strings :: compareLink ( $post -> actor -> url , $own_id )) {
2021-10-03 17:35:20 +00:00
$contactid = $self [ 'id' ];
$post -> actor -> displayName = $self [ 'name' ];
$post -> actor -> url = $self [ 'url' ];
$post -> actor -> image -> url = $self [ 'photo' ];
2013-09-06 06:35:40 +00:00
} else {
2021-10-03 17:35:20 +00:00
$contact = Contact :: selectFirst ([], [ 'nurl' => Strings :: normaliseLink ( $post -> actor -> url ), 'uid' => $uid , 'blocked' => false , 'readonly' => false ]);
if ( DBA :: isResult ( $contact )) {
$contactid = $contact [ 'id' ];
2018-06-28 05:21:13 +00:00
}
2013-09-06 06:35:40 +00:00
2018-06-28 05:21:13 +00:00
if ( $contactid == 0 ) {
2013-09-06 06:35:40 +00:00
$contactid = $orig_post [ 'contact-id' ];
2018-06-28 05:21:13 +00:00
}
2013-09-06 06:35:40 +00:00
}
2022-06-23 15:27:42 +00:00
$condition = [
'verb' => Activity :: LIKE ,
'uid' => $uid ,
'contact-id' => $contactid ,
'thr-parent' => $orig_post [ 'uri' ],
];
2021-01-19 09:14:14 +00:00
if ( Post :: exists ( $condition )) {
2022-06-23 15:27:42 +00:00
Logger :: notice ( 'pumpio_dolike: found existing like. User ' . $own_id . ' ' . $uid . ' Contact: ' . $contactid . ' URI ' . $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
2018-01-15 13:15:33 +00:00
$likedata = [];
2013-09-03 06:22:46 +00:00
$likedata [ 'parent' ] = $orig_post [ 'id' ];
2019-10-23 22:25:42 +00:00
$likedata [ 'verb' ] = Activity :: LIKE ;
2022-09-12 21:15:08 +00:00
$likedata [ 'gravity' ] = Item :: GRAVITY_ACTIVITY ;
2013-09-03 06:22:46 +00:00
$likedata [ 'uid' ] = $uid ;
$likedata [ 'wall' ] = 0 ;
2018-08-11 20:40:48 +00:00
$likedata [ 'network' ] = Protocol :: PUMPIO ;
2022-07-09 19:51:41 +00:00
$likedata [ 'uri' ] = Item :: newURI ();
2020-11-11 14:42:28 +00:00
$likedata [ 'thr-parent' ] = $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 ;
2018-07-31 18:10:34 +00:00
if ( ! empty ( $post -> actor -> image )) {
$likedata [ 'author-avatar' ] = $post -> actor -> image -> url ;
}
2013-09-03 06:22:46 +00:00
$author = '[url=' . $likedata [ 'author-link' ] . ']' . $likedata [ 'author-name' ] . '[/url]' ;
$objauthor = '[url=' . $orig_post [ 'author-link' ] . ']' . $orig_post [ 'author-name' ] . '[/url]' ;
2020-01-18 19:52:33 +00:00
$post_type = DI :: l10n () -> t ( 'status' );
2013-09-03 06:22:46 +00:00
$plink = '[url=' . $orig_post [ 'plink' ] . ']' . $post_type . '[/url]' ;
2019-10-24 22:10:19 +00:00
$likedata [ 'object-type' ] = Activity\ObjectType :: NOTE ;
2013-09-03 06:22:46 +00:00
2020-01-18 19:52:33 +00:00
$likedata [ 'body' ] = DI :: l10n () -> t ( '%1$s likes %2$s\'s %3$s' , $author , $objauthor , $plink );
2013-09-03 06:22:46 +00:00
2019-10-24 22:10:19 +00:00
$likedata [ 'object' ] = '<object><type>' . Activity\ObjectType :: NOTE . '</type><local>1</local>' .
2018-11-05 12:47:04 +00: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 06:22:46 +00:00
2018-01-28 11:19:38 +00:00
$ret = Item :: insert ( $likedata );
2013-09-06 06:35:40 +00:00
2022-06-23 15:27:42 +00:00
Logger :: notice ( 'pumpio_dolike: ' . $ret . ' User ' . $own_id . ' ' . $uid . ' Contact: ' . $contactid . ' URI ' . $orig_post [ 'uri' ]);
2013-09-03 06:22:46 +00:00
}
2018-06-28 05:21:13 +00:00
function pumpio_get_contact ( $uid , $contact , $no_insert = false )
{
2017-11-19 22:09:54 +00:00
$cid = Contact :: getIdForURL ( $contact -> url , $uid );
2016-07-02 09:22:31 +00:00
2018-06-28 05:21:13 +00:00
if ( $no_insert ) {
return $cid ;
}
2015-01-09 06:07:07 +00:00
2021-10-03 17:35:20 +00:00
$r = Contact :: selectFirst ([], [ 'uid' => $uid , 'nurl' => Strings :: normaliseLink ( $contact -> url )]);
2018-07-21 12:46:13 +00:00
if ( ! DBA :: isResult ( $r )) {
2013-09-03 06:22:46 +00:00
// create contact record
2021-10-03 17:35:20 +00:00
Contact :: insert ([
'uid' => $uid ,
'created' => DateTimeFormat :: utcNow (),
'url' => $contact -> url ,
'nurl' => Strings :: normaliseLink ( $contact -> url ),
2022-06-23 15:27:42 +00:00
'addr' => str_replace ( 'acct:' , '' , $contact -> id ),
2021-10-03 17:35:20 +00:00
'alias' => '' ,
'notify' => $contact -> id ,
'poll' => 'pump.io ' . $contact -> id ,
'name' => $contact -> displayName ,
'nick' => $contact -> preferredUsername ,
'photo' => $contact -> image -> url ,
'network' => Protocol :: PUMPIO ,
'rel' => Contact :: FRIEND ,
'priority' => 1 ,
'location' => $contact -> location -> displayName ,
'about' => $contact -> summary ,
'writable' => 1 ,
'blocked' => 0 ,
'readonly' => 0 ,
'pending' => 0
]);
$r = Contact :: selectFirst ([], [ 'uid' => $uid , 'nurl' => Strings :: normaliseLink ( $contact -> url )]);
2018-07-21 12:46:13 +00:00
if ( ! DBA :: isResult ( $r )) {
2018-06-28 05:21:13 +00:00
return false ;
2017-01-17 19:01:27 +00:00
}
2013-09-03 06:22:46 +00:00
2021-10-03 17:35:20 +00:00
$contact_id = $r [ 'id' ];
2013-09-03 06:22:46 +00:00
2023-06-03 19:55:09 +00:00
Circle :: addMember ( User :: getDefaultCircle ( $uid ), $contact_id );
2013-09-03 06:22:46 +00:00
} else {
2022-06-23 15:27:42 +00:00
$contact_id = $r [ 'id' ];
2013-09-03 06:22:46 +00:00
}
2018-07-15 18:40:20 +00:00
if ( ! empty ( $contact -> image -> url )) {
2020-07-25 11:49:44 +00:00
Contact :: updateAvatar ( $contact_id , $contact -> image -> url );
2018-07-15 18:40:20 +00:00
}
2016-07-02 09:22:31 +00:00
2018-06-28 05:21:13 +00:00
return $contact_id ;
2013-09-03 06:22:46 +00:00
}
2023-01-14 02:16:09 +00:00
function pumpio_dodelete ( int $uid , array $self , $post , string $own_id )
2018-06-28 05:21:13 +00:00
{
2013-09-03 06:22:46 +00:00
// Two queries for speed issues
2018-05-29 05:24:25 +00:00
$condition = [ 'uri' => $post -> object -> id , 'uid' => $uid ];
2021-01-19 09:14:14 +00:00
if ( Post :: exists ( $condition )) {
2020-03-10 22:54:36 +00:00
Item :: markForDeletion ( $condition );
2018-05-29 12:36:44 +00:00
return true ;
2018-05-29 05:24:25 +00:00
}
2013-09-03 06:22:46 +00:00
2018-05-29 05:24:25 +00:00
$condition = [ 'extid' => $post -> object -> id , 'uid' => $uid ];
2021-01-19 09:14:14 +00:00
if ( Post :: exists ( $condition )) {
2020-03-10 22:54:36 +00:00
Item :: markForDeletion ( $condition );
2018-05-29 12:36:44 +00:00
return true ;
2018-05-29 05:24:25 +00:00
}
2018-05-29 12:36:44 +00:00
return false ;
2013-09-03 06:22:46 +00:00
}
2023-01-14 02:16:09 +00:00
function pumpio_dopost ( $client , int $uid , array $self , $post , string $own_id , bool $threadcompletion = true )
2018-06-28 05:21:13 +00:00
{
2022-06-23 15:27:42 +00:00
if (( $post -> verb == 'like' ) || ( $post -> verb == 'favorite' )) {
2023-01-14 02:16:09 +00:00
return pumpio_dolike ( $uid , $self , $post , $own_id );
2018-06-28 05:21:13 +00:00
}
2013-09-03 06:22:46 +00:00
2022-06-23 15:27:42 +00:00
if (( $post -> verb == 'unlike' ) || ( $post -> verb == 'unfavorite' )) {
2023-01-14 02:16:09 +00:00
return pumpio_dounlike ( $uid , $self , $post , $own_id );
2018-06-28 05:21:13 +00:00
}
2013-09-05 06:35:37 +00:00
2022-06-23 15:27:42 +00:00
if ( $post -> verb == 'delete' ) {
2023-01-14 02:16:09 +00:00
return pumpio_dodelete ( $uid , $self , $post , $own_id );
2018-06-28 05:21:13 +00:00
}
2013-09-03 06:22:46 +00:00
2022-06-23 15:27:42 +00:00
if ( $post -> verb != 'update' ) {
2013-09-03 06:22:46 +00:00
// Two queries for speed issues
2021-01-19 09:14:14 +00:00
if ( Post :: exists ([ 'uri' => $post -> object -> id , 'uid' => $uid ])) {
2013-09-12 21:20:26 +00:00
return false ;
2018-06-18 05:15:46 +00:00
}
2021-01-19 09:14:14 +00:00
if ( Post :: exists ([ 'extid' => $post -> object -> id , 'uid' => $uid ])) {
2013-09-12 21:20:26 +00:00
return false ;
2018-06-18 05:15:46 +00:00
}
2013-09-03 06:22:46 +00:00
}
2013-09-06 06:35:40 +00:00
// Only handle these three types
2022-06-23 15:27:42 +00:00
if ( ! strstr ( 'post|share|update' , $post -> verb )) {
2013-09-12 21:20:26 +00:00
return false ;
2018-06-28 05:21:13 +00:00
}
2013-09-06 06:35:40 +00:00
2018-01-15 13:15:33 +00:00
$receiptians = [];
2018-06-28 05:21:13 +00:00
if ( @ is_array ( $post -> cc )) {
2013-09-03 06:22:46 +00:00
$receiptians = array_merge ( $receiptians , $post -> cc );
2018-06-28 05:21:13 +00:00
}
2013-09-03 06:22:46 +00:00
2018-06-28 05:21:13 +00:00
if ( @ is_array ( $post -> to )) {
2013-09-03 06:22:46 +00:00
$receiptians = array_merge ( $receiptians , $post -> to );
2018-06-28 05:21:13 +00:00
}
2013-09-03 06:22:46 +00:00
2018-07-15 18:40:20 +00:00
$public = false ;
2022-06-23 15:27:42 +00:00
foreach ( $receiptians as $receiver ) {
if ( is_string ( $receiver -> objectType ) && ( $receiver -> id == 'http://activityschema.org/collection/public' )) {
2018-06-28 05:21:13 +00:00
$public = true ;
}
}
2013-09-03 06:22:46 +00:00
2018-01-15 13:15:33 +00:00
$postarray = [];
2018-08-11 20:40:48 +00:00
$postarray [ 'network' ] = Protocol :: PUMPIO ;
2013-09-03 06:22:46 +00:00
$postarray [ 'uid' ] = $uid ;
$postarray [ 'wall' ] = 0 ;
$postarray [ 'uri' ] = $post -> object -> id ;
2019-10-24 22:34:46 +00:00
$postarray [ 'object-type' ] = ActivityNamespace :: ACTIVITY_SCHEMA . strtolower ( $post -> object -> objectType );
2013-09-03 06:22:46 +00:00
2022-06-23 15:27:42 +00:00
if ( $post -> object -> objectType != 'comment' ) {
2013-09-06 06:35:40 +00:00
$contact_id = pumpio_get_contact ( $uid , $post -> actor );
2018-06-28 05:21:13 +00:00
if ( ! $contact_id ) {
2021-10-03 17:35:20 +00:00
$contact_id = $self [ 'id' ];
2018-06-28 05:21:13 +00:00
}
2013-09-06 06:35:40 +00:00
2020-11-11 14:42:28 +00:00
$postarray [ 'thr-parent' ] = $post -> object -> id ;
2014-11-10 22:00:39 +00:00
if ( ! $public ) {
$postarray [ 'private' ] = 1 ;
2021-10-03 17:35:20 +00:00
$postarray [ 'allow_cid' ] = '<' . $self [ 'id' ] . '>' ;
2014-11-10 22:00:39 +00:00
}
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
2018-11-08 16:45:19 +00:00
if ( Strings :: compareLink ( $post -> actor -> url , $own_id )) {
2021-10-03 17:35:20 +00:00
$contact_id = $self [ 'id' ];
$post -> actor -> displayName = $self [ 'name' ];
$post -> actor -> url = $self [ 'url' ];
$post -> actor -> image -> url = $self [ '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
2021-10-03 17:35:20 +00:00
$contact = Contact :: selectFirst ([], [ 'nurl' => Strings :: normaliseLink ( $post -> actor -> url ), 'uid' => $uid , 'blocked' => false , 'readonly' => false ]);
if ( DBA :: isResult ( $contact )) {
$contact_id = $contact [ 'id' ];
2018-06-28 05:21:13 +00:00
} else {
2021-10-03 17:35:20 +00:00
$contact_id = $self [ 'id' ];
2013-09-07 11:10:51 +00:00
}
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 ;
2022-06-23 15:27:42 +00:00
$reply -> verb = 'note' ;
2018-07-10 12:30:23 +00:00
if ( isset ( $post -> cc )) {
$reply -> cc = $post -> cc ;
}
2018-08-17 03:23:00 +00:00
if ( isset ( $post -> to )) {
$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 ;
2022-06-23 15:27:42 +00:00
$reply -> generator -> displayName = 'pumpio' ;
2013-09-03 06:22:46 +00:00
$reply -> published = $post -> object -> inReplyTo -> published ;
$reply -> received = $post -> object -> inReplyTo -> updated ;
2023-01-14 02:16:09 +00:00
pumpio_dopost ( $client , $uid , $self , $reply , $own_id , false );
2013-09-03 06:22:46 +00:00
2020-11-11 14:42:28 +00:00
$postarray [ 'thr-parent' ] = $post -> object -> inReplyTo -> id ;
2013-09-03 06:22:46 +00:00
}
2018-08-12 05:52:21 +00:00
// When there is no content there is no need to continue
if ( empty ( $post -> object -> content )) {
return false ;
}
2018-07-10 12:30:23 +00:00
if ( ! empty ( $post -> object -> pump_io -> proxyURL )) {
2013-09-12 21:20:26 +00:00
$postarray [ 'extid' ] = $post -> object -> pump_io -> proxyURL ;
2018-06-28 05:21:13 +00:00
}
2013-09-12 21:20:26 +00:00
2013-09-03 06:22:46 +00:00
$postarray [ 'contact-id' ] = $contact_id ;
2019-10-23 22:25:42 +00:00
$postarray [ 'verb' ] = Activity :: POST ;
2013-09-03 06:22:46 +00:00
$postarray [ 'owner-name' ] = $post -> actor -> displayName ;
$postarray [ 'owner-link' ] = $post -> actor -> url ;
2018-07-31 18:10:34 +00: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 06:22:46 +00:00
$postarray [ 'plink' ] = $post -> object -> url ;
$postarray [ 'app' ] = $post -> generator -> displayName ;
2018-07-31 16:22:05 +00:00
$postarray [ 'title' ] = '' ;
2018-03-07 21:48:34 +00:00
$postarray [ 'body' ] = HTML :: toBBCode ( $post -> object -> content );
2016-05-15 21:18:18 +00:00
$postarray [ 'object' ] = json_encode ( $post );
2013-09-03 06:22:46 +00:00
2018-07-10 12:30:23 +00:00
if ( ! empty ( $post -> object -> fullImage -> url )) {
2022-06-23 15:27:42 +00:00
$postarray [ 'body' ] = '[url=' . $post -> object -> fullImage -> url . '][img]' . $post -> object -> image -> url . " [/img][/url] \n " . $postarray [ 'body' ];
2018-06-28 05:21:13 +00:00
}
2013-09-03 06:22:46 +00:00
2018-07-10 12:30:23 +00:00
if ( ! empty ( $post -> object -> displayName )) {
2013-09-03 06:22:46 +00:00
$postarray [ 'title' ] = $post -> object -> displayName ;
2018-06-28 05:21:13 +00:00
}
2013-09-03 06:22:46 +00:00
2018-01-27 02:39:02 +00:00
$postarray [ 'created' ] = DateTimeFormat :: utc ( $post -> published );
2018-06-28 05:21:13 +00:00
if ( isset ( $post -> updated )) {
2018-01-27 02:39:02 +00:00
$postarray [ 'edited' ] = DateTimeFormat :: utc ( $post -> updated );
2018-06-28 05:21:13 +00:00
} elseif ( isset ( $post -> received )) {
2018-01-27 02:39:02 +00:00
$postarray [ 'edited' ] = DateTimeFormat :: utc ( $post -> received );
2018-06-28 05:21:13 +00:00
} else {
2016-07-02 09:22:31 +00:00
$postarray [ 'edited' ] = $postarray [ 'created' ];
2018-06-28 05:21:13 +00:00
}
2013-09-03 06:22:46 +00:00
2022-06-23 15:27:42 +00:00
if ( $post -> verb == 'share' ) {
if ( isset ( $post -> object -> author -> displayName ) && ( $post -> object -> author -> displayName != '' )) {
2018-06-28 05:21:13 +00:00
$share_author = $post -> object -> author -> displayName ;
2022-06-23 15:27:42 +00:00
} elseif ( isset ( $post -> object -> author -> preferredUsername ) && ( $post -> object -> author -> preferredUsername != '' )) {
2018-06-28 05:21:13 +00:00
$share_author = $post -> object -> author -> preferredUsername ;
2013-10-20 10:29:39 +00:00
} else {
2018-06-28 05:21:13 +00:00
$share_author = $post -> object -> author -> url ;
2013-10-20 10:29:39 +00:00
}
2018-06-28 05:21:13 +00:00
2018-08-17 03:23:00 +00:00
if ( isset ( $post -> object -> created )) {
$created = DateTimeFormat :: utc ( $post -> object -> created );
} else {
$created = '' ;
}
2020-06-18 15:25:14 +00:00
$postarray [ 'body' ] = Friendica\Content\Text\BBCode :: getShareOpeningTag ( $share_author , $post -> object -> author -> url ,
2020-06-21 13:50:01 +00:00
$post -> object -> author -> image -> url , $post -> links -> self -> href , $created ) .
2022-06-23 15:27:42 +00:00
$postarray [ 'body' ] . '[/share]' ;
2013-09-03 06:22:46 +00:00
}
2022-06-23 15:27:42 +00:00
if ( trim ( $postarray [ 'body' ]) == '' ) {
2013-09-12 21:20:26 +00:00
return false ;
2018-06-28 05:21:13 +00:00
}
2013-09-03 06:22:46 +00:00
2018-01-28 11:19:38 +00:00
$top_item = Item :: insert ( $postarray );
2022-06-23 15:27:42 +00:00
$postarray [ 'id' ] = $top_item ;
2013-09-03 06:22:46 +00:00
2022-06-23 15:27:42 +00:00
if (( $top_item == 0 ) && ( $post -> verb == 'update' )) {
$fields = [
'title' => $postarray [ 'title' ],
'body' => $postarray [ 'body' ],
'changed' => $postarray [ 'edited' ],
];
$condition = [ 'uri' => $postarray [ 'uri' ], 'uid' => $uid ];
2018-02-06 14:24:24 +00:00
Item :: update ( $fields , $condition );
2013-09-03 06:22:46 +00:00
}
2022-06-23 15:27:42 +00:00
if (( $post -> object -> objectType == 'comment' ) && $threadcompletion ) {
2023-01-14 02:16:09 +00:00
pumpio_fetchallcomments ( $uid , $postarray [ 'thr-parent' ]);
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
}
2023-01-14 02:16:09 +00:00
function pumpio_fetchinbox ( int $uid )
2018-06-28 05:21:13 +00:00
{
2022-10-19 13:47:48 +00:00
$ckey = DI :: pConfig () -> get ( $uid , 'pumpio' , 'consumer_key' );
2020-01-18 15:50:56 +00:00
$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' );
2022-06-23 15:27:42 +00:00
$username = DI :: pConfig () -> get ( $uid , 'pumpio' , 'user' );
2013-09-03 06:22:46 +00:00
2022-06-23 15:27:42 +00:00
$own_id = 'https://' . $hostname . '/' . $username ;
2013-09-06 06:35:40 +00:00
2021-10-03 17:35:20 +00:00
$self = User :: getOwnerDataById ( $uid );
2013-09-03 06:22:46 +00:00
2021-10-07 19:30:10 +00:00
$lastitems = DBA :: p ( " SELECT `uri` FROM `post-thread-user`
2022-11-12 13:13:58 +00:00
INNER JOIN `post-view` ON `post-view` . `uri-id` = `post-thread-user` . `uri-id`
2021-10-07 19:30:10 +00:00
WHERE `post-thread-user` . `network` = ? AND `post-thread-user` . `uid` = ? AND `post-view` . `extid` != ''
ORDER BY `post-thread-user` . `commented` DESC LIMIT 10 " , Protocol::PUMPIO, $uid );
2014-11-10 22:00:39 +00:00
2022-06-23 15:27:42 +00:00
$client = new oauth_client_class ();
2014-06-10 18:13:11 +00:00
$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
2020-01-18 15:50:56 +00:00
$last_id = DI :: pConfig () -> get ( $uid , 'pumpio' , 'last_id' );
2013-09-03 06:22:46 +00:00
$url = 'https://' . $hostname . '/api/user/' . $username . '/inbox' ;
2022-06-23 15:27:42 +00:00
if ( $last_id != '' ) {
$url .= '?since=' . urlencode ( $last_id );
2018-06-28 05:21:13 +00:00
}
2013-09-03 06:22:46 +00:00
2018-06-28 05:21:13 +00:00
if ( pumpio_reachable ( $url )) {
2022-06-23 15:27:42 +00:00
$success = $client -> CallAPI ( $url , 'GET' , [], [ 'FailOnAccessError' => true ], $user );
2018-06-28 05:21:13 +00:00
} else {
2015-11-02 23:42:04 +00:00
$success = false ;
2018-06-28 05:21:13 +00:00
}
2013-09-03 06:22:46 +00:00
2018-07-10 12:30:23 +00:00
if ( ! $success ) {
return ;
}
2018-12-03 06:52:46 +00:00
if ( ! empty ( $user -> items )) {
2018-06-28 05:21:13 +00:00
$posts = array_reverse ( $user -> items );
2013-10-02 06:38:56 +00:00
2018-06-28 05:21:13 +00:00
if ( count ( $posts )) {
foreach ( $posts as $post ) {
$last_id = $post -> id ;
2023-01-14 02:16:09 +00:00
pumpio_dopost ( $client , $uid , $self , $post , $own_id , true );
2018-06-28 05:21:13 +00:00
}
}
2013-10-02 06:38:56 +00:00
}
2013-09-03 06:22:46 +00:00
2021-10-07 19:30:10 +00:00
while ( $item = DBA :: fetch ( $lastitems )) {
2023-01-14 02:16:09 +00:00
pumpio_fetchallcomments ( $uid , $item [ 'uri' ]);
2018-06-28 05:21:13 +00:00
}
2021-10-07 19:30:10 +00:00
DBA :: close ( $lastitems );
2014-11-10 22:00:39 +00:00
2020-01-18 15:54:49 +00:00
DI :: pConfig () -> set ( $uid , 'pumpio' , 'last_id' , $last_id );
2013-09-03 06:22:46 +00:00
}
2023-01-14 02:16:09 +00:00
function pumpio_getallusers ( int $uid )
2018-06-28 05:21:13 +00:00
{
2022-10-19 13:47:48 +00:00
$ckey = DI :: pConfig () -> get ( $uid , 'pumpio' , 'consumer_key' );
2020-01-18 15:50:56 +00:00
$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' );
2022-06-23 15:27:42 +00:00
$username = DI :: 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
2022-06-23 15:27:42 +00:00
$url = 'https://' . $hostname . '/api/user/' . $username . '/following' ;
2013-09-03 06:22:46 +00:00
2018-06-28 05:21:13 +00:00
if ( pumpio_reachable ( $url )) {
2018-07-22 16:01:05 +00:00
$success = $client -> CallAPI ( $url , 'GET' , [], [ 'FailOnAccessError' => true ], $users );
2018-06-28 05:21:13 +00:00
} else {
2015-11-02 23:42:04 +00:00
$success = false ;
2018-06-28 05:21:13 +00:00
}
2013-09-03 06:22:46 +00:00
2018-08-01 19:14:28 +00:00
if ( empty ( $users )) {
return ;
}
2013-09-03 06:22:46 +00:00
if ( $users -> totalItems > count ( $users -> items )) {
$url = 'https://' . $hostname . '/api/user/' . $username . '/following?count=' . $users -> totalItems ;
2018-06-28 05:21:13 +00:00
if ( pumpio_reachable ( $url )) {
2018-07-22 16:01:05 +00:00
$success = $client -> CallAPI ( $url , 'GET' , [], [ 'FailOnAccessError' => true ], $users );
2018-06-28 05:21:13 +00:00
} else {
2015-11-02 23:42:04 +00:00
$success = false ;
2018-06-28 05:21:13 +00:00
}
2013-09-03 06:22:46 +00:00
}
2018-07-22 06:41:30 +00:00
if ( ! empty ( $users -> items )) {
2018-07-22 16:01:05 +00:00
foreach ( $users -> items as $user ) {
2017-08-20 20:51:07 +00:00
pumpio_get_contact ( $uid , $user );
}
}
2013-09-03 06:22:46 +00:00
}
2023-01-14 02:16:09 +00:00
function pumpio_getreceiver ( array $b )
2018-06-28 05:21:13 +00:00
{
2018-01-15 13:15:33 +00:00
$receiver = [];
2013-09-08 15:09:01 +00:00
2024-11-17 02:19:06 +00:00
if ( $b [ 'private' ] != Item :: PRIVATE ) {
2018-06-28 05:21:13 +00:00
if ( ! strstr ( $b [ 'postopts' ], 'pumpio' )) {
2013-09-08 15:09:01 +00:00
return $receiver ;
2018-06-28 05:21:13 +00:00
}
2013-09-08 15:09:01 +00:00
2022-06-23 15:27:42 +00:00
$public = DI :: pConfig () -> get ( $b [ 'uid' ], 'pumpio' , 'public' );
2013-09-08 15:09:01 +00:00
2018-06-28 05:21:13 +00:00
if ( $public ) {
2022-06-23 15:27:42 +00:00
$receiver [ 'to' ][] = [
'objectType' => 'collection' ,
'id' => 'http://activityschema.org/collection/public'
];
2018-06-28 05:21:13 +00:00
}
2013-09-08 15:09:01 +00:00
} else {
2022-06-23 15:27:42 +00:00
$cids = explode ( '><' , $b [ 'allow_cid' ]);
$gids = explode ( '><' , $b [ 'allow_gid' ]);
2013-09-08 15:09:01 +00:00
2022-06-23 15:27:42 +00:00
foreach ( $cids as $cid ) {
$cid = trim ( $cid , ' <>' );
2013-09-08 15:09:01 +00:00
2022-06-23 15:27:42 +00:00
$contact = Contact :: selectFirst ([ 'name' , 'nick' , 'url' ], [ 'id' => $cid , 'uid' => $b [ 'uid' ], 'network' => Protocol :: PUMPIO , 'blocked' => false , 'readonly' => false ]);
2021-10-03 17:35:20 +00:00
if ( DBA :: isResult ( $contact )) {
2022-06-23 15:27:42 +00:00
$receiver [ 'bcc' ][] = [
'displayName' => $contact [ 'name' ],
'objectType' => 'person' ,
'preferredUsername' => $contact [ 'nick' ],
'url' => $contact [ 'url' ],
];
2013-09-12 21:20:26 +00:00
}
2013-09-08 15:09:01 +00:00
}
2022-06-23 15:27:42 +00:00
foreach ( $gids as $gid ) {
$gid = trim ( $gid , ' <>' );
2013-09-08 15:09:01 +00:00
2021-10-07 19:30:10 +00:00
$contacts = DBA :: p ( " SELECT `contact`.`name`, `contact`.`nick`, `contact`.`url`, `contact`.`network`
2023-06-03 19:55:09 +00:00
FROM `group_member` AS `circle_member` , `contact` WHERE `circle_member` . `gid` = ?
AND `contact` . `id` = `circle_member` . `contact-id` AND `contact` . `network` = ? " ,
2021-10-07 19:30:10 +00:00
$gid , Protocol :: PUMPIO );
2013-09-08 15:09:01 +00:00
2021-10-07 19:30:10 +00:00
while ( $row = DBA :: fetch ( $contacts )) {
2022-06-23 15:27:42 +00:00
$receiver [ 'bcc' ][] = [
'displayName' => $row [ 'name' ],
'objectType' => 'person' ,
'preferredUsername' => $row [ 'nick' ],
'url' => $row [ 'url' ],
];
2021-10-07 19:30:10 +00:00
}
DBA :: close ( $contacts );
2013-09-08 15:09:01 +00:00
}
}
2022-06-23 15:27:42 +00:00
if ( $b [ 'inform' ] != '' ) {
$inform = explode ( ',' , $b [ 'inform' ]);
2013-09-12 21:20:26 +00:00
2022-06-23 15:27:42 +00:00
foreach ( $inform as $cid ) {
if ( substr ( $cid , 0 , 4 ) != 'cid:' ) {
2013-09-12 21:20:26 +00:00
continue ;
2018-06-28 05:21:13 +00:00
}
2013-09-12 21:20:26 +00:00
2022-06-23 15:27:42 +00:00
$cid = str_replace ( 'cid:' , '' , $cid );
2013-09-12 21:20:26 +00:00
2022-06-23 15:27:42 +00:00
$contact = Contact :: selectFirst ([ 'name' , 'nick' , 'url' ], [ 'id' => $cid , 'uid' => $b [ 'uid' ], 'network' => Protocol :: PUMPIO , 'blocked' => false , 'readonly' => false ]);
2021-10-03 17:35:20 +00:00
if ( DBA :: isResult ( $contact )) {
2022-06-23 15:27:42 +00:00
$receiver [ 'to' ][] = [
'displayName' => $contact [ 'name' ],
'objectType' => 'person' ,
'preferredUsername' => $contact [ 'nick' ],
'url' => $contact [ 'url' ],
];
2013-09-12 21:20:26 +00:00
}
}
}
2013-09-08 15:09:01 +00:00
return $receiver ;
}
2023-01-14 02:16:09 +00:00
function pumpio_fetchallcomments ( $uid , $id )
2018-06-28 05:21:13 +00:00
{
2020-01-18 15:50:56 +00: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' );
2022-06-23 15:27:42 +00:00
$username = DI :: pConfig () -> get ( $uid , 'pumpio' , 'user' );
2013-09-12 21:20:26 +00:00
2022-06-23 15:27:42 +00:00
Logger :: notice ( 'pumpio_fetchallcomments: completing comment for user ' . $uid . ' post id ' . $id );
2013-09-12 21:20:26 +00:00
2022-06-23 15:27:42 +00:00
$own_id = 'https://' . $hostname . '/' . $username ;
2013-09-12 21:20:26 +00:00
2021-10-03 17:35:20 +00:00
$self = User :: getOwnerDataById ( $uid );
2013-09-12 21:20:26 +00:00
2014-11-10 22:00:39 +00:00
// Fetching the original post
2018-06-18 05:15:46 +00:00
$condition = [ " `uri` = ? AND `uid` = ? AND `extid` != '' " , $id , $uid ];
2021-01-17 00:00:32 +00:00
$original = Post :: selectFirst ([ 'extid' ], $condition );
2020-10-05 06:51:07 +00:00
if ( ! DBA :: isResult ( $original )) {
2014-11-10 22:00:39 +00:00
return false ;
2018-06-18 05:15:46 +00:00
}
2013-09-12 21:20:26 +00:00
2022-06-23 15:27:42 +00:00
$url = $original [ '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 ;
2022-06-23 15:27:42 +00:00
Logger :: notice ( 'pumpio_fetchallcomments: fetching comment for user ' . $uid . ', URL ' . $url );
2013-09-12 21:20:26 +00:00
2024-11-30 20:12:23 +00:00
$item = new \stdClass ();
2018-06-28 05:21:13 +00:00
if ( pumpio_reachable ( $url )) {
2022-06-23 15:27:42 +00:00
$success = $client -> CallAPI ( $url , 'GET' , [], [ 'FailOnAccessError' => true ], $item );
2018-06-28 05:21:13 +00:00
} else {
2015-11-02 23:42:04 +00:00
$success = false ;
2018-06-28 05:21:13 +00:00
}
2013-09-12 21:20:26 +00:00
2018-06-28 05:21:13 +00:00
if ( ! $success ) {
2013-09-12 21:20:26 +00:00
return ;
2018-06-28 05:21:13 +00:00
}
2013-09-12 21:20:26 +00:00
2014-11-10 22:00:39 +00:00
if ( $item -> likes -> totalItems != 0 ) {
2022-06-23 15:27:42 +00:00
foreach ( $item -> likes -> items as $post ) {
2014-11-10 22:00:39 +00:00
$like = new stdClass ;
$like -> object = new stdClass ;
$like -> object -> id = $item -> id ;
$like -> actor = new stdClass ;
2018-07-26 19:20:12 +00:00
if ( ! empty ( $item -> displayName )) {
$like -> actor -> displayName = $item -> displayName ;
}
2018-07-10 12:30:23 +00:00
//$like->actor->preferredUsername = $item->preferredUsername;
//$like->actor->image = $item->image;
2014-11-10 22:00:39 +00:00
$like -> actor -> url = $item -> url ;
$like -> generator = new stdClass ;
2022-06-23 15:27:42 +00:00
$like -> generator -> displayName = 'pumpio' ;
2023-01-14 02:16:09 +00:00
pumpio_dolike ( $uid , $self , $post , $own_id , false );
2014-11-10 22:00:39 +00:00
}
}
2018-06-28 05:21:13 +00:00
if ( $item -> replies -> totalItems == 0 ) {
2013-09-12 21:20:26 +00:00
return ;
2018-06-28 05:21:13 +00:00
}
2013-09-12 21:20:26 +00:00
2022-06-23 15:27:42 +00:00
foreach ( $item -> replies -> items as $item ) {
2018-06-28 05:21:13 +00:00
if ( $item -> id == $id ) {
2013-09-12 21:20:26 +00:00
continue ;
2018-06-28 05:21:13 +00:00
}
2013-09-12 21:20:26 +00:00
// Checking if the comment already exists - Two queries for speed issues
2021-01-19 09:14:14 +00:00
if ( Post :: exists ([ 'uri' => $item -> id , 'uid' => $uid ])) {
2013-09-12 21:20:26 +00:00
continue ;
2018-06-18 05:15:46 +00:00
}
2013-09-12 21:20:26 +00:00
2021-01-19 09:14:14 +00:00
if ( Post :: exists ([ 'extid' => $item -> id , 'uid' => $uid ])) {
2013-09-12 21:20:26 +00:00
continue ;
2018-06-18 05:15:46 +00:00
}
2013-09-12 21:20:26 +00:00
2014-11-10 22:00:39 +00:00
$post = new stdClass ;
2022-06-23 15:27:42 +00:00
$post -> verb = 'post' ;
2013-09-12 21:20:26 +00:00
$post -> actor = $item -> author ;
$post -> published = $item -> published ;
$post -> received = $item -> updated ;
2014-11-10 22:00:39 +00:00
$post -> generator = new stdClass ;
2022-06-23 15:27:42 +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 ;
2022-10-17 05:50:23 +00:00
Logger :: notice ( 'pumpio_fetchallcomments: posting comment ' . $post -> object -> id . ' ' , json_decode ( json_encode ( $post ), true ));
2023-01-14 02:16:09 +00:00
pumpio_dopost ( $client , $uid , $self , $post , $own_id , false );
2013-09-12 21:20:26 +00:00
}
}
2022-06-23 15:27:42 +00:00
function pumpio_reachable ( string $url ) : bool
2018-06-28 05:21:13 +00:00
{
2022-04-02 19:16:21 +00:00
return DI :: httpClient () -> get ( $url , HttpClientAccept :: DEFAULT , [ HttpClientOptions :: TIMEOUT => 10 ]) -> isSuccess ();
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
*/