package net.technicpack.discord; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import net.technicpack.discord.io.Server; import net.technicpack.launchercore.modpacks.ModpackModel; import java.util.concurrent.TimeUnit; public class CacheDiscordApi implements IDiscordApi { private IDiscordApi innerApi; private Cache<String, Server> cache; private Cache<String, Boolean> deadCache; public CacheDiscordApi(IDiscordApi innerApi, int cacheLength, int deadCacheLength) { this.innerApi = innerApi; cache = CacheBuilder.newBuilder() .concurrencyLevel(4) .maximumSize(300) .expireAfterWrite(cacheLength, TimeUnit.SECONDS) .build(); deadCache = CacheBuilder.newBuilder() .concurrencyLevel(4) .maximumSize(300) .expireAfterWrite(deadCacheLength, TimeUnit.SECONDS) .build(); } @Override public void retrieveServer(ModpackModel modpack, final String serverId, final IDiscordCallback callback) { final Boolean deadCacheValue = deadCache.getIfPresent(serverId); if (deadCacheValue != null && deadCacheValue) return; Server cacheValue = cache.getIfPresent(serverId); if (cacheValue != null) { if (deadCacheValue == null) deadCache.put(serverId, false); callback.serverGetCallback(modpack, cacheValue); return; } //Fill the dead cache immediately to prevent discord API requests from getting spammed //before the first one comes back. The response will sort out the "correct" value for the //dead cache. deadCache.put(serverId, true); this.innerApi.retrieveServer(modpack, serverId, new IDiscordCallback() { @Override public void serverGetCallback(ModpackModel pack, Server server) { if (server == null) deadCache.put(serverId, true); else { deadCache.put(serverId, false); cache.put(serverId, server); } callback.serverGetCallback(pack, server); } }); } }