mod_muc_search/mod_muc_search.lua
author Kim Alvefur <zash@zash.se>
Sun, 03 Mar 2024 11:23:40 +0100
changeset 5857 97c9b76867ca
parent 4141 5f4bcaad18ee
permissions -rw-r--r--
mod_log_ringbuffer: Detach event handlers on logging reload (thanks Menel) Otherwise the global event handlers accumulate, one added each time logging is reoladed, and each invocation of the signal or event triggers one dump of each created ringbuffer.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4141
5f4bcaad18ee mod_muc_search: Some changes predating version control
Kim Alvefur <zash@zash.se>
parents: 4140
diff changeset
     1
-- mod_muc_search
5f4bcaad18ee mod_muc_search: Some changes predating version control
Kim Alvefur <zash@zash.se>
parents: 4140
diff changeset
     2
-- https://muclumbus.jabbercat.org/docs/api#xmpp
5f4bcaad18ee mod_muc_search: Some changes predating version control
Kim Alvefur <zash@zash.se>
parents: 4140
diff changeset
     3
-- TODO
5f4bcaad18ee mod_muc_search: Some changes predating version control
Kim Alvefur <zash@zash.se>
parents: 4140
diff changeset
     4
-- Result set management (pagination, limits)
5f4bcaad18ee mod_muc_search: Some changes predating version control
Kim Alvefur <zash@zash.se>
parents: 4140
diff changeset
     5
-- Sorting
5f4bcaad18ee mod_muc_search: Some changes predating version control
Kim Alvefur <zash@zash.se>
parents: 4140
diff changeset
     6
-- min_users
5f4bcaad18ee mod_muc_search: Some changes predating version control
Kim Alvefur <zash@zash.se>
parents: 4140
diff changeset
     7
4140
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
local dataforms = require "util.dataforms";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
local st = require "util.stanza";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
local mod_muc = module:depends("muc");
4141
5f4bcaad18ee mod_muc_search: Some changes predating version control
Kim Alvefur <zash@zash.se>
parents: 4140
diff changeset
    12
assert(mod_muc.live_rooms, "Missing required MUC API. Prosody >= hg:f5c43e829d93 required");
4140
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
local search_form = dataforms.new {
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
	{
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
		type = "hidden";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
		value = "https://xmlns.zombofant.net/muclumbus/search/1.0#params";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    18
		name = "FORM_TYPE";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
	};
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
	{
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    21
		type = "text-single";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    22
		label = "Search for";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
		name = "q";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    24
	};
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
	{
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
		type = "boolean";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    27
		value = true;
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    28
		label = "Search in name";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    29
		name = "sinname";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    30
	};
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
	{
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
		type = "boolean";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
		value = true;
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    34
		label = "Search in description";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    35
		name = "sindescription";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    36
	};
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
	{
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
		type = "boolean";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
		value = true;
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
		label = "Search in address";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    41
		name = "sinaddr";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
	};
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    43
	{
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
		type = "text-single";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    45
		value = "1";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    46
		label = "Minimum number of users";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    47
		name = "min_users";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    48
	};
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    49
	{
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    50
		options = {
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    51
			{
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    52
				label = "Number of online users";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    53
				value = "nusers";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    54
			};
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
			{
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    56
				label = "Address";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    57
				value = "address";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    58
			};
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    59
		};
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    60
		type = "list-single";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    61
		value = "nusers";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    62
		label = "Sort results by";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    63
		name = "key";
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    64
	};
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    65
};
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    66
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    67
module:hook("iq-get/host/https://xmlns.zombofant.net/muclumbus/search/1.0:search", function (event)
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    68
	local origin, stanza = event.origin, event.stanza;
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    69
	origin.send(st.reply(stanza)
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    70
		:tag("search", { xmlns = "https://xmlns.zombofant.net/muclumbus/search/1.0" })
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    71
			:add_child(search_form:form()));
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    72
	return true;
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    73
end);
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    74
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    75
module:hook("iq-set/host/https://xmlns.zombofant.net/muclumbus/search/1.0:search", function (event)
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    76
	local origin, stanza = event.origin, event.stanza;
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    77
	local search = stanza.tags[1];
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    78
	local submitted = search:get_child("x", "jabber:x:data");
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    79
	if not submitted then
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    80
		origin.send(st.error_reply("modify", "bad-request", "Missing dataform"));
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    81
		return;
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    82
	end
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    83
	local query = search_form:data(submitted);
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    84
	module:log("debug", "Got query: %q", query);
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    85
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    86
	local result = st.reply(stanza)
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    87
		:tag("result", { xmlns = "https://xmlns.zombofant.net/muclumbus/search/1.0" });
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    88
4141
5f4bcaad18ee mod_muc_search: Some changes predating version control
Kim Alvefur <zash@zash.se>
parents: 4140
diff changeset
    89
	for room in mod_muc.live_rooms() do -- TODO s/live/all/ but preferably along with pagination/rsm
4140
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    90
		if room:get_public() and not room:get_members_only() then
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    91
			module:log("debug", "Looking at room %s %q", room.jid, room._data);
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    92
			if (query.sinname and room:get_name():find(query.q, 1, true))
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    93
			or (query.sindescription and (room:get_description() or ""):find(query.q, 1, true))
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    94
			or (query.sinaddr and room.jid:find(query.q, 1, true)) then
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    95
				result:tag("item", { address = room.jid })
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    96
					:text_tag("name", room:get_name())
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    97
					:text_tag("description", room:get_description())
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    98
					:text_tag("language", room:get_language())
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    99
					:tag("is-open"):up()
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   100
				:up();
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   101
			end
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   102
		end
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   103
	end
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   104
	origin.send(result);
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   105
	return true;
d2a9aa27169d mod_muc_search: Implementation of the search.jabber.network XMPP API
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   106
end);