aboutsummaryrefslogtreecommitdiff
path: root/modules/line_handler/message.py
diff options
context:
space:
mode:
authorGravatar jesopo2019-02-22 11:23:36 +0000
committerGravatar jesopo2019-02-22 11:23:36 +0000
commit47c2cbb0fa93e143c6add4cf1eb4012bbc37f7b2 (patch)
tree46b13e38f6f22050db75c6ba65221b3034afda84 /modules/line_handler/message.py
parentRemove unused `threading` import in line_handler.py (diff)
signature
Split line_handler.py out in to different files for different categories
Diffstat (limited to 'modules/line_handler/message.py')
-rw-r--r--modules/line_handler/message.py168
1 files changed, 168 insertions, 0 deletions
diff --git a/modules/line_handler/message.py b/modules/line_handler/message.py
new file mode 100644
index 00000000..cdea31c0
--- /dev/null
+++ b/modules/line_handler/message.py
@@ -0,0 +1,168 @@
+from src import utils
+
+def _from_self(server, direction, prefix):
+ if direction == utils.Direction.SEND:
+ if "echo-message" in server.agreed_capabilities:
+ return None
+ else:
+ return True
+ else:
+ if prefix:
+ return server.is_own_nickname(prefix.nickname)
+ else:
+ return False
+
+def privmsg(events, event):
+ from_self = _from_self(event["server"], event["direction"],
+ event.get("prefix", None))
+ if from_self == None:
+ return
+
+ user = None
+ if "prefix" in event and not from_self:
+ user = event["server"].get_user(event["prefix"].nickname)
+
+ message = event["args"][1]
+ target = event["args"][0]
+
+ # 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
+ statusmsg = []
+ while target[0] in event["server"].prefix_symbols.keys():
+ statusmsg.append(target[0])
+ target = target[1:]
+
+ channel = None
+ if target[0] in event["server"].channel_types:
+ 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
+ event_type = "ctcp.%s" % ctcp_message.command
+ if ctcp_message.command == "ACTION":
+ action = True
+ message = ctcp_message.message
+
+ 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}
+
+ 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, statusmsg=statusmsg, **kwargs)
+ channel.buffer.add_message(user_nickname, message, action,
+ event["tags"], user==None)
+ elif event["server"].is_own_nickname(target):
+ hook.call(user=user, **kwargs)
+ user.buffer.add_message(user_nickname, message, action,
+ event["tags"], False)
+ 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)
+
+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]
+ message_split = message.split(" ")
+ 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"])
+ 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)
+
+ direction = "send" if from_self else "received"
+ context = "channel" if channel else "private"
+ hook = events.on(direction).on("notice").on(context)
+
+ user_nickname = None
+ if user:
+ user_nickname = None if from_self else user.nickname
+
+ kwargs = {"message": message, "message_split": message_split,
+ "server": event["server"], "tags": event["tags"]}
+
+ if channel:
+ hook.call(user=user, channel=channel, **kwargs)
+ channel.buffer.add_notice(user_nickname, message, event["tags"],
+ user==None)
+ elif event["server"].is_own_nickname(target):
+ hook.call(user=user, **kwargs)
+ user.buffer.add_notice(user_nickname, message, event["tags"],
+ False)
+ 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)
+
+# IRCv3 TAGMSG, used to send tags without any other information
+@utils.hook("raw.received.tagmsg")
+def tagmsg(events, event):
+ from_self = _from_self(event["server"], event["direction"],
+ event.get("prefix", None))
+ if from_self == None:
+ return
+
+ user = None
+ if "prefix" in event and not from_self:
+ user = event["server"].get_user(event["prefix"].nickname)
+
+ target = event["args"][0]
+ channel = None
+ if target[0] in event["server"].channel_types:
+ channel = event["server"].channels.get(target)
+
+ direction = "send" if from_self else "received"
+ context = "channel" if channel else "private"
+ hook = events.on(direction).on("tagmsg").on(context)
+
+ kwargs = {"server": event["server"], "tags": event["tags"]}
+
+ if channel:
+ hook.call(user=user, channel=channel, **kwargs)
+ elif event["server"].is_own_nickname(taget):
+ hook.call(user=user, **kwargs)
+ elif from_self:
+ user = event["server"].get_user(target)
+ hook.call(user=user, **kwargs)