mod_muc_bot/mod_muc_bot.lua
author Matthew Wild <mwild1@gmail.com>
Tue, 18 Jan 2022 17:01:18 +0000
changeset 4880 0f5f2d4475b9
parent 4828 205b9d06fe6b
permissions -rw-r--r--
mod_http_xep227: Add support for import via APIs rather than direct store manipulation In particular this transitions PEP nodes and data to be imported via mod_pep's APIs, fixing issues with importing at runtime while PEP data may already be live in RAM. Next obvious candidate for this approach is rosters, so clients get immediate roster pushes and other special handling (such as emitting subscribes to reach the desired subscription state).
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?");