Merge pull request #10355 from annando/follow-notifications

Added notifications for follow requests
This commit is contained in:
Hypolite Petovan 2021-06-01 17:28:28 -04:00 committed by GitHub
commit fc0d81d59a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 60 additions and 15 deletions

View file

@ -24,6 +24,7 @@ namespace Friendica\Factory\Api\Mastodon;
use Friendica\BaseFactory; use Friendica\BaseFactory;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\DI; use Friendica\DI;
use Friendica\Model\Contact;
use Friendica\Model\Post; use Friendica\Model\Post;
use Friendica\Model\Verb; use Friendica\Model\Verb;
use Friendica\Protocol\Activity; use Friendica\Protocol\Activity;
@ -46,7 +47,10 @@ class Notification extends BaseFactory
status = Someone you enabled notifications for has posted a status status = Someone you enabled notifications for has posted a status
*/ */
if (($notification['vid'] == Verb::getID(Activity::ANNOUNCE)) && if (($notification['vid'] == Verb::getID(Activity::FOLLOW)) && ($notification['type'] == Post\UserNotification::NOTIF_NONE)) {
$contact = Contact::getById($notification['actor-id'], ['pending']);
$type = $contact['pending'] ? $type = 'follow_request' : 'follow';
} elseif (($notification['vid'] == Verb::getID(Activity::ANNOUNCE)) &&
in_array($notification['type'], [Post\UserNotification::NOTIF_DIRECT_COMMENT, Post\UserNotification::NOTIF_DIRECT_THREAD_COMMENT])) { in_array($notification['type'], [Post\UserNotification::NOTIF_DIRECT_COMMENT, Post\UserNotification::NOTIF_DIRECT_THREAD_COMMENT])) {
$type = 'reblog'; $type = 'reblog';
} elseif (in_array($notification['vid'], [Verb::getID(Activity::LIKE), Verb::getID(Activity::DISLIKE)]) && } elseif (in_array($notification['vid'], [Verb::getID(Activity::LIKE), Verb::getID(Activity::DISLIKE)]) &&

View file

@ -2536,6 +2536,8 @@ class Contact
// Ensure to always have the correct network type, independent from the connection request method // Ensure to always have the correct network type, independent from the connection request method
self::updateFromProbe($contact['id']); self::updateFromProbe($contact['id']);
Post\UserNotification::insertNotication($contact['id'], Verb::getID(Activity::FOLLOW), $importer['uid']);
return true; return true;
} else { } else {
// send email notification to owner? // send email notification to owner?
@ -2567,6 +2569,8 @@ class Contact
self::updateAvatar($contact_id, $photo, true); self::updateAvatar($contact_id, $photo, true);
Post\UserNotification::insertNotication($contact_id, Verb::getID(Activity::FOLLOW), $importer['uid']);
$contact_record = DBA::selectFirst('contact', ['id', 'network', 'name', 'url', 'photo'], ['id' => $contact_id]); $contact_record = DBA::selectFirst('contact', ['id', 'network', 'name', 'url', 'photo'], ['id' => $contact_id]);
/// @TODO Encapsulate this into a function/method /// @TODO Encapsulate this into a function/method

View file

@ -177,7 +177,7 @@ class UserNotification
if (self::checkShared($item, $uid)) { if (self::checkShared($item, $uid)) {
$notification_type = $notification_type | self::NOTIF_SHARED; $notification_type = $notification_type | self::NOTIF_SHARED;
self::insertNotication(self::NOTIF_SHARED, $uid, $item); self::insertNoticationByItem(self::NOTIF_SHARED, $uid, $item);
$notified = true; $notified = true;
} else { } else {
$notified = false; $notified = false;
@ -201,7 +201,7 @@ class UserNotification
if (self::checkExplicitMention($item, $profiles)) { if (self::checkExplicitMention($item, $profiles)) {
$notification_type = $notification_type | self::NOTIF_EXPLICIT_TAGGED; $notification_type = $notification_type | self::NOTIF_EXPLICIT_TAGGED;
if (!$notified) { if (!$notified) {
self::insertNotication( self::NOTIF_EXPLICIT_TAGGED, $uid, $item); self::insertNoticationByItem( self::NOTIF_EXPLICIT_TAGGED, $uid, $item);
$notified = true; $notified = true;
} }
} }
@ -209,7 +209,7 @@ class UserNotification
if (self::checkImplicitMention($item, $profiles)) { if (self::checkImplicitMention($item, $profiles)) {
$notification_type = $notification_type | self::NOTIF_IMPLICIT_TAGGED; $notification_type = $notification_type | self::NOTIF_IMPLICIT_TAGGED;
if (!$notified) { if (!$notified) {
self::insertNotication(self::NOTIF_IMPLICIT_TAGGED, $uid, $item); self::insertNoticationByItem(self::NOTIF_IMPLICIT_TAGGED, $uid, $item);
$notified = true; $notified = true;
} }
} }
@ -217,7 +217,7 @@ class UserNotification
if (self::checkDirectComment($item, $contacts)) { if (self::checkDirectComment($item, $contacts)) {
$notification_type = $notification_type | self::NOTIF_DIRECT_COMMENT; $notification_type = $notification_type | self::NOTIF_DIRECT_COMMENT;
if (!$notified) { if (!$notified) {
self::insertNotication(self::NOTIF_DIRECT_COMMENT, $uid, $item); self::insertNoticationByItem(self::NOTIF_DIRECT_COMMENT, $uid, $item);
$notified = true; $notified = true;
} }
} }
@ -225,7 +225,7 @@ class UserNotification
if (self::checkDirectCommentedThread($item, $contacts)) { if (self::checkDirectCommentedThread($item, $contacts)) {
$notification_type = $notification_type | self::NOTIF_DIRECT_THREAD_COMMENT; $notification_type = $notification_type | self::NOTIF_DIRECT_THREAD_COMMENT;
if (!$notified) { if (!$notified) {
self::insertNotication(self::NOTIF_DIRECT_THREAD_COMMENT, $uid, $item); self::insertNoticationByItem(self::NOTIF_DIRECT_THREAD_COMMENT, $uid, $item);
$notified = true; $notified = true;
} }
} }
@ -233,7 +233,7 @@ class UserNotification
if (self::checkCommentedThread($item, $contacts)) { if (self::checkCommentedThread($item, $contacts)) {
$notification_type = $notification_type | self::NOTIF_THREAD_COMMENT; $notification_type = $notification_type | self::NOTIF_THREAD_COMMENT;
if (!$notified) { if (!$notified) {
self::insertNotication(self::NOTIF_THREAD_COMMENT, $uid, $item); self::insertNoticationByItem(self::NOTIF_THREAD_COMMENT, $uid, $item);
$notified = true; $notified = true;
} }
} }
@ -241,7 +241,7 @@ class UserNotification
if (self::checkCommentedParticipation($item, $contacts)) { if (self::checkCommentedParticipation($item, $contacts)) {
$notification_type = $notification_type | self::NOTIF_COMMENT_PARTICIPATION; $notification_type = $notification_type | self::NOTIF_COMMENT_PARTICIPATION;
if (!$notified) { if (!$notified) {
self::insertNotication(self::NOTIF_COMMENT_PARTICIPATION, $uid, $item); self::insertNoticationByItem(self::NOTIF_COMMENT_PARTICIPATION, $uid, $item);
$notified = true; $notified = true;
} }
} }
@ -249,7 +249,7 @@ class UserNotification
if (self::checkActivityParticipation($item, $contacts)) { if (self::checkActivityParticipation($item, $contacts)) {
$notification_type = $notification_type | self::NOTIF_ACTIVITY_PARTICIPATION; $notification_type = $notification_type | self::NOTIF_ACTIVITY_PARTICIPATION;
if (!$notified) { if (!$notified) {
self::insertNotication(self::NOTIF_ACTIVITY_PARTICIPATION, $uid, $item); self::insertNoticationByItem(self::NOTIF_ACTIVITY_PARTICIPATION, $uid, $item);
$notified = true; $notified = true;
} }
} }
@ -266,7 +266,15 @@ class UserNotification
self::update($item['uri-id'], $uid, $fields, true); self::update($item['uri-id'], $uid, $fields, true);
} }
private static function insertNotication(int $type, int $uid, array $item) /**
* Add a notification entry for a given item array
*
* @param int $type User notification type
* @param int $uid User ID
* @param array $item Item array
* @return boolean
*/
private static function insertNoticationByItem(int $type, int $uid, array $item)
{ {
if (($item['gravity'] == GRAVITY_ACTIVITY) && if (($item['gravity'] == GRAVITY_ACTIVITY) &&
!in_array($type, [self::NOTIF_DIRECT_COMMENT, self::NOTIF_DIRECT_THREAD_COMMENT])) { !in_array($type, [self::NOTIF_DIRECT_COMMENT, self::NOTIF_DIRECT_THREAD_COMMENT])) {
@ -289,7 +297,28 @@ class UserNotification
$fields['target-uri-id'] = $item['uri-id']; $fields['target-uri-id'] = $item['uri-id'];
} }
DBA::insert('notification', $fields); return DBA::insert('notification', $fields);
}
/**
* Add a notification entry
*
* @param int $actor Contact ID of the actor
* @param int $vid Verb ID
* @param int $uid User ID
* @return boolean
*/
public static function insertNotication(int $actor, int $vid, int $uid)
{
$fields = [
'uid' => $uid,
'vid' => $vid,
'type' => self::NOTIF_NONE,
'actor-id' => $actor,
'created' => DateTimeFormat::utcNow(),
];
return DBA::insert('notification', $fields);
} }
/** /**

View file

@ -75,7 +75,15 @@ class Notifications extends BaseApi
} }
if (in_array('follow_request', $request['exclude_types'])) { if (in_array('follow_request', $request['exclude_types'])) {
$condition = DBA::mergeConditions($condition, ["NOT `vid` IN (?)", Verb::getID(Activity::FOLLOW)]); $condition = DBA::mergeConditions($condition,
["(`vid` != ? OR `type` != ? OR NOT EXISTS (SELECT `id` FROM `contact` WHERE `id` = `actor-id` AND `pending`))",
Verb::getID(Activity::FOLLOW), Post\UserNotification::NOTIF_NONE]);
}
if (in_array('follow', $request['exclude_types'])) {
$condition = DBA::mergeConditions($condition,
["(`vid` != ? OR `type` != ? OR NOT EXISTS (SELECT `id` FROM `contact` WHERE `id` = `actor-id` AND NOT `pending`))",
Verb::getID(Activity::FOLLOW), Post\UserNotification::NOTIF_NONE]);
} }
if (in_array('favourite', $request['exclude_types'])) { if (in_array('favourite', $request['exclude_types'])) {