+ $object = $xpath->query("activity:object", $entry)->item(0);
+ $item["object"] = self::transform_activity($xpath, $object, "object");
+
+ if (trim($item["object"]) != "") {
+ $r = parse_xml_string($item["object"], false);
+ if (isset($r->type))
+ $item["object-type"] = $r->type;
+ }
+
+ $target = $xpath->query("activity:target", $entry)->item(0);
+ $item["target"] = self::transform_activity($xpath, $target, "target");
+
+ $categories = $xpath->query("atom:category", $entry);
+ if ($categories) {
+ foreach ($categories AS $category) {
+ $term = "";
+ $scheme = "";
+ foreach($category->attributes AS $attributes) {
+ if ($attributes->name == "term")
+ $term = $attributes->textContent;
+
+ if ($attributes->name == "scheme")
+ $scheme = $attributes->textContent;
+ }
+
+ if (($term != "") AND ($scheme != "")) {
+ $parts = explode(":", $scheme);
+ if ((count($parts) >= 4) AND (array_shift($parts) == "X-DFRN")) {
+ $termhash = array_shift($parts);
+ $termurl = implode(":", $parts);
+
+ if(strlen($item["tag"]))
+ $item["tag"] .= ",";
+
+ $item["tag"] .= $termhash."[url=".$termurl."]".$term."[/url]";
+ }
+ }
+ }
+ }
+
+ $enclosure = "";
+
+ $links = $xpath->query("atom:link", $entry);
+ if ($links)
+ self::parse_links($links, $item);
+
+ // Is it a reply or a top level posting?
+ $item["parent-uri"] = $item["uri"];
+
+ $inreplyto = $xpath->query("thr:in-reply-to", $entry);
+ if (is_object($inreplyto->item(0)))
+ foreach($inreplyto->item(0)->attributes AS $attributes)
+ if ($attributes->name == "ref")
+ $item["parent-uri"] = $attributes->textContent;
+
+ // Get the type of the item (Top level post, reply or remote reply)
+ $entrytype = self::get_entry_type($importer, $item);
+
+ // Now assign the rest of the values that depend on the type of the message
+ if (in_array($entrytype, array(DFRN_REPLY, DFRN_REPLY_RC))) {
+ if (!isset($item["object-type"]))
+ $item["object-type"] = ACTIVITY_OBJ_COMMENT;
+
+ if ($item["contact-id"] != $owner["contact-id"])
+ $item["contact-id"] = $owner["contact-id"];
+
+ if (($item["network"] != $owner["network"]) AND ($owner["network"] != ""))
+ $item["network"] = $owner["network"];
+
+ if ($item["contact-id"] != $author["contact-id"])
+ $item["contact-id"] = $author["contact-id"];
+
+ if (($item["network"] != $author["network"]) AND ($author["network"] != ""))
+ $item["network"] = $author["network"];
+
+ // This code was taken from the old DFRN code
+ // When activated, forums don't work.
+ // And: Why should we disallow commenting by followers?
+ // the behaviour is now similar to the Diaspora part.
+ //if($importer["rel"] == CONTACT_IS_FOLLOWER) {
+ // logger("Contact ".$importer["id"]." is only follower. Quitting", LOGGER_DEBUG);
+ // return;
+ //}
+ }
+
+ if ($entrytype == DFRN_REPLY_RC) {
+ $item["type"] = "remote-comment";
+ $item["wall"] = 1;
+ } elseif ($entrytype == DFRN_TOP_LEVEL) {
+ if (!isset($item["object-type"]))
+ $item["object-type"] = ACTIVITY_OBJ_NOTE;
+
+ // Is it an event?
+ if ($item["object-type"] == ACTIVITY_OBJ_EVENT) {
+ logger("Item ".$item["uri"]." seems to contain an event.", LOGGER_DEBUG);
+ $ev = bbtoevent($item["body"]);
+ if((x($ev, "desc") || x($ev, "summary")) && x($ev, "start")) {
+ logger("Event in item ".$item["uri"]." was found.", LOGGER_DEBUG);
+ $ev["cid"] = $importer["id"];
+ $ev["uid"] = $importer["uid"];
+ $ev["uri"] = $item["uri"];
+ $ev["edited"] = $item["edited"];
+ $ev['private'] = $item['private'];
+ $ev["guid"] = $item["guid"];
+
+ $r = q("SELECT `id` FROM `event` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($item["uri"]),
+ intval($importer["uid"])
+ );
+ if (dbm::is_result($r))
+ $ev["id"] = $r[0]["id"];
+
+ $event_id = event_store($ev);
+ logger("Event ".$event_id." was stored", LOGGER_DEBUG);
+ return;
+ }
+ }
+ }
+
+ if (!self::process_verbs($entrytype, $importer, $item, $is_like)) {
+ logger("Exiting because 'process_verbs' told us so", LOGGER_DEBUG);
+ return;
+ }
+
+ // Update content if 'updated' changes
+ if (dbm::is_result($current)) {
+ if (self::update_content($r[0], $item, $importer, $entrytype))
+ logger("Item ".$item["uri"]." was updated.", LOGGER_DEBUG);
+ else
+ logger("Item ".$item["uri"]." already existed.", LOGGER_DEBUG);
+ return;
+ }
+
+ if (in_array($entrytype, array(DFRN_REPLY, DFRN_REPLY_RC))) {
+ $posted_id = item_store($item);
+ $parent = 0;
+
+ if($posted_id) {
+
+ logger("Reply from contact ".$item["contact-id"]." was stored with id ".$posted_id, LOGGER_DEBUG);
+
+ $item["id"] = $posted_id;
+
+ $r = q("SELECT `parent`, `parent-uri` FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ intval($posted_id),
+ intval($importer["importer_uid"])
+ );
+ if (dbm::is_result($r)) {
+ $parent = $r[0]["parent"];
+ $parent_uri = $r[0]["parent-uri"];
+ }
+
+ if(!$is_like) {
+ $r1 = q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `uid` = %d AND `parent` = %d",
+ dbesc(datetime_convert()),
+ intval($importer["importer_uid"]),
+ intval($r[0]["parent"])
+ );
+
+ $r2 = q("UPDATE `item` SET `last-child` = 1, `changed` = '%s' WHERE `uid` = %d AND `id` = %d",
+ dbesc(datetime_convert()),
+ intval($importer["importer_uid"]),
+ intval($posted_id)
+ );
+ }
+
+ if($posted_id AND $parent AND ($entrytype == DFRN_REPLY_RC)) {
+ logger("Notifying followers about comment ".$posted_id, LOGGER_DEBUG);
+ proc_run(PRIORITY_HIGH, "include/notifier.php", "comment-import", $posted_id);
+ }
+
+ return true;
+ }
+ } else { // $entrytype == DFRN_TOP_LEVEL
+ if(!link_compare($item["owner-link"],$importer["url"])) {
+ // The item owner info is not our contact. It's OK and is to be expected if this is a tgroup delivery,
+ // but otherwise there's a possible data mixup on the sender's system.
+ // the tgroup delivery code called from item_store will correct it if it's a forum,
+ // but we're going to unconditionally correct it here so that the post will always be owned by our contact.
+ logger('Correcting item owner.', LOGGER_DEBUG);
+ $item["owner-name"] = $importer["senderName"];
+ $item["owner-link"] = $importer["url"];
+ $item["owner-avatar"] = $importer["thumb"];
+ }
+
+ if(($importer["rel"] == CONTACT_IS_FOLLOWER) && (!tgroup_check($importer["importer_uid"], $item))) {
+ logger("Contact ".$importer["id"]." is only follower and tgroup check was negative.", LOGGER_DEBUG);
+ return;
+ }
+
+ // This is my contact on another system, but it's really me.
+ // Turn this into a wall post.
+ $notify = item_is_remote_self($importer, $item);
+
+ $posted_id = item_store($item, false, $notify);
+
+ logger("Item was stored with id ".$posted_id, LOGGER_DEBUG);
+
+ if(stristr($item["verb"],ACTIVITY_POKE))
+ self::do_poke($item, $importer, $posted_id);
+ }