Mercurial > prosody-modules
annotate mod_csi_battery_saver/mod_csi_battery_saver.lua @ 2741:69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
This should fix a bug that caused the module to be deactivated
on smacks resume.
Also update the readme accordingly,
author | tmolitor <thilo@eightysoft.de> |
---|---|
date | Thu, 17 Aug 2017 21:21:23 +0200 |
parents | f43c77c69a8a |
children | 2e30bb3a10d5 |
rev | line source |
---|---|
2606
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
1 -- Copyright (C) 2016 Kim Alvefur |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
2 -- Copyright (C) 2017 Thilo Molitor |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
3 -- |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
4 |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
5 module:depends"csi" |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
6 module:depends"track_muc_joins" |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
7 local s_match = string.match; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
8 local s_sub = string.sub; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
9 local jid = require "util.jid"; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
10 local new_queue = require "util.queue".new; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
11 local datetime = require "util.datetime"; |
2741
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
12 local st = require "util.stanza"; |
2606
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
13 |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
14 local xmlns_delay = "urn:xmpp:delay"; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
15 |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
16 -- a log id for this module instance |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
17 local id = s_sub(require "util.hashes".sha256(datetime.datetime(), true), 1, 4); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
18 |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
19 -- Patched version of util.stanza:find() that supports giving stanza names |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
20 -- without their namespace, allowing for every namespace. |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
21 local function find(self, path) |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
22 local pos = 1; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
23 local len = #path + 1; |
2735
b5fae17e4403
mod_csi_battery_saver: correctly handle encrypted message stanzas
tmolitor <thilo@eightysoft.de>
parents:
2606
diff
changeset
|
24 |
2606
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
25 repeat |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
26 local xmlns, name, text; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
27 local char = s_sub(path, pos, pos); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
28 if char == "@" then |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
29 return self.attr[s_sub(path, pos + 1)]; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
30 elseif char == "{" then |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
31 xmlns, pos = s_match(path, "^([^}]+)}()", pos + 1); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
32 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
33 name, text, pos = s_match(path, "^([^@/#]*)([/#]?)()", pos); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
34 name = name ~= "" and name or nil; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
35 if pos == len then |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
36 if text == "#" then |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
37 local child = xmlns ~= nil and self:get_child(name, xmlns) or self:child_with_name(name); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
38 return child and child:get_text() or nil; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
39 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
40 return xmlns ~= nil and self:get_child(name, xmlns) or self:child_with_name(name); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
41 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
42 self = xmlns ~= nil and self:get_child(name, xmlns) or self:child_with_name(name); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
43 until not self |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
44 return nil; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
45 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
46 |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
47 local function new_pump(output, ...) |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
48 -- luacheck: ignore 212/self |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
49 local q = new_queue(...); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
50 local flush = true; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
51 function q:pause() |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
52 flush = false; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
53 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
54 function q:resume() |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
55 flush = true; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
56 return q:flush(); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
57 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
58 local push = q.push; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
59 function q:push(item) |
2741
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
60 local ok = push(self, item); |
2606
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
61 if not ok then |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
62 q:flush(); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
63 output(item, self); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
64 elseif flush then |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
65 return q:flush(); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
66 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
67 return true; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
68 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
69 function q:flush() |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
70 local item = self:pop(); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
71 while item do |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
72 output(item, self); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
73 item = self:pop(); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
74 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
75 return true; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
76 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
77 return q; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
78 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
79 |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
80 local function is_stamp_needed(stanza, session) |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
81 local st_name = stanza and stanza.name or nil; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
82 if st_name == "presence" then |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
83 return true; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
84 elseif st_name == "message" then |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
85 if stanza:get_child("delay", xmlns_delay) then return false; end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
86 if stanza.attr.type == "chat" or stanza.attr.type == "groupchat" then return true; end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
87 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
88 return false; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
89 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
90 |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
91 local function add_stamp(stanza, session) |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
92 stanza = stanza:tag("delay", { xmlns = xmlns_delay, from = session.host, stamp = datetime.datetime()}); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
93 return stanza; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
94 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
95 |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
96 local function is_important(stanza, session) |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
97 local st_name = stanza and stanza.name or nil; |
2741
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
98 if not st_name then return true; end -- nonzas are always important |
2606
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
99 if st_name == "presence" then |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
100 -- TODO check for MUC status codes? |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
101 return false; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
102 elseif st_name == "message" then |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
103 -- unpack carbon copies |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
104 local stanza_direction = "in"; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
105 local carbon; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
106 -- support carbon copied message stanzas having an arbitrary message-namespace or no message-namespace at all |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
107 if not carbon then carbon = find(stanza, "{urn:xmpp:carbons:2}/forwarded/message"); end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
108 if not carbon then carbon = find(stanza, "{urn:xmpp:carbons:1}/forwarded/message"); end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
109 stanza_direction = carbon and stanza:child_with_name("sent") and "out" or "in"; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
110 --session.log("debug", "mod_csi_battery_saver(%s): stanza_direction = %s, carbon = %s, stanza = %s", id, stanza_direction, carbon and "true" or "false", tostring(stanza)); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
111 if carbon then stanza = carbon; end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
112 -- carbon copied outgoing messages aren't important (but incoming carbon copies are!) |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
113 if carbon and stanza_direction == "out" then return false; end |
2735
b5fae17e4403
mod_csi_battery_saver: correctly handle encrypted message stanzas
tmolitor <thilo@eightysoft.de>
parents:
2606
diff
changeset
|
114 |
2606
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
115 local st_type = stanza.attr.type; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
116 if st_type == "headline" then |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
117 return false; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
118 end |
2735
b5fae17e4403
mod_csi_battery_saver: correctly handle encrypted message stanzas
tmolitor <thilo@eightysoft.de>
parents:
2606
diff
changeset
|
119 |
b5fae17e4403
mod_csi_battery_saver: correctly handle encrypted message stanzas
tmolitor <thilo@eightysoft.de>
parents:
2606
diff
changeset
|
120 -- We can't check for nick in encrypted groupchat messages, so let's treat them as important |
b5fae17e4403
mod_csi_battery_saver: correctly handle encrypted message stanzas
tmolitor <thilo@eightysoft.de>
parents:
2606
diff
changeset
|
121 -- Some clients don't set a body or an empty body for encrypted messages |
b5fae17e4403
mod_csi_battery_saver: correctly handle encrypted message stanzas
tmolitor <thilo@eightysoft.de>
parents:
2606
diff
changeset
|
122 |
b5fae17e4403
mod_csi_battery_saver: correctly handle encrypted message stanzas
tmolitor <thilo@eightysoft.de>
parents:
2606
diff
changeset
|
123 -- check omemo https://xmpp.org/extensions/inbox/omemo.html |
b5fae17e4403
mod_csi_battery_saver: correctly handle encrypted message stanzas
tmolitor <thilo@eightysoft.de>
parents:
2606
diff
changeset
|
124 if stanza:get_child("encrypted", "eu.siacs.conversations.axolotl") or stanza:get_child("encrypted", "urn:xmpp:omemo:0") then return true; end |
b5fae17e4403
mod_csi_battery_saver: correctly handle encrypted message stanzas
tmolitor <thilo@eightysoft.de>
parents:
2606
diff
changeset
|
125 |
b5fae17e4403
mod_csi_battery_saver: correctly handle encrypted message stanzas
tmolitor <thilo@eightysoft.de>
parents:
2606
diff
changeset
|
126 -- check xep27 pgp https://xmpp.org/extensions/xep-0027.html |
b5fae17e4403
mod_csi_battery_saver: correctly handle encrypted message stanzas
tmolitor <thilo@eightysoft.de>
parents:
2606
diff
changeset
|
127 if stanza:get_child("x", "jabber:x:encrypted") then return true; end |
b5fae17e4403
mod_csi_battery_saver: correctly handle encrypted message stanzas
tmolitor <thilo@eightysoft.de>
parents:
2606
diff
changeset
|
128 |
b5fae17e4403
mod_csi_battery_saver: correctly handle encrypted message stanzas
tmolitor <thilo@eightysoft.de>
parents:
2606
diff
changeset
|
129 -- check xep373 pgp (OX) https://xmpp.org/extensions/xep-0373.html |
b5fae17e4403
mod_csi_battery_saver: correctly handle encrypted message stanzas
tmolitor <thilo@eightysoft.de>
parents:
2606
diff
changeset
|
130 if stanza:get_child("openpgp", "urn:xmpp:openpgp:0") then return true; end |
b5fae17e4403
mod_csi_battery_saver: correctly handle encrypted message stanzas
tmolitor <thilo@eightysoft.de>
parents:
2606
diff
changeset
|
131 |
2606
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
132 local body = stanza:get_child_text("body"); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
133 if st_type == "groupchat" then |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
134 if stanza:get_child_text("subject") then return true; end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
135 if not body then return false; end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
136 if body:find(session.username, 1, true) then return true; end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
137 local rooms = session.rooms_joined; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
138 if not rooms then return false; end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
139 local room_nick = rooms[jid.bare(stanza_direction == "in" and stanza.attr.from or stanza.attr.to)]; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
140 if room_nick and body:find(room_nick, 1, true) then return true; end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
141 return false; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
142 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
143 return body ~= nil and body ~= ""; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
144 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
145 return true; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
146 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
147 |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
148 module:hook("csi-client-inactive", function (event) |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
149 local session = event.origin; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
150 if session.pump then |
2741
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
151 session.log("debug", "mod_csi_battery_saver(%s): Client is inactive, buffering unimportant stanzas", id); |
2606
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
152 session.pump:pause(); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
153 else |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
154 session.log("debug", "mod_csi_battery_saver(%s): Client is inactive the first time, initializing module for this session", id); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
155 local pump = new_pump(session.send, 100); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
156 pump:pause(); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
157 session.pump = pump; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
158 session._pump_orig_send = session.send; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
159 function session.send(stanza) |
2741
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
160 session.log("debug", "mod_csi_battery_saver(%s): Got stanza: <%s>", id, tostring(stanza.name or stanza)); |
2606
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
161 local important = is_important(stanza, session); |
2735
b5fae17e4403
mod_csi_battery_saver: correctly handle encrypted message stanzas
tmolitor <thilo@eightysoft.de>
parents:
2606
diff
changeset
|
162 -- add delay stamp to unimportant (buffered) stanzas that can/need be stamped |
2606
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
163 if not important and is_stamp_needed(stanza, session) then stanza = add_stamp(stanza, session); end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
164 pump:push(stanza); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
165 if important then |
2741
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
166 session.log("debug", "mod_csi_battery_saver(%s): Encountered important stanza, flushing buffer: <%s>", id, tostring(stanza.name or stanza)); |
2606
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
167 pump:flush(); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
168 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
169 return true; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
170 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
171 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
172 end); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
173 |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
174 module:hook("csi-client-active", function (event) |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
175 local session = event.origin; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
176 if session.pump then |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
177 session.log("debug", "mod_csi_battery_saver(%s): Client is active, resuming direct delivery", id); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
178 session.pump:resume(); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
179 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
180 end); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
181 |
2741
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
182 -- clean up this session |
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
183 local function remove_pump(session) |
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
184 if session.pump then |
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
185 session.log("debug", "mod_csi_battery_saver(%s): Flushing buffer and restoring to original session.send()", id); |
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
186 session.pump:flush(); |
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
187 session.send = session._pump_orig_send; |
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
188 session.pump = nil; |
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
189 session._pump_orig_send = nil; |
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
190 end |
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
191 end |
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
192 |
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
193 -- clean up this session on hibernation start |
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
194 module:hook("smacks-hibernation-start", function (event) |
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
195 remove_pump(event.origin); |
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
196 end); |
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
197 |
2606
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
198 function module.unload() |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
199 module:log("info", "%s: Unloading module, flushing all buffers", id); |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
200 local host_sessions = prosody.hosts[module.host].sessions; |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
201 for _, user in pairs(host_sessions) do |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
202 for _, session in pairs(user.sessions) do |
2741
69248dcd7cff
mod_csi_battery_saver: Fix interaction with smacks hibernation
tmolitor <thilo@eightysoft.de>
parents:
2737
diff
changeset
|
203 remove_pump(session); |
2606
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
204 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
205 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
206 end |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
207 |
538c54d2dab3
mod_csi_battery_saver: CSI module to save battery on mobile devices, based on mod_csi_pump
tmolitor <thilo@eightysoft.de>
parents:
diff
changeset
|
208 module:log("info", "%s: Successfully loaded module", id); |