Mercurial > prosody-modules
diff mod_muc_require_tos/mod_muc_require_tos.lua @ 4690:82dabfffaddf
mod_muc_require_tos: Add this new module
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Thu, 16 Sep 2021 20:41:14 +0200 |
parents | |
children | 1f1dbf652b37 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_muc_require_tos/mod_muc_require_tos.lua Thu Sep 16 20:41:14 2021 +0200 @@ -0,0 +1,47 @@ +local jid = require "util.jid"; +local st = require "util.stanza"; + +local quick_response_ns = "urn:xmpp:tmp:quick-response"; +local welcome_message = module:get_option_string("tos_welcome_message"); +local yes_message = module:get_option_string("tos_yes_message"); +local no_message = module:get_option_string("tos_no_message"); + +module:hook("muc-occupant-joined", function(event) + local origin = event.origin; + local room = event.room; + local occupant = event.occupant; + local nick = occupant.nick; + module:log("debug", "%s joined %s (%s)", nick, room, origin); + if occupant.role == "visitor" then + local message = st.message({ + type = "groupchat", + to = occupant.nick, + from = room.jid, + id = "foo", + ["xml:lang"] = "en", + }, welcome_message) + :tag("response", { xmlns = quick_response_ns, value = "yes", label = "I accept." }):up() + :tag("response", { xmlns = quick_response_ns, value = "no", label = "I decline." }):up(); + origin.send(message); + end +end); + +module:hook("muc-occupant-groupchat", function(event) + local occupant = event.occupant; + if occupant.role ~= "visitor" then + return; + end + local origin = event.origin; + local room = event.room; + local stanza = event.stanza; + -- Namespace must be nil instead of "jabber:client" here. + local body = stanza:get_child_text("body", nil); + module:log("debug", "%s replied %s", occupant.nick, body); + if body == "yes" then + room:set_affiliation(true, occupant.bare_jid, "member", "Agreed to the TOS."); + origin.send(st.reply(stanza):body(yes_message, { ["xml:lang"] = "en" })); + elseif body == "no" then + origin.send(st.reply(stanza):body(no_message, { ["xml:lang"] = "en" })); + room:set_role(true, occupant.nick, "none", "Declined the TOS."); + end +end, 51); -- Priority must be > 50, <forbidden/> is sent at this priority.