Task lists WIP:
* optimizing and fixing the loss of affiliation * fix: unsubscribing based on bare_sessions does not work with remote servers. So we use the muc-occupant-left hook instead.
This commit is contained in:
parent
0326fbc4a5
commit
4345ae09b1
@ -14,7 +14,7 @@
|
|||||||
-- * 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:
|
-- There are some other tricks in this module:
|
||||||
-- * no message sent to offline users
|
-- * unsubscribing users that have left the room (the front-end will subscribe again when needed)
|
||||||
-- * unsubscribing users when losing their affiliation
|
-- * unsubscribing users when losing their affiliation
|
||||||
|
|
||||||
-- TODO: add disco support.
|
-- TODO: add disco support.
|
||||||
@ -177,29 +177,6 @@ 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({
|
||||||
@ -250,7 +227,6 @@ 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);
|
||||||
@ -366,10 +342,39 @@ module:hook("muc-set-affiliation", function(event)
|
|||||||
);
|
);
|
||||||
|
|
||||||
local room_jid, room_host = jid_split(room.jid);
|
local room_jid, room_host = jid_split(room.jid);
|
||||||
local service = get_mep_service(room_jid, room_host);
|
local service = services[room_jid];
|
||||||
|
if (not service) then
|
||||||
|
return;
|
||||||
|
end
|
||||||
|
|
||||||
for node in pairs(service.nodes) do
|
for node in pairs(service.nodes) do
|
||||||
-- remove_subscription can fail if user is not subscribed, but that is ok.
|
if service.nodes[node].subscribers[jid] then
|
||||||
service:remove_subscription(node, true, jid);
|
module:log("debug", " Unsubscribing from node %q", node);
|
||||||
|
service:remove_subscription(node, true, jid);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end);
|
||||||
|
|
||||||
|
-- When a user leaves a room, we must unsubscribe it
|
||||||
|
module:hook("muc-occupant-left", function (event)
|
||||||
|
local room = event.room;
|
||||||
|
local occupant = event.occupant;
|
||||||
|
|
||||||
|
local room_jid, room_host = jid_split(room.jid);
|
||||||
|
local service = services[room_jid];
|
||||||
|
if (not service) then
|
||||||
|
return;
|
||||||
|
end
|
||||||
|
|
||||||
|
module:log(
|
||||||
|
"debug",
|
||||||
|
"Occupant %q has left room %q, we must unsubscribe him/her for pubsub nodes.",
|
||||||
|
occupant.bare_jid, room_jid
|
||||||
|
);
|
||||||
|
for node in pairs(service.nodes) do
|
||||||
|
if service.nodes[node].subscribers[occupant.bare_jid] then
|
||||||
|
module:log("debug", " Unsubscribing from node %q", node);
|
||||||
|
service:remove_subscription(node, true, occupant.bare_jid);
|
||||||
|
end;
|
||||||
end
|
end
|
||||||
end);
|
end);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user