diff options
Diffstat (limited to 'src/Erebos/Conversation.hs')
| -rw-r--r-- | src/Erebos/Conversation.hs | 20 |
1 files changed, 11 insertions, 9 deletions
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 () |