--- /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
+```
--- /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);