From e711e847ddb176bb45b7c5a70cac99039a384aa7 Mon Sep 17 00:00:00 2001 From: Waqas Hussain Date: Wed, 11 Feb 2009 19:41:37 +0500 Subject: mod_muc: Room history --- plugins/mod_muc.lua | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/plugins/mod_muc.lua b/plugins/mod_muc.lua index 79fcbdb6..bd36bd8f 100644 --- a/plugins/mod_muc.lua +++ b/plugins/mod_muc.lua @@ -7,14 +7,15 @@ local jid_bare = require "util.jid".bare; local st = require "util.stanza"; local log = require "util.logger".init("mod_muc"); local multitable_new = require "util.multitable".new; +local t_insert, t_remove = table.insert, table.remove; if module:get_host_type() ~= "component" then error("MUC should be loaded as a component, please see http://prosody.im/doc/components", 0); end local muc_domain = module:get_host(); - local muc_name = "MUCMUCMUC!!!"; +local history_length = 20; -- room_name -> room -- occupant_room_nick -> data @@ -30,6 +31,7 @@ local jid_nick = multitable_new(); -- real jid -> room's jid -> room nick -- subject - the room's subject -- non-anonymous = true|nil -- persistent = true|nil + -- history = {preserialized stanzas} local rooms_info = multitable_new(); local persist_list = datamanager.load(nil, muc_domain, 'room_list') or {}; @@ -131,6 +133,15 @@ function broadcast_message(from, room, subject, body) stanza.attr.to = o_data.jid; core_route_stanza(component, stanza); end + if not subject and body then -- add to history + local history = rooms_info:get(room, 'history'); + if not history then history = {}; rooms_info:set(room, 'history', history); end + -- stanza = st.deserialize(st.preserialize(stanza)); + stanza:tag("delay", {xmlns = "urn:xmpp:delay", from = muc_domain, stamp = datetime.datetime()}):up(); -- XEP-0203 + stanza:tag("x", {xmlns = "jabber:x:delay", from = muc_domain, stamp = datetime.legacy()}):up(); -- XEP-0091 (deprecated) + t_insert(history, st.preserialize(stanza)); + while #history > history_length do t_remove(history, 1) end + end end end @@ -200,7 +211,14 @@ function handle_to_occupant(origin, stanza) -- PM, vCards, etc end end broadcast_presence(nil, to, room); - -- TODO send discussion history + local history = rooms_info:get(room, 'history'); -- send discussion history + if history then + for _, msg in ipairs(history) do + msg = st.deserialize(msg); + msg.attr.to=from; + core_route_stanza(component, msg); + end + end if rooms_info:get(room, 'subject') then core_route_stanza(component, st.message({type='groupchat', from=room, to=from}):tag("subject"):text(rooms_info:get(room, 'subject'))); end -- cgit v1.2.3