Task lists WIP:

* handling affilation loss
* handling user with no current connection
This commit is contained in:
John Livingston 2024-05-09 19:20:21 +02:00
parent a976b2a1d8
commit 0326fbc4a5
No known key found for this signature in database
GPG Key ID: B17B5640CE66CDBC

View File

@ -13,6 +13,10 @@
-- Implemented nodes: -- Implemented nodes:
-- * livechat-tasks: contains tasklist and task items, specific to livechat plugin. -- * livechat-tasks: contains tasklist and task items, specific to livechat plugin.
-- There are some other tricks in this module:
-- * no message sent to offline users
-- * unsubscribing users when losing their affiliation
-- TODO: add disco support. -- TODO: add disco support.
local pubsub = require "util.pubsub"; local pubsub = require "util.pubsub";
@ -24,6 +28,7 @@ local st = require "util.stanza";
local new_id = require "util.id".medium; local new_id = require "util.id".medium;
local storagemanager = require "core.storagemanager"; local storagemanager = require "core.storagemanager";
local uuid_generate = require "util.uuid".generate; local uuid_generate = require "util.uuid".generate;
local bare_sessions = prosody.bare_sessions;
local xmlns_pubsub = "http://jabber.org/protocol/pubsub"; local xmlns_pubsub = "http://jabber.org/protocol/pubsub";
local xmlns_pubsub_event = "http://jabber.org/protocol/pubsub#event"; local xmlns_pubsub_event = "http://jabber.org/protocol/pubsub#event";
@ -172,6 +177,29 @@ local function get_broadcaster(room_jid, room_host)
return simple_broadcast; return simple_broadcast;
end end
-- We only broadcast messages to users currently online.
local function get_subscriber_filter(room_jid, room_host)
return function (jids, node)
local broadcast_to = {};
if (room_host ~= host) then;
return broadcast_to;
end
local service = services[room_jid];
for jid, opts in pairs(jids) do
local bare_jid = jid_bare(jid);
if (not bare_sessions[bare_jid]) then
module:log("debug", "Filtering subscriptions for user %q, as he/she is not currently logged in.", bare_jid);
else
broadcast_to[jid] = opts;
end
end
return broadcast_to;
end
end
-- Read-only service with no nodes where nobody is allowed anything to act as a -- Read-only service with no nodes where nobody is allowed anything to act as a
-- fallback for interactions with non-existent rooms -- fallback for interactions with non-existent rooms
local noroom_service = pubsub.new({ local noroom_service = pubsub.new({
@ -222,6 +250,7 @@ function get_mep_service(room_jid, room_host)
nodestore = nodestore(room_jid); nodestore = nodestore(room_jid);
itemstore = simple_itemstore(room_jid); itemstore = simple_itemstore(room_jid);
broadcaster = get_broadcaster(room_jid, room_host); broadcaster = get_broadcaster(room_jid, room_host);
subscriber_filter = get_subscriber_filter(room_jid, room_host);
itemcheck = is_item_stanza; itemcheck = is_item_stanza;
get_affiliation = function (jid) get_affiliation = function (jid)
-- module:log("debug", "get_affiliation call for %q", jid); -- module:log("debug", "get_affiliation call for %q", jid);
@ -316,3 +345,31 @@ module:hook("muc-room-destroyed", function(event)
-- recipients[room_jid] = nil; -- recipients[room_jid] = nil;
end end
end); end);
-- When a user lose its admin/owner affilation, and is still subscribed to the node,
-- we must unsubscribe him.
module:hook("muc-set-affiliation", function(event)
local previous_affiliation = event.previous_affiliation;
local new_affiliation = event.affiliation;
if (new_affiliation == 'owner' or new_affiliation == 'admin') then
return;
end
if (previous_affiliation ~= 'owner' and previous_affiliation ~= 'admin') then
return;
end
local jid = event.jid;
local room = event.room;
module:log(
"debug",
"User %q lost its admin/owner affilition in room %q, must remove node subscription (if exists).",
jid, room.jid
);
local room_jid, room_host = jid_split(room.jid);
local service = get_mep_service(room_jid, room_host);
for node in pairs(service.nodes) do
-- remove_subscription can fail if user is not subscribed, but that is ok.
service:remove_subscription(node, true, jid);
end
end);