mod_presence_cache/mod_presence_cache.lua
changeset 2156 bb4a2e4b7ba7
parent 2151 ed2bb50d4f91
child 2157 aa24d49c47ef
equal deleted inserted replaced
2155:96aca307964b 2156:bb4a2e4b7ba7
    20 	if next(jids) == nil then
    20 	if next(jids) == nil then
    21 		bare_cache[bare_cache_key] = nil;
    21 		bare_cache[bare_cache_key] = nil;
    22 	end
    22 	end
    23 end
    23 end
    24 
    24 
       
    25 -- used indirectly for the on_evict callback
    25 local presence_cache = cache.new(cache_size, on_evict);
    26 local presence_cache = cache.new(cache_size, on_evict);
    26 
    27 
    27 local function cache_hook(event)
    28 local function cache_hook(event)
    28 	local origin, stanza = event.origin, event.stanza;
    29 	local origin, stanza = event.origin, event.stanza;
    29 	local typ = stanza.attr.type;
    30 	local typ = stanza.attr.type;
    39 			return;
    40 			return;
    40 		end
    41 		end
    41 
    42 
    42 		local cache_key = username .. "\0" .. contact_full;
    43 		local cache_key = username .. "\0" .. contact_full;
    43 		local bare_cache_key = username .. "\0" .. contact_bare;
    44 		local bare_cache_key = username .. "\0" .. contact_bare;
       
    45 
       
    46 		local jids = bare_cache[bare_cache_key];
       
    47 
       
    48 		if typ == "unavailable" then -- remove from cache
       
    49 			presence_cache:set(cache_key, nil);
       
    50 			on_evict(cache_key);
       
    51 			return;
       
    52 		end
       
    53 
    44 		local stamp = datetime.datetime();
    54 		local stamp = datetime.datetime();
    45 		local jids = bare_cache[bare_cache_key];
       
    46 		if jids then
    55 		if jids then
    47 			jids[contact_full] = stamp;
    56 			jids[contact_full] = stamp;
    48 		else
    57 		else
    49 			jids = { [contact_full] = stamp };
    58 			jids = { [contact_full] = stamp };
    50 			bare_cache[bare_cache_key] = jids;
    59 			bare_cache[bare_cache_key] = jids;