Mercurial > prosody-modules
changeset 3243:ca856a892719
mod_pubsub_text_interface: A chat interface to PubSub
This module lets you manage subscriptions to pubsub nodes via simple
chat messages. Subscriptions are always added based on bare JID. The
include_body flag is enabled so that a plain text body version of events
can be included, where supported.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Mon, 20 Aug 2018 17:09:20 +0200 |
parents | fe4194f10c75 |
children | 2b888a7aa21c |
files | mod_pubsub_text_interface/mod_pubsub_text_interface.lua |
diffstat | 1 files changed, 53 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_pubsub_text_interface/mod_pubsub_text_interface.lua Mon Aug 20 17:09:20 2018 +0200 @@ -0,0 +1,53 @@ +local st = require "util.stanza"; +local jid = require "util.jid"; + +local pubsub = module:depends "pubsub".service; + +local name = module:get_option_string("name", "PubSub Service on "..module.host); +local help = name..[[ + +Commands: + +- `help` - this help message +- `list` - list available nodes +- `subscribe node` - subscribe to a node +- `unsubscribe node` - unsubscribe from a node +]]; + +module:hook("message/host", function (event) + local origin, stanza = event.origin, event.stanza; + local body = stanza:get_child_text("body"); + if not body then return end -- bail out + body = body:lower(); + + local from = stanza.attr.from; + + local reply = st.reply(stanza); + + if body == "help" then + reply:body(help); + elseif body == "list" then + local ok, nodes = pubsub:get_nodes(from); + if ok then + local list = {}; + for node, node_obj in pairs(nodes) do + table.insert(list, ("- `%s` %s"):format(node, node_obj.config.title or "")); + end + reply:body(table.concat(list, "\n")); + else + reply:body(nodes); + end + end + local command, node = body:match("^(%a+)%s+(.*)"); + if command == "subscribe" then + local ok, err = pubsub:add_subscription(node, from, jid.bare(from), { ["pubsub#include_body"] = true }); + reply:body(ok and "OK" or err); + elseif command == "unsubscribe" then + local ok, err = pubsub:remove_subscription(node, from, jid.bare(from)); + reply:body(ok and "OK" or err); + else + reply:body("Unknown command. `help` to list commands."); + end + origin.send(reply); + return true; +end);