support !aban and !akickban for account bans

This commit is contained in:
jesopo 2020-02-26 16:46:39 +00:00
parent 192bcc27c2
commit fef1c47626

View file

@ -3,6 +3,7 @@
#--depends-on commands #--depends-on commands
#--depends-on config #--depends-on config
import enum
from src import ModuleManager, utils from src import ModuleManager, utils
QUIET_METHODS = { QUIET_METHODS = {
@ -10,9 +11,20 @@ QUIET_METHODS = {
"insp": ["b", "m:", "367", "368"], "insp": ["b", "m:", "367", "368"],
"unreal": ["b", "~q:", "367", "368"] "unreal": ["b", "~q:", "367", "368"]
} }
ABAN_METHODS = {
"chary": "$a:",
"insp": "R:",
"unreal": "~a:"
}
KICK_REASON = "your behavior is not conducive to the desired environment" KICK_REASON = "your behavior is not conducive to the desired environment"
NO_QUIETS = "This network doesn't support quiets" NO_QUIETS = "This network doesn't support quiets"
NO_ABANS = "This network doesn't support account bans"
class TargetType(enum.Enum):
NICKNAME = 1
MASK = 2
ACCOUNT = 3
KICK_REASON_SETTING = utils.Setting("default-kick-reason", KICK_REASON_SETTING = utils.Setting("default-kick-reason",
"Set the default kick reason", example="have a nice trip") "Set the default kick reason", example="have a nice trip")
@ -26,8 +38,11 @@ BAN_FORMATTING = "${n} = nick, ${u} = username, ${h} = hostname, ${a} = account"
example="~a:${a}")) example="~a:${a}"))
@utils.export("serverset", utils.OptionsSetting( @utils.export("serverset", utils.OptionsSetting(
list(QUIET_METHODS.keys())+["none"], "quiet-method", list(QUIET_METHODS.keys()), "quiet-method",
"Set this server's method of muting users")) "Set this server's method of muting users"))
@utils.export("serverset", utils.OptionsSetting(
list(ABAN_METHODS.keys()), "aban-method",
"Set this server's method of banning users by account"))
@utils.export("botset", KICK_REASON_SETTING) @utils.export("botset", KICK_REASON_SETTING)
@utils.export("serverset", KICK_REASON_SETTING) @utils.export("serverset", KICK_REASON_SETTING)
@ -97,14 +112,12 @@ class Module(ModuleManager.BaseModule):
if server.quiet: if server.quiet:
return server.quiet return server.quiet
quiet_method = server.get_setting("quiet-method", "none").lower() method = server.get_setting("quiet-method", None)
return QUIET_METHODS.get(method, None)
if quiet_method in QUIET_METHODS: def _aban_method(self, server):
return QUIET_METHODS[quiet_method] method = server.get_setting("aban-method", None)
elif quiet_method == "none": return ABAN_METHODS.get(method, None)
return None
else:
raise ValueError("Unknown quiet-method '%s'" % quiet_method)
@utils.hook("received.command.invite") @utils.hook("received.command.invite")
@utils.kwarg("require_mode", "o") @utils.kwarg("require_mode", "o")
@ -295,24 +308,30 @@ class Module(ModuleManager.BaseModule):
def _find_mode(self, type, server): def _find_mode(self, type, server):
if type == "ban": if type == "ban":
return True, "b", "" return TargetType.MASK, "b", ""
elif type == "aban":
aban_method = self._aban_method(server)
if aban_method == None:
raise utils.EventError(NO_ABANS)
return TargetType.ACCOUNT, "b", aban_method
elif type == "invex": elif type == "invex":
if not "INVEX" in server.isupport: if not "INVEX" in server.isupport:
raise utils.EventError( raise utils.EventError(
"invexes are not supported on this network") "invexes are not supported on this network")
return True, server.isupport["INVEX"] or "I", "" return TargetType.MASK, server.isupport["INVEX"] or "I", ""
elif type == "quiet": elif type == "quiet":
quiet_method = self._quiet_method(server) quiet_method = self._quiet_method(server)
if quiet_method == None: if quiet_method == None:
raise utils.EventError(NO_QUIETS) raise utils.EventError(NO_QUIETS)
mode, prefix, _, _ = quiet_method mode, prefix, _, _ = quiet_method
return True, mode, prefix return TargetType.MASK, mode, prefix
elif type == "op": elif type == "op":
return False, "o", None return TargetType.NICKNAME, "o", None
elif type =="voice": elif type =="voice":
return False, "v", None return TargetType.NICKNAME, "v", None
@utils.hook("received.command.ban", require_access="high,ban", type="ban") @utils.hook("received.command.ban", require_access="high,ban", type="ban")
@utils.hook("received.command.aban", require_access="high,ban", type="aban")
@utils.hook("received.command.quiet", require_access="high,quiet", @utils.hook("received.command.quiet", require_access="high,quiet",
type="quiet") type="quiet")
@utils.hook("received.command.invex", require_access="high,invex", @utils.hook("received.command.invex", require_access="high,invex",
@ -348,13 +367,15 @@ class Module(ModuleManager.BaseModule):
self._mask_kick(event["server"], event["spec"][0], event["spec"][1], self._mask_kick(event["server"], event["spec"][0], event["spec"][1],
event["spec"][2]) event["spec"][2])
@utils.hook("received.command.kickban") @utils.hook("received.command.kickban", type="ban")
@utils.hook("received.command.akickban", type="aban")
@utils.kwarg("require_access", "high,kickban") @utils.kwarg("require_access", "high,kickban")
@utils.kwarg("require_mode", "o") @utils.kwarg("require_mode", "o")
@utils.spec( @utils.spec(
"!r~channel ?duration !<mask>cmask|<nickname>cuser ?<reason>string") "!r~channel ?duration !<mask>cmask|<nickname>cuser ?<reason>string")
def kickban(self, event): def kickban(self, event):
self._mask_mode(event["server"], event["user"], event["spec"], "ban") self._mask_mode(event["server"], event["user"], event["spec"],
event["hook"].get_kwarg("type"))
self._mask_kick(event["server"], event["spec"][0], event["spec"][2], self._mask_kick(event["server"], event["spec"][0], event["spec"][2],
event["spec"][3]) event["spec"][3])
@ -369,19 +390,23 @@ class Module(ModuleManager.BaseModule):
elif spec[2][0] == "word": elif spec[2][0] == "word":
masks = [spec[2][1]] masks = [spec[2][1]]
is_mask, mode, prefix = self._find_mode(type, server) target_type, mode, prefix = self._find_mode(type, server)
if users: if users:
if is_mask: if target_type == TargetType.MASK:
args = [self._get_hostmask(spec[0], u) for u in users] args = [self._get_hostmask(spec[0], u) for u in users]
else: elif target_type == TargetType.NICKNAME:
args = [ args = [
u.nickname for u in users if not spec[0].has_mode(u, mode)] u.nickname for u in users if not spec[0].has_mode(u, mode)]
args = [(mode, a) for a in args] elif target_type == TargetType.ACCOUNT:
args = [u.account for u in users if not u.account == None]
if args:
args = [(mode, "%s%s" % (prefix, a)) for a in args]
spec[0].send_modes(args, True) spec[0].send_modes(args, True)
if not spec[1] == None: if not spec[1] == None:
self.timers.add_persistent("unmode", spec[1], channel=spec[0].id, self.timers.add_persistent("unmode", spec[1],
args=args) channel=spec[0].id, args=args)
@utils.hook("received.command.unban", require_access="high,unban", @utils.hook("received.command.unban", require_access="high,unban",
type="ban") type="ban")