mod_pubsub_text_interface/mod_pubsub_text_interface.lua
author Kim Alvefur <zash@zash.se>
Fri, 31 Aug 2018 21:16:45 +0200
changeset 3297 f728c8c42860
parent 3254 5801b5cf8f54
child 3332 7d39ffd058d5
permissions -rw-r--r--
mod_pubsub_text_interface: Add a 'last' command for sending the last item
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3247
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";
3251
ada7a0c7221c mod_pubsub_text_interface: Generate a stanza id for replies
Kim Alvefur <zash@zash.se>
parents: 3247
diff changeset
     3
local id = require "util.id";
3247
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
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
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
     8
local help = name..[[
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
Commands:
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
- `help` - this help message
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
- `list` - list available nodes
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
- `subscribe node` - subscribe to a node
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
- `unsubscribe node` - unsubscribe from a node
3297
f728c8c42860 mod_pubsub_text_interface: Add a 'last' command for sending the last item
Kim Alvefur <zash@zash.se>
parents: 3254
diff changeset
    16
- `last node` - send the last item (again)
3247
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
]];
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    18
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
module:hook("message/host", function (event)
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
	local origin, stanza = event.origin, event.stanza;
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    21
	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
    22
	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
    23
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    24
	local from = stanza.attr.from;
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
	local reply = st.reply(stanza);
3251
ada7a0c7221c mod_pubsub_text_interface: Generate a stanza id for replies
Kim Alvefur <zash@zash.se>
parents: 3247
diff changeset
    27
	reply.attr.id = id.medium();
3247
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    28
3253
8f4a7084c466 mod_pubsub_text_interface: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 3252
diff changeset
    29
	local command, node_arg = body:match("^(%a+)%s+(.*)");
3254
5801b5cf8f54 mod_pubsub_text_interface: Ignore whitespace after all commands
Kim Alvefur <zash@zash.se>
parents: 3253
diff changeset
    30
	command = (command or body):lower();
3252
ecec46f7d020 mod_pubsub_text_interface: Fix chain that accidentally produced nested <body>
Kim Alvefur <zash@zash.se>
parents: 3251
diff changeset
    31
3254
5801b5cf8f54 mod_pubsub_text_interface: Ignore whitespace after all commands
Kim Alvefur <zash@zash.se>
parents: 3253
diff changeset
    32
	if command == "help" then
3247
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
		reply:body(help);
3254
5801b5cf8f54 mod_pubsub_text_interface: Ignore whitespace after all commands
Kim Alvefur <zash@zash.se>
parents: 3253
diff changeset
    34
	elseif command == "list" then
3247
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    35
		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
    36
		if ok then
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
			local list = {};
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
			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
    39
				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
    40
			end
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    41
			reply:body(table.concat(list, "\n"));
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
		else
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    43
			reply:body(nodes);
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
		end
3252
ecec46f7d020 mod_pubsub_text_interface: Fix chain that accidentally produced nested <body>
Kim Alvefur <zash@zash.se>
parents: 3251
diff changeset
    45
	elseif command == "subscribe" then
3253
8f4a7084c466 mod_pubsub_text_interface: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 3252
diff changeset
    46
		local ok, err = pubsub:add_subscription(node_arg, from, jid.bare(from), { ["pubsub#include_body"] = true });
3247
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    47
		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
    48
	elseif command == "unsubscribe" then
3253
8f4a7084c466 mod_pubsub_text_interface: Rename variable to avoid name clash [luacheck]
Kim Alvefur <zash@zash.se>
parents: 3252
diff changeset
    49
		local ok, err = pubsub:remove_subscription(node_arg, from, jid.bare(from));
3247
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    50
		reply:body(ok and "OK" or err);
3297
f728c8c42860 mod_pubsub_text_interface: Add a 'last' command for sending the last item
Kim Alvefur <zash@zash.se>
parents: 3254
diff changeset
    51
	elseif command == "last" then
f728c8c42860 mod_pubsub_text_interface: Add a 'last' command for sending the last item
Kim Alvefur <zash@zash.se>
parents: 3254
diff changeset
    52
		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: 3254
diff changeset
    53
		if not ok then
f728c8c42860 mod_pubsub_text_interface: Add a 'last' command for sending the last item
Kim Alvefur <zash@zash.se>
parents: 3254
diff changeset
    54
			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: 3254
diff changeset
    55
		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: 3254
diff changeset
    56
			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: 3254
diff changeset
    57
		else
f728c8c42860 mod_pubsub_text_interface: Add a 'last' command for sending the last item
Kim Alvefur <zash@zash.se>
parents: 3254
diff changeset
    58
			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: 3254
diff changeset
    59
				[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: 3254
diff changeset
    60
			}, item);
f728c8c42860 mod_pubsub_text_interface: Add a 'last' command for sending the last item
Kim Alvefur <zash@zash.se>
parents: 3254
diff changeset
    61
			reply:body("OK");
f728c8c42860 mod_pubsub_text_interface: Add a 'last' command for sending the last item
Kim Alvefur <zash@zash.se>
parents: 3254
diff changeset
    62
		end
3247
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    63
	else
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    64
		reply:body("Unknown command. `help` to list commands.");
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    65
	end
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    66
	origin.send(reply);
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    67
	return true;
ca856a892719 mod_pubsub_text_interface: A chat interface to PubSub
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    68
end);