Software /
code /
prosody-modules
Annotate
mod_muc_search/mod_muc_search.lua @ 4941:e7b9bc629ecc
mod_rest: Add special handling to catch MAM results from remote hosts
Makes MAM queries to remote hosts works.
As the comment says, MAM results from users' local archives or local
MUCs are returned via origin.send() which is provided in the event and
thus already worked. Results from remote hosts go via normal stanza
routing and events, which need this extra handling to catch.
This pattern of iq-set, message+, iq-result is generally limited to MAM.
Closest similar thing might be MUC join, but to really handle that you
would need the webhook callback mechanism.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Mon, 16 May 2022 19:47:09 +0200 |
parent | 4137:5f4bcaad18ee |
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); |