mod_muc_search/mod_muc_search.lua
author Matthew Wild <mwild1@gmail.com>
Sat, 24 Sep 2022 09:26:26 +0100
changeset 5063 5f1120c284c5
parent 4141 5f4bcaad18ee
permissions -rw-r--r--
mod_cloud_notify_extensions: Add note about dependency Noting here because people might not click through to see it on the mod_cloud_notify_encrypted page.
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);