Annotate

mod_muc_activity/mod_muc_activity.lua @ 6313:5bd4cbe2bfee

mod_http_connect: HTTP CONNECT proxy Meant to allow anonymizing connections to remote HTTP Upload services A work in progress
author Kim Alvefur <zash@zash.se>
date Wed, 25 Jun 2025 15:21:00 +0200
parent 6133:a0429c322454
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6133
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
1 local os_time = os.time;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
2 local math_floor = math.floor;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
3 local store = module:open_store("muc_activity", "keyval");
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
4
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
5 local accumulator = {};
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
6
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
7 local field_var = "{urn:xmpp:muc-activity}message-activity";
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
8
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
9 module:hook("muc-room-destroyed", function (event)
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
10 local jid = event.room.jid;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
11 module:log("debug", "deleting activity data for destroyed muc %s", jid);
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
12 store:set_keys(jid, {});
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
13 accumulator[jid] = nil;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
14 end)
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
15
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
16 module:hook("muc-occupant-groupchat", function (event)
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
17 local jid = event.room.jid;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
18 if not event.room:get_persistent() then
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
19 -- we do not count stanzas in non-persistent rooms
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
20 if accumulator[jid] then
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
21 -- if we have state for the room, drop it.
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
22 store:set_keys(jid, {});
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
23 accumulator[jid] = nil;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
24 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
25
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
26 return
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
27 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
28
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
29 if event.stanza:get_child("body") == nil then
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
30 -- we do not count stanzas without body.
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
31 return
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
32 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
33
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
34 module:log("debug", "counting stanza for MUC activity in %s", jid);
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
35 accumulator[jid] = (accumulator[jid] or 0) + 1;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
36 end)
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
37
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
38 local function shift(data)
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
39 for i = 1, 23 do
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
40 data[i] = data[i+1]
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
41 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
42 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
43
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
44 local function accumulate(data)
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
45 if data == nil then
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
46 return 0;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
47 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
48 local accum = 0;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
49 for i = 1, 24 do
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
50 local v = data[i];
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
51 if v ~= nil then
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
52 accum = accum + v
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
53 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
54 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
55 return accum;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
56 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
57
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
58 module:hourly("muc-activity-shift", function ()
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
59 module:log("info", "shifting MUC activity store forward by one hour");
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
60 for jid in store:users() do
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
61 local data = store:get(jid);
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
62 local new = accumulator[jid] or 0;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
63 shift(data);
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
64 data[24] = new;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
65 accumulator[jid] = nil;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
66 store:set(jid, data);
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
67 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
68
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
69 -- All remaining entries in the accumulator are non-existent in the store,
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
70 -- otherwise they would have been removed earlier.
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
71 for jid, count in pairs(accumulator) do
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
72 store:set(jid, { [24] = count });
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
73 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
74 accumulator = {};
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
75 end)
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
76
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
77 module:hook("muc-disco#info", function(event)
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
78 local room = event.room;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
79 local jid = room.jid;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
80 if not room:get_persistent() or not room:get_public() or room:get_members_only() or room:get_password() ~= nil then
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
81 module:log("debug", "%s is not persistent or not public, not injecting message activity", jid);
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
82 return;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
83 end
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
84 local count = accumulate(store:get(jid)) / 24.0;
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
85 table.insert(event.form, { name = field_var, label = "Message activity" });
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
86 event.formdata[field_var] = tostring(count);
a0429c322454 mod_muc_activity: create module
Jonas Schäfer <jonas@wielicki.name>
parents:
diff changeset
87 end);