2013-01-27 23:25:04 +01:00
< ? php
2013-02-04 00:57:23 +01:00
define ( 'OSTATUS_DEFAULT_POLL_INTERVAL' , 30 ); // given in minutes
2013-03-03 17:58:35 +01:00
define ( 'OSTATUS_DEFAULT_POLL_TIMEFRAME' , 1440 ); // given in minutes
2013-01-27 23:25:04 +01:00
2015-05-26 23:33:38 +02:00
function ostatus_convert_href ( $href ) {
$elements = explode ( " : " , $href );
if (( count ( $elements ) <= 2 ) OR ( $elements [ 0 ] != " tag " ))
return $href ;
$server = explode ( " , " , $elements [ 1 ]);
$conversation = explode ( " = " , $elements [ 2 ]);
if (( count ( $elements ) == 4 ) AND ( $elements [ 2 ] == " post " ))
return " http:// " . $server [ 0 ] . " /notice/ " . $elements [ 3 ];
if (( count ( $conversation ) != 2 ) OR ( $conversation [ 1 ] == " " ))
return $href ;
if ( $elements [ 3 ] == " objectType=thread " )
return " http:// " . $server [ 0 ] . " /conversation/ " . $conversation [ 1 ];
else
return " http:// " . $server [ 0 ] . " /notice/ " . $conversation [ 1 ];
return $href ;
}
function check_conversations ( $override = false ) {
2013-02-04 00:57:23 +01:00
$last = get_config ( 'system' , 'ostatus_last_poll' );
$poll_interval = intval ( get_config ( 'system' , 'ostatus_poll_interval' ));
if ( ! $poll_interval )
$poll_interval = OSTATUS_DEFAULT_POLL_INTERVAL ;
2013-03-03 17:58:35 +01:00
// Don't poll if the interval is set negative
2015-05-26 23:33:38 +02:00
if (( $poll_interval < 0 ) AND ! $override )
2013-03-03 17:58:35 +01:00
return ;
$poll_timeframe = intval ( get_config ( 'system' , 'ostatus_poll_timeframe' ));
2015-05-26 23:33:38 +02:00
if ( ! $poll_timeframe )
2013-03-03 17:58:35 +01:00
$poll_timeframe = OSTATUS_DEFAULT_POLL_TIMEFRAME ;
2015-05-26 23:33:38 +02:00
if ( $last AND ! $override ) {
2013-02-04 00:57:23 +01:00
$next = $last + ( $poll_interval * 60 );
2015-05-26 23:33:38 +02:00
if ( $next > time ()) {
2015-01-12 00:14:51 +01:00
logger ( 'poll interval not reached' );
2013-02-04 00:57:23 +01:00
return ;
}
}
2015-01-12 00:14:51 +01:00
logger ( 'cron_start' );
2013-02-04 00:57:23 +01:00
2013-03-03 17:58:35 +01:00
$start = date ( " Y-m-d H:i:s " , time () - ( $poll_timeframe * 60 ));
2014-03-16 18:09:42 +01:00
$conversations = q ( " SELECT * FROM `term` WHERE `type` = 7 AND `term` > '%s' " ,
2013-02-04 00:57:23 +01:00
dbesc ( $start ));
foreach ( $conversations AS $conversation ) {
$id = $conversation [ 'oid' ];
$url = $conversation [ 'url' ];
complete_conversation ( $id , $url );
}
2015-05-26 23:33:38 +02:00
logger ( 'cron_end' );
2013-02-04 00:57:23 +01:00
set_config ( 'system' , 'ostatus_last_poll' , time ());
}
function complete_conversation ( $itemid , $conversation_url , $only_add_conversation = false ) {
global $a ;
2013-01-27 23:25:04 +01:00
2015-05-26 23:33:38 +02:00
$conversation_url = ostatus_convert_href ( $conversation_url );
2014-03-16 18:09:42 +01:00
if ( intval ( get_config ( 'system' , 'ostatus_poll_interval' )) == - 2 )
return ;
2014-01-05 16:22:42 +01:00
if ( $a -> last_ostatus_conversation_url == $conversation_url )
return ;
$a -> last_ostatus_conversation_url = $conversation_url ;
2015-03-07 21:24:39 +01:00
$messages = q ( " SELECT `uid`, `parent`, `created`, `received`, `guid` FROM `item` WHERE `id` = %d LIMIT 1 " , intval ( $itemid ));
2013-01-27 23:25:04 +01:00
if ( ! $messages )
return ;
$message = $messages [ 0 ];
// Store conversation url if not done before
$conversation = q ( " SELECT `url` FROM `term` WHERE `uid` = %d AND `oid` = %d AND `otype` = %d AND `type` = %d " ,
intval ( $message [ " uid " ]), intval ( $itemid ), intval ( TERM_OBJ_POST ), intval ( TERM_CONVERSATION ));
2013-01-28 01:16:51 +01:00
if ( ! $conversation ) {
2015-03-07 21:24:39 +01:00
$r = q ( " INSERT INTO `term` (`uid`, `oid`, `otype`, `type`, `term`, `url`, `created`, `received`, `guid`) VALUES (%d, %d, %d, %d, '%s', '%s', '%s', '%s', '%s') " ,
intval ( $message [ " uid " ]), intval ( $itemid ), intval ( TERM_OBJ_POST ), intval ( TERM_CONVERSATION ),
dbesc ( $message [ " created " ]), dbesc ( $conversation_url ), dbesc ( $message [ " created " ]), dbesc ( $message [ " received " ]), dbesc ( $message [ " guid " ]));
2013-01-28 01:16:51 +01:00
logger ( 'complete_conversation: Storing conversation url ' . $conversation_url . ' for id ' . $itemid );
}
2013-01-27 23:25:04 +01:00
2013-02-04 00:57:23 +01:00
if ( $only_add_conversation )
return ;
// Get the parent
$parents = q ( " SELECT `id`, `uri`, `contact-id`, `type`, `verb`, `visible` FROM `item` WHERE `uid` = %d AND `id` = %d LIMIT 1 " ,
intval ( $message [ " uid " ]), intval ( $message [ " parent " ]));
if ( ! $parents )
return ;
$parent = $parents [ 0 ];
require_once ( 'include/html2bbcode.php' );
require_once ( 'include/items.php' );
2013-01-27 23:25:04 +01:00
$conv = str_replace ( " /conversation/ " , " /api/statusnet/conversation/ " , $conversation_url ) . " .as " ;
2013-06-08 12:28:19 +02:00
$pageno = 1 ;
$items = array ();
2013-01-27 23:25:04 +01:00
2013-01-28 01:22:00 +01:00
logger ( 'complete_conversation: fetching conversation url ' . $conv . ' for ' . $itemid );
2013-01-27 23:25:04 +01:00
2013-06-08 12:28:19 +02:00
do {
2013-06-27 22:27:59 +02:00
$conv_as = fetch_url ( $conv . " ?page= " . $pageno );
2013-01-27 23:25:04 +01:00
$conv_as = str_replace ( ',"statusnet:notice_info":' , ',"statusnet_notice_info":' , $conv_as );
$conv_as = json_decode ( $conv_as );
2013-06-08 12:28:19 +02:00
if ( @ is_array ( $conv_as -> items ))
$items = array_merge ( $items , $conv_as -> items );
else
break ;
2013-02-23 12:42:55 +01:00
2013-06-08 12:28:19 +02:00
$pageno ++ ;
2013-01-27 23:25:04 +01:00
2013-06-08 12:28:19 +02:00
} while ( true );
2013-03-06 23:23:04 +01:00
2013-06-08 12:28:19 +02:00
if ( ! sizeof ( $items ))
return ;
$items = array_reverse ( $items );
foreach ( $items as $single_conv ) {
2015-05-26 23:33:38 +02:00
if ( ! isset ( $single_conv -> id ) AND isset ( $single_conv -> object -> id ))
2013-06-16 13:28:04 +02:00
$single_conv -> id = $single_conv -> object -> id ;
2015-05-26 23:33:38 +02:00
elseif ( ! isset ( $single_conv -> id ) AND isset ( $single_conv -> object -> url ))
$single_conv -> id = $single_conv -> object -> url ;
2013-06-16 13:28:04 +02:00
2015-05-26 23:33:38 +02:00
$plink = ostatus_convert_href ( $single_conv -> id );
if ( isset ( $single_conv -> provider -> url ) AND isset ( $single_conv -> statusnet_notice_info -> local_id ))
$plink = $single_conv -> provider -> url . " notice/ " . $single_conv -> statusnet_notice_info -> local_id ;
elseif ( isset ( $single_conv -> provider -> url ) AND isset ( $single_conv -> statusnet -> notice_info -> local_id ))
$plink = $single_conv -> provider -> url . " notice/ " . $single_conv -> statusnet -> notice_info -> local_id ;
2015-05-27 08:16:05 +02:00
elseif ( isset ( $single_conv -> provider -> url ) AND isset ( $single_conv -> status_net -> notice_info -> local_id ))
$plink = $single_conv -> provider -> url . " notice/ " . $single_conv -> status_net -> notice_info -> local_id ;
2013-06-08 12:28:19 +02:00
if ( @! $single_conv -> id )
continue ;
2013-03-06 23:23:04 +01:00
2015-05-26 23:33:38 +02:00
//logger("OStatus conversation id ".$single_conv->id, LOGGER_DEBUG);
//logger("OStatus conversation data ".print_r($single_conv, true), LOGGER_DEBUG);
2013-06-08 12:28:19 +02:00
if ( $first_id == " " ) {
$first_id = $single_conv -> id ;
2013-01-28 01:16:51 +01:00
2015-05-27 08:16:05 +02:00
$new_parents = q ( " SELECT `id`, `uri`, `contact-id`, `type`, `verb`, `visible` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `network` IN ('%s','%s') LIMIT 1 " ,
intval ( $message [ " uid " ]), dbesc ( $first_id ),
dbesc ( NETWORK_OSTATUS ), dbesc ( NETWORK_DFRN ));
2013-06-08 12:28:19 +02:00
if ( $new_parents ) {
$parent = $new_parents [ 0 ];
2015-01-12 00:14:51 +01:00
logger ( 'adopting new parent ' . $parent [ " id " ] . ' for ' . $itemid );
2013-06-08 12:28:19 +02:00
} else {
$parent [ " id " ] = 0 ;
$parent [ " uri " ] = $first_id ;
2013-01-28 01:16:51 +01:00
}
2013-06-08 12:28:19 +02:00
}
2013-01-28 01:16:51 +01:00
2013-06-08 12:28:19 +02:00
if ( isset ( $single_conv -> context -> inReplyTo -> id ))
$parent_uri = $single_conv -> context -> inReplyTo -> id ;
else
$parent_uri = $parent [ " uri " ];
2013-01-27 23:25:04 +01:00
2015-05-27 08:16:05 +02:00
$message_exists = q ( " SELECT `id` FROM `item` WHERE `uid` = %d AND `plink` = '%s' AND `network` IN ('%s','%s') LIMIT 1 " ,
intval ( $message [ " uid " ]), dbesc ( $plink ),
dbesc ( NETWORK_OSTATUS ), dbesc ( NETWORK_DFRN ));
2015-05-26 23:33:38 +02:00
if ( ! $message_exists )
2015-05-27 08:16:05 +02:00
$message_exists = q ( " SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `network` IN ('%s','%s') LIMIT 1 " ,
intval ( $message [ " uid " ]), dbesc ( $single_conv -> id ),
dbesc ( NETWORK_OSTATUS ), dbesc ( NETWORK_DFRN ));
2015-05-26 23:33:38 +02:00
2013-06-08 12:28:19 +02:00
if ( $message_exists ) {
if ( $parent [ " id " ] != 0 ) {
$existing_message = $message_exists [ 0 ];
2015-01-12 00:14:51 +01:00
2015-05-27 08:16:05 +02:00
logger ( 'updating id ' . $existing_message [ " id " ] . ' to parent ' . $parent [ " id " ] . ' uri ' . $parent [ " uri " ] . ' thread ' . $parent_uri , LOGGER_DEBUG );
2015-01-12 00:14:51 +01:00
// This is partly bad, since the entry in the thread table isn't updated
2014-03-16 18:09:42 +01:00
$r = q ( " UPDATE `item` SET `parent` = %d, `parent-uri` = '%s', `thr-parent` = '%s' WHERE `id` = %d " ,
2013-06-08 12:28:19 +02:00
intval ( $parent [ " id " ]),
dbesc ( $parent [ " uri " ]),
dbesc ( $parent_uri ),
intval ( $existing_message [ " id " ]));
2013-01-27 23:25:04 +01:00
}
2013-06-08 12:28:19 +02:00
continue ;
}
2013-01-27 23:25:04 +01:00
2015-01-12 00:14:51 +01:00
$contact = q ( " SELECT `id` FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' AND `network` != '%s' " ,
$message [ " uid " ], normalise_link ( $single_conv -> actor -> id ), NETWORK_STATUSNET );
if ( count ( $contact )) {
logger ( " Found contact for url " . $single_conv -> actor -> id , LOGGER_DEBUG );
$contact_id = $contact [ 0 ][ " id " ];
} else {
logger ( " No contact found for url " . $single_conv -> actor -> id , LOGGER_DEBUG );
$contact_id = $parent [ " contact-id " ];
}
2013-06-08 12:28:19 +02:00
$arr = array ();
2013-12-27 01:58:21 +01:00
$arr [ " network " ] = NETWORK_OSTATUS ;
2013-06-08 12:28:19 +02:00
$arr [ " uri " ] = $single_conv -> id ;
2015-05-26 23:33:38 +02:00
$arr [ " plink " ] = $plink ;
2013-06-08 12:28:19 +02:00
$arr [ " uid " ] = $message [ " uid " ];
2015-01-12 00:14:51 +01:00
$arr [ " contact-id " ] = $contact_id ;
2013-06-08 12:28:19 +02:00
if ( $parent [ " id " ] != 0 )
$arr [ " parent " ] = $parent [ " id " ];
$arr [ " parent-uri " ] = $parent [ " uri " ];
$arr [ " thr-parent " ] = $parent_uri ;
$arr [ " created " ] = $single_conv -> published ;
$arr [ " edited " ] = $single_conv -> published ;
//$arr["owner-name"] = $single_conv->actor->contact->displayName;
$arr [ " owner-name " ] = $single_conv -> actor -> contact -> preferredUsername ;
if ( $arr [ " owner-name " ] == '' )
$arr [ " owner-name " ] = $single_conv -> actor -> portablecontacts_net -> preferredUsername ;
if ( $arr [ " owner-name " ] == '' )
$arr [ " owner-name " ] = $single_conv -> actor -> displayName ;
$arr [ " owner-link " ] = $single_conv -> actor -> id ;
$arr [ " owner-avatar " ] = $single_conv -> actor -> image -> url ;
//$arr["author-name"] = $single_conv->actor->contact->displayName;
//$arr["author-name"] = $single_conv->actor->contact->preferredUsername;
$arr [ " author-name " ] = $arr [ " owner-name " ];
$arr [ " author-link " ] = $single_conv -> actor -> id ;
$arr [ " author-avatar " ] = $single_conv -> actor -> image -> url ;
$arr [ " body " ] = html2bbcode ( $single_conv -> content );
2015-05-26 23:33:38 +02:00
2015-05-27 08:16:05 +02:00
if ( isset ( $single_conv -> status_net -> notice_info -> source ))
$arr [ " app " ] = strip_tags ( $single_conv -> status_net -> notice_info -> source );
elseif ( isset ( $single_conv -> statusnet -> notice_info -> source ))
2015-05-26 23:33:38 +02:00
$arr [ " app " ] = strip_tags ( $single_conv -> statusnet -> notice_info -> source );
elseif ( isset ( $single_conv -> statusnet_notice_info -> source ))
$arr [ " app " ] = strip_tags ( $single_conv -> statusnet_notice_info -> source );
elseif ( isset ( $single_conv -> provider -> displayName ))
2013-06-08 12:28:19 +02:00
$arr [ " app " ] = $single_conv -> provider -> displayName ;
2015-05-26 23:33:38 +02:00
else
$arr [ " app " ] = " OStatus " ;
2013-06-08 12:28:19 +02:00
$arr [ " verb " ] = $parent [ " verb " ];
$arr [ " visible " ] = $parent [ " visible " ];
$arr [ " location " ] = $single_conv -> location -> displayName ;
$arr [ " coord " ] = trim ( $single_conv -> location -> lat . " " . $single_conv -> location -> lon );
if ( $arr [ " location " ] == " " )
unset ( $arr [ " location " ]);
if ( $arr [ " coord " ] == " " )
unset ( $arr [ " coord " ]);
$newitem = item_store ( $arr );
2015-05-26 23:33:38 +02:00
logger ( 'Stored new item ' . $plink . ' under id ' . $newitem , LOGGER_DEBUG );
2013-06-08 12:28:19 +02:00
// Add the conversation entry (but don't fetch the whole conversation)
complete_conversation ( $newitem , $conversation_url , true );
// If the newly created item is the top item then change the parent settings of the thread
if ( $newitem AND ( $arr [ " uri " ] == $first_id )) {
2015-01-12 00:14:51 +01:00
logger ( 'setting new parent to id ' . $newitem );
2013-06-08 12:28:19 +02:00
$new_parents = q ( " SELECT `id`, `uri`, `contact-id`, `type`, `verb`, `visible` FROM `item` WHERE `uid` = %d AND `id` = %d LIMIT 1 " ,
intval ( $message [ " uid " ]), intval ( $newitem ));
if ( $new_parents ) {
$parent = $new_parents [ 0 ];
2015-01-12 00:14:51 +01:00
logger ( 'done changing parents to parent ' . $newitem );
2013-01-28 01:16:51 +01:00
}
2013-01-27 23:25:04 +01:00
}
}
}
?>