# HG changeset patch # User Florian Zeitz # Date 1255649830 -7200 # Node ID 00f96207693a57ae0cb5a1078bc8fe750d89dfc3 # Parent adc9eff8adb25bc8f11b9f5ca2b546aeb3625b0d mod_adhoc_cmd_admin: Possibility to limit number of received answers diff -r adc9eff8adb2 -r 00f96207693a mod_adhoc_cmd_admin/mod_adhoc_cmd_admin.lua --- a/mod_adhoc_cmd_admin/mod_adhoc_cmd_admin.lua Fri Oct 16 01:36:04 2009 +0200 +++ b/mod_adhoc_cmd_admin/mod_adhoc_cmd_admin.lua Fri Oct 16 01:37:10 2009 +0200 @@ -29,6 +29,15 @@ { name = "password-verify", type = "text-private", label = "Retype password" }; }; +local get_online_users_layout = dataforms_new{ + title = "Getting List of Online Users"; + instructions = "How many users should be returned at most?"; + + { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" }; + { name = "max_items", type = "list-single", label = "Maximum number of users", + value = { "25", "50", "75", "100", "150", "200", "all" } }; +}; + function add_user_command_handler(item, origin, stanza) if not is_admin(stanza.attr.from) then module:log("warn", "Non-admin %s tried to add a user", tostring(jid.bare(stanza.attr.from))); @@ -93,15 +102,39 @@ :tag("note", {type="error"}):text("You don't have permission to request a list of online users"))); return true; end - local field = st.stanza("field", {label="The list of all online users", var="onlineuserjids", type="text-multi"}); - for username, user in pairs(hosts[stanza.attr.to].sessions or {}) do - field:tag("value"):text(username.."@"..stanza.attr.to):up(); + if stanza.tags[1].attr.sessionid and sessions[stanza.tags[1].attr.sessionid] then + if stanza.tags[1].attr.action == "cancel" then + origin.send(st.reply(stanza):add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid))); + sessions[stanza.tags[1].attr.sessionid] = nil; + return true; + end + + form = stanza.tags[1]:child_with_ns("jabber:x:data"); + local fields = add_user_layout:data(form); + + local max_items = nil + if fields.max_items ~= "all" then + max_items = tonumber(fields.max_items); + end + local count = 0; + local field = st.stanza("field", {label="The list of all online users", var="onlineuserjids", type="text-multi"}); + for username, user in pairs(hosts[stanza.attr.to].sessions or {}) do + if (max_items ~= nil) and (count >= max_items) then + break; + end + field:tag("value"):text(username.."@"..stanza.attr.to):up(); + count = count + 1; + end + origin.send(st.reply(stanza):add_child(item:cmdtag("completed", stanza.tags[1].attr.sessionid) + :tag("x", {xmlns="jabber:x:data", type="result"}) + :tag("field", {type="hidden", var="FORM_TYPE"}) + :tag("value"):text("http://jabber.org/protocol/admin"):up():up() + :add_child(field))); + else + local sessionid=uuid.generate(); + sessions[sessionid] = "executing"; + origin.send(st.reply(stanza):add_child(item:cmdtag("executing", sessionid):add_child(get_online_users_layout:form()))); end - origin.send(st.reply(stanza):add_child(item:cmdtag("completed", uuid:generate()) - :tag("x", {xmlns="jabber:x:data", type="result"}) - :tag("field", {type="hidden", var="FORM_TYPE"}) - :tag("value"):text("http://jabber.org/protocol/admin"):up():up() - :add_child(field))); return true; end