diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2026-05-31 20:32:11 +0200 |
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2026-05-31 20:32:11 +0200 |
| commit | b269af850ab36f03536cb010da373e0cfa87c873 (patch) | |
| tree | 852a09671b1a31dbe19257af835f8561681cf027 /src/Erebos | |
| parent | 0d5c0e31b9e0cbaa0c97b4ea6e55ddbdae689660 (diff) | |
DirectMessage: history diff including replaced messages
Diffstat (limited to 'src/Erebos')
| -rw-r--r-- | src/Erebos/DirectMessage.hs | 17 |
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 |