plugins/servercontact.lua

Sun, 05 Dec 2021 18:35:39 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Sun, 05 Dec 2021 18:35:39 +0000
changeset 165
ec0567256b11
parent 140
4aa787757235
permissions
-rw-r--r--

Add rtbl_admin plugin

local disco_info = "http://jabber.org/protocol/disco#info";
local verse = require "verse"
local riddim = require "riddim"

local dataform = require "util.dataforms".new;

local serverinfo_form = dataform {
	{ value = "http://jabber.org/network/serverinfo"; type = "hidden"; name = "FORM_TYPE"; };
	{ name = "abuse-addresses", type = "list-multi" };
	{ name = "admin-addresses", type = "list-multi" };
	{ name = "feedback-addresses", type = "list-multi" };
	{ name = "sales-addresses", type = "list-multi" };
	{ name = "security-addresses", type = "list-multi" };
	{ name = "support-addresses", type = "list-multi" };
};

local valid_types = {
	abuse = true;
	admin = true;
	feedback = true;
	sales = true;
	security = true;
	support = true;
};

function riddim.plugins.servercontact(bot)
	bot:hook("commands/contact", function (command)
		local target, typ = command.param;
		if not target then
			return "Which server?";
		elseif target:find("%s") then
			typ, target = target:match("(%a+)%s*(%S+)");
			if not valid_types[typ] then
				command:reply("Valid types are abuse, admin, feedback, sales, security and support");
				return;
			end
		end
		if target:find("[@/]") then
			target = target:match("@?([^@/]+)/?");
		end
		bot.stream:send_iq(verse.iq({ type = "get", to = target }):query(disco_info), function (reply)
			if reply.attr.type == "error" then
				local _, condition, text = reply:get_error();
				command:reply(("Could not reach %s: %s"):format(command.param, text or condition));
				return
			end

			for form in reply.tags[1]:childtags("x", "jabber:x:data") do
				local data = serverinfo_form:data(form);
				if data.FORM_TYPE == serverinfo_form[1].value then
					if typ then
						local addresses = data[typ .. "-addresses"];
						if addresses and addresses[1] then
							command:reply(("%s contacts for %s %s: %s"):format(typ:gsub("^.", string.upper), target, addresses[2] and "are" or "is", table.concat(addresses, " ")));
						else
							command:reply(target .. " doesn't have any contact addresses for "..typ);
						end
					else
						local addresses_kinds = {};
						for kind, addresses in pairs(data) do
							kind = kind:sub(1,-11);
							if valid_types[kind] then
								for _, addr in ipairs(addresses) do
									local a = addresses_kinds[addr];
									if not a then
										addresses_kinds[addr] = {
											kind, [kind] = true;
										};
									elseif a and not a[kind] then
										table.insert(a, kind)
										a[kind] = true;
									end
								end
							end
						end
						if next(addresses_kinds) ~= nil then
							local reply = {"Contact addresses for", target, "is"};
							for addr, kinds in pairs(addresses_kinds) do
								if kinds[2] then reply[3] = "are" end
								table.insert(reply, addr);
								table.insert(reply, "(" .. table.concat(kinds, ", ") .. ")");
							end
							if reply[6] then reply[3] = "are" end
							command:reply(table.concat(reply, " "));
						end
					end
					break;
				end
			end
			command:reply(target .. " doesn't have any contact addresses");
		end);
		return true;
	end);
end

mercurial