mod_muc_batched_probe/mod_muc_batched_probe.lua
author Matthew Wild <mwild1@gmail.com>
Fri, 23 Sep 2022 22:41:15 +0100
changeset 5058 62480053c87b
parent 4194 e06258fc6cf1
permissions -rw-r--r--
mod_cloud_notify_encrypted: Additional debug logging when enabling/skipping
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4004
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
     1
-- This module allows you to probe the MUC presences for multiple occupants.
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
     2
-- Copyright (C) 2020 JC Brand
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
     3
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
     4
local st = require "util.stanza";
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
     5
local mod_muc = module:depends"muc";
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
     6
local get_room_from_jid = rawget(mod_muc, "get_room_from_jid") or
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
     7
	function (jid)
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
     8
		local rooms = rawget(mod_muc, "rooms");
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
     9
		return rooms[jid];
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    10
	end
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    11
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    12
module:log("debug", "Module loaded");
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    13
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    14
local function respondToBatchedProbe(event)
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    15
	local stanza = event.stanza;
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    16
	if stanza.attr.type ~= "get" then
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    17
		return;
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    18
	end
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    19
	local query = stanza:get_child("query", "http://jabber.org/protocol/muc#user");
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    20
	if not query then
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    21
		return;
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    22
	end;
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    23
4192
4611999fd8d3 mod_muc_batched_probe: don't rely on mt_room:respond_to_probe method
JC Brand <jc@opkode.com>
parents: 4011
diff changeset
    24
	local origin = event.origin;
4004
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    25
	local room = get_room_from_jid(stanza.attr.to);
4192
4611999fd8d3 mod_muc_batched_probe: don't rely on mt_room:respond_to_probe method
JC Brand <jc@opkode.com>
parents: 4011
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: 4011
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: 4011
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: 4011
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: 4011
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: 4011
diff changeset
    31
4011
845d13ab0dc0 mod_muc_batched_probe: Call instance method
JC Brand <jc@opkode.com>
parents: 4004
diff changeset
    32
	for item in query:children() do
4004
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    33
		local probed_jid = item.attr.jid;
4192
4611999fd8d3 mod_muc_batched_probe: don't rely on mt_room:respond_to_probe method
JC Brand <jc@opkode.com>
parents: 4011
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: 4011
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: 4011
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: 4011
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: 4011
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: 4011
diff changeset
    39
			end
4194
e06258fc6cf1 muc_batched_probe: don't return too quickly
JC Brand <jc@opkode.com>
parents: 4192
diff changeset
    40
		else
e06258fc6cf1 muc_batched_probe: don't return too quickly
JC Brand <jc@opkode.com>
parents: 4192
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: 4192
diff changeset
    42
			room:publicise_occupant_status(probed_occupant, x, nil, nil, nil, nil, false, probing_occupant);
4192
4611999fd8d3 mod_muc_batched_probe: don't rely on mt_room:respond_to_probe method
JC Brand <jc@opkode.com>
parents: 4011
diff changeset
    43
		end
4004
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    44
	end
4192
4611999fd8d3 mod_muc_batched_probe: don't rely on mt_room:respond_to_probe method
JC Brand <jc@opkode.com>
parents: 4011
diff changeset
    45
	origin.send(st.reply(stanza));
4004
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    46
	return true;
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    47
end
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    48
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    49
d56b3c0195a8 mod_muc_batched_probe: New module
JC Brand <jc@opkode.com>
parents:
diff changeset
    50
module:hook("iq/bare", respondToBatchedProbe, 1);