Added basic offline message support

Thu, 13 Nov 2008 12:13:13 +0500

author
Waqas Hussain <waqas20@gmail.com>
date
Thu, 13 Nov 2008 12:13:13 +0500
changeset 249
1fc47cf5d144
parent 248
8ce9559d501a
child 250
9f66ede8deeb

Added basic offline message support

core/offlinemanager.lua file | annotate | diff | comparison | revisions
core/stanza_router.lua file | annotate | diff | comparison | revisions
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/offlinemanager.lua	Thu Nov 13 12:13:13 2008 +0500
@@ -0,0 +1,32 @@
+
+local datamanager = require "util.datamanager";
+local st = require "util.stanza";
+local datetime = require "util.datetime";
+local ipairs = ipairs;
+
+module "offlinemanager"
+
+function store(node, host, stanza)
+	stanza.attr.stamp = datetime.datetime();
+	stanza.attr.stamp_legacy = datetime.legacy();
+	return datamanager.list_append(node, host, "offline", st.preserialize(stanza));
+end
+
+function load(node, host)
+	local data = datamanager.list_load(node, host, "offline");
+	if not data then return; end
+	for k, v in ipairs(data) do
+		stanza = st.deserialize(v);
+		stanza:tag("delay", {xmlns = "urn:xmpp:delay", from = host, stamp = stanza.attr.stamp}):up(); -- XEP-0203
+		stanza:tag("x", {xmlns = "jabber:x:delay", from = host, stamp = stanza.attr.stamp_legacy}):up(); -- XEP-0091 (deprecated)
+		stanza.attr.stamp, stanza.attr.stamp_legacy = nil, nil;
+		data[k] = stanza;
+	end
+	return data;
+end
+
+function deleteAll(node, host)
+	return datamanager.list_store(node, host, "offline", nil);
+end
+
+return _M;
--- a/core/stanza_router.lua	Thu Nov 13 12:12:19 2008 +0500
+++ b/core/stanza_router.lua	Thu Nov 13 12:13:13 2008 +0500
@@ -13,6 +13,7 @@
 
 local rostermanager = require "core.rostermanager";
 local sessionmanager = require "core.sessionmanager";
+local offlinemanager = require "core.offlinemanager";
 
 local s2s_verify_dialback = require "core.s2smanager".verify_dialback;
 local s2s_make_authenticated = require "core.s2smanager".make_authenticated;
@@ -149,6 +150,10 @@
 							core_route_stanza(origin, request);
 						end
 					end
+					for _, msg in ipairs(offlinemanager.load(node, host) or {}) do
+						origin.send(msg); -- FIXME do we need to modify to/from in any way?
+					end
+					offlinemanager.deleteAll(node, host);
 				end
 				origin.priority = 0;
 				if stanza.attr.type == "unavailable" then
@@ -328,8 +333,14 @@
 							t_insert(recipients, session);
 						end
 					end
+					local count = 0;
 					for _, session in pairs(recipients) do
 						session.send(stanza);
+						count = count + 1;
+					end
+					if count == 0 then
+						offlinemanager.store(node, host, stanza);
+						-- TODO deal with storage errors
 					end
 				else
 					-- TODO send IQ error
@@ -349,7 +360,12 @@
 						-- TODO send unavailable presence or unsubscribed
 					end
 				elseif stanza.name == "message" then
-					-- TODO send message error, or store offline messages
+					if stanza.attr.type == "chat" or stanza.attr.type == "normal" or not stanza.attr.type then
+						offlinemanager.store(node, host, stanza);
+						-- FIXME don't store messages with only chat state notifications
+					end
+					-- TODO allow configuration of offline storage
+					-- TODO send error if not storing offline
 				elseif stanza.name == "iq" then
 					-- TODO send IQ error
 				end

mercurial