comparison mod_push2/mod_push2.lua @ 5664:4b052598e435

mod_push2: restore offline message hook Filtering is mostly handled in handle_notify_request now
author Stephen Paul Weber <singpolyma@singpolyma.net>
date Thu, 21 Sep 2023 18:47:27 -0500
parents a1d22d6efb3d
children 83ee752f148c
comparison
equal deleted inserted replaced
5663:a1d22d6efb3d 5664:4b052598e435
379 local node = to and jid.split(to) or session.username 379 local node = to and jid.split(to) or session.username
380 local user_push_services = push2_registrations:get(node) 380 local user_push_services = push2_registrations:get(node)
381 return node, (user_push_services or {}) 381 return node, (user_push_services or {})
382 end 382 end
383 383
384 -- publish on offline message
385 module:hook("message/offline/handle", function(event)
386 local node, user_push_services = get_push_settings(event.stanza, event.origin);
387 module:log("debug", "Invoking handle_notify_request() for offline stanza");
388 handle_notify_request(event.stanza, node, user_push_services, true);
389 end, 1);
390
384 -- publish on bare groupchat 391 -- publish on bare groupchat
385 -- this picks up MUC messages when there are no devices connected 392 -- this picks up MUC messages when there are no devices connected
386 module:hook("message/bare/groupchat", function(event) 393 module:hook("message/bare/groupchat", function(event)
387 local node, user_push_services = get_push_settings(event.stanza, event.origin); 394 local node, user_push_services = get_push_settings(event.stanza, event.origin);
388 local notify_push_services = {}; 395 local notify_push_services = {};
399 handle_notify_request(event.stanza, node, notify_push_services, true); 406 handle_notify_request(event.stanza, node, notify_push_services, true);
400 end, 1); 407 end, 1);
401 408
402 local function process_stanza_queue(queue, session, queue_type) 409 local function process_stanza_queue(queue, session, queue_type)
403 if not session.push_registration_id then return; end 410 if not session.push_registration_id then return; end
404 for _, match in ipairs(session.push_settings.matches) do
405 if match.match == "urn:xmpp:push2:match:archived-with-body" or match.match == "urn:xmpp:push2:match:archived" then
406 module:log("debug", "Not pushing because we are not archiving this stanza: %s", session.push_registration_id)
407 return
408 end
409 end
410 local user_push_services = {[session.push_registration_id] = session.push_settings}; 411 local user_push_services = {[session.push_registration_id] = session.push_settings};
411 local notified = { unimportant = false; important = false } 412 local notified = { unimportant = false; important = false }
412 for i=1, #queue do 413 for i=1, #queue do
413 local stanza = queue[i]; 414 local stanza = queue[i];
414 -- fast ignore of already pushed stanzas 415 -- fast ignore of already pushed stanzas
521 end 522 end
522 523
523 -- archive message added 524 -- archive message added
524 local function archive_message_added(event) 525 local function archive_message_added(event)
525 -- event is: { origin = origin, stanza = stanza, for_user = store_user, id = id } 526 -- event is: { origin = origin, stanza = stanza, for_user = store_user, id = id }
526 if not event.for_user then return; end 527 -- only notify for new mam messages when at least one device is online
528 if not event.for_user or not host_sessions[event.for_user] then return; end
527 -- Note that the stanza in the event is a clone not the same as other hooks, so dedupe doesn't work 529 -- Note that the stanza in the event is a clone not the same as other hooks, so dedupe doesn't work
528 -- This is a problem if you wan to to also hook offline message storage for example 530 -- This is a problem if you wan to to also hook offline message storage for example
529 local stanza = st.clone(event.stanza) 531 local stanza = st.clone(event.stanza)
530 stanza:tag("stanza-id", { xmlns = "urn:xmpp:sid:0", by = event.for_user.."@"..module.host, id = event.id }):up() 532 stanza:tag("stanza-id", { xmlns = "urn:xmpp:sid:0", by = event.for_user.."@"..module.host, id = event.id }):up()
531 local user_session = host_sessions[event.for_user] and host_sessions[event.for_user].sessions or {} 533 local user_session = host_sessions[event.for_user] and host_sessions[event.for_user].sessions or {}
556 break; 558 break;
557 end 559 end
558 end 560 end
559 if identifier_found then 561 if identifier_found then
560 identifier_found.log("debug", "Not pushing '%s' of new MAM stanza (session still alive)", identifier) 562 identifier_found.log("debug", "Not pushing '%s' of new MAM stanza (session still alive)", identifier)
561 elseif not has_body(stanza) then
562 for _, match in ipairs(push_info.matches) do
563 if match.match == "urn:xmpp:push2:match:archived-with-body" then
564 identifier_found.log("debug", "Not pushing '%s' of new MAM stanza (no body)", identifier)
565 else
566 notify_push_services[identifier] = push_info
567 end
568 end
569 else 563 else
570 notify_push_services[identifier] = push_info 564 notify_push_services[identifier] = push_info
571 end 565 end
572 end 566 end
573 end 567 end