]> git.mxchange.org Git - friendica.git/blobdiff - src/Protocol/DFRN.php
Move FSuggest to depository
[friendica.git] / src / Protocol / DFRN.php
index 61f5bab62765fd10baef3ca58bbf5b4fa904ae65..a9918bbd02337e6a4da4a3b9d590450998b7643f 100644 (file)
@@ -37,6 +37,7 @@ use Friendica\Model\Item;
 use Friendica\Model\ItemURI;
 use Friendica\Model\Mail;
 use Friendica\Model\Notification;
+use Friendica\Model\Photo;
 use Friendica\Model\Post;
 use Friendica\Model\Profile;
 use Friendica\Model\Tag;
@@ -299,15 +300,12 @@ class DFRN
                        DI::config()->set('system', 'site_pubkey', $res['pubkey']);
                }
 
-               $rp = q(
-                       "SELECT `resource-id` , `scale`, type FROM `photo`
-                               WHERE `profile` = 1 AND `uid` = %d ORDER BY scale;",
-                       $uid
-               );
+               $profilephotos = Photo::selectToArray(['resource-id' , 'scale'], ['profile' => true, 'uid' => $uid], ['order' => ['scale']]);
+
                $photos = [];
                $ext = Images::supportedTypes();
 
-               foreach ($rp as $p) {
+               foreach ($profilephotos as $p) {
                        $photos[$p['scale']] = DI::baseUrl().'/photo/'.$p['resource-id'].'-'.$p['scale'].'.'.$ext[$p['type']];
                }
 
@@ -449,7 +447,7 @@ class DFRN
 
                $attributes = ["rel" => "photo", "type" => "image/jpeg",
                                        "media:width" => Proxy::PIXEL_SMALL, "media:height" => Proxy::PIXEL_SMALL,
-                                       "href" => Contact::getAvatarUrlForId($owner['id'], Proxy::SIZE_SMALL, $owner['updated'])];
+                                       "href" => User::getAvatarUrl($owner, Proxy::SIZE_SMALL)];
 
                if (!$public || !$hide) {
                        $attributes["dfrn:updated"] = $picdate;
@@ -490,10 +488,7 @@ class DFRN
                        XML::addElement($doc, $author, "poco:note", $profile["about"]);
                        XML::addElement($doc, $author, "poco:preferredUsername", $profile["nickname"]);
 
-                       $savetz = date_default_timezone_get();
-                       date_default_timezone_set($profile["timezone"]);
-                       XML::addElement($doc, $author, "poco:utcOffset", date("P"));
-                       date_default_timezone_set($savetz);
+                       XML::addElement($doc, $author, "poco:utcOffset", DateTimeFormat::timezoneNow($profile["timezone"], "P"));
 
                        if (trim($profile["homepage"]) != "") {
                                $urls = $doc->createElement("poco:urls");
@@ -976,7 +971,7 @@ class DFRN
 
                $content_type = ($public_batch ? "application/magic-envelope+xml" : "application/json");
 
-               $postResult = DI::httpRequest()->post($dest_url, $envelope, ["Content-Type: " . $content_type]);
+               $postResult = DI::httpClient()->post($dest_url, $envelope, ['Content-Type' => $content_type]);
                $xml = $postResult->getBody();
 
                $curl_stat = $postResult->getReturnCode();
@@ -985,7 +980,7 @@ class DFRN
                        return -9; // timed out
                }
 
-               if (($curl_stat == 503) && (stristr($postResult->getHeader(), 'retry-after'))) {
+               if (($curl_stat == 503) && $postResult->inHeader('retry-after')) {
                        return -10;
                }
 
@@ -1215,12 +1210,12 @@ class DFRN
                                'xmpp' => $contact['xmpp'], 'name-date' => DateTimeFormat::utc($contact['name-date']),
                                'unsearchable' => $contact['hidden'], 'uri-date' => DateTimeFormat::utc($contact['uri-date'])];
 
-                       DBA::update('contact', $fields, ['id' => $contact['id'], 'network' => $contact['network']], $contact_old);
+                       Contact::update($fields, ['id' => $contact['id'], 'network' => $contact['network']], $contact_old);
 
                        // Update the public contact. Don't set the "hidden" value, this is used differently for public contacts
                        unset($fields['hidden']);
                        $condition = ['uid' => 0, 'nurl' => Strings::normaliseLink($contact_old['url'])];
-                       DBA::update('contact', $fields, $condition, true);
+                       Contact::update($fields, $condition, true);
 
                        Contact::updateAvatar($contact['id'], $author['avatar']);
 
@@ -1335,7 +1330,61 @@ class DFRN
                $cid = Contact::getIdForURL($url);
                $note = $xpath->evaluate('string(dfrn:note[1]/text())', $suggestion);
 
-               return FContact::addSuggestion($importer['importer_uid'], $cid, $importer['id'], $note);
+               return self::addSuggestion($importer['importer_uid'], $cid, $importer['id'], $note);
+       }
+
+       /**
+        * Suggest a given contact to a given user from a given contact
+        *
+        * @param integer $uid
+        * @param integer $cid
+        * @param integer $from_cid
+        * @return bool   Was the adding successful?
+        */
+       private static function addSuggestion(int $uid, int $cid, int $from_cid, string $note = '')
+       {
+               $owner = User::getOwnerDataById($uid);
+               $contact = Contact::getById($cid);
+               $from_contact = Contact::getById($from_cid);
+
+               if (DBA::exists('contact', ['nurl' => Strings::normaliseLink($contact['url']), 'uid' => $uid])) {
+                       return false;
+               }
+
+               // Quit if we already have an introduction for this person
+               if (DI::intro()->suggestionExistsForUser($cid, $uid)) {
+                       return false;
+               }
+
+               $suggest = [];
+               $suggest['uid'] = $uid;
+               $suggest['cid'] = $from_cid;
+               $suggest['url'] = $contact['url'];
+               $suggest['name'] = $contact['name'];
+               $suggest['photo'] = $contact['photo'];
+               $suggest['request'] = $contact['request'];
+               $suggest['title'] = '';
+               $suggest['body'] = $note;
+
+               DI::intro()->save(DI::introFactory()->createNew(
+                       $suggest['uid'],
+                       $suggest['cid'],
+                       $suggest['body'],
+                       null,
+                       $cid
+               ));
+
+               DI::notify()->createFromArray([
+                       'type'  => Notification\Type::SUGGEST,
+                       'otype' => Notification\ObjectType::INTRO,
+                       'verb'  => Activity::REQ_FRIEND,
+                       'uid'   => $owner['uid'],
+                       'cid'   => $from_contact['uid'],
+                       'item'  => $suggest,
+                       'link'  => DI::baseUrl().'/notifications/intros',
+               ]);
+
+               return true;
        }
 
        /**
@@ -1379,19 +1428,13 @@ class DFRN
                }
 
                // update contact
-               $r = q(
-                       "SELECT `photo`, `url` FROM `contact` WHERE `id` = %d AND `uid` = %d",
-                       intval($importer["id"]),
-                       intval($importer["importer_uid"])
-               );
+               $old = Contact::selectFirst(['photo', 'url'], ['id' => $importer["id"], 'uid' => $importer["importer_uid"]]);
 
-               if (!DBA::isResult($r)) {
-                       Logger::log("Query failed to execute, no result returned in " . __FUNCTION__);
+               if (!DBA::isResult($old)) {
+                       Logger::notice("Query failed to execute, no result returned in " . __FUNCTION__);
                        return false;
                }
 
-               $old = $r[0];
-
                // Update the contact table. We try to find every entry.
                $fields = ['name' => $relocate["name"], 'avatar' => $relocate["avatar"],
                        'url' => $relocate["url"], 'nurl' => Strings::normaliseLink($relocate["url"]),
@@ -1400,7 +1443,7 @@ class DFRN
                        'poll' => $relocate["poll"], 'site-pubkey' => $relocate["sitepubkey"]];
                $condition = ["(`id` = ?) OR (`nurl` = ?)", $importer["id"], Strings::normaliseLink($old["url"])];
 
-               DBA::update('contact', $fields, $condition);
+               Contact::update($fields, $condition);
 
                Contact::updateAvatar($importer["id"], $relocate["avatar"], true);
 
@@ -1536,7 +1579,7 @@ class DFRN
                                $item['parent'] = $parent['id'];
 
                                // send a notification
-                               notification(
+                               DI::notify()->createFromArray(
                                        [
                                        "type"     => Notification\Type::POKE,
                                        "otype"    => Notification\ObjectType::PERSON,
@@ -1584,7 +1627,7 @@ class DFRN
                        }
                        if ($activity->match($item["verb"], Activity::UNFOLLOW)) {
                                Logger::log("Lost follower");
-                               Contact::removeFollower($importer, $contact, $item);
+                               Contact::removeFollower($contact);
                                return false;
                        }
                        if ($activity->match($item["verb"], Activity::REQ_FRIEND)) {
@@ -1976,8 +2019,9 @@ class DFRN
                                        }
 
                                        $event_id = Event::store($ev);
-                                       Logger::log("Event ".$event_id." was stored", Logger::DEBUG);
-                                       return;
+                                       Logger::info('Event was stored', ['id' => $event_id]);
+
+                                       $item = Event::getItemArrayForImportedId($event_id, $item);
                                }
                        }
                }
@@ -2199,36 +2243,36 @@ class DFRN
                        $accounttype = intval(XML::getFirstNodeValue($xpath, "/atom:feed/dfrn:account_type/text()"));
 
                        if ($accounttype != $importer["contact-type"]) {
-                               DBA::update('contact', ['contact-type' => $accounttype], ['id' => $importer['id']]);
+                               Contact::update(['contact-type' => $accounttype], ['id' => $importer['id']]);
 
                                // Updating the public contact as well
-                               DBA::update('contact', ['contact-type' => $accounttype], ['uid' => 0, 'nurl' => $importer['nurl']]);
+                               Contact::update(['contact-type' => $accounttype], ['uid' => 0, 'nurl' => $importer['nurl']]);
                        }
                        // A forum contact can either have set "forum" or "prv" - but not both
                        if ($accounttype == User::ACCOUNT_TYPE_COMMUNITY) {
                                // It's a forum, so either set the public or private forum flag
                                $condition = ['(`forum` != ? OR `prv` != ?) AND `id` = ?', $forum, !$forum, $importer['id']];
-                               DBA::update('contact', ['forum' => $forum, 'prv' => !$forum], $condition);
+                               Contact::update(['forum' => $forum, 'prv' => !$forum], $condition);
 
                                // Updating the public contact as well
                                $condition = ['(`forum` != ? OR `prv` != ?) AND `uid` = 0 AND `nurl` = ?', $forum, !$forum, $importer['nurl']];
-                               DBA::update('contact', ['forum' => $forum, 'prv' => !$forum], $condition);
+                               Contact::update(['forum' => $forum, 'prv' => !$forum], $condition);
                        } else {
                                // It's not a forum, so remove the flags
                                $condition = ['(`forum` OR `prv`) AND `id` = ?', $importer['id']];
-                               DBA::update('contact', ['forum' => false, 'prv' => false], $condition);
+                               Contact::update(['forum' => false, 'prv' => false], $condition);
 
                                // Updating the public contact as well
                                $condition = ['(`forum` OR `prv`) AND `uid` = 0 AND `nurl` = ?', $importer['nurl']];
-                               DBA::update('contact', ['forum' => false, 'prv' => false], $condition);
+                               Contact::update(['forum' => false, 'prv' => false], $condition);
                        }
                } elseif ($forum != $importer["forum"]) { // Deprecated since 3.5.1
                        $condition = ['`forum` != ? AND `id` = ?', $forum, $importer["id"]];
-                       DBA::update('contact', ['forum' => $forum], $condition);
+                       Contact::update(['forum' => $forum], $condition);
 
                        // Updating the public contact as well
                        $condition = ['`forum` != ? AND `uid` = 0 AND `nurl` = ?', $forum, $importer['nurl']];
-                       DBA::update('contact', ['forum' => $forum], $condition);
+                       Contact::update(['forum' => $forum], $condition);
                }