Refactor handling MODE in IRCLineHandler

This commit is contained in:
jesopo 2018-08-30 11:12:48 +01:00
parent ceb73f586c
commit 9b7c7035f9
3 changed files with 34 additions and 43 deletions

View file

@ -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)

View file

@ -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)
channel.change_mode(remove, mode, args.pop(0))
else:
channel.add_mode(char, nickname)
elif len(args):
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"])

View file

@ -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