view mod_pubsub_stats/mod_pubsub_stats.lua @ 4409:44f6537f6427

mod_invites_adhoc: Fail contact invite if user is not on current host Only the username was being used, and the host of the requester ignored. Luckily this only affects admins of the host. If they want to create an account they can use the other command. If they want to create a contact they should request from their account on this host.
author Matthew Wild <mwild1@gmail.com>
date Thu, 28 Jan 2021 07:04:11 +0000
parents b2ce818ec19c
children
line wrap: on
line source

local st = require "util.stanza";

local pubsub = module:depends"pubsub";

local actor = module.host .. "/modules/" .. module.name;

local pubsub_xmlns = "http://jabber.org/protocol/pubsub"

local node = module:get_option_string(module.name .. "_node", "stats");

local function publish_stats(stats, stats_extra)
	local id = "current";
	local xitem = st.stanza("item", { xmlns = pubsub_xmlns, id = id })
		:tag("query", { xmlns = "http://jabber.org/protocol/stats" });

	for name, value in pairs(stats) do
		local stat_extra = stats_extra[name];
		local unit = stat_extra and stat_extra.units;
		xitem:tag("stat", { name = name, unit = unit, value = tostring(value) }):up();
	end

	local ok, err = pubsub.service:publish(node, actor, id, xitem);
	if not ok then
		module:log("error", "Error publishing stats: %s", err);
	end
end

function module.load()
	pubsub.service:create(node, true, {
		persistent_items = false;
		max_items = 1;
	});
	pubsub.service:set_affiliation(node, true, actor, "publisher");
end

module:hook_global("stats-updated", function (event)
	publish_stats(event.stats, event.stats_extra);
end);

function module.unload()
	pubsub.service:delete(node, true);
end

module:hook("pubsub-summary/http://jabber.org/protocol/stats", function (event)
	local payload = event.payload;
	local summary = {};
	for stat in payload:childtags("stat") do
		if stat.attr.name and stat.attr.value then
			table.insert(summary, string.format("%s: %g %s", stat.attr.name, tonumber(stat.attr.value), stat.attr.units or ""));
		end
	end
	table.sort(summary);
	return table.concat(summary, "\n");
end);