annotate mod_muc_bot/mod_muc_bot.lua @ 5175:432587ad1642

mod_muc_rtbl: fix traceback because of scoping error There is no "event" there, we have to use the occupant data instead. That's what you get for moving code around!
author Jonas Schäfer <jonas@wielicki.name>
date Wed, 22 Feb 2023 13:33:16 +0100
parents 205b9d06fe6b
children
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
4824
205b9d06fe6b mod_muc_bot: Use correct JID for virtual occupant
Kim Alvefur <zash@zash.se>
parents: 4567
diff changeset
27 local occupant = room:new_occupant(jid.bare(event.from), virtual_occupant_jid);
4564
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
4566
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4565
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: 4565
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: 4565
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: 4565
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: 4565
diff changeset
62 return false;
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4565
diff changeset
63 else
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4565
diff changeset
64 return true;
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4565
diff changeset
65 end
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4565
diff changeset
66 end);
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4565
diff changeset
67 return true;
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4565
diff changeset
68 end, -100);
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4565
diff changeset
69 end
174c7a3c819b mod_muc_bot: Add option to not send any messages to bots
Kim Alvefur <zash@zash.se>
parents: 4565
diff changeset
70
4567
bcf4518d18d4 mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents: 4566
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: 4566
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: 4566
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: 4566
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: 4566
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: 4566
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: 4566
diff changeset
77 return true;
bcf4518d18d4 mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents: 4566
diff changeset
78 end
bcf4518d18d4 mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents: 4566
diff changeset
79 end
bcf4518d18d4 mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents: 4566
diff changeset
80 end, 1);
bcf4518d18d4 mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents: 4566
diff changeset
81 end
bcf4518d18d4 mod_muc_bot: Add option to ignore error bounces from bots
Kim Alvefur <zash@zash.se>
parents: 4566
diff changeset
82
4563
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?");