summaryrefslogtreecommitdiff
path: root/src/Erebos
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2026-05-31 20:32:11 +0200
committerRoman Smrž <roman.smrz@seznam.cz>2026-05-31 20:32:11 +0200
commitb269af850ab36f03536cb010da373e0cfa87c873 (patch)
tree852a09671b1a31dbe19257af835f8561681cf027 /src/Erebos
parent0d5c0e31b9e0cbaa0c97b4ea6e55ddbdae689660 (diff)
DirectMessage: history diff including replaced messages
Diffstat (limited to 'src/Erebos')
-rw-r--r--src/Erebos/DirectMessage.hs17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/Erebos/DirectMessage.hs b/src/Erebos/DirectMessage.hs
index d9de7c7..62a25a2 100644
--- a/src/Erebos/DirectMessage.hs
+++ b/src/Erebos/DirectMessage.hs
@@ -13,6 +13,7 @@ module Erebos.DirectMessage (
DirectMessageThread(..),
dmThreadToList, dmThreadToListSince, dmThreadToListUnread, dmThreadToListSinceUnread,
+ dmThreadToListChange,
dmThreadView,
watchDirectMessageThreads,
@@ -54,8 +55,8 @@ instance ConversationType DirectMessageThread DirectMessage where
convReference = refDigest . storedRef . head . idDataF . msgPeer
- convMessageListSince mbSince thread = ( 0, ) $
- threadToListHelper (msgSeen thread) (maybe S.empty (S.fromAscList . msgHead) mbSince) (msgHead thread)
+ convMessageListSince Nothing thread = ( 0, ) $ dmThreadToListUnread thread
+ convMessageListSince (Just since) thread = dmThreadToListChange since thread
data DirectMessage = DirectMessage
@@ -340,6 +341,18 @@ threadToListHelper seen used msgs = map (\msg -> ( fromStored msg, isNew msg ))
cmp = comparing $ zonedTimeToUTC . msgTime . fromStored
isNew msg = not $ any (msg `precedesOrEquals`) seen
+dmThreadToListChange :: DirectMessageThread -> DirectMessageThread -> ( Int, [ ( DirectMessage, Bool ) ] )
+dmThreadToListChange since thread =
+ ( graphSize $ graphRemoveTips bottom $ graphFromTips (msgHead since)
+ , map (\msg -> ( fromStored msg, isNew msg )) $ graphToList cmp $ graphRemoveTips bottom $ graphFromTips (msgHead thread)
+ )
+ where
+ cmp = comparing $ zonedTimeToUTC . msgTime . fromStored
+ isNew msg = not $ any (msg `precedesOrEquals`) (msgSeen thread)
+ bottom
+ | msgSeen since == msgSeen thread = msgHead since
+ | otherwise = commonAncestors (msgHead since) (msgSeen since)
+
dmThreadView :: [ Stored MessageState ] -> [ DirectMessageThread ]
dmThreadView = helper []
where helper used ms' = case filterAncestors ms' of