Mercurial > prosody-modules
view mod_adhoc/adhoc/mod_adhoc.lua @ 234:abcb59ab355c
Add new motd_sequential module. This module lets you define numbered messages shown to each user in order, but only once per user, and persistent across server restarts. Useful for notifying users of added features and changes in an
incremental fashion.
author | Jeff Mitchell <jeffrey.mitchell@gmail.com> |
---|---|
date | Wed, 04 Aug 2010 22:29:51 +0000 |
parents | 1ae653712e37 |
children | e0802b2716c3 |
line wrap: on
line source
-- Copyright (C) 2009 Thilo Cestonaro -- Copyright (C) 2009-2010 Florian Zeitz -- -- This file is MIT/X11 licensed. Please see the -- COPYING file in the source package for more information. -- local st = require "util.stanza"; local is_admin = require "core.usermanager".is_admin; local adhoc_handle_cmd = module:require "adhoc".handle_cmd; local xmlns_cmd = "http://jabber.org/protocol/commands"; local xmlns_disco = "http://jabber.org/protocol/disco"; local commands = {}; module:add_feature(xmlns_cmd); module:hook("iq/host/"..xmlns_disco.."#items:query", function (event) local origin, stanza = event.origin, event.stanza; -- Required for Prosody <= 0.7 local privileged = is_admin(stanza.attr.from) or is_admin(stanza.attr.from, stanza.attr.to); if stanza.attr.type == "get" and stanza.tags[1].attr.node and stanza.tags[1].attr.node == xmlns_cmd then reply = st.reply(stanza); reply:tag("query", { xmlns = xmlns_disco.."#items", node = xmlns_cmd }); for node, command in pairs(commands) do if (command.permission == "admin" and privileged) or (command.permission == "user") then reply:tag("item", { name = command.name, node = node, jid = module:get_host() }); reply:up(); end end origin.send(reply); return true; end end, 500); module:hook("iq/host", function (event) local origin, stanza = event.origin, event.stanza; if stanza.attr.type == "set" and stanza.tags[1] and stanza.tags[1].name == "command" then local node = stanza.tags[1].attr.node -- Required for Prosody <= 0.7 local privileged = is_admin(event.stanza.attr.from) or is_admin(stanza.attr.from, stanza.attr.to); if commands[node] then if commands[node].permission == "admin" and not privileged then origin.send(st.error_reply(stanza, "auth", "forbidden", "You don't have permission to execute this command"):up() :add_child(commands[node]:cmdtag("canceled") :tag("note", {type="error"}):text("You don't have permission to execute this command"))); return true end -- User has permission now execute the command return adhoc_handle_cmd(commands[node], origin, stanza); end end end, 500); local function handle_item_added(item) commands[item.node] = item; end module:hook("item-added/adhoc", function (event) return handle_item_added(event.item); end, 500); module:hook("item-removed/adhoc", function (event) commands[event.item.node] = nil; end, 500); -- Pick up any items that are already added for _, item in ipairs(module:get_host_items("adhoc")) do handle_item_added(item); end