Refactor handling MODE in IRCLineHandler
This commit is contained in:
parent
ceb73f586c
commit
9b7c7035f9
3 changed files with 34 additions and 43 deletions
|
@ -42,32 +42,33 @@ class Channel(object):
|
||||||
def has_user(self, user):
|
def has_user(self, user):
|
||||||
return user in self.users
|
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:
|
if not mode in self.modes:
|
||||||
self.modes[mode] = set([])
|
self.modes[mode] = set([])
|
||||||
if args:
|
if arg:
|
||||||
if mode in self.server.mode_prefixes.values():
|
if mode in self.server.mode_prefixes.values():
|
||||||
user = self.server.get_user(args)
|
user = self.server.get_user(arg)
|
||||||
if user:
|
if user:
|
||||||
self.modes[mode].add(user)
|
self.modes[mode].add(user)
|
||||||
else:
|
else:
|
||||||
self.modes[mode].add(args.lower())
|
self.modes[mode].add(arg.lower())
|
||||||
self.bot.events.on("mode").on("channel").call(
|
def remove_mode(self, mode, arg=None):
|
||||||
channel=self, mode=mode, args=args, remove=False)
|
if not arg:
|
||||||
def remove_mode(self, mode, args=None):
|
|
||||||
if not args:
|
|
||||||
del self.modes[mode]
|
del self.modes[mode]
|
||||||
else:
|
else:
|
||||||
if mode in self.server.mode_prefixes.values():
|
if mode in self.server.mode_prefixes.values():
|
||||||
user = self.server.get_user(args)
|
user = self.server.get_user(arg)
|
||||||
if user:
|
if user:
|
||||||
self.modes[mode].discard(user)
|
self.modes[mode].discard(user)
|
||||||
else:
|
else:
|
||||||
self.modes[mode].discard(args.lower())
|
self.modes[mode].discard(arg.lower())
|
||||||
if not len(self.modes[mode]):
|
if not len(self.modes[mode]):
|
||||||
del self.modes[mode]
|
del self.modes[mode]
|
||||||
self.bot.events.on("mode").on("channel").call(
|
def change_mode(self, remove, mode, arg=None):
|
||||||
channel=self, mode=mode, args=args, remove=True)
|
if remove:
|
||||||
|
self.remove_mode(mode, arg)
|
||||||
|
else:
|
||||||
|
self.add_mode(mode, arg)
|
||||||
|
|
||||||
def set_setting(self, setting, value):
|
def set_setting(self, setting, value):
|
||||||
self.bot.database.channel_settings.set(self.id, setting, value)
|
self.bot.database.channel_settings.set(self.id, setting, value)
|
||||||
|
|
|
@ -5,6 +5,7 @@ RE_PREFIXES = re.compile(r"\bPREFIX=\((\w+)\)(\W+)(?:\b|$)")
|
||||||
RE_CHANMODES = re.compile(
|
RE_CHANMODES = re.compile(
|
||||||
r"\bCHANMODES=(\w*),(\w*),(\w*),(\w*)(?:\b|$)")
|
r"\bCHANMODES=(\w*),(\w*),(\w*),(\w*)(?:\b|$)")
|
||||||
RE_CHANTYPES = re.compile(r"\bCHANTYPES=(\W+)(?:\b|$)")
|
RE_CHANTYPES = re.compile(r"\bCHANTYPES=(\W+)(?:\b|$)")
|
||||||
|
RE_MODES = re.compile(r"[-+]\w+")
|
||||||
|
|
||||||
class LineHandler(object):
|
class LineHandler(object):
|
||||||
def __init__(self, bot):
|
def __init__(self, bot):
|
||||||
|
@ -290,42 +291,26 @@ class LineHandler(object):
|
||||||
channel = event["server"].get_channel(target)
|
channel = event["server"].get_channel(target)
|
||||||
remove = False
|
remove = False
|
||||||
args = event["args"][2:]
|
args = event["args"][2:]
|
||||||
modes = event["args"][1]
|
modes = RE_MODES.findall(event["args"][1])
|
||||||
for i, char in enumerate(modes):
|
|
||||||
if char == "+":
|
for chunk in modes:
|
||||||
remove = False
|
remove = chunk[0] == "-"
|
||||||
elif char == "-":
|
for mode in chunk[1:]:
|
||||||
remove = True
|
if mode in event["server"].channel_modes:
|
||||||
else:
|
channel.change_mode(remove, mode)
|
||||||
if char in event["server"].channel_modes:
|
elif mode in event["server"].mode_prefixes.values(
|
||||||
if remove:
|
|
||||||
channel.remove_mode(char)
|
|
||||||
else:
|
|
||||||
channel.add_mode(char)
|
|
||||||
elif char in event["server"].mode_prefixes.values(
|
|
||||||
) and len(args):
|
) and len(args):
|
||||||
nickname = args.pop(0)
|
channel.change_mode(remove, mode, args.pop(0))
|
||||||
if remove:
|
|
||||||
channel.remove_mode(char, nickname)
|
|
||||||
else:
|
else:
|
||||||
channel.add_mode(char, nickname)
|
|
||||||
elif len(args):
|
|
||||||
args.pop(0)
|
args.pop(0)
|
||||||
self.bot.events.on("received").on("mode").call(modes=modes,
|
self.bot.events.on("received").on("mode").call(modes=modes,
|
||||||
mode_args=args, channel=channel, server=event["server"])
|
mode_args=args, channel=channel, server=event["server"])
|
||||||
elif event["server"].is_own_nickname(target):
|
elif event["server"].is_own_nickname(target):
|
||||||
modes = event["arbitrary"]
|
modes = RE_MODES.findall(event["arbitrary"] or args[1])
|
||||||
remove = False
|
for chunk in modes:
|
||||||
for i, char in enumerate(modes):
|
remove = chunk[0] == "-"
|
||||||
if char == "+":
|
for mode in chunk[1:]
|
||||||
remove = False
|
event["server"].change_own_mode(remove, mode)
|
||||||
elif char == "-":
|
|
||||||
remove = True
|
|
||||||
else:
|
|
||||||
if remove:
|
|
||||||
event["server"].remove_own_mode(char)
|
|
||||||
else:
|
|
||||||
event["server"].add_own_mode(char)
|
|
||||||
self.bot.events.on("self").on("mode").call(modes=modes,
|
self.bot.events.on("self").on("mode").call(modes=modes,
|
||||||
server=event["server"])
|
server=event["server"])
|
||||||
|
|
||||||
|
|
|
@ -125,6 +125,11 @@ class Server(object):
|
||||||
self.own_modes[mode] = arg
|
self.own_modes[mode] = arg
|
||||||
def remove_own_mode(self, mode):
|
def remove_own_mode(self, mode):
|
||||||
del self.own_modes[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):
|
def has_user(self, nickname):
|
||||||
return nickname.lower() in self.users
|
return nickname.lower() in self.users
|
||||||
|
|
Loading…
Reference in a new issue