File

mod_adhoc_dataforms_demo/mod_adhoc_dataforms_demo.lua @ 4877:adc6241e5d16

mod_measure_process: Report the enforced limit The soft limit is what the kernel actually enforces, while the hard limit is is how far you can change the soft limit without privileges. Unless the process dynamically adjusts the soft limit, knowing the hard limit is not as useful as knowing the soft limit. Reporting the soft limit and the number of in-use FDs allows placing alerts on expressions like 'process_open_fds / process_max_fds >= 0.95'
author Kim Alvefur <zash@zash.se>
date Tue, 18 Jan 2022 18:55:20 +0100
parent 4581:3e2e708fd18b
line wrap: on
line source

local dataforms = require "util.dataforms";
local adhoc_util = require "util.adhoc";
local serialization = require "util.serialization";

local adhoc_new = module:require "adhoc".new;

-- Dataform borrowed from Prosodys busted test for util.dataforms
local form = dataforms.new({
	title = "form-title",
	instructions = "form-instructions",
	{
		type = "hidden",
		name = "FORM_TYPE",
		value = "xmpp:prosody.im/spec/util.dataforms#1",
	};
	{
		type = "fixed",
		label = "fixed-label",
		name = "fixed-field#1",
		value = "fixed-value",
	},
	{
		type = "hidden",
		label = "hidden-label",
		name = "hidden-field",
		value = "hidden-value",
	},
	{
		type = "text-single",
		label = "text-single-label",
		name = "text-single-field",
		value = "text-single-value",
	},
	{
		type = "text-multi",
		label = "text-multi-label",
		name = "text-multi-field",
		value = "text\nmulti\nvalue",
	},
	{
		type = "text-private",
		label = "text-private-label",
		name = "text-private-field",
		value = "text-private-value",
	},
	{
		type = "boolean",
		label = "boolean-label",
		name = "boolean-field",
		value = true,
	},
	{
		type = "fixed",
		label = "fixed-label",
		name = "fixed-field#2",
		value = "fixed-value",
	},
	{
		type = "list-multi",
		label = "list-multi-label",
		name = "list-multi-field",
		value = {
			"list-multi-option-value#1",
			"list-multi-option-value#3",
		},
		options = {
			{
				label = "list-multi-option-label#1",
				value = "list-multi-option-value#1",
				default = true,
			},
			{
				label = "list-multi-option-label#2",
				value = "list-multi-option-value#2",
				default = false,
			},
			{
				label = "list-multi-option-label#3",
				value = "list-multi-option-value#3",
				default = true,
			},
		}
	},
	{
		type = "jid-single",
		label = "jid-single-label",
		name = "jid-single-field",
		value = "jid@single/value",
	},
	{
		type = "jid-multi",
		label = "jid-multi-label",
		name = "jid-multi-field",
		value = {
			"jid@multi/value#1",
			"jid@multi/value#2",
		},
	},
	{
		type = "list-single",
		label = "list-single-label",
		name = "list-single-field",
		value = "list-single-value",
		options = {
			"list-single-value",
			"list-single-value#2",
			"list-single-value#3",
		}
	},
})

local function handler(fields, err, data) -- luacheck: ignore 212/data
		return {
			status = "completed",
			info = "Data was:\n"
				.. serialization.serialize(err or fields),
		};
end

module:provides("adhoc",
	adhoc_new("Dataforms Demo",
		"xmpp:zash.se/mod_adhoc_dataforms_demo#form",
		adhoc_util.new_simple_form(form, handler), "any"));


local function multi_step_command(_, data, state)

	if data.action == "cancel" then
		return { status = "canceled" };
	elseif data.action == "complete" then
		return {
			status = "completed",
			info = "State was:\n"
				.. serialization.serialize(state, { fatal = false }),
		};
	end
	if state and data.action == "execute" then
		data.action = "next";
	elseif not state and data.action == "next" then
		-- Prevent jumping directly to step 2
		return { status = "canceled", error = "Invalid action" };
	end
	state = state or { step = 1, forms = { } };

	if data.action == "next" then
		state.step = state.step + 1;
	elseif data.action == "prev" then
		state.step = math.max(state.step - 1, 1);
	end

	local current_form = state.forms[state.step]
	if not current_form then
		current_form = {
			title = string.format("Step %d", state.step);
			instructions = state.step == 1 and "Here's a form." or "Here's another form.";
		};
		local already_selected = {};
		for _ = 1, math.random(1, 5) do
			local random
			repeat
				random = math.random(2, #form);
			until not already_selected[random]
			already_selected[random] = true;
			table.insert(current_form, form[random]);
		end
		state.forms[state.step] = dataforms.new(current_form);
	end

	local next_step = {
		status = "executing",
		form = current_form,
		default = "next",
		actions = {
			"next", "complete"
		},
	};
	if state.step > 1 then
		table.insert(next_step.actions, 1, "prev");
	end
	return next_step, state;
end

local permission = "any";
if not module.send_iq then -- hacky attempt at detecting 0.11 or earlier
	permission = "user";
end

module:depends("adhoc");
module:provides("adhoc",
	adhoc_new("Multi-step command demo",
		"xmpp:zash.se/mod_adhoc_dataforms_demo#multi",
		multi_step_command, permission));