2013-01-27 22:25:04 +00:00
< ? php
2015-05-28 05:51:12 +00:00
require_once ( " include/Contact.php " );
2015-06-11 22:39:56 +00:00
require_once ( " include/threads.php " );
2015-05-28 05:51:12 +00:00
2013-02-03 23:57:23 +00:00
define ( 'OSTATUS_DEFAULT_POLL_INTERVAL' , 30 ); // given in minutes
2013-03-03 16:58:35 +00:00
define ( 'OSTATUS_DEFAULT_POLL_TIMEFRAME' , 1440 ); // given in minutes
2013-01-27 22:25:04 +00:00
2015-05-26 21:33:38 +00: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-03 23:57:23 +00: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 16:58:35 +00:00
// Don't poll if the interval is set negative
2015-05-26 21:33:38 +00:00
if (( $poll_interval < 0 ) AND ! $override )
2013-03-03 16:58:35 +00:00
return ;
$poll_timeframe = intval ( get_config ( 'system' , 'ostatus_poll_timeframe' ));
2015-05-26 21:33:38 +00:00
if ( ! $poll_timeframe )
2013-03-03 16:58:35 +00:00
$poll_timeframe = OSTATUS_DEFAULT_POLL_TIMEFRAME ;
2015-05-26 21:33:38 +00:00
if ( $last AND ! $override ) {
2013-02-03 23:57:23 +00:00
$next = $last + ( $poll_interval * 60 );
2015-05-26 21:33:38 +00:00
if ( $next > time ()) {
2015-01-11 23:14:51 +00:00
logger ( 'poll interval not reached' );
2013-02-03 23:57:23 +00:00
return ;
}
}
2015-01-11 23:14:51 +00:00
logger ( 'cron_start' );
2013-02-03 23:57:23 +00:00
2013-03-03 16:58:35 +00:00
$start = date ( " Y-m-d H:i:s " , time () - ( $poll_timeframe * 60 ));
2015-06-06 11:15:37 +00:00
$conversations = q ( " SELECT `oid`, `url` FROM `term` WHERE `type` = 7 AND `term` > '%s' GROUP BY `url` ORDER BY `term` DESC " ,
2013-02-03 23:57:23 +00:00
dbesc ( $start ));
2015-06-06 11:15:37 +00:00
2013-02-03 23:57:23 +00:00
foreach ( $conversations AS $conversation ) {
$id = $conversation [ 'oid' ];
$url = $conversation [ 'url' ];
complete_conversation ( $id , $url );
}
2015-05-26 21:33:38 +00:00
logger ( 'cron_end' );
2013-02-03 23:57:23 +00:00
set_config ( 'system' , 'ostatus_last_poll' , time ());
}
function complete_conversation ( $itemid , $conversation_url , $only_add_conversation = false ) {
global $a ;
2013-01-27 22:25:04 +00:00
2015-05-26 21:33:38 +00:00
$conversation_url = ostatus_convert_href ( $conversation_url );
2014-03-16 17:09:42 +00:00
if ( intval ( get_config ( 'system' , 'ostatus_poll_interval' )) == - 2 )
return ;
2014-01-05 15:22:42 +00:00
if ( $a -> last_ostatus_conversation_url == $conversation_url )
return ;
$a -> last_ostatus_conversation_url = $conversation_url ;
2015-03-07 20:24:39 +00:00
$messages = q ( " SELECT `uid`, `parent`, `created`, `received`, `guid` FROM `item` WHERE `id` = %d LIMIT 1 " , intval ( $itemid ));
2013-01-27 22:25:04 +00: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 00:16:51 +00:00
if ( ! $conversation ) {
2015-03-07 20:24:39 +00: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 " ]));
2015-06-11 22:39:56 +00:00
logger ( 'Storing conversation url ' . $conversation_url . ' for id ' . $itemid );
2013-01-28 00:16:51 +00:00
}
2013-01-27 22:25:04 +00:00
2013-02-03 23:57:23 +00: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 22:25:04 +00:00
$conv = str_replace ( " /conversation/ " , " /api/statusnet/conversation/ " , $conversation_url ) . " .as " ;
2013-06-08 10:28:19 +00:00
$pageno = 1 ;
$items = array ();
2013-01-27 22:25:04 +00:00
2015-06-11 22:39:56 +00:00
logger ( 'fetching conversation url ' . $conv . ' for id ' . $itemid . ' and parent ' . $parent [ " id " ]);
2013-01-27 22:25:04 +00:00
2013-06-08 10:28:19 +00:00
do {
2013-06-27 20:27:59 +00:00
$conv_as = fetch_url ( $conv . " ?page= " . $pageno );
2013-01-27 22:25:04 +00:00
$conv_as = str_replace ( ',"statusnet:notice_info":' , ',"statusnet_notice_info":' , $conv_as );
$conv_as = json_decode ( $conv_as );
2013-06-08 10:28:19 +00:00
if ( @ is_array ( $conv_as -> items ))
$items = array_merge ( $items , $conv_as -> items );
else
break ;
2013-02-23 11:42:55 +00:00
2013-06-08 10:28:19 +00:00
$pageno ++ ;
2013-01-27 22:25:04 +00:00
2013-06-08 10:28:19 +00:00
} while ( true );
2013-03-06 22:23:04 +00:00
2013-06-08 10:28:19 +00:00
if ( ! sizeof ( $items ))
return ;
$items = array_reverse ( $items );
foreach ( $items as $single_conv ) {
2015-05-28 05:51:12 +00:00
if ( isset ( $single_conv -> object -> id ))
2013-06-16 11:28:04 +00:00
$single_conv -> id = $single_conv -> object -> id ;
2015-05-28 05:51:12 +00:00
2015-06-07 21:18:02 +00:00
//logger("Got id ".$single_conv->id, LOGGER_DEBUG);
2015-05-28 05:51:12 +00:00
2015-05-26 21:33:38 +00:00
$plink = ostatus_convert_href ( $single_conv -> id );
2015-05-28 05:51:12 +00:00
if ( isset ( $single_conv -> object -> url ))
$plink = ostatus_convert_href ( $single_conv -> object -> url );
2015-06-07 21:18:02 +00:00
//logger("Got url ".$plink, LOGGER_DEBUG);
2015-05-26 21:33:38 +00:00
2013-06-08 10:28:19 +00:00
if ( @! $single_conv -> id )
continue ;
2013-03-06 22:23:04 +00:00
2013-06-08 10:28:19 +00:00
if ( $first_id == " " ) {
$first_id = $single_conv -> id ;
2013-01-28 00:16:51 +00:00
2015-06-11 22:39:56 +00:00
$new_parents = q ( " SELECT `id`, `parent`, `uri`, `contact-id`, `type`, `verb`, `visible` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `network` IN ('%s','%s') LIMIT 1 " ,
2015-05-27 06:16:05 +00:00
intval ( $message [ " uid " ]), dbesc ( $first_id ),
dbesc ( NETWORK_OSTATUS ), dbesc ( NETWORK_DFRN ));
2013-06-08 10:28:19 +00:00
if ( $new_parents ) {
2015-06-11 22:39:56 +00:00
// It can happen that OStatus servers have incomplete threads.
// Then keep the current parent
if ( $parent [ " id " ] == $parent [ " parent " ]) {
$parent = $new_parents [ 0 ];
if ( $parent [ " id " ] != $message [ " parent " ])
logger ( 'Fetch new parent id ' . $parent [ " id " ] . ' - Old parent: ' . $message [ " parent " ]);
} else {
$first_id = $parent [ " uri " ];
//logger('Keep parent for '.$itemid.' - Old parent: '.$message["parent"]);
}
2013-06-08 10:28:19 +00:00
} else {
$parent [ " id " ] = 0 ;
$parent [ " uri " ] = $first_id ;
2013-01-28 00:16:51 +00:00
}
2013-06-08 10:28:19 +00:00
}
2013-01-28 00:16:51 +00:00
2013-06-08 10:28:19 +00:00
if ( isset ( $single_conv -> context -> inReplyTo -> id ))
$parent_uri = $single_conv -> context -> inReplyTo -> id ;
else
$parent_uri = $parent [ " uri " ];
2013-01-27 22:25:04 +00:00
2015-06-07 21:18:02 +00:00
$message_exists = q ( " SELECT `id`, `parent` FROM `item` WHERE `uid` = %d AND `plink` = '%s' AND `network` IN ('%s','%s') LIMIT 1 " ,
2015-05-27 06:16:05 +00:00
intval ( $message [ " uid " ]), dbesc ( $plink ),
dbesc ( NETWORK_OSTATUS ), dbesc ( NETWORK_DFRN ));
2015-05-26 21:33:38 +00:00
if ( ! $message_exists )
2015-06-07 21:18:02 +00:00
$message_exists = q ( " SELECT `id`, `parent` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `network` IN ('%s','%s') LIMIT 1 " ,
2015-05-27 06:16:05 +00:00
intval ( $message [ " uid " ]), dbesc ( $single_conv -> id ),
dbesc ( NETWORK_OSTATUS ), dbesc ( NETWORK_DFRN ));
2015-05-26 21:33:38 +00:00
2013-06-08 10:28:19 +00:00
if ( $message_exists ) {
if ( $parent [ " id " ] != 0 ) {
$existing_message = $message_exists [ 0 ];
2015-01-11 23:14:51 +00:00
2015-06-11 22:39:56 +00:00
// We improved the way we fetch OStatus messages, this shouldn't happen very often now
2015-06-07 21:18:02 +00:00
if ( $existing_message [ " parent " ] != $parent [ " id " ]) {
2015-06-11 22:39:56 +00:00
logger ( 'updating id ' . $existing_message [ " id " ] . ' with parent ' . $existing_message [ " parent " ] . ' to parent ' . $parent [ " id " ] . ' uri ' . $parent [ " uri " ] . ' thread ' . $parent_uri , LOGGER_DEBUG );
// Update the parent id of the selected item
$r = q ( " UPDATE `item` SET `parent` = %d, `parent-uri` = '%s' WHERE `id` = %d " ,
intval ( $parent [ " id " ]), dbesc ( $parent [ " uri " ]), intval ( $existing_message [ " id " ]));
// Update the parent uri in the thread - but only if it points to itself
$r = q ( " UPDATE `item` SET `thr-parent` = '%s' WHERE `id` = %d AND `uri` = `thr-parent` " ,
dbesc ( $parent_uri ), intval ( $existing_message [ " id " ]));
// try to change all items of the same parent
$r = q ( " UPDATE `item` SET `parent` = %d, `parent-uri` = '%s' WHERE `parent` = %d " ,
intval ( $parent [ " id " ]), dbesc ( $parent [ " uri " ]), intval ( $existing_message [ " parent " ]));
// Update the parent uri in the thread - but only if it points to itself
$r = q ( " UPDATE `item` SET `thr-parent` = '%s' WHERE (`parent` = %d) AND (`uri` = `thr-parent`) " ,
dbesc ( $parent [ " uri " ]), intval ( $existing_message [ " parent " ]));
// Now delete the thread
delete_thread ( $existing_message [ " parent " ]);
2015-06-07 21:18:02 +00:00
}
2013-01-27 22:25:04 +00:00
}
2013-06-08 10:28:19 +00:00
continue ;
}
2013-01-27 22:25:04 +00:00
2015-05-28 05:51:12 +00:00
$actor = $single_conv -> actor -> id ;
if ( isset ( $single_conv -> actor -> url ))
$actor = $single_conv -> actor -> url ;
2015-01-11 23:14:51 +00:00
$contact = q ( " SELECT `id` FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' AND `network` != '%s' " ,
2015-05-28 05:51:12 +00:00
$message [ " uid " ], normalise_link ( $actor ), NETWORK_STATUSNET );
2015-01-11 23:14:51 +00:00
if ( count ( $contact )) {
2015-05-28 05:51:12 +00:00
logger ( " Found contact for url " . $actor , LOGGER_DEBUG );
2015-01-11 23:14:51 +00:00
$contact_id = $contact [ 0 ][ " id " ];
} else {
2015-05-28 05:51:12 +00:00
logger ( " No contact found for url " . $actor , LOGGER_DEBUG );
// Adding a global contact
// To-Do: Use this data for the post
$global_contact_id = get_contact ( $actor , 0 );
logger ( " Global contact " . $global_contact_id . " found for url " . $actor , LOGGER_DEBUG );
2015-01-11 23:14:51 +00:00
$contact_id = $parent [ " contact-id " ];
}
2013-06-08 10:28:19 +00:00
$arr = array ();
2013-12-27 00:58:21 +00:00
$arr [ " network " ] = NETWORK_OSTATUS ;
2013-06-08 10:28:19 +00:00
$arr [ " uri " ] = $single_conv -> id ;
2015-05-26 21:33:38 +00:00
$arr [ " plink " ] = $plink ;
2013-06-08 10:28:19 +00:00
$arr [ " uid " ] = $message [ " uid " ];
2015-01-11 23:14:51 +00:00
$arr [ " contact-id " ] = $contact_id ;
2013-06-08 10:28:19 +00: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 ;
2015-06-13 07:07:13 +00:00
$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 -> displayName ;
if ( $arr [ " owner-name " ] == '' )
$arr [ " owner-name " ] = $single_conv -> actor -> displayName ;
2013-06-08 10:28:19 +00:00
if ( $arr [ " owner-name " ] == '' )
$arr [ " owner-name " ] = $single_conv -> actor -> portablecontacts_net -> preferredUsername ;
if ( $arr [ " owner-name " ] == '' )
2015-06-13 07:07:13 +00:00
$arr [ " owner-name " ] = $single_conv -> actor -> preferredUsername ;
2013-06-08 10:28:19 +00:00
2015-05-28 05:51:12 +00:00
$arr [ " owner-link " ] = $actor ;
2013-06-08 10:28:19 +00:00
$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 " ];
2015-05-28 05:51:12 +00:00
$arr [ " author-link " ] = $actor ;
2013-06-08 10:28:19 +00:00
$arr [ " author-avatar " ] = $single_conv -> actor -> image -> url ;
2015-06-09 21:53:53 +00:00
$arr [ " body " ] = add_page_info_to_body ( html2bbcode ( $single_conv -> content ));
2015-05-26 21:33:38 +00:00
2015-05-27 06:16:05 +00: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 21:33:38 +00: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 10:28:19 +00:00
$arr [ " app " ] = $single_conv -> provider -> displayName ;
2015-05-26 21:33:38 +00:00
else
$arr [ " app " ] = " OStatus " ;
2013-06-08 10:28:19 +00: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-06-11 22:39:56 +00:00
logger ( 'Stored new item ' . $plink . ' for parent ' . $arr [ " parent " ] . ' under id ' . $newitem , LOGGER_DEBUG );
2015-05-26 21:33:38 +00:00
2013-06-08 10:28:19 +00: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
2015-06-11 22:39:56 +00:00
// This shouldn't happen anymore. This is supposed to be absolote.
2013-06-08 10:28:19 +00:00
if ( $newitem AND ( $arr [ " uri " ] == $first_id )) {
2015-01-11 23:14:51 +00:00
logger ( 'setting new parent to id ' . $newitem );
2013-06-08 10:28:19 +00: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 ));
2015-06-11 22:39:56 +00:00
if ( $new_parents )
2013-06-08 10:28:19 +00:00
$parent = $new_parents [ 0 ];
2013-01-27 22:25:04 +00:00
}
}
}
?>