From 9b7c7035f9c6a5ee34bf3ca13167176b669a5a18 Mon Sep 17 00:00:00 2001 From: jesopo Date: Thu, 30 Aug 2018 11:12:48 +0100 Subject: [PATCH] Refactor handling MODE in IRCLineHandler --- IRCChannel.py | 25 +++++++++++++------------ IRCLineHandler.py | 47 ++++++++++++++++------------------------------- IRCServer.py | 5 +++++ 3 files changed, 34 insertions(+), 43 deletions(-) diff --git a/IRCChannel.py b/IRCChannel.py index 2cc46ca4..15d2e5df 100644 --- a/IRCChannel.py +++ b/IRCChannel.py @@ -42,32 +42,33 @@ class Channel(object): def has_user(self, user): return user in self.users - def add_mode(self, mode, args=None): + def add_mode(self, mode, arg=None): if not mode in self.modes: self.modes[mode] = set([]) - if args: + if arg: if mode in self.server.mode_prefixes.values(): - user = self.server.get_user(args) + user = self.server.get_user(arg) if user: self.modes[mode].add(user) else: - self.modes[mode].add(args.lower()) - self.bot.events.on("mode").on("channel").call( - channel=self, mode=mode, args=args, remove=False) - def remove_mode(self, mode, args=None): - if not args: + self.modes[mode].add(arg.lower()) + def remove_mode(self, mode, arg=None): + if not arg: del self.modes[mode] else: if mode in self.server.mode_prefixes.values(): - user = self.server.get_user(args) + user = self.server.get_user(arg) if user: self.modes[mode].discard(user) else: - self.modes[mode].discard(args.lower()) + self.modes[mode].discard(arg.lower()) if not len(self.modes[mode]): del self.modes[mode] - self.bot.events.on("mode").on("channel").call( - channel=self, mode=mode, args=args, remove=True) + def change_mode(self, remove, mode, arg=None): + if remove: + self.remove_mode(mode, arg) + else: + self.add_mode(mode, arg) def set_setting(self, setting, value): self.bot.database.channel_settings.set(self.id, setting, value) diff --git a/IRCLineHandler.py b/IRCLineHandler.py index 6175f71a..b49717ae 100644 --- a/IRCLineHandler.py +++ b/IRCLineHandler.py @@ -5,6 +5,7 @@ RE_PREFIXES = re.compile(r"\bPREFIX=\((\w+)\)(\W+)(?:\b|$)") RE_CHANMODES = re.compile( r"\bCHANMODES=(\w*),(\w*),(\w*),(\w*)(?:\b|$)") RE_CHANTYPES = re.compile(r"\bCHANTYPES=(\W+)(?:\b|$)") +RE_MODES = re.compile(r"[-+]\w+") class LineHandler(object): def __init__(self, bot): @@ -290,42 +291,26 @@ class LineHandler(object): channel = event["server"].get_channel(target) remove = False args = event["args"][2:] - modes = event["args"][1] - for i, char in enumerate(modes): - if char == "+": - remove = False - elif char == "-": - remove = True - else: - if char in event["server"].channel_modes: - if remove: - channel.remove_mode(char) - else: - channel.add_mode(char) - elif char in event["server"].mode_prefixes.values( + modes = RE_MODES.findall(event["args"][1]) + + for chunk in modes: + remove = chunk[0] == "-" + for mode in chunk[1:]: + if mode in event["server"].channel_modes: + channel.change_mode(remove, mode) + elif mode in event["server"].mode_prefixes.values( ) and len(args): - nickname = args.pop(0) - if remove: - channel.remove_mode(char, nickname) - else: - channel.add_mode(char, nickname) - elif len(args): + channel.change_mode(remove, mode, args.pop(0)) + else: args.pop(0) self.bot.events.on("received").on("mode").call(modes=modes, mode_args=args, channel=channel, server=event["server"]) elif event["server"].is_own_nickname(target): - modes = event["arbitrary"] - remove = False - for i, char in enumerate(modes): - if char == "+": - remove = False - elif char == "-": - remove = True - else: - if remove: - event["server"].remove_own_mode(char) - else: - event["server"].add_own_mode(char) + modes = RE_MODES.findall(event["arbitrary"] or args[1]) + for chunk in modes: + remove = chunk[0] == "-" + for mode in chunk[1:] + event["server"].change_own_mode(remove, mode) self.bot.events.on("self").on("mode").call(modes=modes, server=event["server"]) diff --git a/IRCServer.py b/IRCServer.py index 8d4e4b64..8f2b6a8e 100644 --- a/IRCServer.py +++ b/IRCServer.py @@ -125,6 +125,11 @@ class Server(object): self.own_modes[mode] = arg def remove_own_mode(self, mode): del self.own_modes[mode] + def change_own_mode(self, remove, mode, arg=None): + if remove: + self.remove_own_mode(mode, arg) + else: + self.add_own_mode(mode, arg) def has_user(self, nickname): return nickname.lower() in self.users