mod_mamsub/mod_mamsub.lua
changeset 1751 985e05ac833b
child 1752 0697fbef9134
equal deleted inserted replaced
1750:5734a6199938 1751:985e05ac833b
       
     1 -- MAM Subscriptions prototype
       
     2 -- Copyright (C) 2015 Kim Alvefur
       
     3 --
       
     4 -- This file is MIT/X11 licensed.
       
     5 
       
     6 local mt = require"util.multitable";
       
     7 local st = require"util.stanza";
       
     8 
       
     9 local xmlns_mamsub = "http://prosody.im/protocol/mamsub";
       
    10 
       
    11 module:add_feature(xmlns_mamsub);
       
    12 
       
    13 local host_sessions = prosody.hosts[module.host].sessions;
       
    14 
       
    15 local weak = { __mode = "k" };
       
    16 
       
    17 module:hook("iq-set/self/"..xmlns_mamsub..":subscribe", function (event)
       
    18 	local origin, stanza = event.origin, event.stanza;
       
    19 	if origin.mamsub ~= nil then
       
    20 		origin.send(st.error_reply(stanza, "modify", "conflict"));
       
    21 		return true;
       
    22 	end
       
    23 	origin.mamsub = xmlns_mamsub;
       
    24 	local mamsub_sessions = host_sessions[origin.username].mamsub_sessions;
       
    25 	if not mamsub_sessions then
       
    26 		mamsub_sessions = setmetatable({}, weak);
       
    27 		host_sessions[origin.username].mamsub_sessions = mamsub_sessions;
       
    28 	end
       
    29 	mamsub_sessions[origin] = true;
       
    30 	origin.send(st.reply(stanza));
       
    31 	return true;
       
    32 end);
       
    33 
       
    34 module:hook("iq-set/self/"..xmlns_mamsub..":unsubscribe", function (event)
       
    35 	local origin, stanza = event.origin, event.stanza;
       
    36 	if origin.mamsub ~= xmlns_mamsub then
       
    37 		origin.send(st.error_reply(stanza, "modify", "conflict"));
       
    38 		return true;
       
    39 	end
       
    40 	origin.mamsub = nil;
       
    41 	local mamsub_sessions = host_sessions[origin.username].mamsub_sessions;
       
    42 	if mamsub_sessions then
       
    43 		mamsub_sessions[origin] = nil;
       
    44 	end
       
    45 	origin.send(st.reply(stanza));
       
    46 	return true;
       
    47 end);
       
    48 
       
    49 module:hook("archive-message-added", function (event)
       
    50 	local mamsub_sessions = host_sessions[event.for_user].mamsub_sessions;
       
    51 	if not mamsub_sessions then return end;
       
    52 
       
    53 	local for_broadcast = st.message():tag("mamsub", { xmlns = xmlns_mamsub })
       
    54 		:tag("forwarded", { xmlns = "urn:xmpp:forward:0" })
       
    55 			:add_child(event.stanza);
       
    56 
       
    57 	for session in pairs(mamsub_sessions) do
       
    58 		if session.mamsub == xmlns_mamsub then
       
    59 			for_broadcast.attr.to = session.full_jid;
       
    60 			session.send(for_broadcast);
       
    61 		end
       
    62 	end
       
    63 end);