X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FProtocol%2FDFRN.php;h=081b7f2a3748ed29fa8c45a1473abaf533d76495;hb=838cdac5d17cf71e7103215c65bd0b2a878254f9;hp=cd63291eed16bda98f3ce376f3bd8d85bdeb709e;hpb=2108be7e07792a069ef0650126ac22d470a4b7fc;p=friendica.git diff --git a/src/Protocol/DFRN.php b/src/Protocol/DFRN.php index cd63291eed..081b7f2a37 100644 --- a/src/Protocol/DFRN.php +++ b/src/Protocol/DFRN.php @@ -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(); @@ -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,58 @@ 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 (DBA::exists('intro', ['uid' => $uid, 'suggest-cid' => $cid])) { + 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; + + $hash = Strings::getRandomHex(); + $fields = ['uid' => $suggest['uid'], 'suggest-cid' => $cid, 'contact-id' => $suggest['cid'], + 'note' => $suggest['body'], 'hash' => $hash, 'datetime' => DateTimeFormat::utcNow(), 'blocked' => false]; + DBA::insert('intro', $fields); + + notification([ + '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 +1425,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 +1440,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); @@ -1584,7 +1624,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)) { @@ -2200,36 +2240,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); }