{-# Language OverloadedStrings #-}
module Irc.Message
(
IrcMsg(..)
, CapCmd(..)
, CapMore(..)
, cookIrcMsg
, MessageTarget(..)
, ircMsgText
, msgTarget
, msgActor
, nickSplit
, computeMaxMessageLength
, capCmdText
) where
import Control.Monad
import Data.Function
import Data.Maybe
import Data.Text (Text)
import qualified Data.Text as Text
import Data.Text.Read as Text
import Irc.Identifier
import Irc.RawIrcMsg
import Irc.UserInfo
import Irc.Codes
import View
data IrcMsg
= UnknownMsg !RawIrcMsg
| Reply !ReplyCode [Text]
| Nick !UserInfo !Identifier
| Join !UserInfo !Identifier !Text !Text
| Part !UserInfo !Identifier (Maybe Text)
| Quit !UserInfo (Maybe Text)
| Kick !UserInfo !Identifier !Identifier !Text
| Topic !UserInfo !Identifier !Text
| Privmsg !UserInfo !Identifier !Text
| Ctcp !UserInfo !Identifier !Text !Text
| CtcpNotice !UserInfo !Identifier !Text !Text
| Notice !UserInfo !Identifier !Text
| Mode !UserInfo !Identifier [Text]
| Authenticate !Text
| Cap !CapCmd
| Ping [Text]
| Pong [Text]
| Error !Text
| BatchStart !Text !Text [Text]
| BatchEnd !Text
| Account !UserInfo !Text
| Chghost !UserInfo !Text !Text
| Wallops !UserInfo !Text
deriving Int -> IrcMsg -> ShowS
[IrcMsg] -> ShowS
IrcMsg -> String
(Int -> IrcMsg -> ShowS)
-> (IrcMsg -> String) -> ([IrcMsg] -> ShowS) -> Show IrcMsg
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [IrcMsg] -> ShowS
$cshowList :: [IrcMsg] -> ShowS
show :: IrcMsg -> String
$cshow :: IrcMsg -> String
showsPrec :: Int -> IrcMsg -> ShowS
$cshowsPrec :: Int -> IrcMsg -> ShowS
Show
data CapMore = CapMore | CapDone
deriving (Int -> CapMore -> ShowS
[CapMore] -> ShowS
CapMore -> String
(Int -> CapMore -> ShowS)
-> (CapMore -> String) -> ([CapMore] -> ShowS) -> Show CapMore
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CapMore] -> ShowS
$cshowList :: [CapMore] -> ShowS
show :: CapMore -> String
$cshow :: CapMore -> String
showsPrec :: Int -> CapMore -> ShowS
$cshowsPrec :: Int -> CapMore -> ShowS
Show, ReadPrec [CapMore]
ReadPrec CapMore
Int -> ReadS CapMore
ReadS [CapMore]
(Int -> ReadS CapMore)
-> ReadS [CapMore]
-> ReadPrec CapMore
-> ReadPrec [CapMore]
-> Read CapMore
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CapMore]
$creadListPrec :: ReadPrec [CapMore]
readPrec :: ReadPrec CapMore
$creadPrec :: ReadPrec CapMore
readList :: ReadS [CapMore]
$creadList :: ReadS [CapMore]
readsPrec :: Int -> ReadS CapMore
$creadsPrec :: Int -> ReadS CapMore
Read, CapMore -> CapMore -> Bool
(CapMore -> CapMore -> Bool)
-> (CapMore -> CapMore -> Bool) -> Eq CapMore
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CapMore -> CapMore -> Bool
$c/= :: CapMore -> CapMore -> Bool
== :: CapMore -> CapMore -> Bool
$c== :: CapMore -> CapMore -> Bool
Eq, Eq CapMore
Eq CapMore =>
(CapMore -> CapMore -> Ordering)
-> (CapMore -> CapMore -> Bool)
-> (CapMore -> CapMore -> Bool)
-> (CapMore -> CapMore -> Bool)
-> (CapMore -> CapMore -> Bool)
-> (CapMore -> CapMore -> CapMore)
-> (CapMore -> CapMore -> CapMore)
-> Ord CapMore
CapMore -> CapMore -> Bool
CapMore -> CapMore -> Ordering
CapMore -> CapMore -> CapMore
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: CapMore -> CapMore -> CapMore
$cmin :: CapMore -> CapMore -> CapMore
max :: CapMore -> CapMore -> CapMore
$cmax :: CapMore -> CapMore -> CapMore
>= :: CapMore -> CapMore -> Bool
$c>= :: CapMore -> CapMore -> Bool
> :: CapMore -> CapMore -> Bool
$c> :: CapMore -> CapMore -> Bool
<= :: CapMore -> CapMore -> Bool
$c<= :: CapMore -> CapMore -> Bool
< :: CapMore -> CapMore -> Bool
$c< :: CapMore -> CapMore -> Bool
compare :: CapMore -> CapMore -> Ordering
$ccompare :: CapMore -> CapMore -> Ordering
$cp1Ord :: Eq CapMore
Ord)
data CapCmd
= CapLs !CapMore [(Text, Maybe Text)]
| CapList [Text]
| CapAck [Text]
| CapNak [Text]
| CapNew [(Text, Maybe Text)]
| CapDel [Text]
deriving (Int -> CapCmd -> ShowS
[CapCmd] -> ShowS
CapCmd -> String
(Int -> CapCmd -> ShowS)
-> (CapCmd -> String) -> ([CapCmd] -> ShowS) -> Show CapCmd
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CapCmd] -> ShowS
$cshowList :: [CapCmd] -> ShowS
show :: CapCmd -> String
$cshow :: CapCmd -> String
showsPrec :: Int -> CapCmd -> ShowS
$cshowsPrec :: Int -> CapCmd -> ShowS
Show, ReadPrec [CapCmd]
ReadPrec CapCmd
Int -> ReadS CapCmd
ReadS [CapCmd]
(Int -> ReadS CapCmd)
-> ReadS [CapCmd]
-> ReadPrec CapCmd
-> ReadPrec [CapCmd]
-> Read CapCmd
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CapCmd]
$creadListPrec :: ReadPrec [CapCmd]
readPrec :: ReadPrec CapCmd
$creadPrec :: ReadPrec CapCmd
readList :: ReadS [CapCmd]
$creadList :: ReadS [CapCmd]
readsPrec :: Int -> ReadS CapCmd
$creadsPrec :: Int -> ReadS CapCmd
Read, CapCmd -> CapCmd -> Bool
(CapCmd -> CapCmd -> Bool)
-> (CapCmd -> CapCmd -> Bool) -> Eq CapCmd
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CapCmd -> CapCmd -> Bool
$c/= :: CapCmd -> CapCmd -> Bool
== :: CapCmd -> CapCmd -> Bool
$c== :: CapCmd -> CapCmd -> Bool
Eq, Eq CapCmd
Eq CapCmd =>
(CapCmd -> CapCmd -> Ordering)
-> (CapCmd -> CapCmd -> Bool)
-> (CapCmd -> CapCmd -> Bool)
-> (CapCmd -> CapCmd -> Bool)
-> (CapCmd -> CapCmd -> Bool)
-> (CapCmd -> CapCmd -> CapCmd)
-> (CapCmd -> CapCmd -> CapCmd)
-> Ord CapCmd
CapCmd -> CapCmd -> Bool
CapCmd -> CapCmd -> Ordering
CapCmd -> CapCmd -> CapCmd
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: CapCmd -> CapCmd -> CapCmd
$cmin :: CapCmd -> CapCmd -> CapCmd
max :: CapCmd -> CapCmd -> CapCmd
$cmax :: CapCmd -> CapCmd -> CapCmd
>= :: CapCmd -> CapCmd -> Bool
$c>= :: CapCmd -> CapCmd -> Bool
> :: CapCmd -> CapCmd -> Bool
$c> :: CapCmd -> CapCmd -> Bool
<= :: CapCmd -> CapCmd -> Bool
$c<= :: CapCmd -> CapCmd -> Bool
< :: CapCmd -> CapCmd -> Bool
$c< :: CapCmd -> CapCmd -> Bool
compare :: CapCmd -> CapCmd -> Ordering
$ccompare :: CapCmd -> CapCmd -> Ordering
$cp1Ord :: Eq CapCmd
Ord)
cookCapCmd :: Text -> [Text] -> Maybe CapCmd
cookCapCmd :: Text -> [Text] -> Maybe CapCmd
cookCapCmd cmd :: Text
cmd args :: [Text]
args =
case (Text
cmd, [Text]
args) of
("LS" , ["*", caps :: Text
caps]) -> CapCmd -> Maybe CapCmd
forall a. a -> Maybe a
Just (CapMore -> [(Text, Maybe Text)] -> CapCmd
CapLs CapMore
CapMore (Text -> [(Text, Maybe Text)]
splitCapList Text
caps))
("LS" , [ caps :: Text
caps]) -> CapCmd -> Maybe CapCmd
forall a. a -> Maybe a
Just (CapMore -> [(Text, Maybe Text)] -> CapCmd
CapLs CapMore
CapDone (Text -> [(Text, Maybe Text)]
splitCapList Text
caps))
("LIST", [ caps :: Text
caps]) -> CapCmd -> Maybe CapCmd
forall a. a -> Maybe a
Just ([Text] -> CapCmd
CapList (Text -> [Text]
Text.words Text
caps))
("ACK" , [ caps :: Text
caps]) -> CapCmd -> Maybe CapCmd
forall a. a -> Maybe a
Just ([Text] -> CapCmd
CapAck (Text -> [Text]
Text.words Text
caps))
("NAK" , [ caps :: Text
caps]) -> CapCmd -> Maybe CapCmd
forall a. a -> Maybe a
Just ([Text] -> CapCmd
CapNak (Text -> [Text]
Text.words Text
caps))
("NEW" , [ caps :: Text
caps]) -> CapCmd -> Maybe CapCmd
forall a. a -> Maybe a
Just ([(Text, Maybe Text)] -> CapCmd
CapNew (Text -> [(Text, Maybe Text)]
splitCapList Text
caps))
("DEL" , [ caps :: Text
caps]) -> CapCmd -> Maybe CapCmd
forall a. a -> Maybe a
Just ([Text] -> CapCmd
CapDel (Text -> [Text]
Text.words Text
caps))
_ -> Maybe CapCmd
forall a. Maybe a
Nothing
cookIrcMsg :: RawIrcMsg -> IrcMsg
cookIrcMsg :: RawIrcMsg -> IrcMsg
cookIrcMsg msg :: RawIrcMsg
msg =
case ((Text -> Const Text Text) -> RawIrcMsg -> Const Text RawIrcMsg)
-> RawIrcMsg -> Text
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view (Text -> Const Text Text) -> RawIrcMsg -> Const Text RawIrcMsg
forall (f :: * -> *).
Functor f =>
(Text -> f Text) -> RawIrcMsg -> f RawIrcMsg
msgCommand RawIrcMsg
msg of
cmd :: Text
cmd | Right (n :: Word
n,"") <- Reader Word
forall a. Integral a => Reader a
decimal Text
cmd ->
ReplyCode -> [Text] -> IrcMsg
Reply (Word -> ReplyCode
ReplyCode Word
n) ((([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg)
-> RawIrcMsg -> [Text]
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view ([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg
forall (f :: * -> *).
Functor f =>
([Text] -> f [Text]) -> RawIrcMsg -> f RawIrcMsg
msgParams RawIrcMsg
msg)
"CAP" | _target :: Text
_target:cmdTxt :: Text
cmdTxt:rest :: [Text]
rest <- (([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg)
-> RawIrcMsg -> [Text]
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view ([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg
forall (f :: * -> *).
Functor f =>
([Text] -> f [Text]) -> RawIrcMsg -> f RawIrcMsg
msgParams RawIrcMsg
msg
, Just cmd :: CapCmd
cmd <- Text -> [Text] -> Maybe CapCmd
cookCapCmd Text
cmdTxt [Text]
rest -> CapCmd -> IrcMsg
Cap CapCmd
cmd
"AUTHENTICATE" | x :: Text
x:_ <- (([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg)
-> RawIrcMsg -> [Text]
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view ([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg
forall (f :: * -> *).
Functor f =>
([Text] -> f [Text]) -> RawIrcMsg -> f RawIrcMsg
msgParams RawIrcMsg
msg ->
Text -> IrcMsg
Authenticate Text
x
"PING" -> [Text] -> IrcMsg
Ping ((([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg)
-> RawIrcMsg -> [Text]
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view ([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg
forall (f :: * -> *).
Functor f =>
([Text] -> f [Text]) -> RawIrcMsg -> f RawIrcMsg
msgParams RawIrcMsg
msg)
"PONG" -> [Text] -> IrcMsg
Pong ((([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg)
-> RawIrcMsg -> [Text]
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view ([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg
forall (f :: * -> *).
Functor f =>
([Text] -> f [Text]) -> RawIrcMsg -> f RawIrcMsg
msgParams RawIrcMsg
msg)
"PRIVMSG" | Just user :: UserInfo
user <- ((Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg)
-> RawIrcMsg -> Maybe UserInfo
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view (Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg
forall (f :: * -> *).
Functor f =>
(Maybe UserInfo -> f (Maybe UserInfo)) -> RawIrcMsg -> f RawIrcMsg
msgPrefix RawIrcMsg
msg
, [chan :: Text
chan,txt :: Text
txt] <- (([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg)
-> RawIrcMsg -> [Text]
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view ([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg
forall (f :: * -> *).
Functor f =>
([Text] -> f [Text]) -> RawIrcMsg -> f RawIrcMsg
msgParams RawIrcMsg
msg ->
case Text -> Maybe (Text, Text)
parseCtcp Text
txt of
Just (cmd :: Text
cmd,args :: Text
args) -> UserInfo -> Identifier -> Text -> Text -> IrcMsg
Ctcp UserInfo
user (Text -> Identifier
mkId Text
chan) (Text -> Text
Text.toUpper Text
cmd) Text
args
Nothing -> UserInfo -> Identifier -> Text -> IrcMsg
Privmsg UserInfo
user (Text -> Identifier
mkId Text
chan) Text
txt
"NOTICE" | Just user :: UserInfo
user <- ((Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg)
-> RawIrcMsg -> Maybe UserInfo
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view (Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg
forall (f :: * -> *).
Functor f =>
(Maybe UserInfo -> f (Maybe UserInfo)) -> RawIrcMsg -> f RawIrcMsg
msgPrefix RawIrcMsg
msg
, [chan :: Text
chan,txt :: Text
txt] <- (([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg)
-> RawIrcMsg -> [Text]
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view ([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg
forall (f :: * -> *).
Functor f =>
([Text] -> f [Text]) -> RawIrcMsg -> f RawIrcMsg
msgParams RawIrcMsg
msg ->
case Text -> Maybe (Text, Text)
parseCtcp Text
txt of
Just (cmd :: Text
cmd,args :: Text
args) -> UserInfo -> Identifier -> Text -> Text -> IrcMsg
CtcpNotice UserInfo
user (Text -> Identifier
mkId Text
chan) (Text -> Text
Text.toUpper Text
cmd) Text
args
Nothing -> UserInfo -> Identifier -> Text -> IrcMsg
Notice UserInfo
user (Text -> Identifier
mkId Text
chan) Text
txt
"JOIN" | Just user :: UserInfo
user <- ((Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg)
-> RawIrcMsg -> Maybe UserInfo
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view (Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg
forall (f :: * -> *).
Functor f =>
(Maybe UserInfo -> f (Maybe UserInfo)) -> RawIrcMsg -> f RawIrcMsg
msgPrefix RawIrcMsg
msg
, chan :: Text
chan:rest :: [Text]
rest <- (([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg)
-> RawIrcMsg -> [Text]
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view ([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg
forall (f :: * -> *).
Functor f =>
([Text] -> f [Text]) -> RawIrcMsg -> f RawIrcMsg
msgParams RawIrcMsg
msg
, let (a :: Text
a, r :: Text
r) = case [Text]
rest of
[acct :: Text
acct, real :: Text
real] -> (Text
acct, Text
real)
_ -> ("", "") ->
UserInfo -> Identifier -> Text -> Text -> IrcMsg
Join UserInfo
user (Text -> Identifier
mkId Text
chan) Text
a Text
r
"QUIT" | Just user :: UserInfo
user <- ((Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg)
-> RawIrcMsg -> Maybe UserInfo
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view (Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg
forall (f :: * -> *).
Functor f =>
(Maybe UserInfo -> f (Maybe UserInfo)) -> RawIrcMsg -> f RawIrcMsg
msgPrefix RawIrcMsg
msg
, [Text]
reasons <- (([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg)
-> RawIrcMsg -> [Text]
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view ([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg
forall (f :: * -> *).
Functor f =>
([Text] -> f [Text]) -> RawIrcMsg -> f RawIrcMsg
msgParams RawIrcMsg
msg ->
UserInfo -> Maybe Text -> IrcMsg
Quit UserInfo
user ([Text] -> Maybe Text
forall a. [a] -> Maybe a
listToMaybe [Text]
reasons)
"PART" | Just user :: UserInfo
user <- ((Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg)
-> RawIrcMsg -> Maybe UserInfo
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view (Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg
forall (f :: * -> *).
Functor f =>
(Maybe UserInfo -> f (Maybe UserInfo)) -> RawIrcMsg -> f RawIrcMsg
msgPrefix RawIrcMsg
msg
, chan :: Text
chan:reasons :: [Text]
reasons <- (([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg)
-> RawIrcMsg -> [Text]
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view ([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg
forall (f :: * -> *).
Functor f =>
([Text] -> f [Text]) -> RawIrcMsg -> f RawIrcMsg
msgParams RawIrcMsg
msg ->
UserInfo -> Identifier -> Maybe Text -> IrcMsg
Part UserInfo
user (Text -> Identifier
mkId Text
chan) ([Text] -> Maybe Text
forall a. [a] -> Maybe a
listToMaybe [Text]
reasons)
"NICK" | Just user :: UserInfo
user <- ((Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg)
-> RawIrcMsg -> Maybe UserInfo
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view (Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg
forall (f :: * -> *).
Functor f =>
(Maybe UserInfo -> f (Maybe UserInfo)) -> RawIrcMsg -> f RawIrcMsg
msgPrefix RawIrcMsg
msg
, newNick :: Text
newNick:_ <- (([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg)
-> RawIrcMsg -> [Text]
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view ([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg
forall (f :: * -> *).
Functor f =>
([Text] -> f [Text]) -> RawIrcMsg -> f RawIrcMsg
msgParams RawIrcMsg
msg ->
UserInfo -> Identifier -> IrcMsg
Nick UserInfo
user (Text -> Identifier
mkId Text
newNick)
"KICK" | Just user :: UserInfo
user <- ((Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg)
-> RawIrcMsg -> Maybe UserInfo
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view (Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg
forall (f :: * -> *).
Functor f =>
(Maybe UserInfo -> f (Maybe UserInfo)) -> RawIrcMsg -> f RawIrcMsg
msgPrefix RawIrcMsg
msg
, [chan :: Text
chan,nick :: Text
nick,reason :: Text
reason] <- (([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg)
-> RawIrcMsg -> [Text]
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view ([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg
forall (f :: * -> *).
Functor f =>
([Text] -> f [Text]) -> RawIrcMsg -> f RawIrcMsg
msgParams RawIrcMsg
msg ->
UserInfo -> Identifier -> Identifier -> Text -> IrcMsg
Kick UserInfo
user (Text -> Identifier
mkId Text
chan) (Text -> Identifier
mkId Text
nick) Text
reason
"TOPIC" | Just user :: UserInfo
user <- ((Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg)
-> RawIrcMsg -> Maybe UserInfo
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view (Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg
forall (f :: * -> *).
Functor f =>
(Maybe UserInfo -> f (Maybe UserInfo)) -> RawIrcMsg -> f RawIrcMsg
msgPrefix RawIrcMsg
msg
, [chan :: Text
chan,topic :: Text
topic] <- (([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg)
-> RawIrcMsg -> [Text]
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view ([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg
forall (f :: * -> *).
Functor f =>
([Text] -> f [Text]) -> RawIrcMsg -> f RawIrcMsg
msgParams RawIrcMsg
msg ->
UserInfo -> Identifier -> Text -> IrcMsg
Topic UserInfo
user (Text -> Identifier
mkId Text
chan) Text
topic
"MODE" | Just user :: UserInfo
user <- ((Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg)
-> RawIrcMsg -> Maybe UserInfo
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view (Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg
forall (f :: * -> *).
Functor f =>
(Maybe UserInfo -> f (Maybe UserInfo)) -> RawIrcMsg -> f RawIrcMsg
msgPrefix RawIrcMsg
msg
, target :: Text
target:modes :: [Text]
modes <- (([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg)
-> RawIrcMsg -> [Text]
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view ([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg
forall (f :: * -> *).
Functor f =>
([Text] -> f [Text]) -> RawIrcMsg -> f RawIrcMsg
msgParams RawIrcMsg
msg ->
UserInfo -> Identifier -> [Text] -> IrcMsg
Mode UserInfo
user (Text -> Identifier
mkId Text
target) [Text]
modes
"ERROR" | [reason :: Text
reason] <- (([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg)
-> RawIrcMsg -> [Text]
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view ([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg
forall (f :: * -> *).
Functor f =>
([Text] -> f [Text]) -> RawIrcMsg -> f RawIrcMsg
msgParams RawIrcMsg
msg ->
Text -> IrcMsg
Error Text
reason
"BATCH" | refid :: Text
refid : ty :: Text
ty : params :: [Text]
params <- (([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg)
-> RawIrcMsg -> [Text]
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view ([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg
forall (f :: * -> *).
Functor f =>
([Text] -> f [Text]) -> RawIrcMsg -> f RawIrcMsg
msgParams RawIrcMsg
msg
, Just ('+',refid' :: Text
refid') <- Text -> Maybe (Char, Text)
Text.uncons Text
refid ->
Text -> Text -> [Text] -> IrcMsg
BatchStart Text
refid' Text
ty [Text]
params
"BATCH" | [refid :: Text
refid] <- (([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg)
-> RawIrcMsg -> [Text]
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view ([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg
forall (f :: * -> *).
Functor f =>
([Text] -> f [Text]) -> RawIrcMsg -> f RawIrcMsg
msgParams RawIrcMsg
msg
, Just ('-',refid' :: Text
refid') <- Text -> Maybe (Char, Text)
Text.uncons Text
refid ->
Text -> IrcMsg
BatchEnd Text
refid'
"ACCOUNT" | Just user :: UserInfo
user <- ((Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg)
-> RawIrcMsg -> Maybe UserInfo
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view (Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg
forall (f :: * -> *).
Functor f =>
(Maybe UserInfo -> f (Maybe UserInfo)) -> RawIrcMsg -> f RawIrcMsg
msgPrefix RawIrcMsg
msg
, [acct :: Text
acct] <- (([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg)
-> RawIrcMsg -> [Text]
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view ([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg
forall (f :: * -> *).
Functor f =>
([Text] -> f [Text]) -> RawIrcMsg -> f RawIrcMsg
msgParams RawIrcMsg
msg ->
UserInfo -> Text -> IrcMsg
Account UserInfo
user (if Text
acct Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== "*" then "" else Text
acct)
"CHGHOST" | Just user :: UserInfo
user <- ((Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg)
-> RawIrcMsg -> Maybe UserInfo
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view (Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg
forall (f :: * -> *).
Functor f =>
(Maybe UserInfo -> f (Maybe UserInfo)) -> RawIrcMsg -> f RawIrcMsg
msgPrefix RawIrcMsg
msg
, [newuser :: Text
newuser, newhost :: Text
newhost] <- (([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg)
-> RawIrcMsg -> [Text]
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view ([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg
forall (f :: * -> *).
Functor f =>
([Text] -> f [Text]) -> RawIrcMsg -> f RawIrcMsg
msgParams RawIrcMsg
msg ->
UserInfo -> Text -> Text -> IrcMsg
Chghost UserInfo
user Text
newuser Text
newhost
"WALLOPS" | Just user :: UserInfo
user <- ((Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg)
-> RawIrcMsg -> Maybe UserInfo
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view (Maybe UserInfo -> Const (Maybe UserInfo) (Maybe UserInfo))
-> RawIrcMsg -> Const (Maybe UserInfo) RawIrcMsg
forall (f :: * -> *).
Functor f =>
(Maybe UserInfo -> f (Maybe UserInfo)) -> RawIrcMsg -> f RawIrcMsg
msgPrefix RawIrcMsg
msg
, [txt :: Text
txt] <- (([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg)
-> RawIrcMsg -> [Text]
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view ([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg
forall (f :: * -> *).
Functor f =>
([Text] -> f [Text]) -> RawIrcMsg -> f RawIrcMsg
msgParams RawIrcMsg
msg ->
UserInfo -> Text -> IrcMsg
Wallops UserInfo
user Text
txt
_ -> RawIrcMsg -> IrcMsg
UnknownMsg RawIrcMsg
msg
parseCtcp :: Text -> Maybe (Text, Text)
parseCtcp :: Text -> Maybe (Text, Text)
parseCtcp txt :: Text
txt =
do Text
txt1 <- Text -> Text -> Maybe Text
Text.stripSuffix "\^A" (Text -> Maybe Text) -> Maybe Text -> Maybe Text
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Text -> Text -> Maybe Text
Text.stripPrefix "\^A" Text
txt
let (cmd :: Text
cmd,args :: Text
args) = (Char -> Bool) -> Text -> (Text, Text)
Text.break (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==' ') Text
txt1
Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> Bool
not (Text -> Bool
Text.null Text
cmd))
(Text, Text) -> Maybe (Text, Text)
forall (m :: * -> *) a. Monad m => a -> m a
return (Text
cmd, Int -> Text -> Text
Text.drop 1 Text
args)
data MessageTarget
= TargetUser !Identifier
| TargetWindow !Identifier
| TargetNetwork
| TargetHidden
deriving (Int -> MessageTarget -> ShowS
[MessageTarget] -> ShowS
MessageTarget -> String
(Int -> MessageTarget -> ShowS)
-> (MessageTarget -> String)
-> ([MessageTarget] -> ShowS)
-> Show MessageTarget
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MessageTarget] -> ShowS
$cshowList :: [MessageTarget] -> ShowS
show :: MessageTarget -> String
$cshow :: MessageTarget -> String
showsPrec :: Int -> MessageTarget -> ShowS
$cshowsPrec :: Int -> MessageTarget -> ShowS
Show)
msgTarget :: Identifier -> IrcMsg -> MessageTarget
msgTarget :: Identifier -> IrcMsg -> MessageTarget
msgTarget me :: Identifier
me msg :: IrcMsg
msg =
case IrcMsg
msg of
UnknownMsg{} -> MessageTarget
TargetNetwork
Nick user :: UserInfo
user _ -> Identifier -> MessageTarget
TargetUser (UserInfo -> Identifier
userNick UserInfo
user)
Mode _ tgt :: Identifier
tgt _ | Identifier
tgt Identifier -> Identifier -> Bool
forall a. Eq a => a -> a -> Bool
== Identifier
me -> MessageTarget
TargetNetwork
| Bool
otherwise -> Identifier -> MessageTarget
TargetWindow Identifier
tgt
Join _ chan :: Identifier
chan _ _ -> Identifier -> MessageTarget
TargetWindow Identifier
chan
Part _ chan :: Identifier
chan _ -> Identifier -> MessageTarget
TargetWindow Identifier
chan
Quit user :: UserInfo
user _ -> Identifier -> MessageTarget
TargetUser (UserInfo -> Identifier
userNick UserInfo
user)
Kick _ chan :: Identifier
chan _ _ -> Identifier -> MessageTarget
TargetWindow Identifier
chan
Topic _ chan :: Identifier
chan _ -> Identifier -> MessageTarget
TargetWindow Identifier
chan
Privmsg src :: UserInfo
src tgt :: Identifier
tgt _ -> UserInfo -> Identifier -> MessageTarget
directed UserInfo
src Identifier
tgt
Ctcp src :: UserInfo
src tgt :: Identifier
tgt _ _ -> UserInfo -> Identifier -> MessageTarget
directed UserInfo
src Identifier
tgt
CtcpNotice src :: UserInfo
src tgt :: Identifier
tgt _ _ -> UserInfo -> Identifier -> MessageTarget
directed UserInfo
src Identifier
tgt
Notice src :: UserInfo
src tgt :: Identifier
tgt _ -> UserInfo -> Identifier -> MessageTarget
directed UserInfo
src Identifier
tgt
Authenticate{} -> MessageTarget
TargetHidden
Ping{} -> MessageTarget
TargetHidden
Pong{} -> MessageTarget
TargetHidden
Error{} -> MessageTarget
TargetNetwork
Cap{} -> MessageTarget
TargetNetwork
Reply code :: ReplyCode
code args :: [Text]
args -> ReplyCode -> [Text] -> MessageTarget
replyTarget ReplyCode
code [Text]
args
BatchStart{} -> MessageTarget
TargetHidden
BatchEnd{} -> MessageTarget
TargetHidden
Account user :: UserInfo
user _ -> Identifier -> MessageTarget
TargetUser (UserInfo -> Identifier
userNick UserInfo
user)
Chghost user :: UserInfo
user _ _ -> Identifier -> MessageTarget
TargetUser (UserInfo -> Identifier
userNick UserInfo
user)
Wallops src :: UserInfo
src _ -> Identifier -> MessageTarget
TargetWindow (UserInfo -> Identifier
userNick UserInfo
src)
where
directed :: UserInfo -> Identifier -> MessageTarget
directed src :: UserInfo
src tgt :: Identifier
tgt
| Text -> Bool
Text.null (UserInfo -> Text
userHost UserInfo
src) = MessageTarget
TargetNetwork
| Identifier
tgt Identifier -> Identifier -> Bool
forall a. Eq a => a -> a -> Bool
== Identifier
me = Identifier -> MessageTarget
TargetWindow (UserInfo -> Identifier
userNick UserInfo
src)
| Bool
otherwise = Identifier -> MessageTarget
TargetWindow Identifier
tgt
replyTarget :: ReplyCode -> [Text] -> MessageTarget
replyTarget RPL_TOPIC (_:chan :: Text
chan:_) = Identifier -> MessageTarget
TargetWindow (Text -> Identifier
mkId Text
chan)
replyTarget RPL_INVITING (_:_:chan :: Text
chan:_) = Identifier -> MessageTarget
TargetWindow (Text -> Identifier
mkId Text
chan)
replyTarget _ _ = MessageTarget
TargetNetwork
msgActor :: IrcMsg -> Maybe UserInfo
msgActor :: IrcMsg -> Maybe UserInfo
msgActor msg :: IrcMsg
msg =
case IrcMsg
msg of
UnknownMsg{} -> Maybe UserInfo
forall a. Maybe a
Nothing
Reply{} -> Maybe UserInfo
forall a. Maybe a
Nothing
Nick x :: UserInfo
x _ -> UserInfo -> Maybe UserInfo
forall a. a -> Maybe a
Just UserInfo
x
Join x :: UserInfo
x _ _ _ -> UserInfo -> Maybe UserInfo
forall a. a -> Maybe a
Just UserInfo
x
Part x :: UserInfo
x _ _ -> UserInfo -> Maybe UserInfo
forall a. a -> Maybe a
Just UserInfo
x
Quit x :: UserInfo
x _ -> UserInfo -> Maybe UserInfo
forall a. a -> Maybe a
Just UserInfo
x
Kick x :: UserInfo
x _ _ _ -> UserInfo -> Maybe UserInfo
forall a. a -> Maybe a
Just UserInfo
x
Topic x :: UserInfo
x _ _ -> UserInfo -> Maybe UserInfo
forall a. a -> Maybe a
Just UserInfo
x
Privmsg x :: UserInfo
x _ _ -> UserInfo -> Maybe UserInfo
forall a. a -> Maybe a
Just UserInfo
x
Ctcp x :: UserInfo
x _ _ _ -> UserInfo -> Maybe UserInfo
forall a. a -> Maybe a
Just UserInfo
x
CtcpNotice x :: UserInfo
x _ _ _ -> UserInfo -> Maybe UserInfo
forall a. a -> Maybe a
Just UserInfo
x
Notice x :: UserInfo
x _ _ -> UserInfo -> Maybe UserInfo
forall a. a -> Maybe a
Just UserInfo
x
Mode x :: UserInfo
x _ _ -> UserInfo -> Maybe UserInfo
forall a. a -> Maybe a
Just UserInfo
x
Account x :: UserInfo
x _ -> UserInfo -> Maybe UserInfo
forall a. a -> Maybe a
Just UserInfo
x
Authenticate{}-> Maybe UserInfo
forall a. Maybe a
Nothing
Ping{} -> Maybe UserInfo
forall a. Maybe a
Nothing
Pong{} -> Maybe UserInfo
forall a. Maybe a
Nothing
Error{} -> Maybe UserInfo
forall a. Maybe a
Nothing
Cap{} -> Maybe UserInfo
forall a. Maybe a
Nothing
BatchStart{} -> Maybe UserInfo
forall a. Maybe a
Nothing
BatchEnd{} -> Maybe UserInfo
forall a. Maybe a
Nothing
Chghost x :: UserInfo
x _ _ -> UserInfo -> Maybe UserInfo
forall a. a -> Maybe a
Just UserInfo
x
Wallops x :: UserInfo
x _ -> UserInfo -> Maybe UserInfo
forall a. a -> Maybe a
Just UserInfo
x
ircMsgText :: IrcMsg -> Text
ircMsgText :: IrcMsg -> Text
ircMsgText msg :: IrcMsg
msg =
case IrcMsg
msg of
UnknownMsg raw :: RawIrcMsg
raw -> [Text] -> Text
Text.unwords (((Text -> Const Text Text) -> RawIrcMsg -> Const Text RawIrcMsg)
-> RawIrcMsg -> Text
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view (Text -> Const Text Text) -> RawIrcMsg -> Const Text RawIrcMsg
forall (f :: * -> *).
Functor f =>
(Text -> f Text) -> RawIrcMsg -> f RawIrcMsg
msgCommand RawIrcMsg
raw Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: (([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg)
-> RawIrcMsg -> [Text]
forall a s. ((a -> Const a a) -> s -> Const a s) -> s -> a
view ([Text] -> Const [Text] [Text])
-> RawIrcMsg -> Const [Text] RawIrcMsg
forall (f :: * -> *).
Functor f =>
([Text] -> f [Text]) -> RawIrcMsg -> f RawIrcMsg
msgParams RawIrcMsg
raw)
Reply (ReplyCode n :: Word
n) xs :: [Text]
xs -> [Text] -> Text
Text.unwords (String -> Text
Text.pack (Word -> String
forall a. Show a => a -> String
show Word
n) Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: [Text]
xs)
Nick x :: UserInfo
x y :: Identifier
y -> [Text] -> Text
Text.unwords [UserInfo -> Text
renderUserInfo UserInfo
x, Identifier -> Text
idText Identifier
y]
Join x :: UserInfo
x _ _ _ -> UserInfo -> Text
renderUserInfo UserInfo
x
Part x :: UserInfo
x _ mb :: Maybe Text
mb -> [Text] -> Text
Text.unwords (UserInfo -> Text
renderUserInfo UserInfo
x Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: Maybe Text -> [Text]
forall a. Maybe a -> [a]
maybeToList Maybe Text
mb)
Quit x :: UserInfo
x mb :: Maybe Text
mb -> [Text] -> Text
Text.unwords (UserInfo -> Text
renderUserInfo UserInfo
x Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: Maybe Text -> [Text]
forall a. Maybe a -> [a]
maybeToList Maybe Text
mb)
Kick x :: UserInfo
x _ z :: Identifier
z r :: Text
r -> [Text] -> Text
Text.unwords [UserInfo -> Text
renderUserInfo UserInfo
x, Identifier -> Text
idText Identifier
z, Text
r]
Topic x :: UserInfo
x _ t :: Text
t -> [Text] -> Text
Text.unwords [UserInfo -> Text
renderUserInfo UserInfo
x, Text
t]
Privmsg x :: UserInfo
x _ t :: Text
t -> [Text] -> Text
Text.unwords [UserInfo -> Text
renderUserInfo UserInfo
x, Text
t]
Ctcp x :: UserInfo
x _ c :: Text
c t :: Text
t -> [Text] -> Text
Text.unwords [UserInfo -> Text
renderUserInfo UserInfo
x, Text
c, Text
t]
CtcpNotice x :: UserInfo
x _ c :: Text
c t :: Text
t -> [Text] -> Text
Text.unwords [UserInfo -> Text
renderUserInfo UserInfo
x, Text
c, Text
t]
Notice x :: UserInfo
x _ t :: Text
t -> [Text] -> Text
Text.unwords [UserInfo -> Text
renderUserInfo UserInfo
x, Text
t]
Mode x :: UserInfo
x _ xs :: [Text]
xs -> [Text] -> Text
Text.unwords (UserInfo -> Text
renderUserInfo UserInfo
xText -> [Text] -> [Text]
forall a. a -> [a] -> [a]
:"set mode"Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
:[Text]
xs)
Ping xs :: [Text]
xs -> [Text] -> Text
Text.unwords [Text]
xs
Pong xs :: [Text]
xs -> [Text] -> Text
Text.unwords [Text]
xs
Cap cmd :: CapCmd
cmd -> CapCmd -> Text
capCmdText CapCmd
cmd
Error t :: Text
t -> Text
t
Account x :: UserInfo
x a :: Text
a -> [Text] -> Text
Text.unwords [UserInfo -> Text
renderUserInfo UserInfo
x, Text
a]
Authenticate{} -> ""
BatchStart{} -> ""
BatchEnd{} -> ""
Chghost x :: UserInfo
x a :: Text
a b :: Text
b -> [Text] -> Text
Text.unwords [UserInfo -> Text
renderUserInfo UserInfo
x, Text
a, Text
b]
Wallops x :: UserInfo
x t :: Text
t -> [Text] -> Text
Text.unwords [UserInfo -> Text
renderUserInfo UserInfo
x, Text
t]
capCmdText :: CapCmd -> Text
capCmdText :: CapCmd -> Text
capCmdText cmd :: CapCmd
cmd =
case CapCmd
cmd of
CapLs more :: CapMore
more caps :: [(Text, Maybe Text)]
caps -> CapMore -> Text
capMoreText CapMore
more Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> [(Text, Maybe Text)] -> Text
capUnsplitCaps [(Text, Maybe Text)]
caps
CapNew caps :: [(Text, Maybe Text)]
caps -> [(Text, Maybe Text)] -> Text
capUnsplitCaps [(Text, Maybe Text)]
caps
CapList caps :: [Text]
caps -> [Text] -> Text
Text.unwords [Text]
caps
CapAck caps :: [Text]
caps -> [Text] -> Text
Text.unwords [Text]
caps
CapNak caps :: [Text]
caps -> [Text] -> Text
Text.unwords [Text]
caps
CapDel caps :: [Text]
caps -> [Text] -> Text
Text.unwords [Text]
caps
capMoreText :: CapMore -> Text
capMoreText :: CapMore -> Text
capMoreText CapDone = ""
capMoreText CapMore = "* "
capUnsplitCaps :: [(Text, Maybe Text)] -> Text
capUnsplitCaps :: [(Text, Maybe Text)] -> Text
capUnsplitCaps xs :: [(Text, Maybe Text)]
xs = [Text] -> Text
Text.unwords [ Text
k Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> (Text -> Text) -> Maybe Text -> Text
forall b a. b -> (a -> b) -> Maybe a -> b
maybe "" ("=" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>) Maybe Text
v | (k :: Text
k, v :: Maybe Text
v) <- [(Text, Maybe Text)]
xs ]
isNickChar :: Char -> Bool
isNickChar :: Char -> Bool
isNickChar x :: Char
x = '0' Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
x Bool -> Bool -> Bool
&& Char
x Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= '9'
Bool -> Bool -> Bool
|| 'A' Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
x Bool -> Bool -> Bool
&& Char
x Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= '}'
Bool -> Bool -> Bool
|| '-' Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
x
nickSplit :: Text -> [Text]
nickSplit :: Text -> [Text]
nickSplit = (Char -> Char -> Bool) -> Text -> [Text]
Text.groupBy (Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
(==) (Bool -> Bool -> Bool) -> (Char -> Bool) -> Char -> Char -> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` Char -> Bool
isNickChar)
computeMaxMessageLength :: UserInfo -> Text -> Int
computeMaxMessageLength :: UserInfo -> Text -> Int
computeMaxMessageLength myUserInfo :: UserInfo
myUserInfo target :: Text
target
= 512
Int -> Int -> Int
forall a. Num a => a -> a -> a
- Text -> Int
Text.length (UserInfo -> Text
renderUserInfo UserInfo
myUserInfo)
Int -> Int -> Int
forall a. Num a => a -> a -> a
- String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (": PRIVMSG :\r\n"::String)
Int -> Int -> Int
forall a. Num a => a -> a -> a
- Text -> Int
Text.length Text
target
splitCapList :: Text -> [(Text, Maybe Text)]
splitCapList :: Text -> [(Text, Maybe Text)]
splitCapList caps :: Text
caps =
[ (Text
name, Maybe Text
value)
| Text
kv <- Text -> [Text]
Text.words Text
caps
, let (name :: Text
name, v :: Text
v) = (Char -> Bool) -> Text -> (Text, Text)
Text.break ('=' Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==) Text
kv
, let value :: Maybe Text
value | Text -> Bool
Text.null Text
v = Maybe Text
forall a. Maybe a
Nothing
| Bool
otherwise = Text -> Maybe Text
forall a. a -> Maybe a
Just (Text -> Maybe Text) -> Text -> Maybe Text
forall a b. (a -> b) -> a -> b
$! Text -> Text
Text.tail Text
v
]