Software /
code /
prosody-modules
Comparison
mod_push2/mod_push2.lua @ 5687: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 |
parent | 5686:a1d22d6efb3d |
child | 5869:83ee752f148c |
comparison
equal
deleted
inserted
replaced
5686:a1d22d6efb3d | 5687: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 |