comparison mod_cloud_notify/mod_cloud_notify.lua @ 4968:487f1eb829cf

mod_cloud_notify: Compat for prosody 0.12
author tmolitor <thilo@eightysoft.de>
date Sat, 02 Jul 2022 02:29:03 +0200
parents fe5303da99cb
children da151f9af861
comparison
equal deleted inserted replaced
4967:1e8381f0d0a8 4968:487f1eb829cf
9 local jid = require"util.jid"; 9 local jid = require"util.jid";
10 local dataform = require"util.dataforms".new; 10 local dataform = require"util.dataforms".new;
11 local hashes = require"util.hashes"; 11 local hashes = require"util.hashes";
12 local random = require"util.random"; 12 local random = require"util.random";
13 local cache = require"util.cache"; 13 local cache = require"util.cache";
14 local watchdog = require "util.watchdog";
14 15
15 local xmlns_push = "urn:xmpp:push:0"; 16 local xmlns_push = "urn:xmpp:push:0";
16 17
17 -- configuration 18 -- configuration
18 local include_body = module:get_option_boolean("push_notification_with_body", false); 19 local include_body = module:get_option_boolean("push_notification_with_body", false);
19 local include_sender = module:get_option_boolean("push_notification_with_sender", false); 20 local include_sender = module:get_option_boolean("push_notification_with_sender", false);
20 local max_push_errors = module:get_option_number("push_max_errors", 16); 21 local max_push_errors = module:get_option_number("push_max_errors", 16);
21 local max_push_devices = module:get_option_number("push_max_devices", 5); 22 local max_push_devices = module:get_option_number("push_max_devices", 5);
22 local dummy_body = module:get_option_string("push_notification_important_body", "New Message!"); 23 local dummy_body = module:get_option_string("push_notification_important_body", "New Message!");
24 local extended_hibernation_timeout = module:get_option_number("push_max_hibernation_timeout", 72*24*3600); -- use same timeout like ejabberd
23 25
24 local host_sessions = prosody.hosts[module.host].sessions; 26 local host_sessions = prosody.hosts[module.host].sessions;
25 local push_errors = module:shared("push_errors"); 27 local push_errors = module:shared("push_errors");
26 local id2node = {}; 28 local id2node = {};
27 local id2identifier = {}; 29 local id2identifier = {};
96 for _, session in pairs(host_sessions[node].sessions) do 98 for _, session in pairs(host_sessions[node].sessions) do
97 if session.push_identifier == push_identifier then 99 if session.push_identifier == push_identifier then
98 session.push_identifier = nil; 100 session.push_identifier = nil;
99 session.push_settings = nil; 101 session.push_settings = nil;
100 session.first_hibernated_push = nil; 102 session.first_hibernated_push = nil;
103 -- check for prosody 0.12 mod_smacks
104 if session.hibernating_watchdog and session.original_smacks_callback and session.original_smacks_timeout then
105 -- restore old smacks watchdog
106 session.hibernating_watchdog:cancel();
107 session.hibernating_watchdog = watchdog.new(session.original_smacks_timeout, session.original_smacks_callback);
108 end
101 end 109 end
102 end 110 end
103 end 111 end
104 -- save changed global config 112 -- save changed global config
105 changed = true; 113 changed = true;
228 origin.log("info", "Push notifications disabled (%s)", tostring(key)); 236 origin.log("info", "Push notifications disabled (%s)", tostring(key));
229 if origin.push_identifier == key then 237 if origin.push_identifier == key then
230 origin.push_identifier = nil; 238 origin.push_identifier = nil;
231 origin.push_settings = nil; 239 origin.push_settings = nil;
232 origin.first_hibernated_push = nil; 240 origin.first_hibernated_push = nil;
241 -- check for prosody 0.12 mod_smacks
242 if session.hibernating_watchdog and session.original_smacks_callback and session.original_smacks_timeout then
243 -- restore old smacks watchdog
244 session.hibernating_watchdog:cancel();
245 session.hibernating_watchdog = watchdog.new(session.original_smacks_timeout, session.original_smacks_callback);
246 end
233 end 247 end
234 user_push_services[key] = nil; 248 user_push_services[key] = nil;
235 push_errors[key] = nil; 249 push_errors[key] = nil;
236 for stanza_id, identifier in pairs(id2identifier) do 250 for stanza_id, identifier in pairs(id2identifier) do
237 if identifier == key then 251 if identifier == key then
444 -- if the message was important (e.g. had a last-message-body field) OR if we treat all pushes equally, 458 -- if the message was important (e.g. had a last-message-body field) OR if we treat all pushes equally,
445 -- then record the time of first push in the session for the smack module which will extend its hibernation 459 -- then record the time of first push in the session for the smack module which will extend its hibernation
446 -- timeout based on the value of session.first_hibernated_push 460 -- timeout based on the value of session.first_hibernated_push
447 if not dummy_body or (dummy_body and is_important(stanza)) then 461 if not dummy_body or (dummy_body and is_important(stanza)) then
448 session.first_hibernated_push = os_time(); 462 session.first_hibernated_push = os_time();
463 -- check for prosody 0.12 mod_smacks
464 if session.hibernating_watchdog and session.original_smacks_callback and session.original_smacks_timeout then
465 -- restore old smacks watchdog (--> the start of our original timeout will be delayed until first push)
466 session.hibernating_watchdog:cancel();
467 session.hibernating_watchdog = watchdog.new(session.original_smacks_timeout, session.original_smacks_callback);
468 end
449 end 469 end
450 end 470 end
451 session.log("debug", "Cloud handle_notify_request() > 0, not notifying for other %s queued stanzas of type %s", queue_type, stanza_type); 471 session.log("debug", "Cloud handle_notify_request() > 0, not notifying for other %s queued stanzas of type %s", queue_type, stanza_type);
452 notified[stanza_type] = true 472 notified[stanza_type] = true
453 end 473 end
492 -- smacks hibernation is started 512 -- smacks hibernation is started
493 local function hibernate_session(event) 513 local function hibernate_session(event)
494 local session = event.origin; 514 local session = event.origin;
495 local queue = event.queue; 515 local queue = event.queue;
496 session.first_hibernated_push = nil; 516 session.first_hibernated_push = nil;
517 if session.hibernating_watchdog then -- check for prosody 0.12 mod_smacks
518 -- save old watchdog callback and timeout
519 session.original_smacks_callback = session.hibernating_watchdog.callback;
520 session.original_smacks_timeout = session.hibernating_watchdog.timeout;
521 -- cancel old watchdog and create a new watchdog with extended timeout
522 session.hibernating_watchdog:cancel();
523 session.hibernating_watchdog = watchdog.new(extended_hibernation_timeout, function()
524 session.log("debug", "Push-extended smacks watchdog triggered");
525 if session.original_smacks_callback then
526 session.log("debug", "Calling original smacks watchdog handler");
527 session.original_smacks_callback();
528 end
529 end);
530 end
497 -- process unacked stanzas 531 -- process unacked stanzas
498 process_stanza_queue(queue, session, "smacks"); 532 process_stanza_queue(queue, session, "smacks");
499 end 533 end
500 534
501 -- smacks hibernation is ended 535 -- smacks hibernation is ended
505 if session.awaiting_push_timer then 539 if session.awaiting_push_timer then
506 session.awaiting_push_timer:stop(); 540 session.awaiting_push_timer:stop();
507 session.awaiting_push_timer = nil; 541 session.awaiting_push_timer = nil;
508 end 542 end
509 session.first_hibernated_push = nil; 543 session.first_hibernated_push = nil;
544 -- the extended smacks watchdog will be canceled by the smacks module, no need to anything here
510 end 545 end
511 end 546 end
512 547
513 -- smacks ack is delayed 548 -- smacks ack is delayed
514 local function ack_delayed(event) 549 local function ack_delayed(event)
592 -- cleanup some settings, reloading this module can cause process_smacks_stanza() to stop working otherwise 627 -- cleanup some settings, reloading this module can cause process_smacks_stanza() to stop working otherwise
593 for user, _ in pairs(host_sessions) do 628 for user, _ in pairs(host_sessions) do
594 for _, session in pairs(host_sessions[user].sessions) do 629 for _, session in pairs(host_sessions[user].sessions) do
595 if session.awaiting_push_timer then session.awaiting_push_timer:stop(); end 630 if session.awaiting_push_timer then session.awaiting_push_timer:stop(); end
596 session.awaiting_push_timer = nil; 631 session.awaiting_push_timer = nil;
632 session.push_queue = nil;
597 session.first_hibernated_push = nil; 633 session.first_hibernated_push = nil;
598 session.push_queue = nil; 634 -- check for prosody 0.12 mod_smacks
635 if session.hibernating_watchdog and session.original_smacks_callback and session.original_smacks_timeout then
636 -- restore old smacks watchdog
637 session.hibernating_watchdog:cancel();
638 session.hibernating_watchdog = watchdog.new(session.original_smacks_timeout, session.original_smacks_callback);
639 end
599 end 640 end
600 end 641 end
601 module:log("info", "Module unloaded"); 642 module:log("info", "Module unloaded");
602 end 643 end