aboutsummaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorGravatar jesopo2020-01-23 16:24:08 +0000
committerGravatar jesopo2020-01-23 16:24:08 +0000
commitecfab16fc4632ca7c965702f2fb5cb48b968f9d7 (patch)
tree58ab74b7342e0f58126c32f363f34be39f515303 /modules
parentwordiest-prevent-highlight -> words-, apply to !wordusers too (diff)
signature
add !lsearch to show what !clear would remove
Diffstat (limited to 'modules')
-rw-r--r--modules/channel_op.py89
1 files changed, 55 insertions, 34 deletions
diff --git a/modules/channel_op.py b/modules/channel_op.py
index 66574a57..a8199fa8 100644
--- a/modules/channel_op.py
+++ b/modules/channel_op.py
@@ -403,12 +403,46 @@ class Module(ModuleManager.BaseModule):
def _cunmute(self, channel):
channel.send_mode("-m")
- def _filter_mask(self, mask, list):
+ def _filter_mask(self, mask, mode_list):
parsed_mask = utils.irc.hostmask_parse(mask)
- return list(utils.irc.hostmask_match_many(list, parsed_mask))
+ return list(utils.irc.hostmask_match_many(mode_list, parsed_mask))
def _filter_prefix(self, prefix, list):
return [l for l in list if prefix in l]
+ def _type_to_mode(self, server, channel, type):
+ if type[0] == "+":
+ if type[1:]:
+ if type[1] in channel.mode_lists:
+ return type[1], None
+ else:
+ raise utils.EventError("Unknown list mode")
+ else:
+ raise utils.EventError("Please provide a list mode")
+ elif type in ["quiets", "mutes"]:
+ quiet_method = self._quiet_method(server)
+ if quiet_method:
+ return quiet_method[0], quiet_method[1]
+ else:
+ raise utils.EventError(NO_QUIETS)
+ else:
+ raise utils.EventError("Unknown type '%s'" % type)
+
+ def _list_query_event(self, server, channel, args):
+ list_type = args[0]
+ list_mode, list_prefix = self._type_to_mode(server, channel, list_type)
+
+ list_mask = None
+ if len(args) > 1:
+ list_mask = args[1]
+
+ mode_list = list(channel.mode_lists[list_mode])
+ if list_prefix:
+ mode_list = self._filter_prefix(list_prefix, mode_list)
+ if list_mask:
+ mode_list = self._filter_mask(list_mask, mode_list)
+
+ return list_mode, mode_list
+
@utils.hook("received.command.clear")
@utils.kwarg("channel_only", True)
@utils.kwarg("require_mode", "o")
@@ -417,39 +451,26 @@ class Module(ModuleManager.BaseModule):
@utils.kwarg("usage", "<type> [mask]")
@utils.kwarg("usage", "+<mode> [mask]")
def clear(self, event):
- list_type = event["args_split"][0]
- list_mode = None
- list_filter = lambda l: list(l)
-
- if list_type[0] == "+":
- if list_type[1:]:
- list_mode = list_type[1]
- else:
- raise utils.EventError("Please provide a list mode")
+ mode, mode_list = self._list_query_event(
+ event["server"], event["target"], event["args_split"])
- elif list_type in ["quiets", "mutes"]:
- quiet_method = self._quiet_method(event["server"])
- if quiet_method:
- list_mode = quiet_method[0]
- if quiet_method[1]:
- list_filter = lambda list: self._filter_prefix(
- quiet_method[1], list)
- else:
- raise utils.EventError(NO_QUIETS)
+ chunks = self._chunk(event["server"], mode_list)
+ for chunk in chunks:
+ event["target"].send_mode("-%s" % mode*len(chunk), chunk)
- else:
- raise utils.EventError("Unknown type '%s'" % type)
-
- if list_mode in event["target"].mode_lists:
- if len(event["args_split"]) > 1:
- old_filter = list_filter
- list_filter = lambda list: self._filter_mask(
- event["args_split"][1], old_filter(list))
-
- mode_list = list_filter(event["target"].mode_lists[list_mode])
+ @utils.hook("received.command.lsearch")
+ @utils.kwarg("channel_only", True)
+ @utils.kwarg("require_mode", "o")
+ @utils.kwarg("require_access", "lsearch")
+ @utils.kwarg("help", "Search a given channel list mode (e.g. +b)")
+ @utils.kwarg("usage", "<type> [mask]")
+ @utils.kwarg("usage", "+<mode> [mask]")
+ def lsearch(self, event):
+ mode, mode_list = self._list_query_event(
+ event["server"], event["target"], event["args_split"])
- chunks = self._chunk(event["server"], mode_list)
- for chunk in chunks:
- event["target"].send_mode("-%s" % list_mode*len(chunk), chunk)
+ if mode_list:
+ event["stdout"].write("%s: %s" %
+ (event["user"].nickname, " ".join(mode_list)))
else:
- raise utils.EventError("Unknown list mode")
+ event["stderr"].write("%s: no matches" % event["user"].nickname)