Improve clan rank caching

- Use Guava cache instead of scheduled caching to cache clan member
ranks to reduce frequency of caching and simplify logic

Signed-off-by: Tomas Slusny <slusnucky@gmail.com>
This commit is contained in:
Tomas Slusny
2018-01-09 16:02:45 +01:00
parent 81ebc99e99
commit 4871aee9ae

View File

@@ -24,6 +24,9 @@
*/
package net.runelite.client.plugins.clanchat;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.common.eventbus.Subscribe;
import com.google.inject.Provides;
import java.awt.image.BufferedImage;
@@ -34,11 +37,8 @@ import java.awt.image.WritableRaster;
import java.io.IOException;
import java.time.temporal.ChronoUnit;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.concurrent.TimeUnit;
import javax.imageio.ImageIO;
import javax.inject.Inject;
import lombok.extern.slf4j.Slf4j;
@@ -51,7 +51,6 @@ import net.runelite.api.IndexedSprite;
import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetInfo;
import net.runelite.client.config.ConfigManager;
import net.runelite.client.events.ClanMembersChanged;
import net.runelite.client.events.GameStateChanged;
import net.runelite.client.events.SetMessage;
import net.runelite.client.plugins.Plugin;
@@ -72,7 +71,8 @@ public class ClanChatPlugin extends Plugin
"General_clan_rank.png", "Owner_clan_rank.png"
};
private final Map<String, ClanMemberRank> clanRanksCache = new HashMap<>();
private LoadingCache<String, ClanMemberRank> clanRanksCache;
private int modIconsLength;
@Inject
@@ -87,6 +87,34 @@ public class ClanChatPlugin extends Plugin
return configManager.getConfig(ClanChatConfig.class);
}
@Override
protected void startUp() throws Exception
{
clanRanksCache = CacheBuilder.newBuilder()
.maximumSize(100)
.expireAfterAccess(1, TimeUnit.MINUTES)
.build(new CacheLoader<String, ClanMemberRank>()
{
@Override
public ClanMemberRank load(String key) throws Exception
{
final ClanMember[] clanMembersArr = client.getClanMembers();
if (clanMembersArr == null || clanMembersArr.length == 0)
{
return ClanMemberRank.UNRANKED;
}
return Arrays.stream(clanMembersArr)
.filter(Objects::nonNull)
.filter(clanMember -> sanitize(clanMember.getUsername()).equals(sanitize(key)))
.map(ClanMember::getRank)
.findAny()
.orElse(ClanMemberRank.UNRANKED);
}
});
}
@Subscribe
public void onGameStateChanged(GameStateChanged gameStateChanged)
{
@@ -116,56 +144,6 @@ public class ClanChatPlugin extends Plugin
}
}
@Schedule(
period = 2,
unit = ChronoUnit.MINUTES
)
public void cacheClanMemberRanks()
{
if (client.getGameState() != GameState.LOGGED_IN || !config.clanRank())
{
return;
}
clanRanksCache.clear();
final ClanMember[] clanMembersArr = client.getClanMembers();
if (clanMembersArr == null || clanMembersArr.length == 0)
{
return;
}
final Set<ClanMember> clanMembers = Arrays.stream(clanMembersArr)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
final int clanMembersSize = clanMembers.size();
if (clanMembersSize == 0)
{
return;
}
log.debug("Caching clan members...");
for (ClanMember clanMember : clanMembers)
{
final String name = sanitize(clanMember.getUsername());
final ClanMemberRank rank = clanMember.getRank();
if (rank != null)
{
clanRanksCache.put(name, rank);
}
}
}
@Subscribe
public void onClanMembersChanged(ClanMembersChanged event)
{
cacheClanMemberRanks();
}
@Subscribe
public void onSetMessage(SetMessage setMessage)
{
@@ -257,7 +235,7 @@ public class ClanChatPlugin extends Plugin
private void insertClanRankIcon(final SetMessage message)
{
final String playerName = sanitize(message.getName());
final ClanMemberRank rank = clanRanksCache.get(playerName);
final ClanMemberRank rank = clanRanksCache.getUnchecked(playerName);
if (rank != null && rank != ClanMemberRank.UNRANKED)
{