annotate mod_muc_search/mod_muc_search.lua @ 4923:c83b009b5bc5

mod_rest: Add configuration of which stanzas to route to callback Makes it simpler to build APIs that only handle a certain kind of stanzas, letting them be handled by the unhandled stanza handler instead of having to write code to ignore certain kinds of stanzas.
author Kim Alvefur <zash@zash.se>
date Sat, 09 Apr 2022 01:04:25 +0200
parents 5f4bcaad18ee
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4137
5f4bcaad18ee mod_muc_search: Some changes predating version control
Kim Alvefur <zash@zash.se>
parents: 4136
diff changeset
1 -- mod_muc_search
5f4bcaad18ee mod_muc_search: Some changes predating version control
Kim Alvefur <zash@zash.se>
parents: 4136
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: 4136
diff changeset
3 -- TODO
5f4bcaad18ee mod_muc_search: Some changes predating version control
Kim Alvefur <zash@zash.se>
parents: 4136
diff changeset
4 -- Result set management (pagination, limits)
5f4bcaad18ee mod_muc_search: Some changes predating version control
Kim Alvefur <zash@zash.se>
parents: 4136
diff changeset
5 -- Sorting
5f4bcaad18ee mod_muc_search: Some changes predating version control
Kim Alvefur <zash@zash.se>
parents: 4136
diff changeset
6 -- min_users
5f4bcaad18ee mod_muc_search: Some changes predating version control
Kim Alvefur <zash@zash.se>
parents: 4136
diff changeset
7
4136
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");
4137
5f4bcaad18ee mod_muc_search: Some changes predating version control
Kim Alvefur <zash@zash.se>
parents: 4136
diff changeset
12 assert(mod_muc.live_rooms, "Missing required MUC API. Prosody >= hg:f5c43e829d93 required");
4136
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
4137
5f4bcaad18ee mod_muc_search: Some changes predating version control
Kim Alvefur <zash@zash.se>
parents: 4136
diff changeset
89 for room in mod_muc.live_rooms() do -- TODO s/live/all/ but preferably along with pagination/rsm
4136
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);