File

mod_query_client_ver/mod_query_client_ver.lua @ 6305:1c62edeb9147

mod_pastebin: Update Readme diff --git a/mod_pastebin/README.md b/mod_pastebin/README.md --- a/mod_pastebin/README.md +++ b/mod_pastebin/README.md @@ -37,12 +37,14 @@ For example: Pastes will be available by default at `http://<your-prosody>:5280/pastebin/` by default. -In Prosody 0.9 and later this can be changed with [HTTP -settings](https://prosody.im/doc/http). +Ports and path can be changed with [HTTP +settings](https://prosody.im/doc/http), for example like: -In 0.8 and older this can be changed with `pastebin_ports` (see below), -or you can forward another external URL from your web server to Prosody, -use `pastebin_url` to set that URL. +``` {.lua} + http_paths = { + pastebin = "/$host-paste"; + } +``` # Discovery @@ -82,27 +84,16 @@ The line and character tresholds are adv pastebin_line_threshold The maximum number of lines a message may have before it is sent to the pastebin. (default 4 lines) pastebin_trigger A string of characters (e.g. "!paste ") which if detected at the start of a message, always sends the message to the pastebin, regardless of length. (default: not set) pastebin_expire_after Number of hours after which to expire (remove) a paste, defaults to 24. Set to 0 to store pastes permanently on disk. - pastebin_ports List of ports to run the HTTP server on, same format as mod_httpserver's http_ports[^1] - pastebin_url Base URL to display for pastebin links, must end with / and redirect to Prosody's built-in HTTP server[^2] # Compatibility - ------ ------- - trunk Works + ------ --------------------- + trunk Works as of 25-06-13 + 13 Works 0.12 Works - 0.11 Works - 0.10 Works - 0.9 Works - 0.8 Works - ------ ------- + ------ --------------------- # Todo - Maximum paste length - Web interface to submit pastes? - -[^1]: As of Prosody 0.9, `pastebin_ports` is replaced by `http_ports`, - see [Prosody HTTP server documentation](https://prosody.im/doc/http) - -[^2]: See also - [http_external_url](https://prosody.im/doc/http#external_url)
author Menel <menel@snikket.de>
date Fri, 13 Jun 2025 11:39:58 +0200
parent 2993:1f8220f0c8bf
line wrap: on
line source

-- Query and log client software

local st = require"util.stanza";
local uuid = require"util.uuid".generate;

local xmlns_iq_version = "jabber:iq:version";
local version_id = uuid();
local xmlns_disco_info = "http://jabber.org/protocol/disco#info";
local disco_id = uuid();

module:hook("presence/bare", function(event)
	local origin, stanza = event.origin, event.stanza;
	if origin.type == "c2s" and not origin.presence and not stanza.attr.to then
		module:add_timer(1, function()
			if origin.type ~= "c2s" then return end
			origin.log("debug", "Sending version query");
			origin.send(st.iq({ id = version_id, type = "get", from = module.host, to = origin.full_jid }):query(xmlns_iq_version));
		end);
	end
end, 1);

module:hook("iq-result/host/"..version_id, function(event)
	local origin, stanza = event.origin, event.stanza;
	local query = stanza:get_child("query", xmlns_iq_version);
	if query then
		local client = query:get_child_text("name");
		if client then
			local version = query:get_child_text("version");
			if version then
				client = client .. " version " .. version;
			end
			origin.log("info", "Running %s", client);
		end
	end
	return true;
end);

module:hook("iq-error/host/"..version_id, function(event)
	local origin, stanza = event.origin, event.stanza;
	origin.send(st.iq({ id = disco_id, type = "get", from = module.host, to = origin.full_jid }):query(xmlns_disco_info));
	return true;
end);

module:hook("iq-result/host/"..disco_id, function(event)
	local origin, stanza = event.origin, event.stanza;
	local query = stanza:get_child("query", xmlns_disco_info);
	if query then
		local ident = query:get_child("identity");
		if ident and ident.attr.name then
			origin.log("info", "Running %s", ident.attr.name);
		end
	end
	return true;
end);

module:hook("iq-error/host/"..disco_id, function()
	return true; -- Doesn't reply to disco#info? Weird, but ignore for now.
end);

module:add_item("adhoc",
	module:require "adhoc".new("Query all currently connected clients", module.name,
	function (self, data, state)
		for jid, session in pairs(prosody.full_sessions) do
			if session.host == module.host then
				session.send(st.iq({ id = version_id, type = "get", from = module.host, to = session.full_jid }):query(xmlns_iq_version));
			end
		end
		return { info = "Ok, check your logs for results", status = "completed" }
	end, "admin"));