summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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