+
+ if (is_array($single_conv->to))
+ foreach($single_conv->to AS $to)
+ if ($importer["nurl"] == normalise_link($to->id))
+ $mention = true;
+
+ $actor = $single_conv->actor->id;
+ if (isset($single_conv->actor->url))
+ $actor = $single_conv->actor->url;
+
+ $contact = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' AND `network` != '%s'",
+ $uid, normalise_link($actor), NETWORK_STATUSNET);
+
+ if (count($contact)) {
+ logger("Found contact for url ".$actor, LOGGER_DEBUG);
+ $contact_id = $contact[0]["id"];
+ } else {
+ 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);
+
+ $contact_id = $parent["contact-id"];
+ }
+
+ $arr = array();
+ $arr["network"] = NETWORK_OSTATUS;
+ $arr["uri"] = $single_conv->id;
+ $arr["plink"] = $plink;
+ $arr["uid"] = $uid;
+ $arr["contact-id"] = $contact_id;
+ $arr["parent-uri"] = $parent_uri;
+ $arr["created"] = $single_conv->published;
+ $arr["edited"] = $single_conv->published;
+ $arr["owner-name"] = $single_conv->actor->displayName;
+ if ($arr["owner-name"] == '')
+ $arr["owner-name"] = $single_conv->actor->contact->displayName;
+ if ($arr["owner-name"] == '')
+ $arr["owner-name"] = $single_conv->actor->portablecontacts_net->displayName;
+
+ $arr["owner-link"] = $actor;
+ $arr["owner-avatar"] = $single_conv->actor->image->url;
+ $arr["author-name"] = $arr["owner-name"];
+ $arr["author-link"] = $actor;
+ $arr["author-avatar"] = $single_conv->actor->image->url;
+ $arr["body"] = add_page_info_to_body(html2bbcode($single_conv->content));
+
+ 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))
+ $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))
+ $arr["app"] = $single_conv->provider->displayName;
+ else
+ $arr["app"] = "OStatus";
+
+ //$arr["app"] .= " (Conversation)";
+
+ $arr["object"] = json_encode($single_conv);
+ $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);
+
+ // Is it a reshared item?
+ if (isset($single_conv->verb) AND ($single_conv->verb == "share") AND isset($single_conv->object)) {
+ if (is_array($single_conv->object))
+ $single_conv->object = $single_conv->object[0];
+
+ logger("Found reshared item ".$single_conv->object->id);
+
+ // $single_conv->object->context->conversation;
+
+ if (isset($single_conv->object->object->id))
+ $arr["uri"] = $single_conv->object->object->id;
+ else
+ $arr["uri"] = $single_conv->object->id;
+
+ if (isset($single_conv->object->object->url))
+ $plink = ostatus_convert_href($single_conv->object->object->url);
+ else
+ $plink = ostatus_convert_href($single_conv->object->url);
+
+ if (isset($single_conv->object->object->content))
+ $arr["body"] = add_page_info_to_body(html2bbcode($single_conv->object->object->content));
+ else
+ $arr["body"] = add_page_info_to_body(html2bbcode($single_conv->object->content));
+
+ $arr["plink"] = $plink;
+
+ $arr["created"] = $single_conv->object->published;
+ $arr["edited"] = $single_conv->object->published;
+
+ $arr["author-name"] = $single_conv->object->actor->displayName;
+ if ($arr["owner-name"] == '')
+ $arr["author-name"] = $single_conv->object->actor->contact->displayName;
+
+ $arr["author-link"] = $single_conv->object->actor->url;
+ $arr["author-avatar"] = $single_conv->object->actor->image->url;
+
+ $arr["app"] = $single_conv->object->provider->displayName."#";
+ //$arr["verb"] = $single_conv->object->verb;
+
+ $arr["location"] = $single_conv->object->location->displayName;
+ $arr["coord"] = trim($single_conv->object->location->lat." ".$single_conv->object->location->lon);
+ }
+
+ if ($arr["location"] == "")
+ unset($arr["location"]);
+
+ if ($arr["coord"] == "")
+ unset($arr["coord"]);
+
+ // Copy fields from given item array
+ if (isset($item["uri"]) AND (($item["uri"] == $arr["uri"]) OR ($item["uri"] == $single_conv->id))) {
+ $copy_fields = array("owner-name", "owner-link", "owner-avatar", "author-name", "author-link", "author-avatar",
+ "gravity", "body", "object-type", "object", "verb", "created", "edited", "coord", "tag",
+ "title", "attach", "app", "type", "location", "contact-id", "uri");
+ foreach ($copy_fields AS $field)
+ if (isset($item[$field]))
+ $arr[$field] = $item[$field];
+
+ //$arr["app"] .= " (OStatus)";
+ }
+
+ $newitem = item_store($arr);
+ if (!$newitem) {
+ logger("Item wasn't stored ".print_r($arr, true), LOGGER_DEBUG);
+ continue;
+ }
+
+ if (isset($item["uri"]) AND ($item["uri"] == $arr["uri"])) {
+ $item = array();
+ $item_stored = $newitem;
+ }
+
+ logger('Stored new item '.$plink.' for parent '.$arr["parent-uri"].' under id '.$newitem, LOGGER_DEBUG);
+
+ // Add the conversation entry (but don't fetch the whole conversation)
+ ostatus_store_conversation($newitem, $conversation_url);
+
+ if ($mention) {
+ $u = q("SELECT `notify-flags`, `language`, `username`, `email` FROM user WHERE uid = %d LIMIT 1", intval($uid));
+ $r = q("SELECT `parent` FROM `item` WHERE `id` = %d", intval($newitem));
+
+ notification(array(
+ 'type' => NOTIFY_TAGSELF,
+ 'notify_flags' => $u[0]["notify-flags"],
+ 'language' => $u[0]["language"],
+ 'to_name' => $u[0]["username"],
+ 'to_email' => $u[0]["email"],
+ 'uid' => $uid,
+ 'item' => $arr,
+ 'link' => $a->get_baseurl().'/display/'.urlencode(get_item_guid($newitem)),
+ 'source_name' => $arr["author-name"],
+ 'source_link' => $arr["author-link"],
+ 'source_photo' => $arr["author-avatar"],
+ 'verb' => ACTIVITY_TAG,
+ 'otype' => 'item',
+ 'parent' => $r[0]["parent"]
+ ));
+ }
+
+ // If the newly created item is the top item then change the parent settings of the thread
+ // This shouldn't happen anymore. This is supposed to be absolote.
+ if ($arr["uri"] == $first_id) {
+ logger('setting new parent to id '.$newitem);
+ $new_parents = q("SELECT `id`, `uri`, `contact-id`, `type`, `verb`, `visible` FROM `item` WHERE `uid` = %d AND `id` = %d LIMIT 1",
+ intval($uid), intval($newitem));
+ if ($new_parents)
+ $parent = $new_parents[0];
+ }
+ }
+
+ if (($item_stored < 0) AND (count($item) > 0)) {
+ //$arr["app"] .= " (OStatus-NoConvFound)";
+ $item_stored = item_store($item, true);
+ if ($item_stored) {
+ logger("Uri ".$item["uri"]." wasn't found in conversation ".$conversation_url, LOGGER_DEBUG);
+ ostatus_store_conversation($item_stored, $conversation_url);
+ }
+ }
+
+ return($item_stored);
+}
+
+function ostatus_store_conversation($itemid, $conversation_url) {
+ global $a;
+
+ $conversation_url = ostatus_convert_href($conversation_url);
+
+ $messages = q("SELECT `uid`, `parent`, `created`, `received`, `guid` FROM `item` WHERE `id` = %d LIMIT 1", intval($itemid));
+ 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));
+
+ if (!$conversation) {
+ $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"]));
+ logger('Storing conversation url '.$conversation_url.' for id '.$itemid);