Software /
code /
prosody-modules
Annotate
mod_muc_bot/mod_muc_bot.lua @ 4941:e7b9bc629ecc
mod_rest: Add special handling to catch MAM results from remote hosts
Makes MAM queries to remote hosts works.
As the comment says, MAM results from users' local archives or local
MUCs are returned via origin.send() which is provided in the event and
thus already worked. Results from remote hosts go via normal stanza
routing and events, which need this extra handling to catch.
This pattern of iq-set, message+, iq-result is generally limited to MAM.
Closest similar thing might be MUC join, but to really handle that you
would need the webhook callback mechanism.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Mon, 16 May 2022 19:47:09 +0200 |
parent | 4824:205b9d06fe6b |
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?"); |