File

mod_muc_gc10/mod_muc_gc10.lua @ 5615:1893ae742f66

mod_http_oauth2: Show errors on device flow user code entry page If the user enters the code incorrectly, having to click back to try again is no fun. Instead, show the error and the code entry form again.
author Kim Alvefur <zash@zash.se>
date Wed, 19 Jul 2023 13:05:47 +0200
parent 3548:8a15a9b13881
line wrap: on
line source

local jid_bare = require "util.jid".bare;
local st = require "util.stanza";

local rooms = assert(module:depends"muc".rooms, "This module is not needed with Prosody >=0.11");

module:hook("presence/full", function (event)
	local stanza, origin = event.stanza, event.origin;
	if stanza.attr.type ~= nil then return end

	local muc_x = stanza:get_child("x", "http://jabber.org/protocol/muc");

	local room_jid = jid_bare(stanza.attr.to);
	local room = rooms[room_jid];
	if not room then
		if muc_x then
			-- Normal MUC creation
		else
			module:log("info", "GC 1.0 room creation from %s", stanza.attr.from);
			module:send(st.iq({type="get",id=module.name,from=module.host,to=stanza.attr.from}):query("jabber:iq:version"));
		end
		return;
	end
	local current_nick = room._jid_nick[stanza.attr.from];

	if current_nick then
		-- present
		if muc_x then
			module:log("info", "MUC desync with %s", stanza.attr.from);
			module:send(st.iq({type="get",id=module.name,from=module.host,to=stanza.attr.from}):query("jabber:iq:version"));
		else
			-- normal presence update
		end
	else
		-- joining
		if muc_x then
			-- normal join
		else
			module:log("info", "GC 1.0 join from %s", stanza.attr.from);
			module:send(st.iq({type="get",id=module.name,from=module.host,to=stanza.attr.from}):query("jabber:iq:version"));
		end
	end
end);

module:hook("iq-result/host/"..module.name, function (event)
	local stanza, origin = event.stanza, event.origin;
	local version = stanza:get_child("query", "jabber:iq:version");
	if not version then
		module:log("info", "%s replied with an invalid version reply: %s", stanza.attr.from, tostring(stanza));
		return true;
	end
	module:log("info", "%s is running: %s %s", stanza.attr.from, version:get_child_text("name"), version:get_child_text("version"));
end);

module:hook("iq-error/host/"..module.name, function (event)
	local stanza, origin = event.stanza, event.origin;
	module:log("info", "%s replied with an error: %s %s", stanza.attr.from, stanza:get_error());
	return true;
end);