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):
|
||||
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)
|
||||
|
|
|
@ -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"])
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue