2455
|
1 -- Copyright (C) 2016 Kim Alvefur
|
|
2 --
|
|
3
|
|
4 module:depends"csi"
|
|
5 module:depends"track_muc_joins"
|
|
6 local jid = require "util.jid";
|
|
7 local new_queue = require "util.queue".new;
|
|
8
|
|
9 local function new_pump(output, ...)
|
|
10 -- luacheck: ignore 212/self
|
|
11 local q = new_queue(...);
|
|
12 local flush = true;
|
|
13 function q:pause()
|
|
14 flush = false;
|
|
15 end
|
|
16 function q:resume()
|
|
17 flush = true;
|
|
18 return q:flush();
|
|
19 end
|
|
20 local push = q.push;
|
|
21 function q:push(item)
|
|
22 local ok = push(self, item);
|
|
23 if not ok then
|
|
24 q:flush();
|
|
25 output(item, self);
|
|
26 elseif flush then
|
|
27 return q:flush();
|
|
28 end
|
|
29 return true;
|
|
30 end
|
|
31 function q:flush()
|
|
32 local item = self:pop();
|
|
33 while item do
|
|
34 output(item, self);
|
|
35 item = self:pop();
|
|
36 end
|
|
37 return true;
|
|
38 end
|
|
39 return q;
|
|
40 end
|
|
41
|
|
42 -- TODO delay stamps
|
|
43 -- local dt = require "util.datetime";
|
|
44
|
|
45 local function is_important(stanza, session)
|
|
46 local st_name = stanza.name;
|
|
47 if not st_name then return false; end
|
|
48 local st_type = stanza.attr.type;
|
|
49 if st_name == "presence" then
|
|
50 -- TODO check for MUC status codes?
|
|
51 return false;
|
|
52 elseif st_name == "message" then
|
|
53 if st_type == "headline" then
|
|
54 return false;
|
|
55 end
|
|
56 local body = stanza:get_child_text("body");
|
|
57 if not body then return false; end
|
|
58 if st_type == "groupchat" then
|
|
59 if body:find(session.username, 1, true) then return true; end
|
|
60 local rooms = session.rooms_joined;
|
|
61 if not rooms then return false; end
|
|
62 local room_nick = rooms[jid.bare(stanza.attr.from)];
|
|
63 if room_nick and body:find(room_nick, 1, true) then return true; end
|
|
64 return false;
|
|
65 end
|
|
66 return body;
|
|
67 end
|
|
68 return true;
|
|
69 end
|
|
70
|
|
71 module:hook("csi-client-inactive", function (event)
|
|
72 local session = event.origin;
|
|
73 if session.pump then
|
|
74 session.pump:pause();
|
|
75 else
|
|
76 session._orig_send = session.send;
|
|
77 local pump = new_pump(session.send, 100);
|
|
78 pump:pause();
|
|
79 session.pump = pump;
|
|
80 function session.send(stanza)
|
|
81 pump:push(stanza);
|
|
82 if is_important(stanza, session) then
|
|
83 pump:flush();
|
|
84 end
|
|
85 return true;
|
|
86 end
|
|
87 end
|
|
88 end);
|
|
89
|
|
90 module:hook("csi-client-active", function (event)
|
|
91 local session = event.origin;
|
|
92 if session.pump then
|
|
93 session.pump:resume();
|
|
94 end
|
|
95 end);
|
|
96
|