Diff

mod_csi_muc_priorities/mod_csi_muc_priorities.lua @ 6208:e20901443eae draft

Merge
author Trần H. Trung <xmpp:trần.h.trung@trung.fun>
date Mon, 17 Mar 2025 23:42:11 +0700
parent 4014:1b68954a743a
child 6211:750d64c47ec6
line wrap: on
line diff
--- a/mod_csi_muc_priorities/mod_csi_muc_priorities.lua	Wed Feb 26 19:36:35 2025 +0700
+++ b/mod_csi_muc_priorities/mod_csi_muc_priorities.lua	Mon Mar 17 23:42:11 2025 +0700
@@ -12,14 +12,6 @@
 			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
@@ -33,12 +25,33 @@
 					end
 					-- Your own messages
 					if stanza.attr.from == (room_jid .. "/" .. room_nick) then
-					event.reason = "muc own message";
+						event.reason = "muc own message";
 						return true;
 					end
 				end
 			end
 
+			-- No mentions found, check other logic:
+			--			deflaultlow=f or nil	defaultlow=t
+			--	in high prio	nil			nil
+			--	in low prio	false			false
+			--	not in either	nil			false
+			--
+			--	true	means:	important (always send immediately)
+			--	nil	means:	normal (respect other mods for stuff like grace period/reactions/etc)
+			--	false	means:	unimportant (delay sending)
+			if priorities then
+				local priority = priorities[room_jid];
+				if priority == false then  -- low priority
+					event.reason = "muc priority";
+					return false;
+				end
+				if priorities[false] and priorities[false]["defaultlow"] and not priority then -- defaultlow is false or nil or not high priority
+					event.reason = "muc user default low";
+					return false;
+				end
+			end
+
 			-- Standard importance and no mention, leave to other modules to decide for now
 			return nil;
 		end
@@ -74,6 +87,12 @@
 		label = "Lower priority";
 		desc = "E.g. large noisy public channels";
 	};
+	{
+		type = "boolean";
+		name = "defaultlow";
+		label = "Default to lower priority";
+		desc = "Mark all channels lower priority as default";
+	};
 }
 
 local store = module:open_store();
@@ -87,20 +106,29 @@
 	local prioritized_jids = user_sessions[username].csi_muc_priorities or store:get(username);
 	local important = {};
 	local unimportant = {};
+	local defaultlow = false; -- Default to high priority
 	if prioritized_jids then
 		for jid, priority in pairs(prioritized_jids) do
-			if priority then
-				table.insert(important, jid);
-			else
-				table.insert(unimportant, jid);
+			if jid then
+				if priority then
+					table.insert(important, jid);
+				else
+					table.insert(unimportant, jid);
+				end
 			end
 		end
 		table.sort(important);
 		table.sort(unimportant);
+
+		if prioritized_jids[false] then
+			defaultlow = prioritized_jids[false]["defaultlow"];
+		end
 	end
+
 	return {
 		important = important;
 		unimportant = unimportant;
+		defaultlow = defaultlow
 	};
 end, function(fields, form_err, data)
 	if form_err then
@@ -108,17 +136,18 @@
 	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
+		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
+
+	local misc_data = {defaultlow = fields.defaultlow};
+	prioritized_jids[false] = misc_data;
 
 	local username = jid_split(data.from);
 	local ok, err = store:set(username, prioritized_jids);