From 61fee84c15215811a01d1a32e7dacbf7825c95c3 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 27 Sep 2020 18:58:02 +0000 Subject: [PATCH] Functionality to add suggestions --- src/Model/FContact.php | 80 ++++++++++++++++++++++ src/Module/Notifications/Introductions.php | 17 +++-- 2 files changed, 90 insertions(+), 7 deletions(-) diff --git a/src/Model/FContact.php b/src/Model/FContact.php index c4d6251c3b..20ec529715 100644 --- a/src/Model/FContact.php +++ b/src/Model/FContact.php @@ -24,7 +24,10 @@ namespace Friendica\Model; use Friendica\Core\Logger; use Friendica\Core\Protocol; use Friendica\Database\DBA; +use Friendica\DI; +use Friendica\Model\Notify\Type; use Friendica\Network\Probe; +use Friendica\Protocol\Activity; use Friendica\Util\DateTimeFormat; use Friendica\Util\Strings; @@ -130,4 +133,81 @@ class FContact return null; } + + /** + * Add suggestions for a given contact + * + * @param integer $uid + * @param integer $cid + * @return bool Was the adding successful? + */ + public static function addSuggestion(int $uid, int $cid) + { + $owner = User::getOwnerDataById($uid); + $contact = Contact::getById($cid); + + if (DBA::exists('contact', ['nurl' => Strings::normaliseLink($contact['url']), 'uid' => $uid])) { + return false; + } + + $suggest = []; + $suggest['uid'] = $uid; + $suggest['cid'] = $contact['id']; + $suggest['url'] = $contact['url']; + $suggest['name'] = $contact['name']; + $suggest['photo'] = $contact['photo']; + $suggest['request'] = $contact['request']; + $suggest['title'] = ''; + $suggest['body'] = ''; + + // Do we already have an fcontact record for this person? + $fid = 0; + $fcontact = DBA::selectFirst('fcontact', ['id'], ['url' => $suggest['url']]); + if (DBA::isResult($fcontact)) { + $fid = $fcontact['id']; + + $fields = ['name' => $suggest['name'], 'photo' => $suggest['photo'], 'request' => $suggest['request']]; + DBA::update('fcontact', $fields, ['id' => $fid]); + + // Quit if we already have an introduction for this person + if (DBA::exists('intro', ['uid' => $suggest['uid'], 'fid' => $fid])) { + return false; + } + } + + if (empty($fid)) { + $fields = ['name' => $suggest['name'], 'url' => $suggest['url'], + 'photo' => $suggest['photo'], 'request' => $suggest['request']]; + DBA::insert('fcontact', $fields); + $fid = DBA::lastInsertId(); + if (empty($fid)) { + Logger::warning('FContact had not been created', ['fcontact' => $fields]); + return false; + } + } + + $hash = Strings::getRandomHex(); + $fields = ['uid' => $suggest['uid'], 'fid' => $fid, 'contact-id' => $suggest['cid'], + 'note' => $suggest['body'], 'hash' => $hash, 'datetime' => DateTimeFormat::utcNow(), 'blocked' => false]; + DBA::insert('intro', $fields); + + notification( + [ + 'type' => Type::SUGGEST, + 'notify_flags' => $owner['notify-flags'], + 'language' => $owner['language'], + 'to_name' => $owner['name'], + 'to_email' => $owner['email'], + 'uid' => $owner['uid'], + 'item' => $suggest, + 'link' => DI::baseUrl().'/notifications/intros', + 'source_name' => $contact['name'], + 'source_link' => $contact['url'], + 'source_photo' => $contact['photo'], + 'verb' => Activity::REQ_FRIEND, + 'otype' => 'intro'] + ); + + return true; + } } diff --git a/src/Module/Notifications/Introductions.php b/src/Module/Notifications/Introductions.php index cd59626e68..eeb8ce02f7 100644 --- a/src/Module/Notifications/Introductions.php +++ b/src/Module/Notifications/Introductions.php @@ -81,6 +81,13 @@ class Introductions extends BaseNotifications /** @var Introduction $notification */ foreach ($notifications['notifications'] as $notification) { + $helptext = DI::l10n()->t('Shall your connection be bidirectional or not?'); + $helptext2 = DI::l10n()->t('Accepting %s as a friend allows %s to subscribe to your posts, and you will also receive updates from them in your news feed.', $notification->getName(), $notification->getName()); + $helptext3 = DI::l10n()->t('Accepting %s as a subscriber allows them to subscribe to your posts, but you will not receive updates from them in your news feed.', $notification->getName()); + + $friend = ['duplex', DI::l10n()->t('Friend'), '1', $helptext2, true]; + $follower = ['duplex', DI::l10n()->t('Subscriber'), '0', $helptext3, false]; + // There are two kind of introduction. Contacts suggested by other contacts and normal connection requests. // We have to distinguish between these two because they use different data. switch ($notification->getLabel()) { @@ -98,6 +105,9 @@ class Introductions extends BaseNotifications '$contact_id' => $notification->getContactId(), '$photo' => $notification->getPhoto(), '$fullname' => $notification->getName(), + '$lbl_connection_type' => $helptext, + '$friend' => $friend, + '$follower' => $follower, '$url' => $notification->getUrl(), '$zrl' => $notification->getZrl(), '$lbl_url' => DI::l10n()->t('Profile URL'), @@ -122,13 +132,6 @@ class Introductions extends BaseNotifications $knowyou = ''; } - $helptext = DI::l10n()->t('Shall your connection be bidirectional or not?'); - $helptext2 = DI::l10n()->t('Accepting %s as a friend allows %s to subscribe to your posts, and you will also receive updates from them in your news feed.', $notification->getName(), $notification->getName()); - $helptext3 = DI::l10n()->t('Accepting %s as a subscriber allows them to subscribe to your posts, but you will not receive updates from them in your news feed.', $notification->getName()); - - $friend = ['duplex', DI::l10n()->t('Friend'), '1', $helptext2, true]; - $follower = ['duplex', DI::l10n()->t('Subscriber'), '0', $helptext3, false]; - $contact = DBA::selectFirst('contact', ['network', 'protocol'], ['id' => $notification->getContactId()]); if (($contact['network'] != Protocol::DFRN) || ($contact['protocol'] == Protocol::ACTIVITYPUB)) {