Changeset

5997:d3812826c1cd

mod_csi_muc_priorities: Allow setting the default priority for mucs to low Move the priority checking after the mention check so that if there is a mention we return true. Add an option to the form to set the default priority to low. Return `nil` in cases where we determite that the priority should be high, as with `mod_csi_simple` this causes normal MUC messages to be marked important while allowing mod_csi_grace_period and unneeded messages to be queued.
author aereaux <aidan@jmad.org>
date Sun, 22 Sep 2024 08:13:09 -0700
parents 5996:a1aa56ebe73f
children 5999:9db6bad7cc36
files mod_csi_muc_priorities/README.markdown mod_csi_muc_priorities/mod_csi_muc_priorities.lua
diffstat 2 files changed, 55 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/mod_csi_muc_priorities/README.markdown	Tue Oct 08 22:23:57 2024 +0200
+++ b/mod_csi_muc_priorities/README.markdown	Sun Sep 22 08:13:09 2024 -0700
@@ -1,7 +1,7 @@
 # Introduction
 
 This module lets users specify which of the group chats they are in are
-less important. This influences when
+more or less important. This influences when
 [mod_csi_simple][doc:modules:mod_csi_simple] decides to send
 stanzas vs waiting until there is more to send. Users in many large
 public channels might benefit from this.
@@ -12,16 +12,17 @@
 chat priorities* that should appear in the menus of compatible clients.
 
 The command presents a form that accepts a list of XMPP addresses.
-Currently there is a single priority, *Lower priority*, which is
-suitable for e.g. noisy public channels. mod_csi_simple considers
-groupchat messages important by default on the assumptions that smaller
-and more important private chats are more common among most users.
+Currently you can specify channels as lower priority (which is suitable
+for e.g. noisy public channels) or higher priority (which is suitable
+for e.g. small private channels where immediate message delivery is
+desired).  You can also specify whether mucs default to lower priority
+or not.
 
-A message of type groupchat from an address in this list will not be
-considered important enough to send it to an inactive client, unless it
-is from the current user or mentions of their nickname. **Note** that
-mention support require the separate module [mod_track_muc_joins]
-to also be loaded.
+A message of type groupchat from an address in the low priority list will
+not be considered important enough to send it to an inactive client,
+unless it is from the current user or mentions of their nickname.
+**Note** that mention support require the separate module
+[mod_track_muc_joins] to also be loaded.
 
 ``` {.lua}
 modules_enabled = {
--- a/mod_csi_muc_priorities/mod_csi_muc_priorities.lua	Tue Oct 08 22:23:57 2024 +0200
+++ b/mod_csi_muc_priorities/mod_csi_muc_priorities.lua	Sun Sep 22 08:13:09 2024 -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
@@ -118,6 +146,9 @@
 		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);
 	if ok then