comparison mod_csi_muc_priorities/mod_csi_muc_priorities.lua @ 3536:eed657091329

mod_csi_muc_priorities: Allow specifying which MUC JIDs are less important
author Kim Alvefur <zash@zash.se>
date Mon, 01 Apr 2019 08:23:56 +0200
parents bcb0eb9121a9
children 7d6fb9570395
comparison
equal deleted inserted replaced
3535:bcb0eb9121a9 3536:eed657091329
1 local jid_bare = require "util.jid".bare; 1 local jid_bare, jid_split = import("util.jid", "bare", "split");
2
3 -- luacheck: ignore 122
4 local user_sessions = prosody.hosts[module.host].sessions;
2 5
3 module:hook("csi-is-stanza-important", function (event) 6 module:hook("csi-is-stanza-important", function (event)
4 local stanza, session = event.stanza, event.session; 7 local stanza, session = event.stanza, event.session;
5 if stanza.name == "message" then 8 if stanza.name == "message" then
6 if stanza.attr.type == "groupchat" then 9 if stanza.attr.type == "groupchat" then
7 local body = stanza:get_child_text("body"); 10 local body = stanza:get_child_text("body");
8 if not body then return end 11 if not body then return end
9 12
10 local room_jid = jid_bare(stanza.attr.from); 13 local room_jid = jid_bare(stanza.attr.from);
11 14
15 local username = session.username;
16 local priorities = user_sessions[username].csi_muc_priorities;
17
18 if not priorities or priorities[room_jid] ~= false then
19 return nil;
20 end
21
12 -- Look for mention 22 -- Look for mention
13 local rooms = session.rooms_joined; 23 local rooms = session.rooms_joined;
14 if not rooms then return; end 24 if not rooms then return; end
15 25
16 local room_nick = rooms[room_jid]; 26 local room_nick = rooms[room_jid];
17 if room_nick and body:find(room_nick, 1, true) then return true; end 27 if room_nick and body:find(room_nick, 1, true) then return true; end
18
19 return false;
20 end 28 end
21 end 29 end
22 end); 30 end);
23 31
32 module:depends("adhoc");
33
34 local dataform = require"util.dataforms";
35 local adhoc_inital_data = require "util.adhoc".new_initial_data_form;
36 local instructions = [[
37 These settings affect battery optimizations performed by the server
38 while your client has indicated that it is inactive.
39 ]]
40
41 local priority_settings_form = dataform.new {
42 title = "Prioritize addresses of group chats";
43 instructions = instructions;
44 {
45 type = "hidden";
46 name = "FORM_TYPE";
47 value = "xmpp:modules.prosody.im/mod_"..module.name;
48 };
49 {
50 type = "jid-multi";
51 name = "unimportant";
52 label = "Lower priority";
53 desc = "E.g. large noisy public channels";
54 };
55 }
56
57 local store = module:open_store();
58 module:hook("resource-bind", function (event)
59 local username = event.session.username;
60 user_sessions[username].csi_muc_priorities = store:get(username);
61 end);
62
63 local adhoc_command_handler = adhoc_inital_data(priority_settings_form, function (data)
64 local username = jid_split(data.from);
65 local prioritized_jids = user_sessions[username].csi_muc_priorities or store:get(username);
66 local unimportant = {};
67 if prioritized_jids then
68 for jid in pairs(prioritized_jids) do
69 table.insert(unimportant, jid);
70 end
71 end
72 return { unimportant = unimportant };
73 end, function(fields, form_err, data)
74 if form_err then
75 return { status = "completed", error = { message = "Problem in submitted form" } };
76 end
77 local prioritized_jids = {};
78 for _, jid in ipairs(fields.unimportant) do
79 prioritized_jids[jid] = false;
80 end
81
82 local username = jid_split(data.from);
83 local ok, err = store:set(username, prioritized_jids);
84 if ok then
85 user_sessions[username].csi_muc_priorities = prioritized_jids;
86 return { status = "completed", info = "Priorities updated" };
87 else
88 return { status = "completed", error = { message = "Error saving priorities: "..err } };
89 end
90 end);
91
92 module:add_item("adhoc", module:require "adhoc".new("Configure group chat priorities",
93 "xmpp:modules.prosody.im/mod_"..module.name, adhoc_command_handler, "local_user"));