{-# Language OverloadedStrings #-}
module Irc.Commands
( ircAdmin
, ircAway
, ircCapEnd
, ircCapLs
, ircCapReq
, ircCnotice
, ircCprivmsg
, ircInfo
, ircInvite
, ircIson
, ircJoin
, ircKick
, ircKill
, ircKnock
, ircLinks
, ircList
, ircLusers
, ircMap
, ircMode
, ircMotd
, ircNick
, ircNotice
, ircOper
, ircPart
, ircPass
, ircPing
, ircPong
, ircPrivmsg
, ircRules
, ircQuit
, ircRemove
, ircStats
, ircTime
, ircTopic
, ircUser
, ircUserhost
, ircWho
, ircWhois
, ircWhowas
, ircVersion
, ircZnc
, ircAuthenticate
, plainAuthenticationMode
, encodePlainAuthentication
) where
import Irc.RawIrcMsg
import Irc.Identifier
import Data.Text (Text)
import qualified Data.Text as Text
import qualified Data.Text.Encoding as Text
import qualified Data.ByteString.Base64 as Enc
nonempty :: Text -> [Text]
nonempty txt = filter (not . Text.null) [txt]
ircPrivmsg ::
Text ->
Text ->
RawIrcMsg
ircPrivmsg who msg = rawIrcMsg "PRIVMSG" [who, msg]
ircCprivmsg ::
Text ->
Text ->
Text ->
RawIrcMsg
ircCprivmsg nick chan msg = rawIrcMsg "CPRIVMSG" [nick, chan, msg]
ircCnotice ::
Text ->
Text ->
Text ->
RawIrcMsg
ircCnotice nick chan msg = rawIrcMsg "CNOTICE" [nick, chan, msg]
ircKnock ::
Text ->
Text ->
RawIrcMsg
ircKnock chan msg = rawIrcMsg "KNOCK" (chan : nonempty msg)
ircNotice ::
Text ->
Text ->
RawIrcMsg
ircNotice who msg = rawIrcMsg "NOTICE" [who, msg]
ircMode ::
Identifier ->
[Text] ->
RawIrcMsg
ircMode tgt params = rawIrcMsg "MODE" (idText tgt : params)
ircWhois ::
[Text] ->
RawIrcMsg
ircWhois = rawIrcMsg "WHOIS"
ircWho ::
[Text] ->
RawIrcMsg
ircWho = rawIrcMsg "WHO"
ircWhowas ::
[Text] ->
RawIrcMsg
ircWhowas = rawIrcMsg "WHOWAS"
ircWallops ::
Text ->
RawIrcMsg
ircWallops msg = rawIrcMsg "WALLOPS" [msg]
ircNick ::
Text ->
RawIrcMsg
ircNick nick = rawIrcMsg "NICK" [nick]
ircPart ::
Identifier ->
Text ->
RawIrcMsg
ircPart chan msg = rawIrcMsg "PART" (idText chan : nonempty msg)
ircJoin ::
Text ->
Maybe Text ->
RawIrcMsg
ircJoin chan (Just key) = rawIrcMsg "JOIN" [chan, key]
ircJoin chan Nothing = rawIrcMsg "JOIN" [chan]
ircInvite ::
Text ->
Identifier ->
RawIrcMsg
ircInvite nick channel = rawIrcMsg "INVITE" [nick, idText channel]
ircTopic ::
Identifier ->
Text ->
RawIrcMsg
ircTopic chan msg = rawIrcMsg "TOPIC" (idText chan : nonempty msg)
ircKick ::
Identifier ->
Text ->
Text ->
RawIrcMsg
ircKick chan who msg = rawIrcMsg "KICK" (idText chan : who : nonempty msg)
ircKill ::
Text ->
Text ->
RawIrcMsg
ircKill who msg = rawIrcMsg "KILL" (who : nonempty msg)
ircRemove ::
Identifier ->
Text ->
Text ->
RawIrcMsg
ircRemove chan who msg = rawIrcMsg "REMOVE" (idText chan : who : nonempty msg)
ircQuit :: Text -> RawIrcMsg
ircQuit = rawIrcMsg "QUIT" . nonempty
ircPass :: Text -> RawIrcMsg
ircPass pass = rawIrcMsg "PASS" [pass]
ircList ::
[Text] ->
RawIrcMsg
ircList = rawIrcMsg "LIST"
ircPing ::
[Text] ->
RawIrcMsg
ircPing = rawIrcMsg "PING"
ircPong ::
[Text] ->
RawIrcMsg
ircPong = rawIrcMsg "PONG"
ircIson ::
[Text] ->
RawIrcMsg
ircIson nicks = rawIrcMsg "ISON" [Text.unwords nicks]
ircTime ::
Text ->
RawIrcMsg
ircTime = rawIrcMsg "TIME" . nonempty
ircUserhost ::
[Text] ->
RawIrcMsg
ircUserhost = rawIrcMsg "USERHOST"
ircUserip ::
[Text] ->
RawIrcMsg
ircUserip = rawIrcMsg "USERIP"
ircUsers ::
Text ->
RawIrcMsg
ircUsers = rawIrcMsg "USERS" . nonempty
ircStats ::
[Text] ->
RawIrcMsg
ircStats = rawIrcMsg "STATS"
ircOper ::
Text ->
Text ->
RawIrcMsg
ircOper u p = rawIrcMsg "OPER" [u,p]
ircLinks ::
[Text] ->
RawIrcMsg
ircLinks = rawIrcMsg "LINKS"
ircAway ::
Text ->
RawIrcMsg
ircAway = rawIrcMsg "AWAY" . nonempty
ircMap :: RawIrcMsg
ircMap = rawIrcMsg "MAP" []
ircInfo :: RawIrcMsg
ircInfo = rawIrcMsg "INFO" []
ircRules ::
Text ->
RawIrcMsg
ircRules = rawIrcMsg "RULES" . nonempty
ircVersion ::
Text ->
RawIrcMsg
ircVersion = rawIrcMsg "VERSION" . nonempty
ircLusers ::
[Text] ->
RawIrcMsg
ircLusers = rawIrcMsg "LUSERS"
ircMotd ::
Text ->
RawIrcMsg
ircMotd = rawIrcMsg "MOTD" . nonempty
ircAdmin ::
Text ->
RawIrcMsg
ircAdmin = rawIrcMsg "ADMIN" . nonempty
ircUser ::
Text ->
Bool ->
Bool ->
Text -> RawIrcMsg
ircUser user set_w set_i real = rawIrcMsg "USER" [user, modeTxt, "*", real]
where
modeTxt = Text.pack (show mode)
mode :: Int
mode = (if set_w then 4 else 0)
+ (if set_i then 8 else 0)
ircCapReq ::
[Text] ->
RawIrcMsg
ircCapReq caps = rawIrcMsg "CAP" ["REQ", Text.unwords caps]
ircCapEnd :: RawIrcMsg
ircCapEnd = rawIrcMsg "CAP" ["END"]
ircCapLs :: RawIrcMsg
ircCapLs = rawIrcMsg "CAP" ["LS"]
ircZnc ::
[Text] ->
RawIrcMsg
ircZnc = rawIrcMsg "ZNC"
ircAuthenticate :: Text -> RawIrcMsg
ircAuthenticate msg = rawIrcMsg "AUTHENTICATE" [msg]
plainAuthenticationMode :: Text
plainAuthenticationMode = "PLAIN"
encodePlainAuthentication ::
Text ->
Text ->
Text
encodePlainAuthentication user pass
= Text.decodeUtf8
$ Enc.encode
$ Text.encodeUtf8
$ Text.intercalate "\0" [user,user,pass]