aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar jesopo2018-08-30 11:12:48 +0100
committerGravatar jesopo2018-08-30 11:12:48 +0100
commit9b7c7035f9c6a5ee34bf3ca13167176b669a5a18 (patch)
treeb85793e017b9bbf7d938b077fe8463727d188042
parentOnly show 2 biggest units in !seen (diff)
Refactor handling MODE in IRCLineHandler
-rw-r--r--IRCChannel.py25
-rw-r--r--IRCLineHandler.py47
-rw-r--r--IRCServer.py5
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