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 |