Mercurial > prosody-hg
view plugins/mod_lastactivity.lua @ 14020:3c2bfa6a69df
prosodyctl shell: Move non-error result lines back to stdout, suppress with --quiet
We're figuring out how to keep usability and support machine-readability too.
We moved the status line (repl-result) to stderr so that when parsing
something like a table, it didn't get in the way. However sometimes the status
line is the thing we want to parse (e.g. invite creation). Parsing stderr
loses one of the purposes of stderr - to have an error-only channel to emit
stuff out of band (such as error messages).
So the new approach is:
- Status line on stdout, unless it's an error
- If you're parsing the output ("content") of the command, pass --quiet to
suppress the status line.
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Tue, 30 Dec 2025 16:30:43 +0000 |
| parents | 74b9e05af71e |
| children |
line wrap: on
line source
-- Prosody IM -- Copyright (C) 2008-2010 Matthew Wild -- Copyright (C) 2008-2010 Waqas Hussain -- -- This project is MIT/X11 licensed. Please see the -- COPYING file in the source package for more information. -- local st = require "prosody.util.stanza"; local is_contact_subscribed = require "prosody.core.rostermanager".is_contact_subscribed; local jid_bare = require "prosody.util.jid".bare; local jid_split = require "prosody.util.jid".split; module:add_feature("jabber:iq:last"); local map = {}; module:hook("pre-presence/bare", function(event) local stanza = event.stanza; if not(stanza.attr.to) and stanza.attr.type == "unavailable" then local t = os.time(); local s = stanza:get_child_text("status"); map[event.origin.username] = {s = s, t = t}; end end, 10); module:hook("iq-get/bare/jabber:iq:last:query", function(event) local origin, stanza = event.origin, event.stanza; local username = jid_split(stanza.attr.to) or origin.username; if not stanza.attr.to or is_contact_subscribed(username, module.host, jid_bare(stanza.attr.from)) then local seconds, text = "0", ""; if map[username] then seconds = string.format("%d", os.difftime(os.time(), map[username].t)); text = map[username].s; end origin.send(st.reply(stanza):tag('query', {xmlns='jabber:iq:last', seconds=seconds}):text(text)); else origin.send(st.error_reply(stanza, 'auth', 'forbidden')); end return true; end); module.save = function() return {map = map}; end module.restore = function(data) map = data.map or {}; end
