Mercurial > prosody-modules
annotate mod_pubsub_text_interface/mod_pubsub_text_interface.lua @ 4515:2e33eeafe962
mod_muc_markers: Prevent any markers from reaching the archive, even if untracked
Original intention was to leave alone things that this module isn't
handling. However markers in archives are just problematic without
more advanced logic about what is markable and what is not. It also
requires a more advanced query in mod_muc_rai to determine the latest
markable message instead of the latest archived message.
I'd rather keep the "is archivable" and "is markable" definition the
same for simplicity. I don't want to introduce yet another set of rules
for no reason.
No markers in MAM.
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Mon, 22 Mar 2021 15:55:02 +0000 |
parents | 725768d83830 |
children | bbf9e36db3a9 |
rev | line source |
---|---|
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1 local st = require "util.stanza"; |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
2 local jid = require "util.jid"; |
3247
ada7a0c7221c
mod_pubsub_text_interface: Generate a stanza id for replies
Kim Alvefur <zash@zash.se>
parents:
3243
diff
changeset
|
3 local id = require "util.id"; |
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
4 |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
5 local pubsub = module:depends "pubsub".service; |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
6 |
4041
cb5ea9d25cb2
mod_pubsub_text_interface: Hint at possible commands using XEP-0439: Quick Response
Kim Alvefur <zash@zash.se>
parents:
3644
diff
changeset
|
7 local xmlns_quick_resp = "urn:xmpp:tmp:quick-response"; |
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 local name = module:get_option_string("name", "PubSub Service on "..module.host); |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
9 local help = name..[[ |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 Commands: |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
12 |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 - `help` - this help message |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 - `list` - list available nodes |
3488
4ddb034a8a03
mod_pubsub_text_interface: Add command for listing current subscriptions
Kim Alvefur <zash@zash.se>
parents:
3429
diff
changeset
|
15 - `subscriptions` - list nodes you are subscribed to |
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
16 - `subscribe node` - subscribe to a node |
3328
7d39ffd058d5
mod_pubsub_text_interface: Handle lack of `pubsub:get_last_item` in Prosody 0.10
Kim Alvefur <zash@zash.se>
parents:
3293
diff
changeset
|
17 - `unsubscribe node` - unsubscribe from a node]]; |
7d39ffd058d5
mod_pubsub_text_interface: Handle lack of `pubsub:get_last_item` in Prosody 0.10
Kim Alvefur <zash@zash.se>
parents:
3293
diff
changeset
|
18 if pubsub.get_last_item then -- COMPAT not available in 0.10 |
7d39ffd058d5
mod_pubsub_text_interface: Handle lack of `pubsub:get_last_item` in Prosody 0.10
Kim Alvefur <zash@zash.se>
parents:
3293
diff
changeset
|
19 help = help .. "\n- `last node` - send the last item (again)" |
7d39ffd058d5
mod_pubsub_text_interface: Handle lack of `pubsub:get_last_item` in Prosody 0.10
Kim Alvefur <zash@zash.se>
parents:
3293
diff
changeset
|
20 end |
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 module:hook("message/host", function (event) |
3489
33b3f02a9e7d
mod_pubsub_text_interface: Remove unused variable [luacheck]
Kim Alvefur <zash@zash.se>
parents:
3488
diff
changeset
|
23 local stanza = event.stanza; |
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 local body = stanza:get_child_text("body"); |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 if not body then return end -- bail out |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 local from = stanza.attr.from; |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
28 |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
29 local reply = st.reply(stanza); |
3247
ada7a0c7221c
mod_pubsub_text_interface: Generate a stanza id for replies
Kim Alvefur <zash@zash.se>
parents:
3243
diff
changeset
|
30 reply.attr.id = id.medium(); |
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
31 |
3249
8f4a7084c466
mod_pubsub_text_interface: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
3248
diff
changeset
|
32 local command, node_arg = body:match("^(%a+)%s+(.*)"); |
3250
5801b5cf8f54
mod_pubsub_text_interface: Ignore whitespace after all commands
Kim Alvefur <zash@zash.se>
parents:
3249
diff
changeset
|
33 command = (command or body):lower(); |
3248
ecec46f7d020
mod_pubsub_text_interface: Fix chain that accidentally produced nested <body>
Kim Alvefur <zash@zash.se>
parents:
3247
diff
changeset
|
34 |
3250
5801b5cf8f54
mod_pubsub_text_interface: Ignore whitespace after all commands
Kim Alvefur <zash@zash.se>
parents:
3249
diff
changeset
|
35 if command == "help" then |
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
36 reply:body(help); |
4041
cb5ea9d25cb2
mod_pubsub_text_interface: Hint at possible commands using XEP-0439: Quick Response
Kim Alvefur <zash@zash.se>
parents:
3644
diff
changeset
|
37 reply:tag("response", { xmlns = xmlns_quick_resp, value = "list", }):up(); |
cb5ea9d25cb2
mod_pubsub_text_interface: Hint at possible commands using XEP-0439: Quick Response
Kim Alvefur <zash@zash.se>
parents:
3644
diff
changeset
|
38 reply:tag("response", { xmlns = xmlns_quick_resp, value = "subscriptions", }):up(); |
3250
5801b5cf8f54
mod_pubsub_text_interface: Ignore whitespace after all commands
Kim Alvefur <zash@zash.se>
parents:
3249
diff
changeset
|
39 elseif command == "list" then |
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
40 local ok, nodes = pubsub:get_nodes(from); |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
41 if ok then |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
42 local list = {}; |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
43 for node, node_obj in pairs(nodes) do |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
44 table.insert(list, ("- `%s` %s"):format(node, node_obj.config.title or "")); |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
45 end |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
46 reply:body(table.concat(list, "\n")); |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
47 else |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
48 reply:body(nodes); |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 end |
3488
4ddb034a8a03
mod_pubsub_text_interface: Add command for listing current subscriptions
Kim Alvefur <zash@zash.se>
parents:
3429
diff
changeset
|
50 elseif command == "subscriptions" then |
4ddb034a8a03
mod_pubsub_text_interface: Add command for listing current subscriptions
Kim Alvefur <zash@zash.se>
parents:
3429
diff
changeset
|
51 local ok, subs = pubsub:get_subscriptions(nil, from, from); |
4ddb034a8a03
mod_pubsub_text_interface: Add command for listing current subscriptions
Kim Alvefur <zash@zash.se>
parents:
3429
diff
changeset
|
52 if not ok then |
4ddb034a8a03
mod_pubsub_text_interface: Add command for listing current subscriptions
Kim Alvefur <zash@zash.se>
parents:
3429
diff
changeset
|
53 reply:body(subs); |
4ddb034a8a03
mod_pubsub_text_interface: Add command for listing current subscriptions
Kim Alvefur <zash@zash.se>
parents:
3429
diff
changeset
|
54 elseif #subs == 0 then |
4ddb034a8a03
mod_pubsub_text_interface: Add command for listing current subscriptions
Kim Alvefur <zash@zash.se>
parents:
3429
diff
changeset
|
55 reply:body("You are not subscribed to anything from this pubsub service"); |
4ddb034a8a03
mod_pubsub_text_interface: Add command for listing current subscriptions
Kim Alvefur <zash@zash.se>
parents:
3429
diff
changeset
|
56 else |
4ddb034a8a03
mod_pubsub_text_interface: Add command for listing current subscriptions
Kim Alvefur <zash@zash.se>
parents:
3429
diff
changeset
|
57 local response = {}; |
4ddb034a8a03
mod_pubsub_text_interface: Add command for listing current subscriptions
Kim Alvefur <zash@zash.se>
parents:
3429
diff
changeset
|
58 for i = 1, #subs do |
4ddb034a8a03
mod_pubsub_text_interface: Add command for listing current subscriptions
Kim Alvefur <zash@zash.se>
parents:
3429
diff
changeset
|
59 response[i] = string.format("- `%s`", subs[i].node); |
4041
cb5ea9d25cb2
mod_pubsub_text_interface: Hint at possible commands using XEP-0439: Quick Response
Kim Alvefur <zash@zash.se>
parents:
3644
diff
changeset
|
60 reply:tag("response", { xmlns = xmlns_quick_resp, value = "unsubscribe "..subs[i].node, }):up(); |
cb5ea9d25cb2
mod_pubsub_text_interface: Hint at possible commands using XEP-0439: Quick Response
Kim Alvefur <zash@zash.se>
parents:
3644
diff
changeset
|
61 reply:tag("response", { xmlns = xmlns_quick_resp, value = "last "..subs[i].node, }):up(); |
3488
4ddb034a8a03
mod_pubsub_text_interface: Add command for listing current subscriptions
Kim Alvefur <zash@zash.se>
parents:
3429
diff
changeset
|
62 end |
4ddb034a8a03
mod_pubsub_text_interface: Add command for listing current subscriptions
Kim Alvefur <zash@zash.se>
parents:
3429
diff
changeset
|
63 reply:body(table.concat(response, "\n")); |
4ddb034a8a03
mod_pubsub_text_interface: Add command for listing current subscriptions
Kim Alvefur <zash@zash.se>
parents:
3429
diff
changeset
|
64 end |
3248
ecec46f7d020
mod_pubsub_text_interface: Fix chain that accidentally produced nested <body>
Kim Alvefur <zash@zash.se>
parents:
3247
diff
changeset
|
65 elseif command == "subscribe" then |
3249
8f4a7084c466
mod_pubsub_text_interface: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
3248
diff
changeset
|
66 local ok, err = pubsub:add_subscription(node_arg, from, jid.bare(from), { ["pubsub#include_body"] = true }); |
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
67 reply:body(ok and "OK" or err); |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
68 elseif command == "unsubscribe" then |
3249
8f4a7084c466
mod_pubsub_text_interface: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
3248
diff
changeset
|
69 local ok, err = pubsub:remove_subscription(node_arg, from, jid.bare(from)); |
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
70 reply:body(ok and "OK" or err); |
3328
7d39ffd058d5
mod_pubsub_text_interface: Handle lack of `pubsub:get_last_item` in Prosody 0.10
Kim Alvefur <zash@zash.se>
parents:
3293
diff
changeset
|
71 elseif command == "last" and pubsub.get_last_item then |
3293
f728c8c42860
mod_pubsub_text_interface: Add a 'last' command for sending the last item
Kim Alvefur <zash@zash.se>
parents:
3250
diff
changeset
|
72 local ok, item_id, item = pubsub:get_last_item(node_arg, from); |
f728c8c42860
mod_pubsub_text_interface: Add a 'last' command for sending the last item
Kim Alvefur <zash@zash.se>
parents:
3250
diff
changeset
|
73 if not ok then |
f728c8c42860
mod_pubsub_text_interface: Add a 'last' command for sending the last item
Kim Alvefur <zash@zash.se>
parents:
3250
diff
changeset
|
74 reply:body(item_id); -- err message |
f728c8c42860
mod_pubsub_text_interface: Add a 'last' command for sending the last item
Kim Alvefur <zash@zash.se>
parents:
3250
diff
changeset
|
75 elseif not item_id then |
f728c8c42860
mod_pubsub_text_interface: Add a 'last' command for sending the last item
Kim Alvefur <zash@zash.se>
parents:
3250
diff
changeset
|
76 reply:body("node is empty"); |
f728c8c42860
mod_pubsub_text_interface: Add a 'last' command for sending the last item
Kim Alvefur <zash@zash.se>
parents:
3250
diff
changeset
|
77 else |
f728c8c42860
mod_pubsub_text_interface: Add a 'last' command for sending the last item
Kim Alvefur <zash@zash.se>
parents:
3250
diff
changeset
|
78 pubsub.config.broadcaster("items", node_arg, { |
f728c8c42860
mod_pubsub_text_interface: Add a 'last' command for sending the last item
Kim Alvefur <zash@zash.se>
parents:
3250
diff
changeset
|
79 [from] = { ["pubsub#include_body"] = true } |
4489
725768d83830
mod_pubsub_text_interface: Pass node object to broadcaster for config access
Kim Alvefur <zash@zash.se>
parents:
4234
diff
changeset
|
80 }, item, nil, pubsub.nodes[node_arg]); |
3293
f728c8c42860
mod_pubsub_text_interface: Add a 'last' command for sending the last item
Kim Alvefur <zash@zash.se>
parents:
3250
diff
changeset
|
81 reply:body("OK"); |
f728c8c42860
mod_pubsub_text_interface: Add a 'last' command for sending the last item
Kim Alvefur <zash@zash.se>
parents:
3250
diff
changeset
|
82 end |
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
83 else |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
84 reply:body("Unknown command. `help` to list commands."); |
4041
cb5ea9d25cb2
mod_pubsub_text_interface: Hint at possible commands using XEP-0439: Quick Response
Kim Alvefur <zash@zash.se>
parents:
3644
diff
changeset
|
85 reply:tag("response", { xmlns = xmlns_quick_resp, value = "help", }):up(); |
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
86 end |
3644
9980ea72ff91
mod_pubsub_text_interface: Respond to receipts
Kim Alvefur <zash@zash.se>
parents:
3489
diff
changeset
|
87 reply:reset(); |
9980ea72ff91
mod_pubsub_text_interface: Respond to receipts
Kim Alvefur <zash@zash.se>
parents:
3489
diff
changeset
|
88 |
4042
78ac5500a844
mod_pubsub_text_interface: Reflect XEP-0334 hints
Kim Alvefur <zash@zash.se>
parents:
4041
diff
changeset
|
89 if stanza:get_child("no-copy", "urn:xmpp:hints") then |
78ac5500a844
mod_pubsub_text_interface: Reflect XEP-0334 hints
Kim Alvefur <zash@zash.se>
parents:
4041
diff
changeset
|
90 reply:tag("no-copy", { xmlns = "urn:xmpp:hints" }):up(); |
78ac5500a844
mod_pubsub_text_interface: Reflect XEP-0334 hints
Kim Alvefur <zash@zash.se>
parents:
4041
diff
changeset
|
91 end |
78ac5500a844
mod_pubsub_text_interface: Reflect XEP-0334 hints
Kim Alvefur <zash@zash.se>
parents:
4041
diff
changeset
|
92 |
78ac5500a844
mod_pubsub_text_interface: Reflect XEP-0334 hints
Kim Alvefur <zash@zash.se>
parents:
4041
diff
changeset
|
93 if stanza:get_child("no-store", "urn:xmpp:hints") then |
78ac5500a844
mod_pubsub_text_interface: Reflect XEP-0334 hints
Kim Alvefur <zash@zash.se>
parents:
4041
diff
changeset
|
94 reply:tag("no-store", { xmlns = "urn:xmpp:hints" }):up(); |
78ac5500a844
mod_pubsub_text_interface: Reflect XEP-0334 hints
Kim Alvefur <zash@zash.se>
parents:
4041
diff
changeset
|
95 end |
78ac5500a844
mod_pubsub_text_interface: Reflect XEP-0334 hints
Kim Alvefur <zash@zash.se>
parents:
4041
diff
changeset
|
96 |
3429
1f0c290bd28a
mod_pubsub_text_interface: Send replies trough normal stanza routing
Kim Alvefur <zash@zash.se>
parents:
3328
diff
changeset
|
97 module:send(reply); |
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
98 return true; |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
99 end); |