aboutsummaryrefslogtreecommitdiff
path: root/src/IRCChannel.py
diff options
context:
space:
mode:
authorGravatar jesopo2019-06-13 11:53:47 +0100
committerGravatar jesopo2019-06-13 11:53:47 +0100
commit795f6afbeb91d00141b21930b8c0acb717989218 (patch)
treeef7a860b1245139fe2baa7ee51903f35a336a109 /src/IRCChannel.py
parenttypo, 'acount' -> 'count' (diff)
signature
Mode mode (and mode arg) parsing to IRCChannel.py, add IRCChannel.mode_str
Diffstat (limited to 'src/IRCChannel.py')
-rw-r--r--src/IRCChannel.py41
1 files changed, 40 insertions, 1 deletions
diff --git a/src/IRCChannel.py b/src/IRCChannel.py
index 82f8468d..e195248b 100644
--- a/src/IRCChannel.py
+++ b/src/IRCChannel.py
@@ -1,7 +1,9 @@
-import typing, uuid
+import re, typing, uuid
from src import EventManager, IRCBot, IRCBuffer, IRCObject, IRCServer, IRCUser
from src import utils
+RE_MODES = re.compile(r"[-+]\w+")
+
class Channel(IRCObject.Object):
name = ""
def __init__(self, name: str, id, server: "IRCServer.Server",
@@ -50,6 +52,26 @@ class Channel(IRCObject.Object):
def has_user(self, user: IRCUser.User) -> bool:
return user in self.users
+ def mode_str(self) -> str:
+ modes = [] # type: typing.List[typing.Tuple[str, typing.List[str]]]
+ # sorta alphanumerically by mode char
+ modes_iter = sorted(self.modes.items(), key=lambda mode: mode[0])
+
+ for mode, args in modes_iter:
+ # not list mode (e.g. +b) and not prefix mode (e.g. +o)
+ if (not mode in self.server.channel_list_modes and
+ not mode in self.server.prefix_modes):
+ args_list = typing.cast(typing.List[str], list(args))
+ modes.append((mode, args_list))
+
+ # move modes with args to the front
+ modes.sort(key=lambda mode: not bool(mode[1]))
+
+ out_modes = "".join(mode for mode, args in modes)
+ out_args = " ".join(args[0] for mode, args in modes if args)
+
+ return "+%s%s" % (out_modes, " %s" % out_args if out_args else "")
+
def add_mode(self, mode: str, arg: str=None):
if not mode in self.modes:
self.modes[mode] = set([])
@@ -87,6 +109,23 @@ class Channel(IRCObject.Object):
else:
self.add_mode(mode, arg)
+ def parse_modes(self, modes: str, args: typing.List[str]):
+ for chunk in RE_MODES.findall(modes):
+ remove = chunk[0] == "-"
+ for mode in chunk[1:]:
+ if mode in self.server.channel_list_modes:
+ args.pop(0)
+ elif (mode in self.server.channel_paramatered_modes or
+ mode in self.server.prefix_modes):
+ self.change_mode(remove, mode, args.pop(0))
+ elif mode in self.server.channel_setting_modes:
+ if remove:
+ self.change_mode(remove, mode)
+ else:
+ self.change_mode(remove, mode, args.pop(0))
+ elif mode in self.server.channel_modes:
+ self.change_mode(remove, mode)
+
def set_setting(self, setting: str, value: typing.Any):
self.bot.database.channel_settings.set(self.id, setting, value)
def get_setting(self, setting: str, default: typing.Any=None