Annotate

mod_ping_muc/mod_ping_muc.lua @ 4887:806f7c8d830b

mod_ping_muc: Remove 'kick' status code The intent is "you fell off", not "you were kicked out", however older clients may not recognise the 333 code, but that will have to be an acceptable loss.
author Kim Alvefur <zash@zash.se>
date Mon, 07 Feb 2022 16:52:19 +0100
parent 4804:a7c0c70e64b6
child 5130:0772facc786f
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 = "333" }):up()
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56 :reset());
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57 end);
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58 -- 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
59 end
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
a7c0c70e64b6 mod_ping_muc: Yet another attempt to improve MUC reliability
Kim Alvefur <zash@zash.se>
parents:
diff changeset
62 end
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);