Diff

mod_smacks/mod_smacks.lua @ 201:bc24f58a0d39

mod_smacks: Use filters for catching incoming stanzas (more reliable and efficient), also add some logic to make compatible with the stream resumption module (coming soon)
author Matthew Wild <mwild1@gmail.com>
date Thu, 08 Jul 2010 14:01:32 +0100
parent 200:64a573203c20
child 202:d11478ae374e
line wrap: on
line diff
--- a/mod_smacks/mod_smacks.lua	Thu Jul 08 14:00:05 2010 +0100
+++ b/mod_smacks/mod_smacks.lua	Thu Jul 08 14:01:32 2010 +0100
@@ -2,6 +2,7 @@
 
 local t_insert, t_remove = table.insert, table.remove;
 local tonumber, tostring = tonumber, tostring;
+local add_filter = require "util.filters".add_filter;
 
 local xmlns_sm = "urn:xmpp:sm:2";
 
@@ -42,9 +43,21 @@
 				end
 				return ok, err;
 			end
-			_send(st.stanza("enabled", sm_attr));
-			return true;
-		end);
+			
+			session.handled_stanza_count = 0;
+			add_filter(session, "stanzas/in", function (stanza)
+				if not stanza.attr.xmlns then
+					session.handled_stanza_count = session.handled_stanza_count + 1;
+					session.log("debug", "Handled %d incoming stanzas", session.handled_stanza_count);
+				end
+				return stanza;
+			end);
+
+			if not stanza.attr.resume then -- FIXME: Resumption should be a different spec :/
+				_send(st.stanza("enabled", sm_attr));
+				return true;
+			end
+		end, 100);
 
 module:hook_stanza(xmlns_sm, "r", function (origin, stanza)
 	if not origin.smacks then
@@ -73,26 +86,6 @@
 -- and won't slow non-198 sessions). We can also then remove the .handled flag
 -- on stanzas
 
-function catch_all_incoming_stanzas(data)
-	local origin, stanza = data.origin, data.stanza;
-	if origin.smacks and not stanza.handled then
-		stanza.handled = true;
-		origin.handled_stanza_count = origin.handled_stanza_count + 1;
-		module:log("debug", "Handled %d stanzas", origin.handled_stanza_count);
-	end
-end
-module:hook("message/bare", catch_all_incoming_stanzas, 1000);
-module:hook("message/full", catch_all_incoming_stanzas, 1000);
-module:hook("message/host", catch_all_incoming_stanzas, 1000);
-
-module:hook("presence/bare", catch_all_incoming_stanzas, 1000);
-module:hook("presence/full", catch_all_incoming_stanzas, 1000);
-module:hook("presence/host", catch_all_incoming_stanzas, 1000);
-
-module:hook("iq/bare", catch_all_incoming_stanzas, 1000);
-module:hook("iq/full", catch_all_incoming_stanzas, 1000);
-module:hook("iq/host", catch_all_incoming_stanzas, 1000);
-
 function handle_unacked_stanzas(session)
 	local queue = session.outgoing_stanza_queue;
 	local error_attr = { type = "cancel" };