File

plugins/mod_lastactivity.lua @ 12084:59557bc3c4b8 0.11

net.server_epoll: Process all queued events from epoll before timers Should call timers less frequently when many sockets are waiting for processing. May help under heavy load. Requested by Ge0rG Backport of 2bcd84123eba requested by Roi
author Kim Alvefur <zash@zash.se>
date Thu, 21 Oct 2021 15:59:16 +0200
parent 9224:a84dbd2e08bc
child 10750:ff087f2d4cb6
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 "util.stanza";
local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed;
local jid_bare = require "util.jid".bare;
local jid_split = require "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 = tostring(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