view mod_csi_muc_priorities/mod_csi_muc_priorities.lua @ 4409:44f6537f6427

mod_invites_adhoc: Fail contact invite if user is not on current host Only the username was being used, and the host of the requester ignored. Luckily this only affects admins of the host. If they want to create an account they can use the other command. If they want to create a contact they should request from their account on this host.
author Matthew Wild <mwild1@gmail.com>
date Thu, 28 Jan 2021 07:04:11 +0000
parents 1b68954a743a
children
line wrap: on
line source

local jid_bare, jid_split = import("util.jid", "bare", "split");

-- luacheck: ignore 122
local user_sessions = prosody.hosts[module.host].sessions;

module:hook("csi-is-stanza-important", function (event)
	local stanza, session = event.stanza, event.session;
	if stanza.name == "message" then
		if stanza.attr.type == "groupchat" then
			local room_jid = jid_bare(stanza.attr.from);

			local username = session.username;
			local priorities = user_sessions[username].csi_muc_priorities;

			if priorities then
				local priority = priorities[room_jid];
				if priority ~= nil then
					event.reason = "muc priority";
					return priority;
				end
			end

			-- Look for mention
			local rooms = session.rooms_joined;
			if rooms then
				local body = stanza:get_child_text("body");
				if not body then return end
				local room_nick = rooms[room_jid];
				if room_nick then
					if body:find(room_nick, 1, true) then
						event.reason = "muc mention";
						return true;
					end
					-- Your own messages
					if stanza.attr.from == (room_jid .. "/" .. room_nick) then
					event.reason = "muc own message";
						return true;
					end
				end
			end

			-- Standard importance and no mention, leave to other modules to decide for now
			return nil;
		end
	end
end);

module:depends("adhoc");

local dataform = require"util.dataforms";
local adhoc_inital_data = require "util.adhoc".new_initial_data_form;
local instructions = [[
These settings affect battery optimizations performed by the server
while your client has indicated that it is inactive.
]]

local priority_settings_form = dataform.new {
	title = "Prioritize addresses of group chats";
	instructions = instructions;
	{
		type = "hidden";
		name = "FORM_TYPE";
		value = "xmpp:modules.prosody.im/mod_"..module.name;
	};
	{
		type = "jid-multi";
		name = "important";
		label = "Higher priority";
		desc = "Group chats more important to you";
	};
	{
		type = "jid-multi";
		name = "unimportant";
		label = "Lower priority";
		desc = "E.g. large noisy public channels";
	};
}

local store = module:open_store();
module:hook("resource-bind", function (event)
	local username = event.session.username;
	user_sessions[username].csi_muc_priorities = store:get(username);
end);

local adhoc_command_handler = adhoc_inital_data(priority_settings_form, function (data)
	local username = jid_split(data.from);
	local prioritized_jids = user_sessions[username].csi_muc_priorities or store:get(username);
	local important = {};
	local unimportant = {};
	if prioritized_jids then
		for jid, priority in pairs(prioritized_jids) do
			if priority then
				table.insert(important, jid);
			else
				table.insert(unimportant, jid);
			end
		end
		table.sort(important);
		table.sort(unimportant);
	end
	return {
		important = important;
		unimportant = unimportant;
	};
end, function(fields, form_err, data)
	if form_err then
		return { status = "completed", error = { message = "Problem in submitted form" } };
	end
	local prioritized_jids = {};
	if fields.unimportant then
		if fields.unimportant then
			for _, jid in ipairs(fields.unimportant) do
				prioritized_jids[jid] = false;
			end
		end
		if fields.important then
			for _, jid in ipairs(fields.important) do
				prioritized_jids[jid] = true;
			end
		end
	end

	local username = jid_split(data.from);
	local ok, err = store:set(username, prioritized_jids);
	if ok then
		user_sessions[username].csi_muc_priorities = prioritized_jids;
		return { status = "completed", info = "Priorities updated" };
	else
		return { status = "completed", error = { message = "Error saving priorities: "..err } };
	end
end);

module:add_item("adhoc", module:require "adhoc".new("Configure group chat priorities",
	"xmpp:modules.prosody.im/mod_"..module.name, adhoc_command_handler, "local_user"));