Mercurial > prosody-modules
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 |
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?"); |