aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--modules/channel_op.py4
-rw-r--r--modules/github.py2
-rw-r--r--modules/line_handler.py35
-rw-r--r--src/IRCChannel.py51
-rw-r--r--src/IRCServer.py34
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,