annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4563
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
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 -- 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
28 -- this is an actual legitimate participant.
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 -- XXX Hack!
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 event.occupant = {
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 nick = virtual_occupant_jid;
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
32 bare_jid = jid.bare(event.from);
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33 role = "participant";
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 };
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36 end
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 end, 66);
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39 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
40 local room = event.room;
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
41 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
42 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
43 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
44 return true;
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
45 end
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
46 end, 3);
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
47
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
48 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
49 local room = event.room;
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 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
51 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
52 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
53 return true;
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 end
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
55 end, 3);
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57 assert(string.sub("foo[bot]", -5, -1) == "[bot]", "substring indicies, how do they work?");