summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2026-06-23 21:43:56 +0200
committerRoman Smrž <roman.smrz@seznam.cz>2026-06-24 22:10:58 +0200
commite5d8ca9c124c4f8805bba9212845f0e21de5d9fc (patch)
treeddd83d83591d5cd4f23c593095f101f48a6581ae
parent32d93542af615cd5d7853916623b5c39c54abd1e (diff)
Format chatroom messages with Conversation module
-rw-r--r--main/Main.hs8
-rw-r--r--src/Erebos/Chatroom.hs5
-rw-r--r--src/Erebos/Conversation.hs12
-rw-r--r--src/Erebos/Conversation/Class.hs8
4 files changed, 22 insertions, 11 deletions
diff --git a/main/Main.hs b/main/Main.hs
index 5496315..4d1c5d6 100644
--- a/main/Main.hs
+++ b/main/Main.hs
@@ -24,7 +24,6 @@ import Data.Text (Text)
import Data.Text qualified as T
import Data.Text.Encoding qualified as T
import Data.Text.IO qualified as T
-import Data.Time.Format
import Data.Time.LocalTime
import Data.Typeable
@@ -985,12 +984,7 @@ watchChatroomsForCli tui eprint h chatroomSetVar contextVar contextOptsVar autoS
when (not tui || isSelected) $ do
tzone <- getCurrentTimeZone
forM_ (reverse $ getMessagesSinceState rstate oldroom) $ \msg -> do
- eprint $ plainText $ T.concat
- [ T.pack $ formatTime defaultTimeLocale "[%H:%M] " $ utcToLocalTime tzone $ zonedTimeToUTC $ cmsgTime msg
- , fromMaybe "<unnamed>" $ idName $ cmsgFrom msg
- , if cmsgLeave msg then " left" else ""
- , maybe (if cmsgLeave msg then "" else " joined") ((": " <>)) $ cmsgText msg
- ]
+ eprint $ formatMessageLine tzone $ makeMessage False msg
modifyMVar_ subscribedNumVar $ return
. (if roomStateSubscribe rstate then (+ 1) else id)
. (if roomStateSubscribe oldroom then subtract 1 else id)
diff --git a/src/Erebos/Chatroom.hs b/src/Erebos/Chatroom.hs
index fce8b1d..c535845 100644
--- a/src/Erebos/Chatroom.hs
+++ b/src/Erebos/Chatroom.hs
@@ -67,6 +67,11 @@ instance ConversationType ChatroomState ChatMessage where
convMessageTime = cmsgTime
convMessageText = cmsgText
+ convMessageExtra msg
+ | cmsgLeave msg = [ UserLeft ]
+ | Nothing <- cmsgText msg = [ UserJoined ]
+ | otherwise = []
+
convReference = refDigest . storedRef . head . filterAncestors . concatMap storedRoots . roomStateData
convMessageListSince mbSince cstate = ( 0, ) $
diff --git a/src/Erebos/Conversation.hs b/src/Erebos/Conversation.hs
index 0e6690e..78774bd 100644
--- a/src/Erebos/Conversation.hs
+++ b/src/Erebos/Conversation.hs
@@ -74,11 +74,15 @@ formatMessage :: TimeZone -> Message -> String
formatMessage tzone = T.unpack . renderPlainText . formatMessageFT tzone
formatMessageFT :: TimeZone -> Message -> FormattedText
-formatMessageFT tzone msg = mconcat
- [ PlainText $ T.pack $ formatTime defaultTimeLocale "[%H:%M] " $ utcToLocalTime tzone $ zonedTimeToUTC $ messageTime msg
- , maybe "<unnamed>" PlainText $ idName $ messageFrom msg
- , maybe "" ((": " <>) . PlainText) $ messageText msg
+formatMessageFT tzone msg = mconcat $ concat
+ [ [ PlainText $ T.pack $ formatTime defaultTimeLocale "[%H:%M] " $ utcToLocalTime tzone $ zonedTimeToUTC $ messageTime msg ]
+ , [ maybe "<unnamed>" PlainText $ idName $ messageFrom msg ]
+ , map formatExtra $ withMessage convMessageExtra msg
+ , [ maybe "" ((": " <>) . PlainText) $ messageText msg ]
]
+ where
+ formatExtra UserJoined = " " <> withStyle (setForegroundColor BrightMagenta noStyle) (plainText "joined")
+ formatExtra UserLeft = " " <> withStyle (setForegroundColor Magenta noStyle) (plainText "left")
data Conversation
diff --git a/src/Erebos/Conversation/Class.hs b/src/Erebos/Conversation/Class.hs
index d7bac5d..7c3652d 100644
--- a/src/Erebos/Conversation/Class.hs
+++ b/src/Erebos/Conversation/Class.hs
@@ -1,5 +1,6 @@
module Erebos.Conversation.Class (
ConversationType(..),
+ MessageExtra(..),
RefDigest,
) where
@@ -15,10 +16,17 @@ import Erebos.Object
import Erebos.State
+data MessageExtra
+ = UserJoined
+ | UserLeft
+
+
class (Typeable conv, Typeable msg) => ConversationType conv msg | conv -> msg, msg -> conv where
convMessageFrom :: msg -> ComposedIdentity
convMessageTime :: msg -> ZonedTime
convMessageText :: msg -> Maybe Text
+ convMessageExtra :: msg -> [ MessageExtra ]
+ convMessageExtra _ = []
convReference :: conv -> RefDigest
convMessageListSince