diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/IRCChannel.py | 51 | ||||
| -rw-r--r-- | src/IRCServer.py | 34 |
2 files changed, 56 insertions, 29 deletions
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, |
