diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2025-11-20 21:08:44 +0100 |
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2025-11-20 21:08:44 +0100 |
| commit | 223e10691606a8d1885887fd6bb7570e1318e063 (patch) | |
| tree | ac8b7a380802f44229b49bab5cf3011acd2c69bc /src/Erebos | |
| parent | e1765a3e39cfb0a1c1b53e38a6b1d36592566ef1 (diff) | |
Highlight new messages in conversation history
Diffstat (limited to 'src/Erebos')
| -rw-r--r-- | src/Erebos/Chatroom.hs | 3 | ||||
| -rw-r--r-- | src/Erebos/Conversation.hs | 20 | ||||
| -rw-r--r-- | src/Erebos/Conversation/Class.hs | 1 | ||||
| -rw-r--r-- | src/Erebos/DirectMessage.hs | 3 |
4 files changed, 18 insertions, 9 deletions
diff --git a/src/Erebos/Chatroom.hs b/src/Erebos/Chatroom.hs index bdb101f..5a86b23 100644 --- a/src/Erebos/Chatroom.hs +++ b/src/Erebos/Chatroom.hs @@ -67,6 +67,9 @@ instance ConversationType ChatroomState ChatMessage where convMessageTime = cmsgTime convMessageText = cmsgText + convMessageListSince mbSince cstate = + map (, False) $ threadToListSince (maybe [] roomStateMessageData mbSince) (roomStateMessageData cstate) + data ChatroomData = ChatroomData { rdPrev :: [Stored (Signed ChatroomData)] diff --git a/src/Erebos/Conversation.hs b/src/Erebos/Conversation.hs index ff8396c..2c6f967 100644 --- a/src/Erebos/Conversation.hs +++ b/src/Erebos/Conversation.hs @@ -40,12 +40,10 @@ import Erebos.State import Erebos.Storable -data Message = DirectMessageMessage DirectMessage Bool - | ChatroomMessage ChatMessage Bool +data Message = forall conv msg. ConversationType conv msg => Message msg Bool withMessage :: (forall conv msg. ConversationType conv msg => msg -> a) -> Message -> a -withMessage f (DirectMessageMessage msg _) = f msg -withMessage f (ChatroomMessage msg _) = f msg +withMessage f (Message msg _) = f msg messageFrom :: Message -> ComposedIdentity messageFrom = withMessage convMessageFrom @@ -57,14 +55,15 @@ messageText :: Message -> Maybe Text messageText = withMessage convMessageText messageUnread :: Message -> Bool -messageUnread (DirectMessageMessage _ unread) = unread -messageUnread (ChatroomMessage _ unread) = unread +messageUnread (Message _ unread) = unread formatMessage :: TimeZone -> Message -> String formatMessage tzone msg = concat - [ formatTime defaultTimeLocale "[%H:%M] " $ utcToLocalTime tzone $ zonedTimeToUTC $ messageTime msg + [ if messageUnread msg then "\ESC[93m" else "" + , formatTime defaultTimeLocale "[%H:%M] " $ utcToLocalTime tzone $ zonedTimeToUTC $ messageTime msg , maybe "<unnamed>" T.unpack $ idName $ messageFrom msg , maybe "" ((": "<>) . T.unpack) $ messageText msg + , if messageUnread msg then "\ESC[0m" else "" ] @@ -72,6 +71,10 @@ data Conversation = DirectMessageConversation DirectMessageThread | ChatroomConversation ChatroomState +withConversation :: (forall conv msg. ConversationType conv msg => conv -> a) -> Conversation -> a +withConversation f (DirectMessageConversation conv) = f conv +withConversation f (ChatroomConversation conv) = f conv + isSameConversation :: Conversation -> Conversation -> Bool isSameConversation (DirectMessageConversation t) (DirectMessageConversation t') = sameIdentity (msgPeer t) (msgPeer t') @@ -113,8 +116,7 @@ conversationPeer (DirectMessageConversation thread) = Just $ msgPeer thread conversationPeer (ChatroomConversation _) = Nothing conversationHistory :: Conversation -> [ Message ] -conversationHistory (DirectMessageConversation thread) = map (\msg -> DirectMessageMessage msg False) $ dmThreadToList thread -conversationHistory (ChatroomConversation rstate) = map (\msg -> ChatroomMessage msg False) $ roomStateMessages rstate +conversationHistory = withConversation $ map (uncurry Message) . convMessageListSince Nothing sendMessage :: (MonadHead LocalState m, MonadError e m, FromErebosError e) => Conversation -> Text -> m () diff --git a/src/Erebos/Conversation/Class.hs b/src/Erebos/Conversation/Class.hs index 909dac6..6a28651 100644 --- a/src/Erebos/Conversation/Class.hs +++ b/src/Erebos/Conversation/Class.hs @@ -13,3 +13,4 @@ class (Typeable conv, Typeable msg) => ConversationType conv msg | conv -> msg, convMessageFrom :: msg -> ComposedIdentity convMessageTime :: msg -> ZonedTime convMessageText :: msg -> Maybe Text + convMessageListSince :: Maybe conv -> conv -> [ ( msg, Bool ) ] diff --git a/src/Erebos/DirectMessage.hs b/src/Erebos/DirectMessage.hs index 91cc045..dd10d35 100644 --- a/src/Erebos/DirectMessage.hs +++ b/src/Erebos/DirectMessage.hs @@ -50,6 +50,9 @@ instance ConversationType DirectMessageThread DirectMessage where convMessageTime = msgTime convMessageText = Just . msgText + convMessageListSince mbSince thread = + threadToListHelper (msgSeen thread) (maybe S.empty (S.fromAscList . msgHead) mbSince) (msgHead thread) + data DirectMessage = DirectMessage { msgFrom :: ComposedIdentity |