diff options
| author | 2018-11-11 12:34:22 +0000 | |
|---|---|---|
| committer | 2018-11-11 12:34:22 +0000 | |
| commit | 2816fe67bbd139ee971f87276a9c29cb0af0e97e (patch) | |
| tree | 19ef3c09aec48efeb9b3c9f2d733f595e20156dc | |
| parent | API keys should have a value of `[]` when they're created, not `True` (diff) | |
| signature | ||
Move channel tracking data/functions to src/IRCChannel.Channels
| -rw-r--r-- | modules/channel_op.py | 4 | ||||
| -rw-r--r-- | modules/github.py | 2 | ||||
| -rw-r--r-- | modules/line_handler.py | 35 | ||||
| -rw-r--r-- | src/IRCChannel.py | 51 | ||||
| -rw-r--r-- | src/IRCServer.py | 34 |
5 files changed, 76 insertions, 50 deletions
diff --git a/modules/channel_op.py b/modules/channel_op.py index 3d92c451..92ee99e5 100644 --- a/modules/channel_op.py +++ b/modules/channel_op.py @@ -22,8 +22,8 @@ class Module(ModuleManager.BaseModule): @utils.hook("timer.unban") def _timer_unban(self, event): server = self.bot.get_server(event["server_id"]) - if server.has_channel(event["channel_name"]): - channel = server.get_channel(event["channel_name"]) + if event["channel_name"] in server.channels: + channel = server.channels.get(event["channel_name"]) channel.send_unban(event["hostmask"]) def _kick(self, server, channel, nickname, reason): diff --git a/modules/github.py b/modules/github.py index ecbbff51..ed6004e2 100644 --- a/modules/github.py +++ b/modules/github.py @@ -54,7 +54,7 @@ class Module(ModuleManager.BaseModule): for server_id, channel_name, _ in hooks: for output in outputs: server = self.bot.get_server(server_id) - channel = server.get_channel(channel_name) + channel = server.channels.get(channel_name) trigger = self._make_trigger(channel, server, output) self.bot.trigger(trigger) diff --git a/modules/line_handler.py b/modules/line_handler.py index dc38e675..fb4873a4 100644 --- a/modules/line_handler.py +++ b/modules/line_handler.py @@ -118,7 +118,7 @@ class Module(ModuleManager.BaseModule): # on-join channel topic line @utils.hook("raw.332") def handle_332(self, event): - channel = event["server"].get_channel(event["args"][1]) + channel = event["server"].channels.get(event["args"][1]) topic = event["args"].get(2) channel.set_topic(topic) self.events.on("received.numeric.332").call(channel=channel, @@ -128,7 +128,7 @@ class Module(ModuleManager.BaseModule): @utils.hook("raw.topic") def topic(self, event): user = event["server"].get_user(event["prefix"].nickname) - channel = event["server"].get_channel(event["args"][0]) + channel = event["server"].channels.get(event["args"][0]) topic = event["args"].get(1) channel.set_topic(topic) self.events.on("received.topic").call(channel=channel, @@ -137,7 +137,7 @@ class Module(ModuleManager.BaseModule): # on-join channel topic set by/at @utils.hook("raw.333") def handle_333(self, event): - channel = event["server"].get_channel(event["args"][1]) + channel = event["server"].channels.getl(event["args"][1]) topic_setter_hostmask = event["args"][2] topic_setter = utils.irc.seperate_hostmask(topic_setter_hostmask) @@ -154,7 +154,7 @@ class Module(ModuleManager.BaseModule): # /names response, also on-join user list @utils.hook("raw.353", default_event=True) def handle_353(self, event): - channel = event["server"].get_channel(event["args"][2]) + channel = event["server"].channels.get(event["args"][2]) nicknames = event["args"].get(3).split() for nickname in nicknames: modes = set([]) @@ -187,13 +187,12 @@ class Module(ModuleManager.BaseModule): def join(self, event): account = None realname = None + channel = event["server"].channels.get(event["args"][0]) + if len(event["args"]) == 2: - channel = event["server"].get_channel(event["args"][0]) if not event["args"][1] == "*": account = event["args"][1] realname = event["args"][2] - else: - channel = event["server"].get_channel(event["args"][0]) if not event["server"].is_own_nickname(event["prefix"].nickname): user = event["server"].get_user(event["prefix"].nickname) @@ -223,7 +222,7 @@ class Module(ModuleManager.BaseModule): # on user parting channel @utils.hook("raw.part") def part(self, event): - channel = event["server"].get_channel(event["args"][0]) + channel = event["server"].channels.get(event["args"][0]) reason = event["args"].get(1) if not event["server"].is_own_nickname(event["prefix"].nickname): @@ -237,7 +236,7 @@ class Module(ModuleManager.BaseModule): else: self.events.on("self.part").call(channel=channel, reason=reason, server=event["server"]) - event["server"].remove_channel(channel) + event["server"].channels.remove(channel) # unknown command sent by us, oops! @utils.hook("raw.421", default_event=True) @@ -336,7 +335,7 @@ class Module(ModuleManager.BaseModule): target = event["args"][0] is_channel = target[0] in event["server"].channel_types if is_channel: - channel = event["server"].get_channel(target) + channel = event["server"].channels.get(target) remove = False args = event["args"][2:] _args = args[:] @@ -395,7 +394,7 @@ class Module(ModuleManager.BaseModule): "action": action} if target[0] in event["server"].channel_types: - channel = event["server"].get_channel(event["args"][0]) + channel = event["server"].channels.get(event["args"][0]) self.events.on("received.message.channel").call( user=user, channel=channel, **kwargs) channel.buffer.add_message(user.nickname, message, action, @@ -425,7 +424,7 @@ class Module(ModuleManager.BaseModule): user = event["server"].get_user(event["prefix"].nickname) if target[0] in event["server"].channel_types: - channel = event["server"].get_channel(target) + channel = event["server"].channels.get(target) self.events.on("received.notice.channel").call( message=message, message_split=message_split, user=user, server=event["server"], channel=channel, @@ -442,7 +441,7 @@ class Module(ModuleManager.BaseModule): target = event["args"][0] if target[0] in event["server"].channel_types: - channel = event["server"].get_channel(target) + channel = event["server"].channels.get(target) self.events.on("received.tagmsg.channel").call(channel=channel, user=user, tags=event["tags"], server=event["server"]) elif event["server"].is_own_nickname(target): @@ -530,7 +529,7 @@ class Module(ModuleManager.BaseModule): # response to an empty mode command @utils.hook("raw.324", default_event=True) def handle_324(self, event): - channel = event["server"].get_channel(event["args"][1]) + channel = event["server"].channels.get(event["args"][1]) modes = event["args"][2] if modes[0] == "+" and modes[1:]: for mode in modes[1:]: @@ -540,7 +539,7 @@ class Module(ModuleManager.BaseModule): # channel creation unix timestamp @utils.hook("raw.329", default_event=True) def handle_329(self, event): - channel = event["server"].get_channel(event["args"][1]) + channel = event["server"].channels.get(event["args"][1]) channel.creation_timestamp = int(event["args"][2]) # nickname already in use @@ -563,7 +562,7 @@ class Module(ModuleManager.BaseModule): def kick(self, event): user = event["server"].get_user(event["prefix"].nickname) target = event["args"][1] - channel = event["server"].get_channel(event["args"][0]) + channel = event["server"].channels.get(event["args"][0]) reason = event["args"].get(2) if not event["server"].is_own_nickname(target): @@ -580,9 +579,9 @@ class Module(ModuleManager.BaseModule): def rename(self, event): old_name = event["args"][0] new_name = event["args"][1] - channel = event["server"].get_channel(old_name) + channel = event["server"].channels.get(old_name) - event["server"].rename_channel(old_name, new_name) + event["server"].channels.rename(old_name, new_name) self.events.on("received.rename").call(channel=channel, old_name=old_name, new_name=new_name, reason=event["args"].get(2), server=event["server"]) diff --git a/src/IRCChannel.py b/src/IRCChannel.py index ac4dd5e9..0569b0f0 100644 --- a/src/IRCChannel.py +++ b/src/IRCChannel.py @@ -154,3 +154,54 @@ class Channel(IRCObject.Object): def get_user_status(self, user: IRCUser.User) -> typing.Set: return self.user_modes.get(user, []) + +class Channels(object): + def __init__(self, server: "IRCServer.Server", bot: "IRCBot.Bot", + events: EventManager.EventHook): + self._server = server + self._bot = bot + self._events = events + self._channels = {} # type: typing.Dict[str, Channel] + + def __iter__(self) -> Iterable[Channel]: + return (channel for channel in self._channels.values()) + def __contains__(self, name: str) -> bool + return self.contains(name) + + def _get_id(self, channel_name: str) -> int: + self.bot.database.channels.add(self.id, channel_name) + return self.bot.database.channels.get_id(self.id, channel_name) + + def _name_lower(self, channel_name: str) -> str: + return utils.irc.lower(self._server.case_mapping, channel_name) + + def contains(self, name: str) -> bool: + lower = self._name_lower(name) + return name[0] in self._server.channel_types and lower in self._channels + + def add(self, name: str) -> Channel: + id = self.get_channel_id(name) + lower = self._name_lower(name) + new_channel = Channel(lower, id, self._server, self._bot) + self._channels[lower] = new_channel + self._events.on("new.channel").call(channel=new_channel, server=self) + return new_channel + + def remove(self, channel: Channel): + lower = self._name_lower(channel.name) + del self._channels[lower] + + def get(self, name: str): + if not self.contains(name): + return self._add(name) + return self._channels[self._name_lower(name)] + + def rename(self, old_name, new_name): + old_lower = self._name_lower(old_name) + new_lower = self._name_lower(new_name) + + channel = self.channels.pop(old_lower) + channel.name = new_name + self._channels[new_name] = channel + + self._bot.database.channels.rename(channel.id, new_lower) diff --git a/src/IRCServer.py b/src/IRCServer.py index ad5d7451..910c4b93 100644 --- a/src/IRCServer.py +++ b/src/IRCServer.py @@ -38,7 +38,7 @@ class Server(IRCObject.Object): self.users = {} # type: typing.Dict[str, IRCUser.User] self.new_users = set([]) #type: typing.Set[IRCUser.User] - self.channels = {} # type: typing.Dict[str, IRCChannel.Channel] + self.channels = IRCChannel.Channels(self, self.bot, self.events) self.own_modes = {} # type: typing.Dict[str, typing.Optional[str]] self.isupport = {} # type: typing.Dict[str, typing.Optional[str]] @@ -194,30 +194,6 @@ class Server(IRCObject.Object): user = self.users.pop(utils.irc.lower(self.case_mapping, old_nickname)) user._id = self.get_user_id(new_nickname) self.users[utils.irc.lower(self.case_mapping, new_nickname)] = user - def has_channel(self, channel_name: str): - return channel_name[0] in self.channel_types and utils.irc.lower( - self.case_mapping, channel_name) in self.channels - def get_channel(self, channel_name: str): - if not self.has_channel(channel_name): - channel_id = self.get_channel_id(channel_name) - new_channel = IRCChannel.Channel(channel_name, channel_id, - self, self.bot) - self.events.on("new.channel").call(channel=new_channel, - server=self) - self.channels[new_channel.name] = new_channel - return self.channels[utils.irc.lower(self.case_mapping, channel_name)] - def get_channel_id(self, channel_name: str): - self.bot.database.channels.add(self.id, channel_name) - return self.bot.database.channels.get_id(self.id, channel_name) - def remove_channel(self, channel: IRCChannel.Channel): - for user in channel.users: - user.part_channel(channel) - del self.channels[channel.name] - def rename_channel(self, old_name, new_name): - channel = self.channels.pop(old_name.lower()) - channel.name = new_name.lower() - self.channels[channel.name] = channel - self.bot.database.channels.rename(channel.id, new_name) def parse_data(self, line: str): if not line: @@ -411,8 +387,8 @@ class Server(IRCObject.Object): message = full_message.split("\01ACTION ", 1)[1][:-1] full_message_split = full_message.split() - if self.has_channel(target): - channel = self.get_channel(target) + if target in self.channels: + channel = self.channels.get(target) channel.buffer.add_message(None, message, action, tags, True) self.events.on("self.message.channel").call( message=full_message, message_split=full_message_split, @@ -429,8 +405,8 @@ class Server(IRCObject.Object): full_message = message if not prefix else prefix+message self.send("%sNOTICE %s :%s" % (self._tag_str(tags), target, full_message)) - if self.has_channel(target): - self.get_channel(target).buffer.add_notice(None, message, tags, + if target in self.channels: + self.channels.get(target).buffer.add_notice(None, message, tags, True) else: self.get_user(target).buffer.add_notice(None, message, tags, |
