Mercurial > prosody-modules
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 4562:28c16c93d79a | 4563:30f2d7c3f946 |
|---|---|
| 1 local st = require "util.stanza"; | |
| 2 local jid = require "util.jid"; | |
| 3 | |
| 4 local bots = module:get_option_set("known_bots", {}); | |
| 5 | |
| 6 module:hook("muc-occupant-groupchat", function(event) | |
| 7 if event.occupant then return end -- skip messages from actual occupants | |
| 8 local room = event.room; | |
| 9 | |
| 10 if bots:contains(jid.bare(event.from)) or bots:contains(jid.host(event.from)) then | |
| 11 | |
| 12 local nick = room:get_registered_nick(jid); | |
| 13 | |
| 14 if not nick then | |
| 15 -- Allow bot to specify its own nick, but we're appending '[bot]' to it. | |
| 16 -- FIXME HATS!!! | |
| 17 nick = event.stanza:get_child_text("nick", "http://jabber.org/protocol/nick"); | |
| 18 nick = (nick or jid.bare(event.from)) .. "[bot]"; | |
| 19 end | |
| 20 | |
| 21 local virtual_occupant_jid = jid.prep(room.jid .. "/" .. nick, true); | |
| 22 if not virtual_occupant_jid then | |
| 23 module:send(st.error_reply(event.stanza, "modify", "jid-malformed", "Nickname must pass strict validation", room.jid)); | |
| 24 return true; | |
| 25 end | |
| 26 | |
| 27 -- Inject virtual occupant to trick all the other hooks on this event that | |
| 28 -- this is an actual legitimate participant. | |
| 29 -- XXX Hack! | |
| 30 event.occupant = { | |
| 31 nick = virtual_occupant_jid; | |
| 32 bare_jid = jid.bare(event.from); | |
| 33 role = "participant"; | |
| 34 }; | |
| 35 | |
| 36 end | |
| 37 end, 66); | |
| 38 | |
| 39 module:hook("muc-occupant-pre-join", function(event) | |
| 40 local room = event.room; | |
| 41 local nick = jid.resource(event.occupant.nick); | |
| 42 if nick:sub(-5, -1) == "[bot]" then | |
| 43 event.origin.send(st.error_reply(event.stanza, "modify", "policy-violation", "Only known bots may use the [bot] suffix", room.jid)); | |
| 44 return true; | |
| 45 end | |
| 46 end, 3); | |
| 47 | |
| 48 module:hook("muc-occupant-pre-change", function(event) | |
| 49 local room = event.room; | |
| 50 local nick = jid.resource(event.dest_occupant.nick); | |
| 51 if nick:sub(-5, -1) == "[bot]" then | |
| 52 event.origin.send(st.error_reply(event.stanza, "modify", "policy-violation", "Only known bots may use the [bot] suffix", room.jid)); | |
| 53 return true; | |
| 54 end | |
| 55 end, 3); | |
| 56 | |
| 57 assert(string.sub("foo[bot]", -5, -1) == "[bot]", "substring indicies, how do they work?"); |
