from src import utils def _from_self(server, direction, prefix): 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) 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_str = 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 target = target_str.lstrip("".join(event["server"].prefix_symbols.keys())) 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 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"]) 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 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) 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(target): hook.call(user=user, **kwargs) elif from_self: user = event["server"].get_user(target) hook.call(user=user, **kwargs)