Software /
code /
prosody-modules
Annotate
mod_muc_bot/mod_muc_bot.lua @ 5160:8474a3b80200
mod_firewall: Fix 'is_admin' internal dependency rule #1797 (thanks diane)
Looks like the boolean logic was inverted here. Instead, for now,
simply check if is_admin is there. It is deprecated in trunk and was
briefly removed before being brought back with a 'deprecated' warning as
part of the new roles and permissions work. Making this dependency
conditioned on the existence of the underlying function should make it
work until it actually goes away for real.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 27 Jan 2023 23:06:25 +0100 |
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?"); |