aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar jesopo2020-01-22 17:41:20 +0000
committerGravatar jesopo2020-01-22 17:41:20 +0000
commit811b85d0f92feb2d739dc3f5cea369038c370fd0 (patch)
treeab33e6d398df5de2f52b94e7b3765b969265525c /src
parentdon't add modes to mode_lists until we have data (diff)
signature
move mode list (beIq e.g.) to it's own module, mode_lists.py
Diffstat (limited to 'src')
-rw-r--r--src/IRCChannel.py1
-rw-r--r--src/core_modules/mode_lists.py62
2 files changed, 63 insertions, 0 deletions
diff --git a/src/IRCChannel.py b/src/IRCChannel.py
index 0cdfbc32..d391f745 100644
--- a/src/IRCChannel.py
+++ b/src/IRCChannel.py
@@ -18,6 +18,7 @@ class Channel(IRCObject.Object):
self.topic_time = 0
self.users = set([]) # type: typing.Set[IRCUser.User]
self.modes = {} # type: typing.Dict[str, typing.Set]
+ self.mode_lists = {}
self.user_modes = {} # type: typing.Dict[IRCUser.User, typing.Set]
self.created_timestamp = None
self.buffer = IRCBuffer.Buffer(bot, server)
diff --git a/src/core_modules/mode_lists.py b/src/core_modules/mode_lists.py
new file mode 100644
index 00000000..f73a76d4
--- /dev/null
+++ b/src/core_modules/mode_lists.py
@@ -0,0 +1,62 @@
+from src import ModuleManager, utils
+
+class Module(ModuleManager.BaseModule):
+ # RPL_BANLIST
+ @utils.hook("received.367")
+ def on_367(self, event):
+ self._mode_list_mask(event["server"], event["line"].args[1], "b",
+ event["line"].args[2])
+ @utils.hook("received.368")
+ def on_368(self, event):
+ self._mode_list_end(event["server"], event["line"].args[1], "b")
+
+ # RPL_QUIETLIST
+ @utils.hook("received.728")
+ def on_728(self, event):
+ self._mode_list_mask(event["server"], event["line"].args[1], "q",
+ event["line"].args[3])
+ @utils.hook("received.729")
+ def on_729(self, event):
+ self._mode_list_end(event["server"], event["line"].args[1], "q")
+
+ def _mode_list_mask(self, server, target, mode, mask):
+ if target in server.channels:
+ channel = server.channels.get(target)
+ self._mask_add(channel, "~%s " % mode, mask)
+ def _mode_list_end(self, server, target, mode):
+ if target in server.channels:
+ channel = server.channels.get(target)
+ temp_key = "~%s" % mode
+ if temp_key in channel.mode_lists:
+ channel.mode_lists[mode] = channel.mode_lists.pop(temp_key)
+ else:
+ channel.mode_lists[mode] = set([])
+
+ def _mask_add(self, channel, mode, mask):
+ if not mode in channel.mode_lists:
+ channel.mode_lists[mode] = set([])
+ channel.mode_lists[mode].add(mask)
+ def _mask_remove(self, channel, mode, mask):
+ if mode in channel.mode_lists:
+ channel.mode_lists[mode].discard(mask)
+
+ @utils.hook("received.mode.channel")
+ def channel_mode_lists(self, event):
+ for mode, arg in event["modes"]:
+ if mode[1] in event["server"].channel_list_modes:
+ if mode[0] == "+":
+ self._mask_add(event["channel"], mode[1], arg)
+ else:
+ self._mask_remove(event["channel"], mode[1], arg)
+ elif mode[1] in dict(event["server"].prefix_modes):
+ if event["server"].irc_equals(event["server"].nickname, arg):
+ missed = set(event["server"].channel_list_modes)-set(
+ event["channel"].mode_lists.keys())
+ if missed:
+ event["channel"].send_mode("+%s" % "".join(missed))
+
+ @utils.hook("self.join")
+ def self_join(self, event):
+ event["channel"].send_mode("+%s" %
+ "".join(event["server"].channel_list_modes))
+