diff options
author | Joas Schilling <213943+nickvergessen@users.noreply.github.com> | 2021-12-07 14:02:42 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-07 14:02:42 +0300 |
commit | 07048b2709890c166eb59f3683c0c9118902f70e (patch) | |
tree | e4f294f3058d3304a8eb586a2a002f3ac48a5a3d /lib | |
parent | 3635f89b21a6af0eb376efb44de7dfa993671188 (diff) | |
parent | 030d59719ac3d3c4722bdc9035574d777f502687 (diff) |
Merge pull request #6625 from nextcloud/bugfix/6621/recognize-shares-as-unread-messages
Recognize voice messages, object and file shares as unread messages
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Chat/ChatManager.php | 15 | ||||
-rw-r--r-- | lib/Chat/CommentsManager.php | 26 | ||||
-rw-r--r-- | lib/Chat/MessageParser.php | 7 |
3 files changed, 44 insertions, 4 deletions
diff --git a/lib/Chat/ChatManager.php b/lib/Chat/ChatManager.php index ec38cc887..92fd17fe4 100644 --- a/lib/Chat/ChatManager.php +++ b/lib/Chat/ChatManager.php @@ -64,7 +64,8 @@ class ChatManager { public const GEO_LOCATION_VALIDATOR = '/^geo:-?\d{1,2}(\.\d+)?,-?\d{1,3}(\.\d+)?(,-?\d+(\.\d+)?)?(;crs=wgs84)?(;u=\d+(\.\d+)?)?$/i'; - /** @var ICommentsManager */ + /** @var ICommentsManager|CommentsManager + */ private $commentsManager; /** @var IEventDispatcher */ private $dispatcher; @@ -141,7 +142,15 @@ class ChatManager { if ($parentId !== null) { $comment->setParentId((string) $parentId); } - $comment->setVerb('system'); + + $messageDecoded = json_decode($message, true); + $messageType = $messageDecoded['message'] ?? ''; + + if ($messageType === 'object_shared' || $messageType === 'file_shared') { + $comment->setVerb('object_shared'); + } else { + $comment->setVerb('system'); + } $event = new ChatEvent($chat, $comment); $this->dispatcher->dispatch(self::EVENT_BEFORE_SYSTEM_MESSAGE_SEND, $event); @@ -359,7 +368,7 @@ class ChatManager { $key = $chat->getId() . '-' . $lastReadMessage; $unreadCount = $this->unreadCountCache->get($key); if ($unreadCount === null) { - $unreadCount = $this->commentsManager->getNumberOfCommentsForObjectSinceComment('chat', (string) $chat->getId(), $lastReadMessage, 'comment'); + $unreadCount = $this->commentsManager->getNumberOfCommentsWithVerbsForObjectSinceComment('chat', (string) $chat->getId(), $lastReadMessage, ['comment', 'object_shared']); $this->unreadCountCache->set($key, $unreadCount, 1800); } return $unreadCount; diff --git a/lib/Chat/CommentsManager.php b/lib/Chat/CommentsManager.php index 12a758e86..8ad4f849b 100644 --- a/lib/Chat/CommentsManager.php +++ b/lib/Chat/CommentsManager.php @@ -26,6 +26,7 @@ namespace OCA\Talk\Chat; use OC\Comments\Comment; use OC\Comments\Manager; use OCP\Comments\IComment; +use OCP\DB\QueryBuilder\IQueryBuilder; class CommentsManager extends Manager { /** @@ -39,4 +40,29 @@ class CommentsManager extends Manager { $comment->setMessage($message, ChatManager::MAX_CHAT_LENGTH); return $comment; } + + /** + * TODO Remove when server version with https://github.com/nextcloud/server/pull/29921 is required + * + * @param string $objectType + * @param string $objectId + * @param int $lastRead + * @param string[] $verbs + * @return int + */ + public function getNumberOfCommentsWithVerbsForObjectSinceComment(string $objectType, string $objectId, int $lastRead, array $verbs): int { + $query = $this->dbConn->getQueryBuilder(); + $query->select($query->func()->count('id', 'num_messages')) + ->from('comments') + ->where($query->expr()->eq('object_type', $query->createNamedParameter($objectType))) + ->andWhere($query->expr()->eq('object_id', $query->createNamedParameter($objectId))) + ->andWhere($query->expr()->gt('id', $query->createNamedParameter($lastRead))) + ->andWhere($query->expr()->in('verb', $query->createNamedParameter($verbs, IQueryBuilder::PARAM_STR_ARRAY))); + + $result = $query->executeQuery(); + $data = $result->fetch(); + $result->closeCursor(); + + return (int) ($data['num_messages'] ?? 0); + } } diff --git a/lib/Chat/MessageParser.php b/lib/Chat/MessageParser.php index ff944c2f4..db142107e 100644 --- a/lib/Chat/MessageParser.php +++ b/lib/Chat/MessageParser.php @@ -64,7 +64,12 @@ class MessageParser { public function parseMessage(Message $message): void { $message->setMessage($message->getComment()->getMessage(), []); - $message->setMessageType($message->getComment()->getVerb()); + + $verb = $message->getComment()->getVerb(); + if ($verb === 'object_shared') { + $verb = 'system'; + } + $message->setMessageType($verb); $this->setActor($message); $event = new ChatMessageEvent($message); |