# HG changeset patch # User Matthew Wild # Date 1569754107 -3600 # Node ID d267e381255fb456fc86baa9868b55f110452885 # Parent 7570976318a99cc69ad4f13f475b88cd8b0d9a2b mod_muc_hide_media: Module to allow hiding inline media in a MUC diff -r 7570976318a9 -r d267e381255f mod_muc_hide_media/README.markdown --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_muc_hide_media/README.markdown Sun Sep 29 11:48:27 2019 +0100 @@ -0,0 +1,26 @@ +# Introduction + +This module adds a room configuration option to hide inline media from MUCs and +display them as links instead. + +This can be useful in public channels where content posted by users should not +be shown by default. + +# Configuring + +## Enabling + +``` {.lua} +Component "rooms.example.net" "muc" +modules_enabled = { + "muc_hide_media"; +} +``` + +## Settings + +A default setting can be provided in the config file: + +``` {.lua} +muc_room_default_hide_media = true +``` diff -r 7570976318a9 -r d267e381255f mod_muc_hide_media/mod_muc_hide_media.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_muc_hide_media/mod_muc_hide_media.lua Sun Sep 29 11:48:27 2019 +0100 @@ -0,0 +1,57 @@ +module:depends"muc"; + +local hide_by_default = not module:get_option_boolean("muc_room_default_hide_media", false); + +local function should_hide_media(room) + local hide_media = room._data.hide_media; + if hide_media == nil then + hide_media = hide_by_default; + end + return hide_media; +end + +module:hook("muc-config-form", function(event) + local room, form = event.room, event.form; + table.insert(form, { + name = "{xmpp:prosody.im}muc#roomconfig_display_media", + type = "boolean", + label = "Display inline media (images, etc.)", + value = not should_hide_media(room), + }); +end); + +module:hook("muc-config-submitted", function(event) + local room, fields, changed = event.room, event.fields, event.changed; + local new_hide_media = not fields["{xmpp:prosody.im}muc#roomconfig_display_media"]; + if new_hide_media ~= should_hide_media(room) then + if new_hide_media == hide_by_default(room) then + room._data.hide_media = nil; + else + room._data.hide_media = new_hide_media; + end + if type(changed) == "table" then + changed["{xmpp:prosody.im}muc#roomconfig_display_media"] = true; + else + event.changed = true; + end + end +end); + +module:hook("muc-disco#info", function (event) + local room, form, formdata = event.room, event.form, event.formdata; + + local display_media = not should_hide_media(room); + table.insert(form, { + name = "{xmpp:prosody.im}muc#roomconfig_display_media", + }); + formdata["{xmpp:prosody.im}muc#roomconfig_display_media"] = display_media; +end); + + +module:hook("muc-occupant-groupchat", function (event) + local stanza = event.stanza; + if stanza.attr.type ~= "groupchat" then return; end + if should_hide_media(event.room) then + stanza:remove_children("x", "jabber:x:oob"); + end +end, 20);