glirc-2.40: src/Client/Commands/Operator.hs
{-# 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 Client.Commands.Arguments.Spec (optionalArg, remainingArg, simpleToken)
import Client.Commands.TabCompletion (noNetworkTab, simpleNetworkTab)
import Client.Commands.Types
import Client.State.Network (sendMsg)
import Control.Applicative (liftA2, liftA3)
import Data.Maybe (fromMaybe, maybeToList)
import Data.Text qualified as Text
import Irc.Commands
import Irc.RawIrcMsg (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