support wildcards/masks for !ban, !unban and !kickban

This commit is contained in:
jesopo 2020-02-17 10:29:23 +00:00
parent ec5a6000c9
commit c9eff9edb9

View file

@ -85,50 +85,66 @@ class Module(ModuleManager.BaseModule):
format = channel.get_setting("ban-format", "*!$u@$h") format = channel.get_setting("ban-format", "*!$u@$h")
return self._format_hostmask(user, format) return self._format_hostmask(user, format)
def _ban(self, server, channel, target, allow_hostmask, time, add): def _ban(self, channel, masks, time, add):
if target[0] == "word":
if not allow_hostmask:
raise utils.EventError("No such user")
hostmask = target[1]
else:
hostmask = self._get_hostmask(channel, target[1])
if not add: if not add:
channel.send_unban(hostmask) channel.send_modes("b", False, masks)
else: else:
channel.send_ban(hostmask) channel.send_modes("b", True, masks)
if not time == None: if not time == None:
self.timers.add_persistent("unmode", time, channel=channel.id, self.timers.add_persistent("unmode", time, channel=channel.id,
arg=hostmask) args=args)
def _mask_spec(self, channel, spec):
if spec[0] == "cuser":
return [self._get_hostmask(channel, spec[1])]
elif spec[0] == "cmask":
return [self._get_hostmask(channel, u) for u in spec[1]]
elif spec[0] == "word":
return [spec[1]]
@utils.hook("received.command.ban") @utils.hook("received.command.ban")
@utils.hook("received.command.b", alias_of="ban") @utils.hook("received.command.b", alias_of="ban")
@utils.kwarg("require_mode", "o") @utils.kwarg("require_mode", "o")
@utils.kwarg("require_access", "high,ban") @utils.kwarg("require_access", "high,ban")
@utils.spec("!<#channel>r~channel ?duration !<nickname>user|<mask>word") @utils.spec(
"!<#channel>r~channel ?duration !<nickname>user|<mask>cmask|<mask>word")
def ban(self, event): def ban(self, event):
self._ban(event["server"], event["spec"][0], event["spec"][2], True, masks = self._mask_spec(event["spec"][0], event["spec"][2])
event["spec"][1], True) self._ban(event["spec"][0], masks, event["spec"][1], True)
@utils.hook("received.command.unban") @utils.hook("received.command.unban")
@utils.kwarg("require_mode", "o") @utils.kwarg("require_mode", "o")
@utils.kwarg("require_access", "high,ban") @utils.kwarg("require_access", "high,ban")
@utils.spec("!<#channel>r~channel !<nickname>user|<mask>word") @utils.spec("!<#channel>r~channel !<nickname>user|<mask>word")
def unban(self, event): def unban(self, event):
self._ban(event["server"], event["spec"][0], event["spec"][1], if event["spec"][1][0] == "user":
True, None, False) masks = self._get_hostmask(event["spec"][0], event["spec"][1][1])
elif event["spec"][1][0] == "word":
_, masks = self._list_query_event(event["server"],
event["spec"][0], "+b", event["spec"][1][1])
if masks:
event["spec"][0].send_modes("b", False, masks)
else:
event["stderr"].write("No bans found to remove")
@utils.hook("received.command.kickban") @utils.hook("received.command.kickban")
@utils.hook("received.command.kb", alias_of="kickban") @utils.hook("received.command.kb", alias_of="kickban")
@utils.kwarg("require_mode", "o") @utils.kwarg("require_mode", "o")
@utils.kwarg("require_access", "high,kickban") @utils.kwarg("require_access", "high,kickban")
@utils.spec( @utils.spec(
"!<#channel>r~channel ?duration !<nickname>cuser| ?<reason>string") "!<#channel>r~channel ?duration "
"!<nickname>cuser|<mask>cmask ?<reason>string")
def kickban(self, event): def kickban(self, event):
self._ban(event["server"], event["spec"][0], event["spec"][2], masks = self._mask_spec(event["spec"][0], event["spec"][2])
False, event["spec"][1], True) self._ban(event["spec"][0], masks, event["spec"][1], True)
self._kick(event["server"], event["spec"][0], event["spec"][2][1],
if event["spec"][2][0] == "cmask":
users = event["spec"][2][1]
else:
users = [event["spec"][2][1]]
for user in users:
self._kick(event["server"], event["spec"][0], user,
event["spec"][3]) event["spec"][3])
@utils.hook("received.command.op") @utils.hook("received.command.op")
@ -408,9 +424,7 @@ class Module(ModuleManager.BaseModule):
event["server"], event["spec"][0], event["spec"][1], event["server"], event["spec"][0], event["spec"][1],
event["spec"][2]) event["spec"][2])
chunks = self._chunk(event["server"], mode_list) event["spec"][0].send_modes(mode, False, mode_list)
for chunk in chunks:
event["spec"][0].send_mode("-%s" % mode*len(chunk), chunk)
@utils.hook("received.command.lsearch") @utils.hook("received.command.lsearch")
@utils.kwarg("require_mode", "o") @utils.kwarg("require_mode", "o")