diff mod_mam_muc/mod_mam_muc.lua @ 1543:57fb9ce21f9c

mod_mam_muc: Add compatibility with the new MUC code in trunk
author Kim Alvefur <zash@zash.se>
date Thu, 30 Oct 2014 12:43:00 +0100
parents ccb9dc624ebd
children fff2858c554f
line wrap: on
line diff
--- a/mod_mam_muc/mod_mam_muc.lua	Thu Oct 30 12:39:57 2014 +0100
+++ b/mod_mam_muc/mod_mam_muc.lua	Thu Oct 30 12:43:00 2014 +0100
@@ -16,7 +16,11 @@
 
 local mod_muc = module:depends"muc";
 local room_mt = mod_muc.room_mt;
-local rooms = mod_muc.rooms;
+local rooms = rawget(mod_muc, "rooms");
+local new_muc = not rooms;
+if new_muc then
+	rooms = module:shared"muc/rooms";
+end
 
 local getmetatable = getmetatable;
 local function is_stanza(x)
@@ -57,27 +61,29 @@
 local send_history, save_to_history;
 
 	-- Override history methods for all rooms.
-module:hook("muc-room-created", function (event)
-	local room = event.room;
-	if logging_enabled(room) then
-		room.send_history = send_history;
-		room.save_to_history = save_to_history;
-	end
-end);
-
-function module.load()
-	for _, room in pairs(rooms) do
+if not new_muc then -- 0.10 or older
+	module:hook("muc-room-created", function (event)
+		local room = event.room;
 		if logging_enabled(room) then
 			room.send_history = send_history;
 			room.save_to_history = save_to_history;
 		end
+	end);
+
+	function module.load()
+		for _, room in pairs(rooms) do
+			if logging_enabled(room) then
+				room.send_history = send_history;
+				room.save_to_history = save_to_history;
+			end
+		end
 	end
-end
-function module.unload()
-	for _, room in pairs(rooms) do
-		if room.send_history == send_history then
-			room.send_history = nil;
-			room.save_to_history = nil;
+	function module.unload()
+		for _, room in pairs(rooms) do
+			if room.send_history == send_history then
+				room.send_history = nil;
+				room.save_to_history = nil;
+			end
 		end
 	end
 end
@@ -228,6 +234,53 @@
 				first = first, last = last, count = count }));
 end);
 
+module:hook("muc-get-history", function (event)
+	local room = event.room;
+	if not logging_enabled(room) then return end
+	local room_jid = room.jid;
+	local maxstanzas = event.maxstanzas;
+	local maxchars = event.maxchars;
+	local since = event.since;
+	local to = event.to;
+
+	-- Load all the data!
+	local query = {
+		limit = m_min(maxstanzas or 20, max_history_length);
+		start = since;
+		reverse = true;
+		with = "message<groupchat";
+	}
+	module:log("debug", require"util.serialization".serialize(query))
+	local data, err = archive:find(jid_split(room_jid), query);
+
+	if not data then
+		module:log("error", "Could not fetch history: %s", tostring(err));
+		return
+	end
+
+	local chars = 0;
+	local history, i = {}, 1;
+
+	for id, item, when in data do
+		item.attr.to = to;
+		item:tag("delay", { xmlns = "urn:xmpp:delay", from = room_jid, stamp = timestamp(when) }):up(); -- XEP-0203
+		if maxchars then
+			chars = #tostring(item);
+			if chars + charcount > maxchars then
+				break
+			end
+			charcount = charcount + chars;
+		end
+		history[i], i = item, i+1;
+		-- module:log("debug", tostring(item));
+	end
+	function event:next_stanza()
+		i = i - 1;
+		return history[i];
+	end
+	return true;
+end, 1);
+
 function send_history(self, to, stanza)
 	local maxchars, maxstanzas, seconds, since;
 	local history_tag = stanza:find("{http://jabber.org/protocol/muc}x/history")
@@ -246,34 +299,17 @@
 		end
 	end
 
-	-- Load all the data!
-	local data, err = archive:find(jid_split(self.jid), {
-		limit = m_min(maxstanzas or 20, max_history_length);
-		start = since;
-		reverse = true;
-		with = "message<groupchat";
-	});
-
-	if not data then
-		module:log("error", "Could not fetch history: %s", tostring(err));
-		return
-	end
+	local event = {
+		room = self;
+		to = to; -- `to` is required to calculate the character count for `maxchars`
+		maxchars = maxchars, maxstanzas = maxstanzas, since = since;
+		next_stanza = function() end; -- events should define this iterator
+	};
 
-	local to_send = {};
-	local charcount = 0;
-	local chars;
-	for id, item, when in data do
-		item.attr.to = to;
-		item:tag("delay", { xmlns = "urn:xmpp:delay", from = self.jid, stamp = timestamp(when) }):up(); -- XEP-0203
-		if maxchars then
-			chars = #tostring(item);
-			if chars + charcount > maxchars then break end
-			charcount = charcount + chars;
-		end
-		to_send[1+#to_send] = item;
-	end
-	for i = #to_send,1,-1 do
-		self:_route_stanza(to_send[i]);
+	module:fire_event("muc-get-history", event);
+
+	for msg in event.next_stanza, event do
+		self:_route_stanza(msg);
 	end
 end
 
@@ -294,6 +330,13 @@
 	archive:append(room, nil, time_now(), with, stanza);
 end
 
+module:hook("muc-broadcast-message", function (event)
+	local room, stanza = event.room, event.stanza;
+	if stanza:get_child("body") then
+		save_to_history(room, stanza);
+	end
+end);
+
 module:hook("muc-room-destroyed", function(event)
 	local username = jid_split(event.room.jid);
 	archive:delete(username);