mod_muc_bot/mod_muc_bot.lua
author Matthew Wild <mwild1@gmail.com>
Fri, 23 Sep 2022 22:41:15 +0100
changeset 5058 62480053c87b
parent 4828 205b9d06fe6b
permissions -rw-r--r--
mod_cloud_notify_encrypted: Additional debug logging when enabling/skipping
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4567
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
local st = require "util.stanza";
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
local jid = require "util.jid";
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
local bots = module:get_option_set("known_bots", {});
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
module:hook("muc-occupant-groupchat", function(event)
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
	if event.occupant then return end -- skip messages from actual occupants
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
	local room = event.room;
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
	if bots:contains(jid.bare(event.from)) or bots:contains(jid.host(event.from)) then
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
		local nick = room:get_registered_nick(jid);
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
		if not nick then
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
			-- Allow bot to specify its own nick, but we're appending '[bot]' to it.
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
			-- FIXME HATS!!!
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
			nick = event.stanza:get_child_text("nick", "http://jabber.org/protocol/nick");
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    18
			nick = (nick or jid.bare(event.from)) .. "[bot]";
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
		end
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    21
		local virtual_occupant_jid = jid.prep(room.jid .. "/" .. nick, true);
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    22
		if not virtual_occupant_jid then
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
			module:send(st.error_reply(event.stanza, "modify", "jid-malformed", "Nickname must pass strict validation", room.jid));
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    24
			return true;
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
		end
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
4828
205b9d06fe6b mod_muc_bot: Use correct JID for virtual occupant
Kim Alvefur <zash@zash.se>
parents: 4571
diff changeset
    27
		local occupant = room:new_occupant(jid.bare(event.from), virtual_occupant_jid);
4568
d25f0fea270f mod_muc_bot: Reduce hackyness of occupant construction
Kim Alvefur <zash@zash.se>
parents: 4567
diff changeset
    28
		local join = st.presence({from = event.from; to = virtual_occupant_jid});
d25f0fea270f mod_muc_bot: Reduce hackyness of occupant construction
Kim Alvefur <zash@zash.se>
parents: 4567
diff changeset
    29
		local dest_x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user"});
d25f0fea270f mod_muc_bot: Reduce hackyness of occupant construction
Kim Alvefur <zash@zash.se>
parents: 4567
diff changeset
    30
		occupant:set_session(event.from, join, true);
4569
3b2ae854842c mod_muc_bot: Save occupant to room
Kim Alvefur <zash@zash.se>
parents: 4568
diff changeset
    31
		room:save_occupant(occupant);
3b2ae854842c mod_muc_bot: Save occupant to room
Kim Alvefur <zash@zash.se>
parents: 4568
diff changeset
    32
		room:publicise_occupant_status(occupant, dest_x);
4567
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
		-- Inject virtual occupant to trick all the other hooks on this event that
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    34
		-- this is an actual legitimate participant.
4568
d25f0fea270f mod_muc_bot: Reduce hackyness of occupant construction
Kim Alvefur <zash@zash.se>
parents: 4567
diff changeset
    35
		event.occupant = occupant;
4567
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    36
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
	end
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
end, 66);
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
module:hook("muc-occupant-pre-join", function(event)
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    41
	local room = event.room;
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
	local nick = jid.resource(event.occupant.nick);
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    43
	if nick:sub(-5, -1) == "[bot]" then
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
		event.origin.send(st.error_reply(event.stanza, "modify", "policy-violation", "Only known bots may use the [bot] suffix", room.jid));
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    45
		return true;
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    46
	end
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    47
end, 3);
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    48
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    49
module:hook("muc-occupant-pre-change", function(event)
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    50
	local room = event.room;
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    51
	local nick = jid.resource(event.dest_occupant.nick);
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    52
	if nick:sub(-5, -1) == "[bot]" then
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    53
		event.origin.send(st.error_reply(event.stanza, "modify", "policy-violation", "Only known bots may use the [bot] suffix", room.jid));
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    54
		return true;
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
	end
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    56
end, 3);
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    57
4570
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4569
diff changeset
    58
if not module:get_option_boolean("bots_get_messages", true) then
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4569
diff changeset
    59
	module:hook("muc-broadcast-message", function (event)
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4569
diff changeset
    60
		event.room:broadcast(event.stanza, function (nick, occupant)
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4569
diff changeset
    61
			if nick:sub(-5, -1) == "[bot]" or bots:contains(occupant.bare_jid) or bots:contains(jid.host(occupant.bare_jid)) then
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4569
diff changeset
    62
				return false;
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4569
diff changeset
    63
			else
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4569
diff changeset
    64
				return true;
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4569
diff changeset
    65
			end
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4569
diff changeset
    66
		end);
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4569
diff changeset
    67
		return true;
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4569
diff changeset
    68
	end, -100);
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4569
diff changeset
    69
end
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4569
diff changeset
    70
4571
bcf4518d18d4 mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents: 4570
diff changeset
    71
if module:get_option_boolean("ignore_bot_errors", true) then
bcf4518d18d4 mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents: 4570
diff changeset
    72
	module:hook("message/full", function (event)
bcf4518d18d4 mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents: 4570
diff changeset
    73
		local stanza = event.stanza;
bcf4518d18d4 mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents: 4570
diff changeset
    74
		if stanza.attr.type == "error" then
bcf4518d18d4 mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents: 4570
diff changeset
    75
			if bots:contains(jid.bare(stanza.attr.from)) or bots:contains(jid.host(stanza.attr.from)) then
bcf4518d18d4 mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents: 4570
diff changeset
    76
				module:log("debug", "Ignoring error from known bot");
bcf4518d18d4 mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents: 4570
diff changeset
    77
				return true;
bcf4518d18d4 mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents: 4570
diff changeset
    78
			end
bcf4518d18d4 mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents: 4570
diff changeset
    79
		end
bcf4518d18d4 mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents: 4570
diff changeset
    80
	end, 1);
bcf4518d18d4 mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents: 4570
diff changeset
    81
end
bcf4518d18d4 mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents: 4570
diff changeset
    82
4567
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    83
assert(string.sub("foo[bot]", -5, -1) == "[bot]", "substring indicies, how do they work?");