From b269af850ab36f03536cb010da373e0cfa87c873 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Sun, 31 May 2026 20:32:11 +0200 Subject: DirectMessage: history diff including replaced messages --- src/Erebos/DirectMessage.hs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'src/Erebos/DirectMessage.hs') 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 -- cgit v1.2.3