]> git.mxchange.org Git - friendica.git/blobdiff - src/Protocol/Diaspora.php
New function to fetch item data especially for users
[friendica.git] / src / Protocol / Diaspora.php
index e8cfbf511352f8552256019a4b36cad46150fe5d..c42e8c24841f78f6e41da81a85cf3100a2023126 100644 (file)
@@ -69,7 +69,7 @@ class Diaspora
 
                if (Config::get("system", "relay_directly", false)) {
                        // We distribute our stuff based on the parent to ensure that the thread will be complete
-                       $parent = dba::selectFirst('item', ['parent'], ['id' => $item_id]);
+                       $parent = Item::selectFirst(['parent'], ['id' => $item_id]);
                        if (!DBM::is_result($parent)) {
                                return;
                        }
@@ -1170,15 +1170,10 @@ class Diaspora
         */
        private static function messageExists($uid, $guid)
        {
-               $r = q(
-                       "SELECT `id` FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
-                       intval($uid),
-                       dbesc($guid)
-               );
-
-               if (DBM::is_result($r)) {
+               $item = Item::selectFirst(['id'], ['uid' => $uid, 'guid' => $guid]);
+               if (DBM::is_result($item)) {
                        logger("message ".$guid." already exists for user ".$uid);
-                       return $r[0]["id"];
+                       return $item["id"];
                }
 
                return false;
@@ -1385,16 +1380,13 @@ class Diaspora
         */
        private static function parentItem($uid, $guid, $author, $contact)
        {
-               $r = q(
-                       "SELECT `id`, `parent`, `body`, `wall`, `uri`, `guid`, `private`, `origin`,
-                               `author-name`, `author-link`, `author-avatar`,
-                               `owner-name`, `owner-link`, `owner-avatar`
-                       FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
-                       intval($uid),
-                       dbesc($guid)
-               );
+               $fields = ['id', 'parent', 'body', 'wall', 'uri', 'guid', 'private', 'origin',
+                       'author-name', 'author-link', 'author-avatar',
+                       'owner-name', 'owner-link', 'owner-avatar'];
+               $condition = ['uid' => $uid, 'guid' => $guid];
+               $item = Item::selectFirst($fields, $condition);
 
-               if (!$r) {
+               if (!DBM::is_result($item)) {
                        $result = self::storeByGuid($guid, $contact["url"], $uid);
 
                        if (!$result) {
@@ -1405,23 +1397,16 @@ class Diaspora
                        if ($result) {
                                logger("Fetched missing item ".$guid." - result: ".$result, LOGGER_DEBUG);
 
-                               $r = q(
-                                       "SELECT `id`, `body`, `wall`, `uri`, `private`, `origin`,
-                                               `author-name`, `author-link`, `author-avatar`,
-                                               `owner-name`, `owner-link`, `owner-avatar`
-                                       FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
-                                       intval($uid),
-                                       dbesc($guid)
-                               );
+                               $item = Item::selectFirst($fields, $condition);
                        }
                }
 
-               if (!$r) {
+               if (!DBM::is_result($item)) {
                        logger("parent item not found: parent: ".$guid." - user: ".$uid);
                        return false;
                } else {
                        logger("parent item found: parent: ".$guid." - user: ".$uid);
-                       return $r[0];
+                       return $item;
                }
        }
 
@@ -1602,11 +1587,21 @@ class Diaspora
         */
        private static function getUriFromGuid($author, $guid, $onlyfound = false)
        {
-               $r = q("SELECT `uri` FROM `item` WHERE `guid` = '%s' LIMIT 1", dbesc($guid));
-               if (DBM::is_result($r)) {
-                       return $r[0]["uri"];
+               $item = Item::selectFirst(['uri'], ['guid' => $guid]);
+               if (DBM::is_result($item)) {
+                       return $item["uri"];
                } elseif (!$onlyfound) {
-                       return $author.":".$guid;
+                       $contact = Contact::getDetailsByAddr($author, 0);
+                       if (!empty($contact['network'])) {
+                               $prefix = 'urn:X-' . $contact['network'] . ':';
+                       } else {
+                               // This fallback should happen most unlikely
+                               $prefix = 'urn:X-dspr:';
+                       }
+
+                       $author_parts = explode('@', $author);
+
+                       return $prefix . $author_parts[1] . ':' . $author_parts[0] . ':'. $guid;
                }
 
                return "";
@@ -1622,9 +1617,9 @@ class Diaspora
         */
        private static function getGuidFromUri($uri, $uid)
        {
-               $r = q("SELECT `guid` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1", dbesc($uri), intval($uid));
-               if (DBM::is_result($r)) {
-                       return $r[0]["guid"];
+               $item = Item::selectFirst(['guid'], ['uri' => $uri, 'uid' => $uid]);
+               if (DBM::is_result($item)) {
+                       return $item["guid"];
                } else {
                        return false;
                }
@@ -1639,11 +1634,10 @@ class Diaspora
         */
        private static function importerForGuid($guid)
        {
-               $item = dba::fetch_first("SELECT `uid` FROM `item` WHERE `origin` AND `guid` = ? LIMIT 1", $guid);
-
+               $item = Item::selectFirst(['uid'], ['origin' => true, 'guid' => $guid]);
                if (DBM::is_result($item)) {
                        logger("Found user ".$item['uid']." as owner of item ".$guid, LOGGER_DEBUG);
-                       $contact = dba::fetch_first("SELECT * FROM `contact` WHERE `self` AND `uid` = ?", $item['uid']);
+                       $contact = dba::selectFirst('contact', [], ['self' => true, 'uid' => $item['uid']]);
                        if (DBM::is_result($contact)) {
                                return $contact;
                        }
@@ -1711,13 +1705,11 @@ class Diaspora
                $datarray["contact-id"] = $author_contact["cid"];
                $datarray["network"]  = $author_contact["network"];
 
-               $datarray["author-name"] = $person["name"];
                $datarray["author-link"] = $person["url"];
-               $datarray["author-avatar"] = ((x($person, "thumb")) ? $person["thumb"] : $person["photo"]);
+               $datarray["author-id"] = Contact::getIdForURL($person["url"], 0);
 
-               $datarray["owner-name"] = $contact["name"];
                $datarray["owner-link"] = $contact["url"];
-               $datarray["owner-avatar"] = ((x($contact, "thumb")) ? $contact["thumb"] : $contact["photo"]);
+               $datarray["owner-id"] = Contact::getIdForURL($contact["url"], 0);
 
                $datarray["guid"] = $guid;
                $datarray["uri"] = self::getUriFromGuid($author, $guid);
@@ -1747,6 +1739,12 @@ class Diaspora
 
                self::fetchGuid($datarray);
 
+               // If we are the origin of the parent we store the original data.
+               // We notify our followers during the item storage.
+               if ($parent_item["origin"]) {
+                       $datarray['diaspora_signed_text'] = json_encode($data);
+               }
+
                $message_id = Item::insert($datarray);
 
                if ($message_id <= 0) {
@@ -1756,20 +1754,10 @@ class Diaspora
                if ($message_id) {
                        logger("Stored comment ".$datarray["guid"]." with message id ".$message_id, LOGGER_DEBUG);
                        if ($datarray['uid'] == 0) {
-                               Item::distribute($message_id);
+                               Item::distribute($message_id, json_encode($data));
                        }
                }
 
-               // If we are the origin of the parent we store the original data and notify our followers
-               if ($message_id && $parent_item["origin"]) {
-                       // Formerly we stored the signed text, the signature and the author in different fields.
-                       // We now store the raw data so that we are more flexible.
-                       dba::insert('sign', ['iid' => $message_id, 'signed_text' => json_encode($data)]);
-
-                       // notify others
-                       Worker::add(PRIORITY_HIGH, "Notifier", "comment-import", $message_id);
-               }
-
                return true;
        }
 
@@ -2050,13 +2038,11 @@ class Diaspora
                $datarray["contact-id"] = $author_contact["cid"];
                $datarray["network"]  = $author_contact["network"];
 
-               $datarray["author-name"] = $person["name"];
                $datarray["author-link"] = $person["url"];
-               $datarray["author-avatar"] = ((x($person, "thumb")) ? $person["thumb"] : $person["photo"]);
+               $datarray["author-id"] = Contact::getIdForURL($person["url"], 0);
 
-               $datarray["owner-name"] = $contact["name"];
                $datarray["owner-link"] = $contact["url"];
-               $datarray["owner-avatar"] = ((x($contact, "thumb")) ? $contact["thumb"] : $contact["photo"]);
+               $datarray["owner-id"] = Contact::getIdForURL($contact["url"], 0);
 
                $datarray["guid"] = $guid;
                $datarray["uri"] = self::getUriFromGuid($author, $guid);
@@ -2071,6 +2057,20 @@ class Diaspora
 
                $datarray["body"] = self::constructLikeBody($contact, $parent_item, $guid);
 
+               // like on comments have the comment as parent. So we need to fetch the toplevel parent
+               if ($parent_item["id"] != $parent_item["parent"]) {
+                       $toplevel = Item::selectFirst(['origin'], ['id' => $parent_item["parent"]]);
+                       $origin = $toplevel["origin"];
+               } else {
+                       $origin = $parent_item["origin"];
+               }
+
+               // If we are the origin of the parent we store the original data.
+               // We notify our followers during the item storage.
+               if ($origin) {
+                       $datarray['diaspora_signed_text'] = json_encode($data);
+               }
+
                $message_id = Item::insert($datarray);
 
                if ($message_id <= 0) {
@@ -2080,28 +2080,10 @@ class Diaspora
                if ($message_id) {
                        logger("Stored like ".$datarray["guid"]." with message id ".$message_id, LOGGER_DEBUG);
                        if ($datarray['uid'] == 0) {
-                               Item::distribute($message_id);
+                               Item::distribute($message_id, json_encode($data));
                        }
                }
 
-               // like on comments have the comment as parent. So we need to fetch the toplevel parent
-               if ($parent_item["id"] != $parent_item["parent"]) {
-                       $toplevel = dba::selectFirst('item', ['origin'], ['id' => $parent_item["parent"]]);
-                       $origin = $toplevel["origin"];
-               } else {
-                       $origin = $parent_item["origin"];
-               }
-
-               // If we are the origin of the parent we store the original data and notify our followers
-               if ($message_id && $origin) {
-                       // Formerly we stored the signed text, the signature and the author in different fields.
-                       // We now store the raw data so that we are more flexible.
-                       dba::insert('sign', ['iid' => $message_id, 'signed_text' => json_encode($data)]);
-
-                       // notify others
-                       Worker::add(PRIORITY_HIGH, "Notifier", "comment-import", $message_id);
-               }
-
                return true;
        }
 
@@ -2214,7 +2196,7 @@ class Diaspora
                        return false;
                }
 
-               $item = dba::selectFirst('item', ['id'], ['guid' => $parent_guid, 'origin' => true, 'private' => false]);
+               $item = Item::selectFirst(['id'], ['guid' => $parent_guid, 'origin' => true, 'private' => false]);
                if (!DBM::is_result($item)) {
                        logger('Item not found, no origin or private: '.$parent_guid);
                        return false;
@@ -2235,11 +2217,11 @@ class Diaspora
                }
 
                // Send all existing comments and likes to the requesting server
-               $comments = dba::p("SELECT `item`.`id`, `item`.`verb`, `contact`.`self`
-                               FROM `item`
-                               INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
-                               WHERE `item`.`parent` = ? AND `item`.`id` != `item`.`parent`", $item['id']);
+               $comments = Item::select(['id', 'verb', 'self'], ['parent' => $item['id']]);
                while ($comment = dba::fetch($comments)) {
+                       if ($comment['id'] == $comment['parent']) {
+                               continue;
+                       }
                        if ($comment['verb'] == ACTIVITY_POST) {
                                $cmd = $comment['self'] ? 'comment-new' : 'comment-import';
                        } else {
@@ -2394,78 +2376,6 @@ class Diaspora
                                ['id' => $contact["id"], 'uid' => $importer["uid"]]
                        );
                }
-               // send notification
-
-               $r = q(
-                       "SELECT `hide-friends` FROM `profile` WHERE `uid` = %d AND `is-default` = 1 LIMIT 1",
-                       intval($importer["uid"])
-               );
-
-               if ($r && !$r[0]["hide-friends"] && !$contact["hidden"] && intval(PConfig::get($importer["uid"], "system", "post_newfriend"))) {
-                       $self = q(
-                               "SELECT * FROM `contact` WHERE `self` AND `uid` = %d LIMIT 1",
-                               intval($importer["uid"])
-                       );
-
-                       // they are not CONTACT_IS_FOLLOWER anymore but that's what we have in the array
-
-                       if ($self && $contact["rel"] == CONTACT_IS_FOLLOWER) {
-                               $arr = [];
-                               $arr["protocol"] = PROTOCOL_DIASPORA;
-                               $arr["uri"] = $arr["parent-uri"] = item_new_uri($a->get_hostname(), $importer["uid"]);
-                               $arr["uid"] = $importer["uid"];
-                               $arr["contact-id"] = $self[0]["id"];
-                               $arr["wall"] = 1;
-                               $arr["type"] = 'wall';
-                               $arr["gravity"] = 0;
-                               $arr["origin"] = 1;
-                               $arr["author-name"] = $arr["owner-name"] = $self[0]["name"];
-                               $arr["author-link"] = $arr["owner-link"] = $self[0]["url"];
-                               $arr["author-avatar"] = $arr["owner-avatar"] = $self[0]["thumb"];
-                               $arr["verb"] = ACTIVITY_FRIEND;
-                               $arr["object-type"] = ACTIVITY_OBJ_PERSON;
-
-                               $A = "[url=".$self[0]["url"]."]".$self[0]["name"]."[/url]";
-                               $B = "[url=".$contact["url"]."]".$contact["name"]."[/url]";
-                               $BPhoto = "[url=".$contact["url"]."][img]".$contact["thumb"]."[/img][/url]";
-                               $arr["body"] = L10n::t('%1$s is now friends with %2$s', $A, $B)."\n\n\n".$BPhoto;
-
-                               $arr["object"] = self::constructNewFriendObject($contact);
-
-                               $user = dba::selectFirst('user', ['allow_cid', 'allow_gid', 'deny_cid', 'deny_gid'], ['uid' => $importer["uid"]]);
-
-                               $arr["allow_cid"] = $user["allow_cid"];
-                               $arr["allow_gid"] = $user["allow_gid"];
-                               $arr["deny_cid"]  = $user["deny_cid"];
-                               $arr["deny_gid"]  = $user["deny_gid"];
-
-                               $i = Item::insert($arr);
-                               if ($i) {
-                                       Worker::add(PRIORITY_HIGH, "Notifier", "activity", $i);
-                               }
-                       }
-               }
-       }
-
-       /**
-        * @brief Creates a XML object for a "new friend" message
-        *
-        * @param array $contact Array of the contact
-        *
-        * @return string The XML
-        */
-       private static function constructNewFriendObject($contact)
-       {
-               $objtype = ACTIVITY_OBJ_PERSON;
-               $link = '<link rel="alternate" type="text/html" href="'.$contact["url"].'" />'."\n".
-                       '<link rel="photo" type="image/jpeg" href="'.$contact["thumb"].'" />'."\n";
-
-               $xmldata = ["object" => ["type" => $objtype,
-                                               "title" => $contact["name"],
-                                               "id" => $contact["url"]."/".$contact["name"],
-                                               "link" => $link]];
-
-               return XML::fromArray($xmldata, $xml, true);
        }
 
        /**
@@ -2669,7 +2579,7 @@ class Diaspora
                $fields = ['body', 'tag', 'app', 'created', 'object-type', 'uri', 'guid',
                        'author-name', 'author-link', 'author-avatar'];
                $condition = ['guid' => $guid, 'visible' => true, 'deleted' => false, 'private' => false];
-               $item = dba::selectfirst('item', $fields, $condition);
+               $item = Item::selectFirst($fields, $condition);
 
                if (DBM::is_result($item)) {
                        logger("reshared message ".$guid." already exists on system.");
@@ -2713,7 +2623,7 @@ class Diaspora
                                $fields = ['body', 'tag', 'app', 'created', 'object-type', 'uri', 'guid',
                                        'author-name', 'author-link', 'author-avatar'];
                                $condition = ['guid' => $guid, 'visible' => true, 'deleted' => false, 'private' => false];
-                               $item = dba::selectfirst('item', $fields, $condition);
+                               $item = Item::selectFirst($fields, $condition);
 
                                if (DBM::is_result($item)) {
                                        // If it is a reshared post from another network then reformat to avoid display problems with two share elements
@@ -2771,13 +2681,11 @@ class Diaspora
                $datarray["contact-id"] = $contact["id"];
                $datarray["network"]  = NETWORK_DIASPORA;
 
-               $datarray["author-name"] = $contact["name"];
                $datarray["author-link"] = $contact["url"];
-               $datarray["author-avatar"] = ((x($contact, "thumb")) ? $contact["thumb"] : $contact["photo"]);
+               $datarray["author-id"] = Contact::getIdForURL($contact["url"], 0);
 
-               $datarray["owner-name"] = $datarray["author-name"];
                $datarray["owner-link"] = $datarray["author-link"];
-               $datarray["owner-avatar"] = $datarray["author-avatar"];
+               $datarray["owner-id"] = $datarray["author-id"];
 
                $datarray["guid"] = $guid;
                $datarray["uri"] = $datarray["parent-uri"] = self::getUriFromGuid($author, $guid);
@@ -2857,7 +2765,7 @@ class Diaspora
                } else {
                        $condition = ["`guid` = ? AND `uid` = ? AND NOT `file` LIKE '%%[%%' AND NOT `deleted`", $target_guid, $importer['uid']];
                }
-               $r = dba::select('item', $fields, $condition);
+               $r = Item::select($fields, $condition);
                if (!DBM::is_result($r)) {
                        logger("Target guid ".$target_guid." was not found on this system for user ".$importer['uid'].".");
                        return false;
@@ -2865,7 +2773,7 @@ class Diaspora
 
                while ($item = dba::fetch($r)) {
                        // Fetch the parent item
-                       $parent = dba::selectFirst('item', ['author-link', 'origin'], ['id' => $item["parent"]]);
+                       $parent = Item::selectFirst(['author-link'], ['id' => $item["parent"]]);
 
                        // Only delete it if the parent author really fits
                        if (!link_compare($parent["author-link"], $contact["url"]) && !link_compare($item["author-link"], $contact["url"])) {
@@ -2873,15 +2781,9 @@ class Diaspora
                                continue;
                        }
 
-                       Item::deleteById($item["id"]);
+                       Item::delete(['id' => $item['id']]);
 
                        logger("Deleted target ".$target_guid." (".$item["id"].") from user ".$item["uid"]." parent: ".$item["parent"], LOGGER_DEBUG);
-
-                       // Now check if the retraction needs to be relayed by us
-                       if ($parent["origin"]) {
-                               // notify others
-                               Worker::add(PRIORITY_HIGH, "Notifier", "drop", $item["id"]);
-                       }
                }
 
                return true;
@@ -2997,13 +2899,11 @@ class Diaspora
                $datarray["contact-id"] = $contact["id"];
                $datarray["network"] = NETWORK_DIASPORA;
 
-               $datarray["author-name"] = $contact["name"];
                $datarray["author-link"] = $contact["url"];
-               $datarray["author-avatar"] = ((x($contact, "thumb")) ? $contact["thumb"] : $contact["photo"]);
+               $datarray["author-id"] = Contact::getIdForURL($contact["url"], 0);
 
-               $datarray["owner-name"] = $datarray["author-name"];
                $datarray["owner-link"] = $datarray["author-link"];
-               $datarray["owner-avatar"] = $datarray["author-avatar"];
+               $datarray["owner-id"] = $datarray["author-id"];
 
                $datarray["guid"] = $guid;
                $datarray["uri"] = $datarray["parent-uri"] = self::getUriFromGuid($author, $guid);
@@ -3509,12 +3409,16 @@ class Diaspora
 
                if (($guid != "") && $complete) {
                        $condition = ['guid' => $guid, 'network' => [NETWORK_DFRN, NETWORK_DIASPORA]];
-                       $item = dba::selectFirst('item', ['contact-id'], $condition);
+                       $item = Item::selectFirst(['contact-id'], $condition);
                        if (DBM::is_result($item)) {
                                $ret= [];
                                $ret["root_handle"] = self::handleFromContact($item["contact-id"]);
                                $ret["root_guid"] = $guid;
                                return $ret;
+                       } elseif ($complete) {
+                               // We are resharing something that isn't a DFRN or Diaspora post.
+                               // So we have to return "false" on "$complete" to not trigger a reshare.
+                               return false;
                        }
                } elseif (($guid == "") && $complete) {
                        return false;
@@ -3772,16 +3676,11 @@ class Diaspora
         */
        private static function constructLike($item, $owner)
        {
-               $p = q(
-                       "SELECT `guid`, `uri`, `parent-uri` FROM `item` WHERE `uri` = '%s' LIMIT 1",
-                       dbesc($item["thr-parent"])
-               );
-               if (!DBM::is_result($p)) {
+               $parent = Item::selectFirst(['guid', 'uri', 'parent-uri'], ['uri' => $item["thr-parent"]]);
+               if (!DBM::is_result($parent)) {
                        return false;
                }
 
-               $parent = $p[0];
-
                $target_type = ($parent["uri"] === $parent["parent-uri"] ? "Post" : "Comment");
                $positive = null;
                if ($item['verb'] === ACTIVITY_LIKE) {
@@ -3808,16 +3707,11 @@ class Diaspora
         */
        private static function constructAttend($item, $owner)
        {
-               $p = q(
-                       "SELECT `guid`, `uri`, `parent-uri` FROM `item` WHERE `uri` = '%s' LIMIT 1",
-                       dbesc($item["thr-parent"])
-               );
-               if (!DBM::is_result($p)) {
+               $parent = Item::selectFirst(['guid', 'uri', 'parent-uri'], ['uri' => $item["thr-parent"]]);
+               if (!DBM::is_result($parent)) {
                        return false;
                }
 
-               $parent = $p[0];
-
                switch ($item['verb']) {
                        case ACTIVITY_ATTEND:
                                $attend_answer = 'accepted';
@@ -3857,18 +3751,11 @@ class Diaspora
                        return $result;
                }
 
-               $p = q(
-                       "SELECT `guid` FROM `item` WHERE `parent` = %d AND `id` = %d LIMIT 1",
-                       intval($item["parent"]),
-                       intval($item["parent"])
-               );
-
-               if (!DBM::is_result($p)) {
+               $parent = Item::selectFirst(['guid'], ['id' => $item["parent"], 'parent' => $item["parent"]]);
+               if (!DBM::is_result($parent)) {
                        return false;
                }
 
-               $parent = $p[0];
-
                $text = html_entity_decode(BBCode::toMarkdown($item["body"]));
                $created = DateTimeFormat::utc($item["created"], DateTimeFormat::ATOM);
 
@@ -4337,16 +4224,16 @@ class Diaspora
 
                $contact["uprvkey"] = $r[0]['prvkey'];
 
-               $r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1", intval($post_id));
-               if (!DBM::is_result($r)) {
+               $item = Item::selectFirst([], ['id' => $post_id]);
+               if (!DBM::is_result($item)) {
                        return false;
                }
 
-               if (!in_array($r[0]["verb"], [ACTIVITY_LIKE, ACTIVITY_DISLIKE])) {
+               if (!in_array($item["verb"], [ACTIVITY_LIKE, ACTIVITY_DISLIKE])) {
                        return false;
                }
 
-               $message = self::constructLike($r[0], $contact);
+               $message = self::constructLike($item, $contact);
                if ($message === false) {
                        return false;
                }