comparison mod_muc_bot/mod_muc_bot.lua @ 4563:30f2d7c3f946

mod_muc_bot: Attempt at module easing creation of stateless bots
author Kim Alvefur <zash@zash.se>
date Thu, 01 Apr 2021 13:15:05 +0200
parents
children d25f0fea270f
comparison
equal deleted inserted replaced
4562:28c16c93d79a 4563:30f2d7c3f946
1 local st = require "util.stanza";
2 local jid = require "util.jid";
3
4 local bots = module:get_option_set("known_bots", {});
5
6 module:hook("muc-occupant-groupchat", function(event)
7 if event.occupant then return end -- skip messages from actual occupants
8 local room = event.room;
9
10 if bots:contains(jid.bare(event.from)) or bots:contains(jid.host(event.from)) then
11
12 local nick = room:get_registered_nick(jid);
13
14 if not nick then
15 -- Allow bot to specify its own nick, but we're appending '[bot]' to it.
16 -- FIXME HATS!!!
17 nick = event.stanza:get_child_text("nick", "http://jabber.org/protocol/nick");
18 nick = (nick or jid.bare(event.from)) .. "[bot]";
19 end
20
21 local virtual_occupant_jid = jid.prep(room.jid .. "/" .. nick, true);
22 if not virtual_occupant_jid then
23 module:send(st.error_reply(event.stanza, "modify", "jid-malformed", "Nickname must pass strict validation", room.jid));
24 return true;
25 end
26
27 -- Inject virtual occupant to trick all the other hooks on this event that
28 -- this is an actual legitimate participant.
29 -- XXX Hack!
30 event.occupant = {
31 nick = virtual_occupant_jid;
32 bare_jid = jid.bare(event.from);
33 role = "participant";
34 };
35
36 end
37 end, 66);
38
39 module:hook("muc-occupant-pre-join", function(event)
40 local room = event.room;
41 local nick = jid.resource(event.occupant.nick);
42 if nick:sub(-5, -1) == "[bot]" then
43 event.origin.send(st.error_reply(event.stanza, "modify", "policy-violation", "Only known bots may use the [bot] suffix", room.jid));
44 return true;
45 end
46 end, 3);
47
48 module:hook("muc-occupant-pre-change", function(event)
49 local room = event.room;
50 local nick = jid.resource(event.dest_occupant.nick);
51 if nick:sub(-5, -1) == "[bot]" then
52 event.origin.send(st.error_reply(event.stanza, "modify", "policy-violation", "Only known bots may use the [bot] suffix", room.jid));
53 return true;
54 end
55 end, 3);
56
57 assert(string.sub("foo[bot]", -5, -1) == "[bot]", "substring indicies, how do they work?");