Annotate

mod_muc_bot/mod_muc_bot.lua @ 4565:3b2ae854842c

mod_muc_bot: Save occupant to room This has some side-effects: Firstly, the bot shows up in occupant list, which is nice. Secondly, the bot starts receiving messages from the room which might be wanted, but it would be better to join the room for real in this case.
author Kim Alvefur <zash@zash.se>
date Sat, 10 Apr 2021 19:23:25 +0200
parent 4564:d25f0fea270f
child 4566:174c7a3c819b
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
4564
d25f0fea270f mod_muc_bot: Reduce hackyness of occupant construction
Kim Alvefur <zash@zash.se>
parents: 4563
diff changeset
27 local occupant = room:new_occupant(module.host, virtual_occupant_jid);
d25f0fea270f mod_muc_bot: Reduce hackyness of occupant construction
Kim Alvefur <zash@zash.se>
parents: 4563
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: 4563
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: 4563
diff changeset
30 occupant:set_session(event.from, join, true);
4565
3b2ae854842c mod_muc_bot: Save occupant to room
Kim Alvefur <zash@zash.se>
parents: 4564
diff changeset
31 room:save_occupant(occupant);
3b2ae854842c mod_muc_bot: Save occupant to room
Kim Alvefur <zash@zash.se>
parents: 4564
diff changeset
32 room:publicise_occupant_status(occupant, dest_x);
4563
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.
4564
d25f0fea270f mod_muc_bot: Reduce hackyness of occupant construction
Kim Alvefur <zash@zash.se>
parents: 4563
diff changeset
35 event.occupant = occupant;
4563
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
30f2d7c3f946 mod_muc_bot: Attempt at module easing creation of stateless bots
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58 assert(string.sub("foo[bot]", -5, -1) == "[bot]", "substring indicies, how do they work?");