aboutsummaryrefslogtreecommitdiff
path: root/modules/line_handler
diff options
context:
space:
mode:
Diffstat (limited to 'modules/line_handler')
-rw-r--r--modules/line_handler/__init__.py58
-rw-r--r--modules/line_handler/channel.py16
-rw-r--r--modules/line_handler/core.py9
-rw-r--r--modules/line_handler/ircv3.py2
-rw-r--r--modules/line_handler/message.py200
-rw-r--r--modules/line_handler/user.py18
6 files changed, 124 insertions, 179 deletions
diff --git a/modules/line_handler/__init__.py b/modules/line_handler/__init__.py
index a11fdec5..19e1902b 100644
--- a/modules/line_handler/__init__.py
+++ b/modules/line_handler/__init__.py
@@ -2,11 +2,6 @@ import enum
from src import EventManager, ModuleManager, utils
from . import channel, core, ircv3, message, user
-LABELED_BATCH = {
- "labeled-response": "label",
- "draft/labeled-response": "draft/label"
-}
-
class Module(ModuleManager.BaseModule):
def _handle(self, server, line):
hooks = self.events.on("raw.received").on(line.command).get_hooks()
@@ -15,8 +10,9 @@ class Module(ModuleManager.BaseModule):
default_events.append(hook.kwargs.get("default_event", False))
default_event = any(default_events)
- kwargs = {"args": line.args, "tags": line.tags, "server": server,
- "prefix": line.prefix, "direction": utils.Direction.Recv}
+ kwargs = {"command": line.command, "args": line.args, "tags": line.tags,
+ "server": server, "source": line.source,
+ "direction": utils.Direction.Recv}
self.events.on("raw.received").on(line.command).call_unsafe(**kwargs)
if default_event or not hooks:
@@ -26,7 +22,7 @@ class Module(ModuleManager.BaseModule):
def handle_raw(self, event):
if ("batch" in event["line"].tags and
event["line"].tags["batch"] in event["server"].batches):
- event["server"].batches[event["line"].tags["batch"]].lines.append(
+ event["server"].batches[event["line"].tags["batch"]].add_line(
event["line"])
else:
self._handle(event["server"], event["line"])
@@ -34,8 +30,9 @@ class Module(ModuleManager.BaseModule):
@utils.hook("raw.send")
def handle_send(self, event):
self.events.on("raw.send").on(event["line"].command).call_unsafe(
- args=event["line"].args, tags=event["line"].tags,
- server=event["server"], direction=utils.Direction.Send)
+ command=event["line"].command, args=event["line"].args,
+ tags=event["line"].tags, server=event["server"],
+ direction=utils.Direction.Send)
# ping from the server
@utils.hook("raw.received.ping")
@@ -158,22 +155,14 @@ class Module(ModuleManager.BaseModule):
def invite(self, event):
core.invite(self.events, event)
- # we've received/sent a message
+ # we've received/sent a PRIVMSG, NOTICE or TAGMSG
@utils.hook("raw.received.privmsg")
@utils.hook("raw.send.privmsg")
- def privmsg(self, event):
- message.privmsg(self.events, event)
-
- # we've received/sent a notice
@utils.hook("raw.received.notice")
@utils.hook("raw.send.notice")
- def notice(self, event):
- message.notice(self.events, event)
-
- # IRCv3 TAGMSG, used to send tags without any other information
@utils.hook("raw.received.tagmsg")
- def tagmsg(self, event):
- message.tagmsg(self.events, event)
+ def message(self, event):
+ message.message(self.events, event)
# IRCv3 AWAY, used to notify us that a client we can see has changed /away
@utils.hook("raw.received.away")
@@ -187,20 +176,29 @@ class Module(ModuleManager.BaseModule):
if modifier == "+":
batch_type = event["args"][1]
- event["server"].batches[identifier] = utils.irc.IRCRecvBatch(
- identifier, batch_type, event["tags"])
+ args = event["args"][2:]
+
+ batch = utils.irc.IRCBatch(identifier, batch_type, args,
+ event["tags"])
+ event["server"].batches[identifier] = batch
+
+ self.events.on("received.batch.start").call(batch=batch,
+ server=event["server"])
else:
batch = event["server"].batches[identifier]
del event["server"].batches[identifier]
- add_tags = {}
- if batch.type in LABELED_BATCH.keys():
- tag_name = LABELED_BATCH[batch.type]
- add_tags[tag_name] = batch.tags[tag_name]
+ lines = batch.get_lines()
+
+ results = self.events.on("received.batch.end").call(batch=batch,
+ server=event["server"])
+
+ for result in results:
+ if not result == None:
+ lines = result
+ break
- for line in batch.lines:
- if add_tags:
- line.tags.update(add_tags)
+ for line in lines:
self._handle(event["server"], line)
# IRCv3 CHGHOST, a user's username and/or hostname has changed
diff --git a/modules/line_handler/channel.py b/modules/line_handler/channel.py
index 5b877764..759fdf45 100644
--- a/modules/line_handler/channel.py
+++ b/modules/line_handler/channel.py
@@ -8,7 +8,7 @@ def handle_332(events, event):
topic=topic)
def topic(events, event):
- user = event["server"].get_user(event["prefix"].nickname)
+ user = event["server"].get_user(event["source"].nickname)
channel = event["server"].channels.get(event["args"][0])
topic = event["args"].get(1)
channel.set_topic(topic)
@@ -69,17 +69,17 @@ def join(events, event):
account = event["args"][1]
realname = event["args"][2]
- user = event["server"].get_user(event["prefix"].nickname)
+ user = event["server"].get_user(event["source"].nickname)
- user.username = event["prefix"].username
- user.hostname = event["prefix"].hostname
+ user.username = event["source"].username
+ user.hostname = event["source"].hostname
if account:
user.identified_account = account
user.identified_account_id = event["server"].get_user(account).get_id()
if realname:
user.realname = realname
- is_self = event["server"].is_own_nickname(event["prefix"].nickname)
+ is_self = event["server"].is_own_nickname(event["source"].nickname)
if is_self:
channel = event["server"].channels.add(channel_name)
else:
@@ -101,7 +101,7 @@ def join(events, event):
def part(events, event):
channel = event["server"].channels.get(event["args"][0])
- user = event["server"].get_user(event["prefix"].nickname)
+ user = event["server"].get_user(event["source"].nickname)
reason = event["args"].get(1)
channel.remove_user(user)
@@ -109,7 +109,7 @@ def part(events, event):
if not len(user.channels):
event["server"].remove_user(user)
- if not event["server"].is_own_nickname(event["prefix"].nickname):
+ if not event["server"].is_own_nickname(event["source"].nickname):
events.on("received.part").call(channel=channel, reason=reason,
user=user, server=event["server"])
else:
@@ -137,7 +137,7 @@ def handle_477(timers, event):
server_id=event["server"].id)
def kick(events, event):
- user = event["server"].get_user(event["prefix"].nickname)
+ user = event["server"].get_user(event["source"].nickname)
target = event["args"][1]
channel = event["server"].channels.get(event["args"][0])
reason = event["args"].get(2)
diff --git a/modules/line_handler/core.py b/modules/line_handler/core.py
index 88544a08..3d656b2f 100644
--- a/modules/line_handler/core.py
+++ b/modules/line_handler/core.py
@@ -7,10 +7,11 @@ def ping(event):
event["server"].send_pong(event["args"][0])
def handle_001(event):
- event["server"].socket.set_write_throttling(True)
- event["server"].name = event["prefix"].hostmask
+ event["server"].socket.enable_write_throttle()
+ event["server"].name = event["source"].hostmask
event["server"].set_own_nickname(event["args"][0])
event["server"].send_whois(event["server"].nickname)
+ event["server"].connected = True
def handle_005(events, event):
isupport_list = event["args"][1:-1]
@@ -64,7 +65,7 @@ def motd_line(event):
event["server"].motd_lines.append(event["args"][1])
def mode(events, event):
- user = event["server"].get_user(event["prefix"].nickname)
+ user = event["server"].get_user(event["source"].nickname)
target = event["args"][0]
is_channel = target[0] in event["server"].channel_types
if is_channel:
@@ -97,7 +98,7 @@ def mode(events, event):
def invite(events, event):
target_channel = event["args"][1]
- user = event["server"].get_user(event["prefix"].nickname)
+ user = event["server"].get_user(event["source"].nickname)
target_user = event["server"].get_user(event["args"][0])
events.on("received.invite").call(user=user, target_channel=target_channel,
server=event["server"], target_user=target_user)
diff --git a/modules/line_handler/ircv3.py b/modules/line_handler/ircv3.py
index 42afece7..d9f83b75 100644
--- a/modules/line_handler/ircv3.py
+++ b/modules/line_handler/ircv3.py
@@ -10,11 +10,9 @@ CAPABILITIES = [
utils.irc.Capability("away-notify"),
utils.irc.Capability("userhost-in-names"),
utils.irc.Capability("message-tags", "draft/message-tags-0.2"),
- utils.irc.Capability("server-time"),
utils.irc.Capability("cap-notify"),
utils.irc.Capability("batch"),
utils.irc.Capability("echo-message"),
- utils.irc.Capability(None, "draft/labeled-response"),
utils.irc.Capability(None, "draft/rename"),
utils.irc.Capability(None, "draft/setname")
]
diff --git a/modules/line_handler/message.py b/modules/line_handler/message.py
index 4fb507ca..9157af66 100644
--- a/modules/line_handler/message.py
+++ b/modules/line_handler/message.py
@@ -1,163 +1,111 @@
from src import utils
-def _from_self(server, direction, prefix):
+def _from_self(server, direction, source):
if direction == utils.Direction.Send:
if server.has_capability_str("echo-message"):
return None
else:
return True
else:
- if prefix:
- return server.is_own_nickname(prefix.nickname)
+ if source:
+ return server.is_own_nickname(source.nickname)
else:
return False
-def privmsg(events, event):
+def message(events, event):
from_self = _from_self(event["server"], event["direction"],
- event.get("prefix", None))
+ event.get("source", None))
if from_self == None:
return
- user = None
- if "prefix" in event and not from_self:
- user = event["server"].get_user(event["prefix"].nickname)
+ direction = "send" if from_self else "received"
- message = event["args"][1]
target_str = event["args"][0]
+ message = None
+ if len(event["args"]) > 1:
+ message = event["args"][1]
+
+ if not from_self and (
+ not event["source"] or
+ not event["server"].name or
+ event["source"].hostmask == event["server"].name or
+ target_str == "*"):
+ if event["source"]:
+ event["server"].name = event["source"].hostmask
+
+ events.on("received.server-notice").call(message=message,
+ message_split=message.split(" "), server=event["server"])
+ return
+
+ if from_self:
+ user = event["server"].get_user(event["server"].nickname)
+ else:
+ user = event["server"].get_user(event["source"].nickname)
+
# strip prefix_symbols from the start of target, for when people use
# e.g. 'PRIVMSG +#channel :hi' which would send a message to only
# voiced-or-above users
target = target_str.lstrip("".join(event["server"].prefix_symbols.keys()))
- channel = None
+ is_channel = False
+
if target[0] in event["server"].channel_types:
+ is_channel = True
if not target in event["server"].channels:
return
- channel = event["server"].channels.get(target)
-
- action = False
- event_type = "message"
- ctcp_message = utils.irc.parse_ctcp(message)
- if ctcp_message:
- message = ctcp_message.message
- if ctcp_message.command == "ACTION":
- action = True
- message = ctcp_message.message
- else:
- event_type = "ctcp.%s" % ctcp_message.command
-
- if user and "account" in event["tags"]:
- user.identified_account = event["tags"]["account"]
- user.identified_account_id = event["server"].get_user(
- event["tags"]["account"]).get_id()
-
- kwargs = {"message": message, "message_split": message.split(" "),
- "server": event["server"], "tags": event["tags"],
- "action": action, "target_str": target_str}
-
- direction = "send" if from_self else "received"
- context = "channel" if channel else "private"
- hook = events.on(direction).on(event_type).on(context)
-
- user_nickname = None
- if user:
- user_nickname = None if from_self else user.nickname
-
- if channel:
- hook.call(user=user, channel=channel, **kwargs)
- channel.buffer.add_message(user_nickname, message, action,
- event["tags"], user==None)
- elif from_self:
- # a message we've sent to a user
- user = event["server"].get_user(target)
- hook.call(user=user, **kwargs)
- user.buffer.add_message(user_nickname, message, action,
- event["tags"], True)
- elif event["server"].is_own_nickname(target):
- hook.call(user=user, **kwargs)
- user.buffer.add_message(user_nickname, message, action,
- event["tags"], False)
-
-def notice(events, event):
- from_self = _from_self(event["server"], event["direction"],
- event.get("prefix", None))
- if from_self == None:
- return
-
- message = event["args"][1]
- target = event["args"][0]
-
- if "prefix" in event and (
- not event["prefix"] or
- not event["server"].name or
- event["prefix"].hostmask == event["server"].name or
- target == "*"):
- if event["prefix"]:
- event["server"].name = event["prefix"].hostmask
-
- events.on("received.server-notice").call(message=message,
- message_split=message.split(" "), server=event["server"])
+ target_obj = event["server"].channels.get(target)
else:
- user = None
- if "prefix" in event and not from_self:
- user = event["server"].get_user(event["prefix"].nickname)
-
- channel = None
- if target[0] in event["server"].channel_types:
- channel = event["server"].channels.get(target)
+ target_obj = event["server"].get_user(target)
- direction = "send" if from_self else "received"
- context = "channel" if channel else "private"
- hook = events.on(direction).on("notice").on(context)
+ kwargs = {"server": event["server"], "target": target_obj,
+ "target_str": target_str, "user": user, "tags": event["tags"],
+ "is_channel": is_channel}
- user_nickname = None
- if user:
- user_nickname = None if from_self else user.nickname
+ action = False
- kwargs = {"message": message, "message_split": message.split(" "),
- "server": event["server"], "tags": event["tags"]}
+ if message:
+ ctcp_message = utils.irc.parse_ctcp(message)
- if channel:
- hook.call(user=user, channel=channel, **kwargs)
- channel.buffer.add_notice(user_nickname, message, event["tags"],
- user==None)
- elif from_self:
- # a notice we've sent to a user
- user = event["server"].get_user(target)
- hook.call(user=user, **kwargs)
- user.buffer.add_notice(user_nickname, message, event["tags"],
- True)
- elif event["server"].is_own_nickname(target):
- hook.call(user=user, **kwargs)
- user.buffer.add_notice(user_nickname, message, event["tags"],
- False)
+ if ctcp_message:
+ if not ctcp_message.command == "ACTION" or not event["command"
+ ] == "PRIVMSG":
+ if event["command"] == "PRIVMSG":
+ ctcp_action = "request"
+ else:
+ ctcp_action = "response"
+ events.on(direction).on("ctcp").on(ctcp_action).call(
+ message=ctcp_message.message, **kwargs)
+ events.on(direction).on("ctcp").on(ctcp_action).on(
+ ctcp_message.command).call(message=ctcp_message.message,
+ **kwargs)
+ return
+ else:
+ message = ctcp_message.message
+ action = True
-def tagmsg(events, event):
- from_self = _from_self(event["server"], event["direction"],
- event.get("prefix", None))
- if from_self == None:
- return
+ if not message == None:
+ kwargs["message"] = message
+ kwargs["message_split"] = message.split(" ")
+ kwargs["action"] = action
- user = None
- if "prefix" in event and not from_self:
- user = event["server"].get_user(event["prefix"].nickname)
+ event_type = event["command"].lower()
+ if event["command"] == "PRIVMSG":
+ event_type = "message"
- target = event["args"][0]
- channel = None
- if target[0] in event["server"].channel_types:
- channel = event["server"].channels.get(target)
+ context = "channel" if is_channel else "private"
+ hook = events.on(direction).on(event_type).on(context)
- direction = "send" if from_self else "received"
- context = "channel" if channel else "private"
- hook = events.on(direction).on("tagmsg").on(context)
+ if is_channel:
+ hook.call(channel=target_obj, **kwargs)
+ target_obj.buffer.add_message(user.nickname, message, action,
+ event["tags"], from_self)
+ else:
+ hook.call(**kwargs)
- kwargs = {"server": event["server"], "tags": event["tags"]}
+ buffer_obj = target_obj
+ if not from_self:
+ buffer_obj = user
- if channel:
- hook.call(user=user, channel=channel, **kwargs)
- elif event["server"].is_own_nickname(target):
- hook.call(user=user, **kwargs)
- elif from_self:
- user = event["server"].get_user(target)
- hook.call(user=user, **kwargs)
+ buffer_obj.buffer.add_message(user.nickname, message, action,
+ event["tags"], from_self)
diff --git a/modules/line_handler/user.py b/modules/line_handler/user.py
index f95ce4f4..c31a3b52 100644
--- a/modules/line_handler/user.py
+++ b/modules/line_handler/user.py
@@ -19,13 +19,13 @@ def handle_311(event):
def quit(events, event):
nickname = None
if event["direction"] == utils.Direction.Recv:
- nickname = event["prefix"].nickname
+ nickname = event["source"].nickname
reason = event["args"].get(0)
if event["direction"] == utils.Direction.Recv:
- nickname = event["prefix"].nickname
+ nickname = event["source"].nickname
if (not event["server"].is_own_nickname(nickname) and
- not event["prefix"].hostmask == "*"):
+ not event["source"].hostmask == "*"):
user = event["server"].get_user(nickname)
event["server"].remove_user(user)
events.on("received.quit").call(reason=reason, user=user,
@@ -37,10 +37,10 @@ def quit(events, event):
def nick(events, event):
new_nickname = event["args"].get(0)
- user = event["server"].get_user(event["prefix"].nickname)
+ user = event["server"].get_user(event["source"].nickname)
old_nickname = user.nickname
- if not event["server"].is_own_nickname(event["prefix"].nickname):
+ if not event["server"].is_own_nickname(event["source"].nickname):
events.on("received.nick").call(new_nickname=new_nickname,
old_nickname=old_nickname, user=user, server=event["server"])
else:
@@ -52,7 +52,7 @@ def nick(events, event):
event["server"].change_user_nickname(old_nickname, new_nickname)
def away(events, event):
- user = event["server"].get_user(event["prefix"].nickname)
+ user = event["server"].get_user(event["source"].nickname)
message = event["args"].get(0)
if message:
user.away = True
@@ -65,7 +65,7 @@ def away(events, event):
events.on("received.away.off").call(user=user, server=event["server"])
def chghost(event):
- nickname = event["prefix"].nickname
+ nickname = event["source"].nickname
username = event["args"][0]
hostname = event["args"][1]
@@ -78,7 +78,7 @@ def chghost(event):
target.hostname = hostname
def setname(event):
- nickname = event["prefix"].nickname
+ nickname = event["source"].nickname
realname = event["args"][0]
user = event["server"].get_user(nickname)
@@ -88,7 +88,7 @@ def setname(event):
event["server"].realname = realname
def account(events, event):
- user = event["server"].get_user(event["prefix"].nickname)
+ user = event["server"].get_user(event["source"].nickname)
if not event["args"][0] == "*":
user.identified_account = event["args"][0]