Mercurial > prosody-modules
annotate mod_muc_batched_probe/mod_muc_batched_probe.lua @ 4738:5aee8d86629a
mod_bookmarks2: Fix handling of nick and password elements
This form of child retrieval fails when the stanza elements internally
don't have an 'xmlns' attribute, which can happen sometimes for some
reason, including when they have been constructed via the stanza builder
API. When that is the case then the explicit namespace arguemnt does not
match the nil value of the internal attribute. Calling `:get_child()`
without the namespace argument does the right thing here, with both nil
and the parent namespace as valid values for the internal attribute.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Wed, 03 Nov 2021 21:11:55 +0100 |
parents | e06258fc6cf1 |
children |
rev | line source |
---|---|
4000 | 1 -- This module allows you to probe the MUC presences for multiple occupants. |
2 -- Copyright (C) 2020 JC Brand | |
3 | |
4 local st = require "util.stanza"; | |
5 local mod_muc = module:depends"muc"; | |
6 local get_room_from_jid = rawget(mod_muc, "get_room_from_jid") or | |
7 function (jid) | |
8 local rooms = rawget(mod_muc, "rooms"); | |
9 return rooms[jid]; | |
10 end | |
11 | |
12 module:log("debug", "Module loaded"); | |
13 | |
14 local function respondToBatchedProbe(event) | |
15 local stanza = event.stanza; | |
16 if stanza.attr.type ~= "get" then | |
17 return; | |
18 end | |
19 local query = stanza:get_child("query", "http://jabber.org/protocol/muc#user"); | |
20 if not query then | |
21 return; | |
22 end; | |
23 | |
4188
4611999fd8d3
mod_muc_batched_probe: don't rely on mt_room:respond_to_probe method
JC Brand <jc@opkode.com>
parents:
4007
diff
changeset
|
24 local origin = event.origin; |
4000 | 25 local room = get_room_from_jid(stanza.attr.to); |
4188
4611999fd8d3
mod_muc_batched_probe: don't rely on mt_room:respond_to_probe method
JC Brand <jc@opkode.com>
parents:
4007
diff
changeset
|
26 local probing_occupant = room:get_occupant_by_real_jid(stanza.attr.from); |
4611999fd8d3
mod_muc_batched_probe: don't rely on mt_room:respond_to_probe method
JC Brand <jc@opkode.com>
parents:
4007
diff
changeset
|
27 if probing_occupant == nil then |
4611999fd8d3
mod_muc_batched_probe: don't rely on mt_room:respond_to_probe method
JC Brand <jc@opkode.com>
parents:
4007
diff
changeset
|
28 origin.send(st.error_reply(stanza, "cancel", "not-acceptable", "You are not currently connected to this chat", room.jid)); |
4611999fd8d3
mod_muc_batched_probe: don't rely on mt_room:respond_to_probe method
JC Brand <jc@opkode.com>
parents:
4007
diff
changeset
|
29 return true; |
4611999fd8d3
mod_muc_batched_probe: don't rely on mt_room:respond_to_probe method
JC Brand <jc@opkode.com>
parents:
4007
diff
changeset
|
30 end |
4611999fd8d3
mod_muc_batched_probe: don't rely on mt_room:respond_to_probe method
JC Brand <jc@opkode.com>
parents:
4007
diff
changeset
|
31 |
4007
845d13ab0dc0
mod_muc_batched_probe: Call instance method
JC Brand <jc@opkode.com>
parents:
4000
diff
changeset
|
32 for item in query:children() do |
4000 | 33 local probed_jid = item.attr.jid; |
4188
4611999fd8d3
mod_muc_batched_probe: don't rely on mt_room:respond_to_probe method
JC Brand <jc@opkode.com>
parents:
4007
diff
changeset
|
34 local probed_occupant = room:get_occupant_by_nick(probed_jid); |
4611999fd8d3
mod_muc_batched_probe: don't rely on mt_room:respond_to_probe method
JC Brand <jc@opkode.com>
parents:
4007
diff
changeset
|
35 if probed_occupant == nil then |
4611999fd8d3
mod_muc_batched_probe: don't rely on mt_room:respond_to_probe method
JC Brand <jc@opkode.com>
parents:
4007
diff
changeset
|
36 local pr = room:build_unavailable_presence(probed_jid, stanza.attr.from); |
4611999fd8d3
mod_muc_batched_probe: don't rely on mt_room:respond_to_probe method
JC Brand <jc@opkode.com>
parents:
4007
diff
changeset
|
37 if pr then |
4611999fd8d3
mod_muc_batched_probe: don't rely on mt_room:respond_to_probe method
JC Brand <jc@opkode.com>
parents:
4007
diff
changeset
|
38 room:route_stanza(pr); |
4611999fd8d3
mod_muc_batched_probe: don't rely on mt_room:respond_to_probe method
JC Brand <jc@opkode.com>
parents:
4007
diff
changeset
|
39 end |
4190
e06258fc6cf1
muc_batched_probe: don't return too quickly
JC Brand <jc@opkode.com>
parents:
4188
diff
changeset
|
40 else |
e06258fc6cf1
muc_batched_probe: don't return too quickly
JC Brand <jc@opkode.com>
parents:
4188
diff
changeset
|
41 local x = st.stanza("x", {xmlns = "http://jabber.org/protocol/muc#user"}); |
e06258fc6cf1
muc_batched_probe: don't return too quickly
JC Brand <jc@opkode.com>
parents:
4188
diff
changeset
|
42 room:publicise_occupant_status(probed_occupant, x, nil, nil, nil, nil, false, probing_occupant); |
4188
4611999fd8d3
mod_muc_batched_probe: don't rely on mt_room:respond_to_probe method
JC Brand <jc@opkode.com>
parents:
4007
diff
changeset
|
43 end |
4000 | 44 end |
4188
4611999fd8d3
mod_muc_batched_probe: don't rely on mt_room:respond_to_probe method
JC Brand <jc@opkode.com>
parents:
4007
diff
changeset
|
45 origin.send(st.reply(stanza)); |
4000 | 46 return true; |
47 end | |
48 | |
49 | |
50 module:hook("iq/bare", respondToBatchedProbe, 1); |