Mercurial > prosody-modules
view mod_muc_restrict_rooms/mod_muc_restrict_rooms.lua @ 3532:85c357b69eec
mod_csi_muc_priorities: Reduce importance of group chat messages
This helps if you are in more noisy public channels than small private
group chats.
The short term plan is to give users the ability to set MUC JIDs as
either high or low priority and use that. Long term it would be great to
be able to automatically classify MUCs as public channels vs private
group chats.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Mon, 01 Apr 2019 00:15:13 +0200 |
parents | 79adec50b24d |
children |
line wrap: on
line source
local st = require "util.stanza"; local jid = require "util.jid"; local nodeprep = require "util.encodings".stringprep.nodeprep; local rooms = module:shared "muc/rooms"; if not rooms then module:log("error", "This module only works on MUC components!"); return; end local restrict_patterns = module:get_option("muc_restrict_matching", {}); local restrict_excepts = module:get_option_set("muc_restrict_exceptions", {}); local restrict_allow_admins = module:get_option_boolean("muc_restrict_allow_admins", false); local function is_restricted(room, who) -- If admins can join prohibited rooms, we allow them to if restrict_allow_admins and usermanager.is_admin(who, module.host) then module:log("debug", "Admins are allowed to enter restricted rooms (%s on %s)", who, room) return nil; end -- Don't evaluate exceptions if restrict_excepts:contains(room) then module:log("debug", "Room %s is amongst restriction exceptions", room()) return nil; end -- Evaluate regexps of restricted patterns for pattern,reason in pairs(restrict_patterns) do if room:match(pattern) then module:log("debug", "Room %s is restricted by pattern %s, user %s is not allowed to join (%s)", room, pattern, who, reason) return reason; end end return nil end module:hook("presence/full", function(event) local stanza = event.stanza; if stanza.name == "presence" and stanza.attr.type == "unavailable" then -- Leaving events get discarded return; end -- Get the room local room = jid.split(stanza.attr.to); if not room then return; end -- Get who has tried to join it local who = jid.bare(stanza.attr.from) -- Checking whether room is restricted local check_restricted = is_restricted(room, who) if check_restricted ~= nil then event.allowed = false; event.stanza.attr.type = 'error'; return event.origin.send(st.error_reply(event.stanza, "cancel", "forbidden", "You're not allowed to enter this room: " .. check_restricted)); end end, 10);