{-# Language OverloadedStrings #-} {-| Module : Client.Commands.Operator Description : Operator command implementations Copyright : (c) Eric Mertens, 2016-2020 License : ISC Maintainer : emertens@gmail.com -} module Client.Commands.Operator (operatorCommands) where import Control.Applicative import Client.Commands.Arguments.Spec import Client.Commands.TabCompletion import Client.Commands.Types import Client.State.Network (sendMsg) import Data.Maybe (fromMaybe, maybeToList) import qualified Data.Text as Text import Irc.Commands import Irc.RawIrcMsg operatorCommands :: CommandSection operatorCommands = CommandSection "Network operator commands" [ Command (pure "oper") (liftA2 (,) (simpleToken "user") (simpleToken "password")) "Authenticate as a server operator.\n" $ NetworkCommand cmdOper noNetworkTab , Command (pure "kill") (liftA2 (,) (simpleToken "client") (remainingArg "reason")) "Kill a client connection to the server.\n" $ NetworkCommand cmdKill simpleNetworkTab , Command (pure "kline") (liftA3 (,,) (simpleToken "minutes") (simpleToken "user@host") (remainingArg "reason")) "Ban a client from the server.\n" $ NetworkCommand cmdKline simpleNetworkTab , Command (pure "unkline") (liftA2 (,) (simpleToken "[user@]host") (optionalArg (simpleToken "[servername]"))) "Unban a client from the server.\n" $ NetworkCommand cmdUnkline simpleNetworkTab , Command (pure "undline") (liftA2 (,) (simpleToken "host") (optionalArg (simpleToken "[servername]"))) "Unban a client from the server.\n" $ NetworkCommand cmdUndline simpleNetworkTab , Command (pure "unxline") (liftA2 (,) (simpleToken "gecos") (optionalArg (simpleToken "[servername]"))) "Unban a gecos from the server.\n" $ NetworkCommand cmdUnxline simpleNetworkTab , Command (pure "unresv") (liftA2 (,) (simpleToken "channel|nick") (optionalArg (simpleToken "[servername]"))) "Unban a channel or nickname from the server.\n" $ NetworkCommand cmdUnresv simpleNetworkTab , Command (pure "testline") (simpleToken "[[nick!]user@]host") "Check matching I/K/D lines for a [[nick!]user@]host\n" $ NetworkCommand cmdTestline simpleNetworkTab , Command (pure "testkline") (simpleToken "[user@]host") "Check matching K/D lines for a [user@]host\n" $ NetworkCommand cmdTestkline simpleNetworkTab , Command (pure "testgecos") (simpleToken "gecos") "Check matching X lines for a gecos\n" $ NetworkCommand cmdTestGecos simpleNetworkTab , Command (pure "testmask") (liftA2 (,) (simpleToken "[nick!]user@host") (remainingArg "[gecos]")) "Test how many local and global clients match a mask.\n" $ NetworkCommand cmdTestmask simpleNetworkTab , Command (pure "masktrace") (liftA2 (,) (simpleToken "[nick!]user@host") (remainingArg "[gecos]")) "Outputs a list of local users matching the given masks.\n" $ NetworkCommand cmdMasktrace simpleNetworkTab , Command (pure "chantrace") (simpleToken "channel") "Outputs a list of channel members in etrace format.\n" $ NetworkCommand cmdChantrace simpleNetworkTab , Command (pure "trace") (optionalArg (liftA2 (,) (simpleToken "[server|nick]") (optionalArg (simpleToken "[location]")))) "Outputs a list users on a server.\n" $ NetworkCommand cmdTrace simpleNetworkTab , Command (pure "etrace") (optionalArg (simpleToken "[-full|-v4|-v6|nick]")) "Outputs a list users on a server.\n" $ NetworkCommand cmdEtrace simpleNetworkTab , Command (pure "map") (pure ()) "Display network map.\n" $ NetworkCommand cmdMap simpleNetworkTab , Command (pure "sconnect") (liftA2 (,) (simpleToken "connect_to") (optionalArg (liftA2 (,) (simpleToken "[port]") (optionalArg (simpleToken "[remote]"))))) "Connect two servers together.\n" $ NetworkCommand cmdSconnect simpleNetworkTab , Command (pure "squit") (liftA2 (,) (simpleToken "server") (remainingArg "[reason]")) "Split a server away from your side of the network.\n" $ NetworkCommand cmdSquit simpleNetworkTab , Command (pure "modload") (liftA2 (,) (simpleToken "[path/]module") (optionalArg (simpleToken "[remote]"))) "Load an IRCd module.\n" $ NetworkCommand cmdModload simpleNetworkTab , Command (pure "modunload") (liftA2 (,) (simpleToken "module") (optionalArg (simpleToken "[remote]"))) "Unload an IRCd module.\n" $ NetworkCommand cmdModunload simpleNetworkTab , Command (pure "modlist") (optionalArg (liftA2 (,) (simpleToken "pattern") (optionalArg (simpleToken "[remote]")))) "List loaded IRCd modules.\n" $ NetworkCommand cmdModlist simpleNetworkTab , Command (pure "modrestart") (optionalArg (simpleToken "[server]")) "Reload all IRCd modules.\n" $ NetworkCommand cmdModrestart simpleNetworkTab , Command (pure "modreload") (liftA2 (,) (simpleToken "module") (optionalArg (simpleToken "[remote]"))) "Reload an IRCd module.\n" $ NetworkCommand cmdModreload simpleNetworkTab , Command (pure "grant") (liftA2 (,) (simpleToken "target") (simpleToken "privset")) "Manually assign a privset to a user.\n" $ NetworkCommand cmdGrant simpleNetworkTab , Command (pure "privs") (optionalArg (simpleToken "[target]")) "Check operator privileges of the target.\n" $ NetworkCommand cmdPrivs simpleNetworkTab ] cmdGrant :: NetworkCommand (String, String) cmdGrant cs st (target, privset) = do sendMsg cs (rawIrcMsg "GRANT" (Text.pack <$> [target, privset])) commandSuccess st cmdPrivs :: NetworkCommand (Maybe String) cmdPrivs cs st mbTarget = do sendMsg cs (rawIrcMsg "PRIVS" (Text.pack <$> maybeToList mbTarget)) commandSuccess st cmdModlist :: NetworkCommand (Maybe (String, Maybe String)) cmdModlist cs st args = do let argList = case args of Nothing -> [] Just (x, xs) -> x : maybeToList xs sendMsg cs (rawIrcMsg "MODLIST" (Text.pack <$> argList)) commandSuccess st cmdModrestart :: NetworkCommand (Maybe String) cmdModrestart cs st args = do sendMsg cs (rawIrcMsg "MODRESTART" (Text.pack <$> maybeToList args)) commandSuccess st cmdModload :: NetworkCommand (String, Maybe String) cmdModload cs st (mod_, remote) = do sendMsg cs (rawIrcMsg "MODLOAD" (Text.pack <$> (mod_ : maybeToList remote))) commandSuccess st cmdModunload :: NetworkCommand (String, Maybe String) cmdModunload cs st (mod_, remote) = do sendMsg cs (rawIrcMsg "MODUNLOAD" (Text.pack <$> (mod_ : maybeToList remote))) commandSuccess st cmdModreload :: NetworkCommand (String, Maybe String) cmdModreload cs st (mod_, remote) = do sendMsg cs (rawIrcMsg "MODRELOAD" (Text.pack <$> (mod_ : maybeToList remote))) commandSuccess st cmdSquit :: NetworkCommand (String, String) cmdSquit cs st (server, reason) = do sendMsg cs (rawIrcMsg "SQUIT" (Text.pack <$> [server, reason])) commandSuccess st cmdSconnect :: NetworkCommand (String, Maybe (String, Maybe String)) cmdSconnect cs st (server, rest) = do let args = case rest of Nothing -> [server] Just (x, xs) -> server : x : maybeToList xs sendMsg cs (rawIrcMsg "CONNECT" (Text.pack <$> args)) commandSuccess st cmdKill :: NetworkCommand (String, String) cmdKill cs st (client,rest) = do sendMsg cs (ircKill (Text.pack client) (Text.pack rest)) commandSuccess st cmdKline :: NetworkCommand (String, String, String) cmdKline cs st (minutes, mask, reason) = do sendMsg cs (ircKline (Text.pack minutes) (Text.pack mask) (Text.pack reason)) commandSuccess st cmdUnkline :: NetworkCommand (String, Maybe String) cmdUnkline cs st (mask, server) = do sendMsg cs (ircUnkline (Text.pack mask) (Text.pack <$> server)) commandSuccess st cmdUndline :: NetworkCommand (String, Maybe String) cmdUndline cs st (mask, server) = do sendMsg cs (ircUndline (Text.pack mask) (Text.pack <$> server)) commandSuccess st cmdUnxline :: NetworkCommand (String, Maybe String) cmdUnxline cs st (mask, server) = do sendMsg cs (ircUnxline (Text.pack mask) (Text.pack <$> server)) commandSuccess st cmdUnresv :: NetworkCommand (String, Maybe String) cmdUnresv cs st (mask, server) = do sendMsg cs (ircUnresv (Text.pack mask) (Text.pack <$> server)) commandSuccess st cmdTestline :: NetworkCommand String cmdTestline cs st mask = do sendMsg cs (ircTestline (Text.pack mask)) commandSuccess st cmdTestkline :: NetworkCommand String cmdTestkline cs st mask = do sendMsg cs (rawIrcMsg "TESTKLINE" [Text.pack mask]) commandSuccess st cmdTestGecos :: NetworkCommand String cmdTestGecos cs st mask = do sendMsg cs (rawIrcMsg "TESTGECOS" [Text.pack mask]) commandSuccess st cmdTestmask :: NetworkCommand (String, String) cmdTestmask cs st (mask, gecos) = do sendMsg cs (ircTestmask (Text.pack mask) (Text.pack gecos)) commandSuccess st cmdMasktrace :: NetworkCommand (String, String) cmdMasktrace cs st (mask, gecos) = do sendMsg cs (ircMasktrace (Text.pack mask) (Text.pack gecos)) commandSuccess st cmdChantrace :: NetworkCommand String cmdChantrace cs st chan = do sendMsg cs (ircChantrace (Text.pack chan)) commandSuccess st cmdEtrace :: NetworkCommand (Maybe String) cmdEtrace cs st arg = do sendMsg cs (ircEtrace (Text.pack (fromMaybe "" arg))) commandSuccess st cmdTrace :: NetworkCommand (Maybe (String, Maybe String)) cmdTrace cs st args = do let argsList = case args of Nothing -> [] Just (x, Nothing) -> [x] Just (x, Just y) -> [x, y] sendMsg cs (ircTrace (map Text.pack argsList)) commandSuccess st cmdMap :: NetworkCommand () cmdMap cs st _ = do sendMsg cs ircMap commandSuccess st cmdOper :: NetworkCommand (String, String) cmdOper cs st (user, pass) = do sendMsg cs (ircOper (Text.pack user) (Text.pack pass)) commandSuccess st