From 04ac4841f9a134262aee17df6972c262835fd364 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Wed, 16 Mar 2022 21:56:22 -0400 Subject: [PATCH] Add support for notification visibility settings --- mod/settings.php | 13 +++++ src/Module/Notifications/Ping.php | 2 +- .../Notifications/Repository/Notification.php | 49 +++++++++++++++++-- 3 files changed, 60 insertions(+), 4 deletions(-) diff --git a/mod/settings.php b/mod/settings.php index 41a1436e69..642229de0b 100644 --- a/mod/settings.php +++ b/mod/settings.php @@ -35,8 +35,10 @@ use Friendica\Model\Item; use Friendica\Model\Notification; use Friendica\Model\Profile; use Friendica\Model\User; +use Friendica\Model\Verb; use Friendica\Module\BaseSettings; use Friendica\Module\Security\Login; +use Friendica\Protocol\Activity; use Friendica\Protocol\Email; use Friendica\Util\Temporal; use Friendica\Worker\Delivery; @@ -352,7 +354,18 @@ function settings_post(App $a) DI::pConfig()->set(local_user(), 'expire', 'photos', $expire_photos); DI::pConfig()->set(local_user(), 'expire', 'network_only', $expire_network_only); + // Reset like notifications when they are going to be shown again + if (!DI::pConfig()->get(local_user(), 'system', 'notify_like') && $notify_like) { + DI::notification()->setAllSeenForUser(local_user(), ['vid' => Verb::getID(Activity::LIKE)]); + } + DI::pConfig()->set(local_user(), 'system', 'notify_like', $notify_like); + + // Reset share notifications when they are going to be shown again + if (!DI::pConfig()->get(local_user(), 'system', 'notify_announce') && $notify_announce) { + DI::notification()->setAllSeenForUser(local_user(), ['vid' => Verb::getID(Activity::ANNOUNCE)]); + } + DI::pConfig()->set(local_user(), 'system', 'notify_announce', $notify_announce); DI::pConfig()->set(local_user(), 'system', 'email_textonly', $email_textonly); diff --git a/src/Module/Notifications/Ping.php b/src/Module/Notifications/Ping.php index 03d3ae5f77..7deb42fcaa 100644 --- a/src/Module/Notifications/Ping.php +++ b/src/Module/Notifications/Ping.php @@ -87,7 +87,7 @@ class Ping extends BaseModule if (local_user()) { if (DI::pConfig()->get(local_user(), 'system', 'detailed_notif')) { - $notifications = $this->notificationRepo->selectForUser(local_user(), ['`vid` != ?', Verb::getID(\Friendica\Protocol\Activity::LIKE)], ['limit' => 50, 'order' => ['id' => true]]); + $notifications = $this->notificationRepo->selectDetailedForUser(local_user()); } else { $notifications = $this->notificationRepo->selectDigestForUser(local_user()); } diff --git a/src/Navigation/Notifications/Repository/Notification.php b/src/Navigation/Notifications/Repository/Notification.php index 60ac82ae31..b9ac9e4dd4 100644 --- a/src/Navigation/Notifications/Repository/Notification.php +++ b/src/Navigation/Notifications/Repository/Notification.php @@ -24,6 +24,7 @@ namespace Friendica\Navigation\Notifications\Repository; use Exception; use Friendica\BaseCollection; use Friendica\BaseRepository; +use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues; use Friendica\Database\Database; use Friendica\Database\DBA; use Friendica\Model\Verb; @@ -41,9 +42,14 @@ class Notification extends BaseRepository protected static $table_name = 'notification'; - public function __construct(Database $database, LoggerInterface $logger, Factory\Notification $factory) + /** @var IManagePersonalConfigValues */ + private $pconfig; + + public function __construct(IManagePersonalConfigValues $pconfig, Database $database, LoggerInterface $logger, Factory\Notification $factory) { parent::__construct($database, $logger, $factory); + + $this->pconfig = $pconfig; } /** @@ -100,6 +106,28 @@ class Notification extends BaseRepository return $this->select($condition, $params); } + + /** + * Returns only the most recent notifications for the same conversation or contact + * + * @param int $uid + * @return Collection\Notifications + * @throws Exception + */ + public function selectDetailedForUser(int $uid): Collection\Notifications + { + $condition = []; + if (!$this->pconfig->get($uid, 'system', 'notify_like')) { + $condition = DBA::mergeConditions($condition, ['`vid` != ?', Verb::getID(\Friendica\Protocol\Activity::LIKE)]); + } + + if (!$this->pconfig->get($uid, 'system', 'notify_announce')) { + $condition = DBA::mergeConditions($condition, ['`vid` != ?', Verb::getID(\Friendica\Protocol\Activity::ANNOUNCE)]); + } + + return $this->selectForUser(local_user(), $condition, ['limit' => 50, 'order' => ['id' => true]]); + } + /** * Returns only the most recent notifications for the same conversation or contact * @@ -109,6 +137,20 @@ class Notification extends BaseRepository */ public function selectDigestForUser(int $uid): Collection\Notifications { + $values = [$uid]; + + $like_condition = ''; + if (!$this->pconfig->get($uid, 'system', 'notify_like')) { + $like_condition = 'AND vid != ?'; + $values[] = Verb::getID(\Friendica\Protocol\Activity::LIKE); + } + + $announce_condition = ''; + if (!$this->pconfig->get($uid, 'system', 'notify_announce')) { + $announce_condition = 'AND vid != ?'; + $values[] = Verb::getID(\Friendica\Protocol\Activity::ANNOUNCE); + } + $rows = $this->db->p(" SELECT notification.* FROM notification @@ -116,12 +158,13 @@ class Notification extends BaseRepository SELECT MAX(`id`) FROM notification WHERE uid = ? - AND vid != ? + $like_condition + $announce_condition GROUP BY IFNULL(`parent-uri-id`, `actor-id`) ) ORDER BY `seen`, `id` DESC LIMIT 50 - ", $uid, Verb::getID(\Friendica\Protocol\Activity::LIKE)); + ", ...$values); $Entities = new Collection\Notifications(); foreach ($rows as $fields) { -- 2.39.5