{-# Language OverloadedStrings #-}
module Irc.Commands
( ircAdmin
, ircAway
, ircCapEnd
, ircCapLs
, ircCapReq
, ircChantrace
, ircCnotice
, ircCprivmsg
, ircEtrace
, ircInfo
, ircInvite
, ircIson
, ircJoin
, ircKick
, ircKill
, ircKline
, ircKnock
, ircLinks
, ircList
, ircLusers
, ircMap
, ircMasktrace
, ircMode
, ircMonitor
, ircMotd
, ircNick
, ircNotice
, ircOper
, ircPart
, ircPass
, ircPing
, ircPong
, ircPrivmsg
, ircQuit
, ircRemove
, ircRules
, ircStats
, ircTestline
, ircTestmask
, ircTime
, ircTopic
, ircTrace
, ircUnkline
, ircUser
, ircUserhost
, ircUserip
, ircUsers
, ircVersion
, ircWallops
, ircWho
, ircWhois
, ircWhowas
, ircZnc
, AuthenticatePayload(..)
, ircAuthenticate
, ircAuthenticates
, encodePlainAuthentication
, encodeExternalAuthentication
) where
import Irc.RawIrcMsg
import Irc.Identifier
import Data.ByteString (ByteString)
import Data.Text (Text)
import qualified Data.Text as Text
import qualified Data.Text.Encoding as Text
import qualified Data.ByteString as B
import qualified Data.ByteString.Base64 as Enc
nonempty :: Text -> [Text]
nonempty :: Text -> [Text]
nonempty Text
txt = [Text
txt | Bool -> Bool
not (Text -> Bool
Text.null Text
txt)]
ircPrivmsg ::
Text ->
Text ->
RawIrcMsg
ircPrivmsg :: Text -> Text -> RawIrcMsg
ircPrivmsg Text
who Text
msg = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"PRIVMSG" [Text
who, Text
msg]
ircCprivmsg ::
Text ->
Text ->
Text ->
RawIrcMsg
ircCprivmsg :: Text -> Text -> Text -> RawIrcMsg
ircCprivmsg Text
nick Text
chan Text
msg = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"CPRIVMSG" [Text
nick, Text
chan, Text
msg]
ircCnotice ::
Text ->
Text ->
Text ->
RawIrcMsg
ircCnotice :: Text -> Text -> Text -> RawIrcMsg
ircCnotice Text
nick Text
chan Text
msg = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"CNOTICE" [Text
nick, Text
chan, Text
msg]
ircKnock ::
Text ->
Text ->
RawIrcMsg
ircKnock :: Text -> Text -> RawIrcMsg
ircKnock Text
chan Text
msg = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"KNOCK" (Text
chan Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: Text -> [Text]
nonempty Text
msg)
ircNotice ::
Text ->
Text ->
RawIrcMsg
ircNotice :: Text -> Text -> RawIrcMsg
ircNotice Text
who Text
msg = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"NOTICE" [Text
who, Text
msg]
ircMode ::
Identifier ->
[Text] ->
RawIrcMsg
ircMode :: Identifier -> [Text] -> RawIrcMsg
ircMode Identifier
tgt [Text]
params = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"MODE" (Identifier -> Text
idText Identifier
tgt Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: [Text]
params)
ircMonitor ::
[Text] ->
RawIrcMsg
ircMonitor :: [Text] -> RawIrcMsg
ircMonitor [Text]
params = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"MONITOR" [Text]
params
ircWhois ::
[Text] ->
RawIrcMsg
ircWhois :: [Text] -> RawIrcMsg
ircWhois = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"WHOIS"
ircWho ::
[Text] ->
RawIrcMsg
ircWho :: [Text] -> RawIrcMsg
ircWho = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"WHO"
ircWhowas ::
[Text] ->
RawIrcMsg
ircWhowas :: [Text] -> RawIrcMsg
ircWhowas = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"WHOWAS"
ircWallops ::
Text ->
RawIrcMsg
ircWallops :: Text -> RawIrcMsg
ircWallops Text
msg = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"WALLOPS" [Text
msg]
ircNick ::
Text ->
RawIrcMsg
ircNick :: Text -> RawIrcMsg
ircNick Text
nick = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"NICK" [Text
nick]
ircPart ::
Identifier ->
Text ->
RawIrcMsg
ircPart :: Identifier -> Text -> RawIrcMsg
ircPart Identifier
chan Text
msg = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"PART" (Identifier -> Text
idText Identifier
chan Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: Text -> [Text]
nonempty Text
msg)
ircJoin ::
Text ->
Maybe Text ->
RawIrcMsg
ircJoin :: Text -> Maybe Text -> RawIrcMsg
ircJoin Text
chan (Just Text
key) = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"JOIN" [Text
chan, Text
key]
ircJoin Text
chan Maybe Text
Nothing = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"JOIN" [Text
chan]
ircInvite ::
Text ->
Identifier ->
RawIrcMsg
ircInvite :: Text -> Identifier -> RawIrcMsg
ircInvite Text
nick Identifier
channel = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"INVITE" [Text
nick, Identifier -> Text
idText Identifier
channel]
ircTopic ::
Identifier ->
Text ->
RawIrcMsg
ircTopic :: Identifier -> Text -> RawIrcMsg
ircTopic Identifier
chan Text
msg = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"TOPIC" (Identifier -> Text
idText Identifier
chan Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: Text -> [Text]
nonempty Text
msg)
ircKick ::
Identifier ->
Text ->
Text ->
RawIrcMsg
ircKick :: Identifier -> Text -> Text -> RawIrcMsg
ircKick Identifier
chan Text
who Text
msg = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"KICK" (Identifier -> Text
idText Identifier
chan Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: Text
who Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: Text -> [Text]
nonempty Text
msg)
ircKill ::
Text ->
Text ->
RawIrcMsg
ircKill :: Text -> Text -> RawIrcMsg
ircKill Text
who Text
msg = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"KILL" (Text
who Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: Text -> [Text]
nonempty Text
msg)
ircKline ::
Text ->
Text ->
Text ->
RawIrcMsg
ircKline :: Text -> Text -> Text -> RawIrcMsg
ircKline Text
minutes Text
mask Text
reason = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"KLINE" [Text
minutes, Text
mask, Text
reason]
ircUnkline ::
Text ->
RawIrcMsg
ircUnkline :: Text -> RawIrcMsg
ircUnkline Text
mask = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"UNKLINE" [Text
mask]
ircTestline ::
Text ->
RawIrcMsg
ircTestline :: Text -> RawIrcMsg
ircTestline Text
mask = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"TESTLINE" [Text
mask]
ircTestmask ::
Text ->
Text ->
RawIrcMsg
ircTestmask :: Text -> Text -> RawIrcMsg
ircTestmask Text
mask Text
gecos = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"TESTMASK" (Text
mask Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: Text -> [Text]
nonempty Text
gecos)
ircMasktrace ::
Text ->
Text ->
RawIrcMsg
ircMasktrace :: Text -> Text -> RawIrcMsg
ircMasktrace Text
mask Text
gecos = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"MASKTRACE" [Text
mask, Text
gecos]
ircChantrace ::
Text ->
RawIrcMsg
ircChantrace :: Text -> RawIrcMsg
ircChantrace Text
channel = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"CHANTRACE" [Text
channel]
ircEtrace ::
Text ->
RawIrcMsg
ircEtrace :: Text -> RawIrcMsg
ircEtrace Text
arg = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"ETRACE" (Text -> [Text]
nonempty Text
arg)
ircRemove ::
Identifier ->
Text ->
Text ->
RawIrcMsg
ircRemove :: Identifier -> Text -> Text -> RawIrcMsg
ircRemove Identifier
chan Text
who Text
msg = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"REMOVE" (Identifier -> Text
idText Identifier
chan Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: Text
who Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: Text -> [Text]
nonempty Text
msg)
ircQuit :: Text -> RawIrcMsg
ircQuit :: Text -> RawIrcMsg
ircQuit Text
msg = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"QUIT" [Text
msg]
ircPass :: Text -> RawIrcMsg
ircPass :: Text -> RawIrcMsg
ircPass Text
pass = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"PASS" [Text
pass]
ircList ::
[Text] ->
RawIrcMsg
ircList :: [Text] -> RawIrcMsg
ircList = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"LIST"
ircPing ::
[Text] ->
RawIrcMsg
ircPing :: [Text] -> RawIrcMsg
ircPing = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"PING"
ircPong ::
[Text] ->
RawIrcMsg
ircPong :: [Text] -> RawIrcMsg
ircPong = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"PONG"
ircIson ::
[Text] ->
RawIrcMsg
ircIson :: [Text] -> RawIrcMsg
ircIson [Text]
nicks = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"ISON" [[Text] -> Text
Text.unwords [Text]
nicks]
ircTime ::
Text ->
RawIrcMsg
ircTime :: Text -> RawIrcMsg
ircTime = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"TIME" ([Text] -> RawIrcMsg) -> (Text -> [Text]) -> Text -> RawIrcMsg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text]
nonempty
ircUserhost ::
[Text] ->
RawIrcMsg
ircUserhost :: [Text] -> RawIrcMsg
ircUserhost = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"USERHOST"
ircUserip ::
[Text] ->
RawIrcMsg
ircUserip :: [Text] -> RawIrcMsg
ircUserip = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"USERIP"
ircUsers ::
Text ->
RawIrcMsg
ircUsers :: Text -> RawIrcMsg
ircUsers = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"USERS" ([Text] -> RawIrcMsg) -> (Text -> [Text]) -> Text -> RawIrcMsg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text]
nonempty
ircStats ::
[Text] ->
RawIrcMsg
ircStats :: [Text] -> RawIrcMsg
ircStats = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"STATS"
ircOper ::
Text ->
Text ->
RawIrcMsg
ircOper :: Text -> Text -> RawIrcMsg
ircOper Text
u Text
p = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"OPER" [Text
u,Text
p]
ircLinks ::
[Text] ->
RawIrcMsg
ircLinks :: [Text] -> RawIrcMsg
ircLinks = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"LINKS"
ircAway ::
Text ->
RawIrcMsg
ircAway :: Text -> RawIrcMsg
ircAway = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"AWAY" ([Text] -> RawIrcMsg) -> (Text -> [Text]) -> Text -> RawIrcMsg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text]
nonempty
ircMap :: RawIrcMsg
ircMap :: RawIrcMsg
ircMap = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"MAP" []
ircInfo :: RawIrcMsg
ircInfo :: RawIrcMsg
ircInfo = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"INFO" []
ircRules ::
Text ->
RawIrcMsg
ircRules :: Text -> RawIrcMsg
ircRules = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"RULES" ([Text] -> RawIrcMsg) -> (Text -> [Text]) -> Text -> RawIrcMsg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text]
nonempty
ircVersion ::
Text ->
RawIrcMsg
ircVersion :: Text -> RawIrcMsg
ircVersion = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"VERSION" ([Text] -> RawIrcMsg) -> (Text -> [Text]) -> Text -> RawIrcMsg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text]
nonempty
ircLusers ::
[Text] ->
RawIrcMsg
ircLusers :: [Text] -> RawIrcMsg
ircLusers = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"LUSERS"
ircMotd ::
Text ->
RawIrcMsg
ircMotd :: Text -> RawIrcMsg
ircMotd = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"MOTD" ([Text] -> RawIrcMsg) -> (Text -> [Text]) -> Text -> RawIrcMsg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text]
nonempty
ircAdmin ::
Text ->
RawIrcMsg
ircAdmin :: Text -> RawIrcMsg
ircAdmin = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"ADMIN" ([Text] -> RawIrcMsg) -> (Text -> [Text]) -> Text -> RawIrcMsg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text]
nonempty
ircTrace ::
[Text] ->
RawIrcMsg
ircTrace :: [Text] -> RawIrcMsg
ircTrace = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"TRACE"
ircUser ::
Text ->
Text -> RawIrcMsg
ircUser :: Text -> Text -> RawIrcMsg
ircUser Text
user Text
real = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"USER" [Text
user, Text
"0", Text
"*", Text
real]
ircCapReq ::
[Text] ->
RawIrcMsg
ircCapReq :: [Text] -> RawIrcMsg
ircCapReq [Text]
caps = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"CAP" [Text
"REQ", [Text] -> Text
Text.unwords [Text]
caps]
ircCapEnd :: RawIrcMsg
ircCapEnd :: RawIrcMsg
ircCapEnd = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"CAP" [Text
"END"]
ircCapLs :: RawIrcMsg
ircCapLs :: RawIrcMsg
ircCapLs = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"CAP" [Text
"LS", Text
"302"]
ircZnc ::
[Text] ->
RawIrcMsg
ircZnc :: [Text] -> RawIrcMsg
ircZnc = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"ZNC"
newtype AuthenticatePayload = AuthenticatePayload ByteString
deriving Int -> AuthenticatePayload -> ShowS
[AuthenticatePayload] -> ShowS
AuthenticatePayload -> String
(Int -> AuthenticatePayload -> ShowS)
-> (AuthenticatePayload -> String)
-> ([AuthenticatePayload] -> ShowS)
-> Show AuthenticatePayload
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AuthenticatePayload] -> ShowS
$cshowList :: [AuthenticatePayload] -> ShowS
show :: AuthenticatePayload -> String
$cshow :: AuthenticatePayload -> String
showsPrec :: Int -> AuthenticatePayload -> ShowS
$cshowsPrec :: Int -> AuthenticatePayload -> ShowS
Show
ircAuthenticate ::
Text ->
RawIrcMsg
ircAuthenticate :: Text -> RawIrcMsg
ircAuthenticate Text
msg = Text -> [Text] -> RawIrcMsg
rawIrcMsg Text
"AUTHENTICATE" [Text
msg]
ircAuthenticates ::
AuthenticatePayload ->
[RawIrcMsg]
ircAuthenticates :: AuthenticatePayload -> [RawIrcMsg]
ircAuthenticates (AuthenticatePayload ByteString
bytes) =
(ByteString -> RawIrcMsg) -> [ByteString] -> [RawIrcMsg]
forall a b. (a -> b) -> [a] -> [b]
map (Text -> RawIrcMsg
ircAuthenticate (Text -> RawIrcMsg)
-> (ByteString -> Text) -> ByteString -> RawIrcMsg
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Text
Text.decodeUtf8) (ByteString -> [ByteString]
chunks (ByteString -> ByteString
Enc.encode ByteString
bytes))
where
chunks :: ByteString -> [ByteString]
chunks :: ByteString -> [ByteString]
chunks ByteString
b
| ByteString -> Bool
B.null ByteString
b = [ByteString
"+"]
| ByteString -> Int
B.length ByteString
b Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
400 = Int -> ByteString -> ByteString
B.take Int
400 ByteString
b ByteString -> [ByteString] -> [ByteString]
forall a. a -> [a] -> [a]
: ByteString -> [ByteString]
chunks (Int -> ByteString -> ByteString
B.drop Int
400 ByteString
b)
| Bool
otherwise = [ByteString
b]
encodePlainAuthentication ::
Text ->
Text ->
Text ->
AuthenticatePayload
encodePlainAuthentication :: Text -> Text -> Text -> AuthenticatePayload
encodePlainAuthentication Text
authz Text
authc Text
pass
= ByteString -> AuthenticatePayload
AuthenticatePayload
(ByteString -> AuthenticatePayload)
-> ByteString -> AuthenticatePayload
forall a b. (a -> b) -> a -> b
$ Text -> ByteString
Text.encodeUtf8
(Text -> ByteString) -> Text -> ByteString
forall a b. (a -> b) -> a -> b
$ Text -> [Text] -> Text
Text.intercalate Text
"\0" [Text
authz,Text
authc,Text
pass]
encodeExternalAuthentication ::
Text ->
AuthenticatePayload
encodeExternalAuthentication :: Text -> AuthenticatePayload
encodeExternalAuthentication Text
authz = ByteString -> AuthenticatePayload
AuthenticatePayload (Text -> ByteString
Text.encodeUtf8 Text
authz)