Mercurial > prosody-modules
comparison mod_presence_cache/mod_presence_cache.lua @ 2175:cc0cf6748885
mod_presence_cache: Also cache the 'show' value
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Wed, 11 May 2016 23:12:51 +0200 |
| parents | aa24d49c47ef |
| children | b76b062e77db |
comparison
equal
deleted
inserted
replaced
| 2174:7be158b3376f | 2175:cc0cf6748885 |
|---|---|
| 5 local datetime = require"util.datetime"; | 5 local datetime = require"util.datetime"; |
| 6 local cache = require "util.cache"; | 6 local cache = require "util.cache"; |
| 7 | 7 |
| 8 local cache_size = module:get_option_number("presence_cache_size", 100); | 8 local cache_size = module:get_option_number("presence_cache_size", 100); |
| 9 | 9 |
| 10 local bare_cache = {}; -- [username NUL bare_jid] = { [full_jid] = timestamp, ... } | 10 local bare_cache = {}; -- [username NUL bare_jid] = { [full_jid] = { timestamp, ... } } |
| 11 | 11 |
| 12 local function on_evict(cache_key) | 12 local function on_evict(cache_key) |
| 13 local bare_cache_key = cache_key:match("^%Z+%z[^/]+"); | 13 local bare_cache_key = cache_key:match("^%Z+%z[^/]+"); |
| 14 local full_jid = cache_key:match("%z(.*)$"); | 14 local full_jid = cache_key:match("%z(.*)$"); |
| 15 local jids = bare_cache[bare_cache_key]; | 15 local jids = bare_cache[bare_cache_key]; |
| 49 presence_cache:set(cache_key, nil); | 49 presence_cache:set(cache_key, nil); |
| 50 on_evict(cache_key); | 50 on_evict(cache_key); |
| 51 return; | 51 return; |
| 52 end | 52 end |
| 53 | 53 |
| 54 local stamp = datetime.datetime(); | 54 local presence_bits = { |
| 55 stamp = datetime.datetime(); | |
| 56 show = stanza:get_child_text("show"); | |
| 57 }; | |
| 55 if jids then | 58 if jids then |
| 56 jids[contact_full] = stamp; | 59 jids[contact_full] = presence_bits; |
| 57 else | 60 else |
| 58 jids = { [contact_full] = stamp }; | 61 jids = { [contact_full] = presence_bits }; |
| 59 bare_cache[bare_cache_key] = jids; | 62 bare_cache[bare_cache_key] = jids; |
| 60 end | 63 end |
| 61 presence_cache:set(cache_key, true); | 64 presence_cache:set(cache_key, true); |
| 62 end | 65 end |
| 63 end | 66 end |
| 74 | 77 |
| 75 local bare_cache_key = username .. "\0" .. contact_bare; | 78 local bare_cache_key = username .. "\0" .. contact_bare; |
| 76 | 79 |
| 77 local cached = bare_cache[bare_cache_key]; | 80 local cached = bare_cache[bare_cache_key]; |
| 78 if not cached then return end | 81 if not cached then return end |
| 79 for jid, stamp in pairs(cached) do | 82 for jid, presence_bits in pairs(cached) do |
| 80 local presence = st.presence({ to = origin.full_jid, from = jid }) | 83 local presence = st.presence({ to = origin.full_jid, from = jid }) |
| 81 :tag("delay", { xmlns = "urn:xmpp:delay", from = module.host, stamp = stamp }):up(); | 84 if presence_bits.show then |
| 85 presence:tag("show"):text(presence_bits.show):up(); | |
| 86 end | |
| 87 if presence_bits.stamp then | |
| 88 presence:tag("delay", { xmlns = "urn:xmpp:delay", from = module.host, stamp = presence_bits.stamp }):up(); | |
| 89 end | |
| 82 origin.send(presence); | 90 origin.send(presence); |
| 83 end | 91 end |
| 84 end | 92 end |
| 85 | 93 |
| 86 module:hook("pre-presence/bare", answer_probe_from_cache, 10); | 94 module:hook("pre-presence/bare", answer_probe_from_cache, 10); |
