Mercurial > prosody-modules
comparison mod_ping_muc/mod_ping_muc.lua @ 5951:d6a695abb33c
mod_ping_muc: Delay ping a configurable amount of time
If a server is restarting, checking immediately before it has a chance
to complete its restart and get ready would often fail, preventing the
possibility of transparent restarts as supported by Prosody's mod_muc.
Reconnecting immediately when a connection is closed for being idle, or
because the remote server is trying to reclaim some resources, is also
counter-productive as the connection may fail.
Also, if there is some Internet routing problem affecting s2s, it may
help to wait a bit before checking, in case the problem resolved itself
in the mean time.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sun, 11 Aug 2024 16:10:24 +0200 |
parents | 0772facc786f |
children |
comparison
equal
deleted
inserted
replaced
5950:f89367e421d1 | 5951:d6a695abb33c |
---|---|
26 if s2s_session.hosts then | 26 if s2s_session.hosts then |
27 -- While rarely used, multiplexing is still supported | 27 -- While rarely used, multiplexing is still supported |
28 for host, state in pairs(s2s_session.hosts) do if state.authed then related_hosts:add(host); end end | 28 for host, state in pairs(s2s_session.hosts) do if state.authed then related_hosts:add(host); end end |
29 end | 29 end |
30 | 30 |
31 for _, user_session in pairs(local_sessions) do | 31 local ping_delay = module:get_option_number("ping_muc_delay", 60, 1); |
32 for _, session in pairs(user_session.sessions) do | |
33 if session.rooms_joined then | |
34 for room, info in pairs(session.rooms_joined) do | |
35 local nick = info.nick or info; | |
36 local room_nick = room .. "/" .. nick; | |
37 if related_hosts:contains(jid.host(room)) then | |
38 -- User is in a MUC room for which the s2s connection was lost. Now what? | |
39 | 32 |
40 -- Self-ping | 33 module:add_timer(ping_delay, function () |
41 -- ========= | 34 for _, user_session in pairs(local_sessions) do |
42 -- | 35 for _, session in pairs(user_session.sessions) do |
43 -- Response of <iq type=result> means the user is still in the room | 36 if session.rooms_joined then |
44 -- (and self-ping is supported), so we do nothing. | 37 for room, info in pairs(session.rooms_joined) do |
45 -- | 38 local nick = info.nick or info; |
46 -- An error reply either means the user has fallen out of the room, | 39 local room_nick = room .. "/" .. nick; |
47 -- or that self-ping is unsupported. In the later case, whether the | 40 if related_hosts:contains(jid.host(room)) then |
48 -- user is still joined is indeterminate and we might as well | 41 -- User is in a MUC room for which the s2s connection was lost. Now what? |
49 -- pretend they fell out. | 42 |
50 module:send_iq(st.iq({ type = "get"; id = id.medium(); from = session.full_jid; to = room_nick }) | 43 -- Self-ping |
51 :tag("ping", { xmlns = "urn:xmpp:ping"; })) | 44 -- ========= |
52 :catch(function(err) | 45 -- |
53 module:send( | 46 -- Response of <iq type=result> means the user is still in the room |
54 st.presence({ type = "unavailable"; id = id.medium(); to = session.full_jid; from = room_nick }) | 47 -- (and self-ping is supported), so we do nothing. |
55 :tag("x", { xmlns = "http://jabber.org/protocol/muc#user" }) | 48 -- |
56 :tag("item", { affiliation = "none"; role = "none" }) | 49 -- An error reply either means the user has fallen out of the room, |
57 :text_tag("reason", err.text or "Connection to remote server lost") | 50 -- or that self-ping is unsupported. In the later case, whether the |
58 :up() | 51 -- user is still joined is indeterminate and we might as well |
59 :tag("status", { code = "110" }):up() | 52 -- pretend they fell out. |
60 :tag("status", { code = "333" }):up() | 53 module:send_iq(st.iq({ type = "get"; id = id.medium(); from = session.full_jid; to = room_nick }) |
61 :reset()); | 54 :tag("ping", { xmlns = "urn:xmpp:ping"; })) |
62 end); | 55 :catch(function(err) |
63 -- TODO do this with some delay? | 56 module:send( |
57 st.presence({ type = "unavailable"; id = id.medium(); to = session.full_jid; from = room_nick }) | |
58 :tag("x", { xmlns = "http://jabber.org/protocol/muc#user" }) | |
59 :tag("item", { affiliation = "none"; role = "none" }) | |
60 :text_tag("reason", err.text or "Connection to remote server lost") | |
61 :up() | |
62 :tag("status", { code = "110" }):up() | |
63 :tag("status", { code = "333" }):up() | |
64 :reset()); | |
65 end); | |
66 end | |
64 end | 67 end |
65 end | 68 end |
66 | |
67 end | 69 end |
68 end | 70 end |
69 end | 71 end) |
70 end); | 72 end); |