annotate mod_ping_muc/mod_ping_muc.lua @ 4813:0a257d1402c3

mod_muc_rtbl: Optimize case with zero hashes On the assumption that during quiet times between torrents of spam, the hash set would be empty. There would be no point in doing the operations and hashes to check for a match in that case.
author Kim Alvefur <zash@zash.se>
date Mon, 06 Dec 2021 18:19:19 +0100
parents a7c0c70e64b6
children 806f7c8d830b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4804
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 local id = require "util.id";
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 local jid = require "util.jid";
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 local set = require "util.set";
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 local st = require "util.stanza";
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 module:depends "track_muc_joins";
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 module:add_feature("https://modules.prosody.im/mod_" .. module.name);
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9 local local_sessions = prosody.hosts[module.host].sessions;
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 module:hook_global("s2s-destroyed", function(event)
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12 local s2s_session = event.session;
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 if s2s_session.direction == "outgoing" and s2s_session.from_host ~= module.host then
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14 return
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 elseif s2s_session.direction == "incoming" and s2s_session.to_host ~= module.host then
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 return
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 end
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 local related_hosts = set.new({ s2s_session.direction == "outgoing" and s2s_session.to_host or s2s_session.from_host });
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
21 if s2s_session.hosts then
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22 -- While rarely used, multiplexing is still supported
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23 for host, state in pairs(s2s_session.hosts) do if state.authed then related_hosts:add(host); end end
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 end
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 for _, user_session in pairs(local_sessions) do
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 for _, session in pairs(user_session.sessions) do
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 if session.rooms_joined then
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 for room, info in pairs(session.rooms_joined) do
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 local nick = info.nick or info;
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 local room_nick = room .. "/" .. nick;
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
32 if related_hosts:contains(jid.host(room)) then
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33 -- User is in a MUC room for which the s2s connection was lost. Now what?
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35 -- Self-ping
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36 -- =========
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 --
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38 -- Response of <iq type=result> means the user is still in the room
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39 -- (and self-ping is supported), so we do nothing.
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40 --
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
41 -- An error reply either means the user has fallen out of the room,
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42 -- or that self-ping is unsupported. In the later case, whether the
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 -- user is still joined is indeterminate and we might as well
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44 -- pretend they fell out.
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
45 module:send_iq(st.iq({ type = "get"; id = id.medium(); from = session.full_jid; to = room_nick })
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
46 :tag("ping", { xmlns = "urn:xmpp:ping"; }))
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
47 :catch(function(err)
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
48 module:send(
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
49 st.presence({ type = "unavailable"; id = id.medium(); to = session.full_jid; from = room_nick })
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 :tag("x", { xmlns = "http://jabber.org/protocol/muc#user" })
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51 :tag("item", { affiliation = "none"; role = "none" })
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52 :text_tag("reason", err.text or "Connection to remote server lost")
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
53 :up()
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 :tag("status", { code = "110" }):up()
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
55 :tag("status", { code = "307" }):up()
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56 :tag("status", { code = "333" }):up()
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57 :reset());
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58 end);
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
59 -- TODO do this with some delay?
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
60 end
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
61 end
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
62
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
63 end
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
64 end
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
65 end
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
66 end);