{-# Language OverloadedStrings, TemplateHaskell, PatternSynonyms #-}
module Client.Message
(
ClientMessage(..)
, msgNetwork
, msgBody
, msgTime
, MessageBody(..)
, _IrcBody
, _ErrorBody
, _NormalBody
, IrcSummary(..)
, msgSummary
, summaryActor
, QuitKind(..)
, msgText
) where
import Control.Lens
import Data.Maybe (isJust)
import Data.Text (Text)
import Data.Time (ZonedTime)
import Irc.Codes (ReplyCode, pattern RPL_NOWAWAY, pattern RPL_UNAWAY )
import Irc.Identifier (Identifier, mkId)
import Irc.Message (IrcMsg(..), ircMsgText, Source(srcUser))
import Irc.UserInfo ( UserInfo(userNick) )
data MessageBody
= IrcBody !IrcMsg
| ErrorBody {-# UNPACK #-} !Text
| NormalBody {-# UNPACK #-} !Text
makePrisms ''MessageBody
data ClientMessage = ClientMessage
{ ClientMessage -> Text
_msgNetwork :: !Text
, ClientMessage -> MessageBody
_msgBody :: !MessageBody
, ClientMessage -> ZonedTime
_msgTime :: !ZonedTime
}
makeLenses ''ClientMessage
data QuitKind
= NormalQuit
| MassQuit
deriving (QuitKind -> QuitKind -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: QuitKind -> QuitKind -> Bool
$c/= :: QuitKind -> QuitKind -> Bool
== :: QuitKind -> QuitKind -> Bool
$c== :: QuitKind -> QuitKind -> Bool
Eq, Int -> QuitKind -> ShowS
[QuitKind] -> ShowS
QuitKind -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [QuitKind] -> ShowS
$cshowList :: [QuitKind] -> ShowS
show :: QuitKind -> String
$cshow :: QuitKind -> String
showsPrec :: Int -> QuitKind -> ShowS
$cshowsPrec :: Int -> QuitKind -> ShowS
Show)
data IrcSummary
= JoinSummary {-# UNPACK #-} !Identifier
| QuitSummary {-# UNPACK #-} !Identifier !QuitKind
| PartSummary {-# UNPACK #-} !Identifier
| NickSummary {-# UNPACK #-} !Identifier {-# UNPACK #-} !Identifier
| ReplySummary {-# UNPACK #-} !ReplyCode
| ChatSummary {-# UNPACK #-} !UserInfo
| CtcpSummary {-# UNPACK #-} !Identifier
| ChngSummary {-# UNPACK #-} !Identifier
| AcctSummary {-# UNPACK #-} !Identifier
| AwaySummary {-# UNPACK #-} !Identifier !Bool
| NoSummary
deriving (IrcSummary -> IrcSummary -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: IrcSummary -> IrcSummary -> Bool
$c/= :: IrcSummary -> IrcSummary -> Bool
== :: IrcSummary -> IrcSummary -> Bool
$c== :: IrcSummary -> IrcSummary -> Bool
Eq, Int -> IrcSummary -> ShowS
[IrcSummary] -> ShowS
IrcSummary -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [IrcSummary] -> ShowS
$cshowList :: [IrcSummary] -> ShowS
show :: IrcSummary -> String
$cshow :: IrcSummary -> String
showsPrec :: Int -> IrcSummary -> ShowS
$cshowsPrec :: Int -> IrcSummary -> ShowS
Show)
msgText :: MessageBody -> Text
msgText :: MessageBody -> Text
msgText (IrcBody IrcMsg
irc) = IrcMsg -> Text
ircMsgText IrcMsg
irc
msgText (ErrorBody Text
txt) = Text
txt
msgText (NormalBody Text
txt) = Text
txt
msgSummary :: MessageBody -> IrcSummary
msgSummary :: MessageBody -> IrcSummary
msgSummary (IrcBody IrcMsg
irc) = IrcMsg -> IrcSummary
ircSummary IrcMsg
irc
msgSummary (ErrorBody Text
_ ) = IrcSummary
NoSummary
msgSummary (NormalBody Text
_ ) = IrcSummary
NoSummary
ircSummary :: IrcMsg -> IrcSummary
ircSummary :: IrcMsg -> IrcSummary
ircSummary IrcMsg
msg =
case IrcMsg
msg of
Join Source
who Identifier
_ Text
_ Text
_ -> Identifier -> IrcSummary
JoinSummary (UserInfo -> Identifier
userNick (Source -> UserInfo
srcUser Source
who))
Part Source
who Identifier
_ Maybe Text
_ -> Identifier -> IrcSummary
PartSummary (UserInfo -> Identifier
userNick (Source -> UserInfo
srcUser Source
who))
Quit Source
who Maybe Text
mbTxt -> Identifier -> QuitKind -> IrcSummary
QuitSummary (UserInfo -> Identifier
userNick (Source -> UserInfo
srcUser Source
who)) (Maybe Text -> QuitKind
quitKind Maybe Text
mbTxt)
Nick Source
who Identifier
who' -> Identifier -> Identifier -> IrcSummary
NickSummary (UserInfo -> Identifier
userNick (Source -> UserInfo
srcUser Source
who)) Identifier
who'
Privmsg Source
who Identifier
_ Text
_ -> UserInfo -> IrcSummary
ChatSummary (Source -> UserInfo
srcUser Source
who)
Notice Source
who Identifier
_ Text
_ -> UserInfo -> IrcSummary
ChatSummary (Source -> UserInfo
srcUser Source
who)
Ctcp Source
who Identifier
_ Text
"ACTION" Text
_ -> UserInfo -> IrcSummary
ChatSummary (Source -> UserInfo
srcUser Source
who)
Ctcp Source
who Identifier
_ Text
_ Text
_ -> Identifier -> IrcSummary
CtcpSummary (UserInfo -> Identifier
userNick (Source -> UserInfo
srcUser Source
who))
CtcpNotice Source
who Identifier
_ Text
_ Text
_ -> UserInfo -> IrcSummary
ChatSummary (Source -> UserInfo
srcUser Source
who)
Reply Text
_ ReplyCode
RPL_NOWAWAY (Text
who:[Text]
_) -> Identifier -> Bool -> IrcSummary
AwaySummary (Text -> Identifier
mkId Text
who) Bool
True
Reply Text
_ ReplyCode
RPL_UNAWAY (Text
who:[Text]
_) -> Identifier -> Bool -> IrcSummary
AwaySummary (Text -> Identifier
mkId Text
who) Bool
False
Reply Text
_ ReplyCode
code [Text]
_ -> ReplyCode -> IrcSummary
ReplySummary ReplyCode
code
Account Source
who Text
_ -> Identifier -> IrcSummary
AcctSummary (UserInfo -> Identifier
userNick (Source -> UserInfo
srcUser Source
who))
Chghost Source
who Text
_ Text
_ -> Identifier -> IrcSummary
ChngSummary (UserInfo -> Identifier
userNick (Source -> UserInfo
srcUser Source
who))
Away Source
who Maybe Text
mb -> Identifier -> Bool -> IrcSummary
AwaySummary (UserInfo -> Identifier
userNick (Source -> UserInfo
srcUser Source
who)) (forall a. Maybe a -> Bool
isJust Maybe Text
mb)
IrcMsg
_ -> IrcSummary
NoSummary
quitKind :: Maybe Text -> QuitKind
quitKind :: Maybe Text -> QuitKind
quitKind Maybe Text
mbReason =
case Maybe Text
mbReason of
Just Text
"*.net *.split" -> QuitKind
MassQuit
Maybe Text
_ -> QuitKind
NormalQuit
summaryActor :: IrcSummary -> Maybe Identifier
summaryActor :: IrcSummary -> Maybe Identifier
summaryActor IrcSummary
s =
case IrcSummary
s of
JoinSummary Identifier
who -> forall a. a -> Maybe a
Just Identifier
who
QuitSummary Identifier
who QuitKind
_ -> forall a. a -> Maybe a
Just Identifier
who
PartSummary Identifier
who -> forall a. a -> Maybe a
Just Identifier
who
NickSummary Identifier
who Identifier
_ -> forall a. a -> Maybe a
Just Identifier
who
ChatSummary UserInfo
who -> forall a. a -> Maybe a
Just (UserInfo -> Identifier
userNick UserInfo
who)
CtcpSummary Identifier
who -> forall a. a -> Maybe a
Just Identifier
who
AcctSummary Identifier
who -> forall a. a -> Maybe a
Just Identifier
who
ChngSummary Identifier
who -> forall a. a -> Maybe a
Just Identifier
who
AwaySummary Identifier
who Bool
_ -> forall a. a -> Maybe a
Just Identifier
who
ReplySummary {} -> forall a. Maybe a
Nothing
IrcSummary
NoSummary -> forall a. Maybe a
Nothing