annotate mod_mamsub/mod_mamsub.lua @ 4203:c4002aae4ad3

mod_s2s_keepalive: Use timestamp as iq @id RFC 6120 implies that the id attribute must be unique within a stream. This should fix problems with remote servers that enforce uniqueness and don't answer duplicated ids. If it doesn't do that, then at least you can get a guesstimate at round-trip time from the difference between the result iq stanza and the timestamp it was logged without having to go look for when it was sent, or needing to keep state.
author Kim Alvefur <zash@zash.se>
date Wed, 14 Oct 2020 18:02:10 +0200
parents 0697fbef9134
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1747
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 -- MAM Subscriptions prototype
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 -- Copyright (C) 2015 Kim Alvefur
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 --
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 -- This file is MIT/X11 licensed.
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 local mt = require"util.multitable";
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 local st = require"util.stanza";
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9 local xmlns_mamsub = "http://prosody.im/protocol/mamsub";
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 module:add_feature(xmlns_mamsub);
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 local host_sessions = prosody.hosts[module.host].sessions;
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 local weak = { __mode = "k" };
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 module:hook("iq-set/self/"..xmlns_mamsub..":subscribe", function (event)
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18 local origin, stanza = event.origin, event.stanza;
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 if origin.mamsub ~= nil then
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20 origin.send(st.error_reply(stanza, "modify", "conflict"));
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
21 return true;
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22 end
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23 origin.mamsub = xmlns_mamsub;
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 local mamsub_sessions = host_sessions[origin.username].mamsub_sessions;
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 if not mamsub_sessions then
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 mamsub_sessions = setmetatable({}, weak);
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 host_sessions[origin.username].mamsub_sessions = mamsub_sessions;
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 end
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 mamsub_sessions[origin] = true;
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 origin.send(st.reply(stanza));
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 return true;
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
32 end);
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 module:hook("iq-set/self/"..xmlns_mamsub..":unsubscribe", function (event)
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35 local origin, stanza = event.origin, event.stanza;
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36 if origin.mamsub ~= xmlns_mamsub then
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 origin.send(st.error_reply(stanza, "modify", "conflict"));
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38 return true;
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39 end
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40 origin.mamsub = nil;
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
41 local mamsub_sessions = host_sessions[origin.username].mamsub_sessions;
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42 if mamsub_sessions then
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 mamsub_sessions[origin] = nil;
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44 end
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
45 origin.send(st.reply(stanza));
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
46 return true;
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
47 end);
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
48
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
49 module:hook("archive-message-added", function (event)
1748
0697fbef9134 mod_mamsub: Prevent nil indexing if message is added to archive of an offline user
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
50 local user_session = host_sessions[event.for_user];
0697fbef9134 mod_mamsub: Prevent nil indexing if message is added to archive of an offline user
Kim Alvefur <zash@zash.se>
parents: 1747
diff changeset
51 local mamsub_sessions = user_session and user_session.mamsub_sessions;
1747
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52 if not mamsub_sessions then return end;
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
53
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 local for_broadcast = st.message():tag("mamsub", { xmlns = xmlns_mamsub })
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
55 :tag("forwarded", { xmlns = "urn:xmpp:forward:0" })
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56 :add_child(event.stanza);
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58 for session in pairs(mamsub_sessions) do
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
59 if session.mamsub == xmlns_mamsub then
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
60 for_broadcast.attr.to = session.full_jid;
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
61 session.send(for_broadcast);
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
62 end
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
63 end
985e05ac833b mod_mamsub: Experimental implementation of MAM subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
64 end);