Annotate

mod_muc_gateway_optimize/mod_muc_gateway_optimize.lua @ 6055:23c4c61a1068

mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways Some gateways are happy to receive presence for each participant in MUCs that they are in only once, to any one of their joined JIDs.
author Stephen Paul Weber <singpolyma@singpolyma.net>
date Sun, 17 Nov 2024 22:32:52 -0500
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6055
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
1 local jid = require("util.jid")
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
2 local mod_muc = module:depends("muc")
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
3
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
4 local gateway_hosts = module:get_option_array("gateway_hosts", {})
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
5
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
6 function optimize(remote_host, event)
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
7 local stanza = event.stanza
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
8 module:log("debug", "optimize presence event destined for " .. remote_host)
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
9
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
10 local muc_x = stanza:get_child("x", "http://jabber.org/protocol/muc#user")
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
11 if muc_x then
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
12 for status in muc_x:childtags("status") do
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
13 if status.attr.status == "110" then
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
14 module:log("debug", "optimize delivering 110")
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
15 -- Always deliver self-presence
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
16 return
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
17 end
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
18 end
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
19 end
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
20
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
21 local bare_jid = jid.bare(stanza.attr.to)
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
22 local room = mod_muc.get_room_from_jid(jid.bare(stanza.attr.from))
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
23 if not room then return end
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
24 for nick, occupant in room:each_occupant() do
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
25 local occupant_host = jid.host(occupant.bare_jid)
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
26 if occupant_host == remote_host then
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
27 -- This is the "first" occupant from the host
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
28 -- which is the only one we will route non-110
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
29 -- presence to
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
30 if occupant.bare_jid == bare_jid then
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
31 module:log("debug", "optimize found first occupant, so route")
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
32 return
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
33 else
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
34 module:log("debug", "optimize found non-first occupant, so drop")
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
35 return true
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
36 end
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
37 end
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
38 end
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
39 -- If we get here we found no occupants for this host
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
40 module:log("debug", "optimize found no occupants for host " .. remote_host)
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
41 end
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
42
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
43 -- Note this will only affect gateways over s2s for now
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
44 module:hook("route/remote", function (event)
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
45 if event.stanza.name ~= "presence" then
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
46 return
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
47 end
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
48
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
49 local remote_host = jid.host(event.stanza.attr.to)
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
50 for _, gateway_host in pairs(gateway_hosts) do
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
51 if remote_host == gateway_host then
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
52 return optimize(remote_host, event)
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
53 end
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
54 end
23c4c61a1068 mod_muc_gateway_optimize: New module to optimize muc presence to remote gateways
Stephen Paul Weber <singpolyma@singpolyma.net>
parents:
diff changeset
55 end, 1000)