From 3e6fea30f2f3bc2352b6e16e1d48e204cde3696b Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Fri, 17 Sep 2021 23:15:23 -0400 Subject: [PATCH] Create constants for Mastodon notification types --- src/Factory/Api/Mastodon/Notification.php | 9 ----- src/Model/Notification.php | 11 +++--- src/Model/Subscription.php | 3 +- src/Module/Api/Mastodon/Notifications.php | 12 +++--- src/Module/Api/Mastodon/PushSubscription.php | 39 ++++++++++---------- src/Object/Api/Mastodon/Notification.php | 19 +++++++++- src/Object/Api/Mastodon/Subscription.php | 15 ++++---- 7 files changed, 59 insertions(+), 49 deletions(-) diff --git a/src/Factory/Api/Mastodon/Notification.php b/src/Factory/Api/Mastodon/Notification.php index 82ef67d618..03d102b503 100644 --- a/src/Factory/Api/Mastodon/Notification.php +++ b/src/Factory/Api/Mastodon/Notification.php @@ -49,15 +49,6 @@ class Notification extends BaseFactory if (!$this->dba->isResult($notification)) { return null; } - /* - follow = Someone followed you - follow_request = Someone requested to follow you - mention = Someone mentioned you in their status - reblog = Someone boosted one of your statuses - favourite = Someone favourited one of your statuses - poll = A poll you have voted in or created has ended - status = Someone you enabled notifications for has posted a status - */ $type = ModelNotification::getType($notification); if (empty($type)) { diff --git a/src/Model/Notification.php b/src/Model/Notification.php index 8411ed77db..284b3e7a83 100644 --- a/src/Model/Notification.php +++ b/src/Model/Notification.php @@ -28,6 +28,7 @@ use Friendica\Core\Logger; use Friendica\Database\Database; use Friendica\DI; use Friendica\Network\HTTPException\InternalServerErrorException; +use Friendica\Object\Api\Mastodon\Notification as MstdnNotification; use Friendica\Protocol\Activity; use Psr\Log\LoggerInterface; @@ -46,15 +47,15 @@ class Notification extends BaseModel { if (($notification['vid'] == Verb::getID(Activity::FOLLOW)) && ($notification['type'] == Post\UserNotification::TYPE_NONE)) { $contact = Contact::getById($notification['actor-id'], ['pending']); - $type = $contact['pending'] ? 'follow_request' : 'follow'; + $type = $contact['pending'] ? MstdnNotification::TYPE_INTRODUCTION : MstdnNotification::TYPE_FOLLOW; } elseif (($notification['vid'] == Verb::getID(Activity::ANNOUNCE)) && in_array($notification['type'], [Post\UserNotification::TYPE_DIRECT_COMMENT, Post\UserNotification::TYPE_DIRECT_THREAD_COMMENT])) { - $type = 'reblog'; + $type = MstdnNotification::TYPE_RESHARE; } elseif (in_array($notification['vid'], [Verb::getID(Activity::LIKE), Verb::getID(Activity::DISLIKE)]) && in_array($notification['type'], [Post\UserNotification::TYPE_DIRECT_COMMENT, Post\UserNotification::TYPE_DIRECT_THREAD_COMMENT])) { - $type = 'favourite'; + $type = MstdnNotification::TYPE_LIKE; } elseif ($notification['type'] == Post\UserNotification::TYPE_SHARED) { - $type = 'status'; + $type = MstdnNotification::TYPE_POST; } elseif (in_array($notification['type'], [ Post\UserNotification::TYPE_EXPLICIT_TAGGED, Post\UserNotification::TYPE_IMPLICIT_TAGGED, @@ -62,7 +63,7 @@ class Notification extends BaseModel Post\UserNotification::TYPE_DIRECT_THREAD_COMMENT, Post\UserNotification::TYPE_THREAD_COMMENT ])) { - $type = 'mention'; + $type = MstdnNotification::TYPE_MENTION; } else { return ''; } diff --git a/src/Model/Subscription.php b/src/Model/Subscription.php index 59e71307f5..f9498af986 100644 --- a/src/Model/Subscription.php +++ b/src/Model/Subscription.php @@ -25,6 +25,7 @@ use Friendica\Core\Logger; use Friendica\Core\Worker; use Friendica\Database\DBA; use Friendica\DI; +use Friendica\Object\Api\Mastodon\Notification; use Minishlink\WebPush\VAPID; class Subscription @@ -142,8 +143,8 @@ class Subscription $notification = DBA::selectFirst('notification', [], ['id' => $nid]); $type = Notification::getType($notification); + $desktop_notification = !in_array($type, [Notification::TYPE_RESHARE, Notification::TYPE_LIKE]); - $desktop_notification = !in_array($type, ['reblog', 'favourite']); if (DI::pConfig()->get($notification['uid'], 'system', 'notify_like') && ($type == 'favourite')) { $desktop_notification = true; diff --git a/src/Module/Api/Mastodon/Notifications.php b/src/Module/Api/Mastodon/Notifications.php index 763a768f58..a04a9ae69a 100644 --- a/src/Module/Api/Mastodon/Notifications.php +++ b/src/Module/Api/Mastodon/Notifications.php @@ -74,19 +74,19 @@ class Notifications extends BaseApi } } - if (in_array('follow_request', $request['exclude_types'])) { + if (in_array(Notification::TYPE_INTRODUCTION, $request['exclude_types'])) { $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::TYPE_NONE]); } - if (in_array('follow', $request['exclude_types'])) { + if (in_array(Notification::TYPE_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::TYPE_NONE]); } - if (in_array('favourite', $request['exclude_types'])) { + if (in_array(Notification::TYPE_LIKE, $request['exclude_types'])) { $condition = DBA::mergeConditions($condition, [ "(NOT `vid` IN (?, ?) OR NOT `type` IN (?, ?))", Verb::getID(Activity::LIKE), Verb::getID(Activity::DISLIKE), @@ -94,7 +94,7 @@ class Notifications extends BaseApi ]); } - if (in_array('reblog', $request['exclude_types'])) { + if (in_array(Notification::TYPE_RESHARE, $request['exclude_types'])) { $condition = DBA::mergeConditions($condition, [ "(NOT `vid` IN (?) OR NOT `type` IN (?, ?))", Verb::getID(Activity::ANNOUNCE), @@ -102,7 +102,7 @@ class Notifications extends BaseApi ]); } - if (in_array('mention', $request['exclude_types'])) { + if (in_array(Notification::TYPE_MENTION, $request['exclude_types'])) { $condition = DBA::mergeConditions($condition, [ "(NOT `vid` IN (?) OR NOT `type` IN (?, ?, ?, ?, ?))", Verb::getID(Activity::POST), Post\UserNotification::TYPE_EXPLICIT_TAGGED, @@ -110,7 +110,7 @@ class Notifications extends BaseApi Post\UserNotification::TYPE_DIRECT_THREAD_COMMENT, Post\UserNotification::TYPE_THREAD_COMMENT]); } - if (in_array('status', $request['exclude_types'])) { + if (in_array(Notification::TYPE_POST, $request['exclude_types'])) { $condition = DBA::mergeConditions($condition, ["(NOT `vid` IN (?) OR NOT `type` IN (?))", Verb::getID(Activity::POST), Post\UserNotification::TYPE_SHARED]); } diff --git a/src/Module/Api/Mastodon/PushSubscription.php b/src/Module/Api/Mastodon/PushSubscription.php index 411d5391f5..3bc77aeb6f 100644 --- a/src/Module/Api/Mastodon/PushSubscription.php +++ b/src/Module/Api/Mastodon/PushSubscription.php @@ -26,6 +26,7 @@ use Friendica\Core\System; use Friendica\DI; use Friendica\Model\Subscription; use Friendica\Module\BaseApi; +use Friendica\Object\Api\Mastodon\Notification; /** * @see https://docs.joinmastodon.org/methods/notifications/push/ @@ -44,18 +45,18 @@ class PushSubscription extends BaseApi ]); $subscription = [ - 'application-id' => $application['id'], - 'uid' => $uid, - 'endpoint' => $request['subscription']['endpoint'] ?? '', - 'pubkey' => $request['subscription']['keys']['p256dh'] ?? '', - 'secret' => $request['subscription']['keys']['auth'] ?? '', - 'follow' => $request['data']['alerts']['follow'] ?? false, - 'favourite' => $request['data']['alerts']['favourite'] ?? false, - 'reblog' => $request['data']['alerts']['reblog'] ?? false, - 'mention' => $request['data']['alerts']['mention'] ?? false, - 'poll' => $request['data']['alerts']['poll'] ?? false, - 'follow_request' => $request['data']['alerts']['follow_request'] ?? false, - 'status' => $request['data']['alerts']['status'] ?? false, + 'application-id' => $application['id'], + 'uid' => $uid, + 'endpoint' => $request['subscription']['endpoint'] ?? '', + 'pubkey' => $request['subscription']['keys']['p256dh'] ?? '', + 'secret' => $request['subscription']['keys']['auth'] ?? '', + Notification::TYPE_FOLLOW => $request['data']['alerts'][Notification::TYPE_FOLLOW] ?? false, + Notification::TYPE_LIKE => $request['data']['alerts'][Notification::TYPE_LIKE] ?? false, + Notification::TYPE_RESHARE => $request['data']['alerts'][Notification::TYPE_RESHARE] ?? false, + Notification::TYPE_MENTION => $request['data']['alerts'][Notification::TYPE_MENTION] ?? false, + Notification::TYPE_POLL => $request['data']['alerts'][Notification::TYPE_POLL] ?? false, + Notification::TYPE_INTRODUCTION => $request['data']['alerts'][Notification::TYPE_INTRODUCTION] ?? false, + Notification::TYPE_POST => $request['data']['alerts'][Notification::TYPE_POST] ?? false, ]; $ret = Subscription::replace($subscription); @@ -82,13 +83,13 @@ class PushSubscription extends BaseApi } $fields = [ - 'follow' => $request['data']['alerts']['follow'] ?? false, - 'favourite' => $request['data']['alerts']['favourite'] ?? false, - 'reblog' => $request['data']['alerts']['reblog'] ?? false, - 'mention' => $request['data']['alerts']['mention'] ?? false, - 'poll' => $request['data']['alerts']['poll'] ?? false, - 'follow_request' => $request['data']['alerts']['follow_request'] ?? false, - 'status' => $request['data']['alerts']['status'] ?? false, + Notification::TYPE_FOLLOW => $request['data']['alerts'][Notification::TYPE_FOLLOW] ?? false, + Notification::TYPE_LIKE => $request['data']['alerts'][Notification::TYPE_LIKE] ?? false, + Notification::TYPE_RESHARE => $request['data']['alerts'][Notification::TYPE_RESHARE] ?? false, + Notification::TYPE_MENTION => $request['data']['alerts'][Notification::TYPE_MENTION] ?? false, + Notification::TYPE_POLL => $request['data']['alerts'][Notification::TYPE_POLL] ?? false, + Notification::TYPE_INTRODUCTION => $request['data']['alerts'][Notification::TYPE_INTRODUCTION] ?? false, + Notification::TYPE_POST => $request['data']['alerts'][Notification::TYPE_POST] ?? false, ]; $ret = Subscription::update($application['id'], $uid, $fields); diff --git a/src/Object/Api/Mastodon/Notification.php b/src/Object/Api/Mastodon/Notification.php index 5f39c503e2..d660baa083 100644 --- a/src/Object/Api/Mastodon/Notification.php +++ b/src/Object/Api/Mastodon/Notification.php @@ -33,9 +33,26 @@ use Friendica\Util\DateTimeFormat; */ class Notification extends BaseDataTransferObject { + /* From the Mastodon documentation: + * - follow = Someone followed you + * - follow_request = Someone requested to follow you + * - mention = Someone mentioned you in their status + * - reblog = Someone boosted one of your statuses + * - favourite = Someone favourited one of your statuses + * - poll = A poll you have voted in or created has ended + * - status = Someone you enabled notifications for has posted a status + */ + public const TYPE_FOLLOW = 'follow'; + public const TYPE_INTRODUCTION = 'follow_request'; + public const TYPE_MENTION = 'mention'; + public const TYPE_RESHARE = 'reblog'; + public const TYPE_LIKE = 'favourite'; + public const TYPE_POLL = 'poll'; + public const TYPE_POST = 'status'; + /** @var string */ protected $id; - /** @var string (Enumerable oneOf) */ + /** @var string One of the TYPE_* constant values */ protected $type; /** @var string (Datetime) */ protected $created_at; diff --git a/src/Object/Api/Mastodon/Subscription.php b/src/Object/Api/Mastodon/Subscription.php index dcd0a6982f..ddc6f7d6eb 100644 --- a/src/Object/Api/Mastodon/Subscription.php +++ b/src/Object/Api/Mastodon/Subscription.php @@ -42,20 +42,19 @@ class Subscription extends BaseDataTransferObject /** * Creates a subscription record from an item record. * - * @param array $subscription - * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @param array $subscription + * @param string $vapid */ public function __construct(array $subscription, string $vapid) { $this->id = (string)$subscription['id']; $this->endpoint = $subscription['endpoint']; $this->alerts = [ - 'follow' => $subscription['follow'], - 'favourite' => $subscription['favourite'], - 'reblog' => $subscription['reblog'], - 'mention' => $subscription['mention'], - 'mention' => $subscription['mention'], - 'poll' => $subscription['poll'], + Notification::TYPE_FOLLOW => $subscription[Notification::TYPE_FOLLOW], + Notification::TYPE_LIKE => $subscription[Notification::TYPE_LIKE], + Notification::TYPE_RESHARE => $subscription[Notification::TYPE_RESHARE], + Notification::TYPE_MENTION => $subscription[Notification::TYPE_MENTION], + Notification::TYPE_POLL => $subscription[Notification::TYPE_POLL], ]; $this->server_key = $vapid;