# HG changeset patch # User Emmanuel Gil Peyrot # Date 1631817674 -7200 # Node ID 82dabfffaddfc5e0a800e1f4a2f57ad236d9bab0 # Parent ecfffbbcbf4247a70be4be4a2eb122ad9f67b329 mod_muc_require_tos: Add this new module diff -r ecfffbbcbf42 -r 82dabfffaddf mod_muc_require_tos/README.markdown --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_muc_require_tos/README.markdown Thu Sep 16 20:41:14 2021 +0200 @@ -0,0 +1,31 @@ +--- +labels: +- 'Stage-Alpha' +summary: Require visitors to accept something before being allowed in a room +... + +# Introduction + +This module sends a message to visitors of a room, prompting them to accept or reject it. + +They get kicked if they reject it, and become members if they accept it. + +# Setup + +```lua +Component "rooms.example.org" "muc" + modules_enabled = { + "muc_require_tos"; + } + tos_welcome_message = "Please read and accept the TOS of this service: https://lurk.org/TOS.txt" + tos_yes_message = "Thanks, and welcome here!" + tos_no_message = "Too bad." +``` + +Compatibility +============= + + ----- ----- + trunk Works + ----- ----- + diff -r ecfffbbcbf42 -r 82dabfffaddf mod_muc_require_tos/mod_muc_require_tos.lua --- /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, is sent at this priority.