summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Erebos/Chatroom.hs3
-rw-r--r--src/Erebos/Conversation.hs20
-rw-r--r--src/Erebos/Conversation/Class.hs1
-rw-r--r--src/Erebos/DirectMessage.hs3
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