mod_adhoc/adhoc/adhoc.lib.lua
changeset 124 843cadf36306
parent 123 c04443ea114c
child 149 b8a89ebf71e3
equal deleted inserted replaced
123:c04443ea114c 124:843cadf36306
     1 local st = require "util.stanza";
     1 local st, uuid = require "util.stanza", require "util.uuid";
     2 
     2 
     3 local xmlns_cmd = "http://jabber.org/protocol/commands";
     3 local xmlns_cmd = "http://jabber.org/protocol/commands";
       
     4 
       
     5 local states = {}
     4 
     6 
     5 local _M = {};
     7 local _M = {};
     6 
     8 
     7 function _cmdtag(desc, status, sessionid, action)
     9 function _cmdtag(desc, status, sessionid, action)
     8 	local cmd = st.stanza("command", { xmlns = xmlns_cmd, node = desc.node, status = status });
    10 	local cmd = st.stanza("command", { xmlns = xmlns_cmd, node = desc.node, status = status });
    15 function _M.new(name, node, handler, permission)
    17 function _M.new(name, node, handler, permission)
    16 	return { name = name, node = node, handler = handler, cmdtag = _cmdtag, permission = (permission or "user") };
    18 	return { name = name, node = node, handler = handler, cmdtag = _cmdtag, permission = (permission or "user") };
    17 end
    19 end
    18 
    20 
    19 function _M.handle_cmd(command, origin, stanza)
    21 function _M.handle_cmd(command, origin, stanza)
    20 	local sessionid = stanza.tags[1].attr.sessionid or nil;
    22 	local sessionid = stanza.tags[1].attr.sessionid or uuid.generate();
    21 	local dataIn = {};
    23 	local dataIn = {};
    22 	dataIn.to = stanza.attr.to;
    24 	dataIn.to = stanza.attr.to;
    23 	dataIn.from = stanza.attr.from;
    25 	dataIn.from = stanza.attr.from;
    24 	dataIn.action = stanza.tags[1].attr.action or nil;
    26 	dataIn.action = stanza.tags[1].attr.action or nil;
    25 	dataIn.form = stanza.tags[1]:child_with_ns("jabber:x:data");
    27 	dataIn.form = stanza.tags[1]:child_with_ns("jabber:x:data");
    26 
    28 
    27 	local data, sessid = command:handler(dataIn, sessionid);
    29 	local data, state = command:handler(dataIn, states[sessionid]);
       
    30 	states[sessionid] = state;
    28 	local stanza = st.reply(stanza);
    31 	local stanza = st.reply(stanza);
    29 	if data.status == "completed" then
    32 	if data.status == "completed" then
    30 		cmdtag = command:cmdtag("completed", sessid);
    33 		states[sessionid] = nil;
       
    34 		cmdtag = command:cmdtag("completed", sessionid);
    31 	elseif data.status == "canceled" then
    35 	elseif data.status == "canceled" then
    32 		cmdtag = command:cmdtag("canceled", sessid);
    36 		states[sessionid] = nil;
       
    37 		cmdtag = command:cmdtag("canceled", sessionid);
    33 	elseif data.status == "error" then
    38 	elseif data.status == "error" then
       
    39 		states[sessionid] = nil;
    34 		stanza = st.error_reply(stanza, data.error.type, data.error.condition, data.error.message);
    40 		stanza = st.error_reply(stanza, data.error.type, data.error.condition, data.error.message);
    35 		cmdtag = command:cmdtag("canceled", sessid);
    41 		cmdtag = command:cmdtag("canceled", sessionid);
    36 	else 
    42 	else 
    37 		cmdtag = command:cmdtag("executing", sessid);
    43 		cmdtag = command:cmdtag("executing", sessionid);
    38 	end
    44 	end
    39 
    45 
    40 	for name, content in pairs(data) do
    46 	for name, content in pairs(data) do
    41 		if name == "info" then
    47 		if name == "info" then
    42 			cmdtag:tag("note", {type="info"}):text(content):up();
    48 			cmdtag:tag("note", {type="info"}):text(content):up();