Software /
code /
prosody-modules
Annotate
mod_pubsub_text_interface/mod_pubsub_text_interface.lua @ 5160:8474a3b80200
mod_firewall: Fix 'is_admin' internal dependency rule #1797 (thanks diane)
Looks like the boolean logic was inverted here. Instead, for now,
simply check if is_admin is there. It is deprecated in trunk and was
briefly removed before being brought back with a 'deprecated' warning as
part of the new roles and permissions work. Making this dependency
conditioned on the existence of the underlying function should make it
work until it actually goes away for real.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 27 Jan 2023 23:06:25 +0100 |
parent | 5134:e0d0ef564095 |
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 |
5134
e0d0ef564095
mod_pubsub_text_interface: Try to clarify help message wrt node arguments
Kim Alvefur <zash@zash.se>
parents:
5133
diff
changeset
|
16 - `subscribe NODE` - subscribe to a node |
e0d0ef564095
mod_pubsub_text_interface: Try to clarify help message wrt node arguments
Kim Alvefur <zash@zash.se>
parents:
5133
diff
changeset
|
17 - `unsubscribe NODE` - unsubscribe from 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
|
18 if pubsub.get_last_item then -- COMPAT not available in 0.10 |
5134
e0d0ef564095
mod_pubsub_text_interface: Try to clarify help message wrt node arguments
Kim Alvefur <zash@zash.se>
parents:
5133
diff
changeset
|
19 help = help .. "\n- `last NODE` - send the last item (again)" |
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
|
20 end |
5133
d7652471ae3e
mod_pubsub_text_interface: Improve error messages
Kim Alvefur <zash@zash.se>
parents:
4645
diff
changeset
|
21 -- FIXME better word for "node" |
d7652471ae3e
mod_pubsub_text_interface: Improve error messages
Kim Alvefur <zash@zash.se>
parents:
4645
diff
changeset
|
22 |
d7652471ae3e
mod_pubsub_text_interface: Improve error messages
Kim Alvefur <zash@zash.se>
parents:
4645
diff
changeset
|
23 local friendly_pubsub_errors = { |
d7652471ae3e
mod_pubsub_text_interface: Improve error messages
Kim Alvefur <zash@zash.se>
parents:
4645
diff
changeset
|
24 ["forbidden"] = "You are not allowed to do that"; |
d7652471ae3e
mod_pubsub_text_interface: Improve error messages
Kim Alvefur <zash@zash.se>
parents:
4645
diff
changeset
|
25 ["item-not-found"] = "That node does not exist"; |
d7652471ae3e
mod_pubsub_text_interface: Improve error messages
Kim Alvefur <zash@zash.se>
parents:
4645
diff
changeset
|
26 ["internal-server-error"] = "Something went wrong (see server logs)"; |
d7652471ae3e
mod_pubsub_text_interface: Improve error messages
Kim Alvefur <zash@zash.se>
parents:
4645
diff
changeset
|
27 ["not-subscribed"] = "You were not subscribed"; |
d7652471ae3e
mod_pubsub_text_interface: Improve error messages
Kim Alvefur <zash@zash.se>
parents:
4645
diff
changeset
|
28 }; |
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
29 |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 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
|
31 local stanza = event.stanza; |
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
32 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
|
33 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
|
34 |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
35 local from = stanza.attr.from; |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
36 |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
37 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
|
38 reply.attr.id = id.medium(); |
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
39 |
3249
8f4a7084c466
mod_pubsub_text_interface: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents:
3248
diff
changeset
|
40 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
|
41 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
|
42 |
3250
5801b5cf8f54
mod_pubsub_text_interface: Ignore whitespace after all commands
Kim Alvefur <zash@zash.se>
parents:
3249
diff
changeset
|
43 if command == "help" then |
4644
bbf9e36db3a9
mod_pubsub_text_interface: Fix move quick response tags out of <body>
Kim Alvefur <zash@zash.se>
parents:
4489
diff
changeset
|
44 reply:body(help):up(); |
4041
cb5ea9d25cb2
mod_pubsub_text_interface: Hint at possible commands using XEP-0439: Quick Response
Kim Alvefur <zash@zash.se>
parents:
3644
diff
changeset
|
45 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
|
46 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
|
47 elseif command == "list" then |
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
48 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
|
49 if ok then |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
50 local list = {}; |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
51 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
|
52 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
|
53 end |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
54 reply:body(table.concat(list, "\n")); |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
55 else |
5133
d7652471ae3e
mod_pubsub_text_interface: Improve error messages
Kim Alvefur <zash@zash.se>
parents:
4645
diff
changeset
|
56 reply:body(friendly_pubsub_errors[nodes] or nodes); |
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
57 end |
3488
4ddb034a8a03
mod_pubsub_text_interface: Add command for listing current subscriptions
Kim Alvefur <zash@zash.se>
parents:
3429
diff
changeset
|
58 elseif command == "subscriptions" then |
4ddb034a8a03
mod_pubsub_text_interface: Add command for listing current subscriptions
Kim Alvefur <zash@zash.se>
parents:
3429
diff
changeset
|
59 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
|
60 if not ok then |
5133
d7652471ae3e
mod_pubsub_text_interface: Improve error messages
Kim Alvefur <zash@zash.se>
parents:
4645
diff
changeset
|
61 reply:body(friendly_pubsub_errors[subs] or subs); |
3488
4ddb034a8a03
mod_pubsub_text_interface: Add command for listing current subscriptions
Kim Alvefur <zash@zash.se>
parents:
3429
diff
changeset
|
62 elseif #subs == 0 then |
4ddb034a8a03
mod_pubsub_text_interface: Add command for listing current subscriptions
Kim Alvefur <zash@zash.se>
parents:
3429
diff
changeset
|
63 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
|
64 else |
4ddb034a8a03
mod_pubsub_text_interface: Add command for listing current subscriptions
Kim Alvefur <zash@zash.se>
parents:
3429
diff
changeset
|
65 local response = {}; |
4ddb034a8a03
mod_pubsub_text_interface: Add command for listing current subscriptions
Kim Alvefur <zash@zash.se>
parents:
3429
diff
changeset
|
66 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
|
67 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
|
68 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
|
69 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
|
70 end |
4ddb034a8a03
mod_pubsub_text_interface: Add command for listing current subscriptions
Kim Alvefur <zash@zash.se>
parents:
3429
diff
changeset
|
71 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
|
72 end |
3248
ecec46f7d020
mod_pubsub_text_interface: Fix chain that accidentally produced nested <body>
Kim Alvefur <zash@zash.se>
parents:
3247
diff
changeset
|
73 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
|
74 local ok, err = pubsub:add_subscription(node_arg, from, jid.bare(from), { ["pubsub#include_body"] = true }); |
5133
d7652471ae3e
mod_pubsub_text_interface: Improve error messages
Kim Alvefur <zash@zash.se>
parents:
4645
diff
changeset
|
75 reply:body(ok and "OK" or friendly_pubsub_errors[err] or err); |
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
76 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
|
77 local ok, err = pubsub:remove_subscription(node_arg, from, jid.bare(from)); |
5133
d7652471ae3e
mod_pubsub_text_interface: Improve error messages
Kim Alvefur <zash@zash.se>
parents:
4645
diff
changeset
|
78 reply:body(ok and "OK" or friendly_pubsub_errors[err] 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
|
79 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
|
80 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
|
81 if not ok then |
5133
d7652471ae3e
mod_pubsub_text_interface: Improve error messages
Kim Alvefur <zash@zash.se>
parents:
4645
diff
changeset
|
82 reply:body(friendly_pubsub_errors[item_id] or item_id); |
3293
f728c8c42860
mod_pubsub_text_interface: Add a 'last' command for sending the last item
Kim Alvefur <zash@zash.se>
parents:
3250
diff
changeset
|
83 elseif not item_id then |
5133
d7652471ae3e
mod_pubsub_text_interface: Improve error messages
Kim Alvefur <zash@zash.se>
parents:
4645
diff
changeset
|
84 reply:body("That node does not contain any items"); |
3293
f728c8c42860
mod_pubsub_text_interface: Add a 'last' command for sending the last item
Kim Alvefur <zash@zash.se>
parents:
3250
diff
changeset
|
85 else |
f728c8c42860
mod_pubsub_text_interface: Add a 'last' command for sending the last item
Kim Alvefur <zash@zash.se>
parents:
3250
diff
changeset
|
86 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
|
87 [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
|
88 }, 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
|
89 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
|
90 end |
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
91 else |
4645
25ce28711fac
mod_pubsub_text_interface: Move quick response out of unknown command text
Kim Alvefur <zash@zash.se>
parents:
4644
diff
changeset
|
92 reply:body("Unknown command. `help` to list commands."):up(); |
4041
cb5ea9d25cb2
mod_pubsub_text_interface: Hint at possible commands using XEP-0439: Quick Response
Kim Alvefur <zash@zash.se>
parents:
3644
diff
changeset
|
93 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
|
94 end |
3644
9980ea72ff91
mod_pubsub_text_interface: Respond to receipts
Kim Alvefur <zash@zash.se>
parents:
3489
diff
changeset
|
95 reply:reset(); |
9980ea72ff91
mod_pubsub_text_interface: Respond to receipts
Kim Alvefur <zash@zash.se>
parents:
3489
diff
changeset
|
96 |
4042
78ac5500a844
mod_pubsub_text_interface: Reflect XEP-0334 hints
Kim Alvefur <zash@zash.se>
parents:
4041
diff
changeset
|
97 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
|
98 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
|
99 end |
78ac5500a844
mod_pubsub_text_interface: Reflect XEP-0334 hints
Kim Alvefur <zash@zash.se>
parents:
4041
diff
changeset
|
100 |
78ac5500a844
mod_pubsub_text_interface: Reflect XEP-0334 hints
Kim Alvefur <zash@zash.se>
parents:
4041
diff
changeset
|
101 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
|
102 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
|
103 end |
78ac5500a844
mod_pubsub_text_interface: Reflect XEP-0334 hints
Kim Alvefur <zash@zash.se>
parents:
4041
diff
changeset
|
104 |
3429
1f0c290bd28a
mod_pubsub_text_interface: Send replies trough normal stanza routing
Kim Alvefur <zash@zash.se>
parents:
3328
diff
changeset
|
105 module:send(reply); |
3243
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
106 return true; |
ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
107 end); |