annotate mod_pubsub_text_interface/mod_pubsub_text_interface.lua @ 4203:c4002aae4ad3

mod_s2s_keepalive: Use timestamp as iq @id RFC 6120 implies that the id attribute must be unique within a stream. This should fix problems with remote servers that enforce uniqueness and don't answer duplicated ids. If it doesn't do that, then at least you can get a guesstimate at round-trip time from the difference between the result iq stanza and the timestamp it was logged without having to go look for when it was sent, or needing to keep state.
author Kim Alvefur <zash@zash.se>
date Wed, 14 Oct 2020 18:02:10 +0200
parents 78ac5500a844
children f31eac6b2e9c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }
f728c8c42860 mod_pubsub_text_interface: Add a 'last' command for sending the last item
Kim Alvefur <zash@zash.se>
parents: 3250
diff changeset
80 }, item);
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
9980ea72ff91 mod_pubsub_text_interface: Respond to receipts
Kim Alvefur <zash@zash.se>
parents: 3489
diff changeset
89 if stanza:get_child("request", "urn:xmpp:receipts") then
9980ea72ff91 mod_pubsub_text_interface: Respond to receipts
Kim Alvefur <zash@zash.se>
parents: 3489
diff changeset
90 reply:tag("received", { xmlns = "urn:xmpp:receipts", id = stanza.attr.id }):up();
9980ea72ff91 mod_pubsub_text_interface: Respond to receipts
Kim Alvefur <zash@zash.se>
parents: 3489
diff changeset
91 end
9980ea72ff91 mod_pubsub_text_interface: Respond to receipts
Kim Alvefur <zash@zash.se>
parents: 3489
diff changeset
92
4042
78ac5500a844 mod_pubsub_text_interface: Reflect XEP-0334 hints
Kim Alvefur <zash@zash.se>
parents: 4041
diff changeset
93 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
94 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
95 end
78ac5500a844 mod_pubsub_text_interface: Reflect XEP-0334 hints
Kim Alvefur <zash@zash.se>
parents: 4041
diff changeset
96
78ac5500a844 mod_pubsub_text_interface: Reflect XEP-0334 hints
Kim Alvefur <zash@zash.se>
parents: 4041
diff changeset
97 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
98 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
99 end
78ac5500a844 mod_pubsub_text_interface: Reflect XEP-0334 hints
Kim Alvefur <zash@zash.se>
parents: 4041
diff changeset
100
3429
1f0c290bd28a mod_pubsub_text_interface: Send replies trough normal stanza routing
Kim Alvefur <zash@zash.se>
parents: 3328
diff changeset
101 module:send(reply);
3243
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
102 return true;
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
103 end);