Improve cached bukkit locale lookup - #GH-342

This commit is contained in:
chickeneer
2021-08-29 17:31:56 -05:00
parent 1e7a6b194b
commit f145659dd0
2 changed files with 19 additions and 7 deletions
@@ -31,6 +31,8 @@ import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.server.PluginDisableEvent;
import org.bukkit.plugin.Plugin;
import java.util.UUID;
class ACFBukkitListener implements Listener {
private BukkitCommandManager manager;
private final Plugin plugin;
@@ -47,10 +49,11 @@ class ACFBukkitListener implements Listener {
}
manager.unregisterCommands();
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
if(this.manager.autoDetectFromClient) {
if (this.manager.autoDetectFromClient) {
this.manager.readPlayerLocale(player);
this.plugin.getServer().getScheduler().runTaskLater(this.plugin, () -> manager.readPlayerLocale(player), 20);
} else {
@@ -62,6 +65,8 @@ class ACFBukkitListener implements Listener {
@EventHandler
public void onPlayerQuit(PlayerQuitEvent quitEvent) {
//cleanup
manager.issuersLocale.remove(quitEvent.getPlayer().getUniqueId());
UUID playerUniqueId = quitEvent.getPlayer().getUniqueId();
manager.issuersLocale.remove(playerUniqueId);
manager.issuersLocaleString.remove(playerUniqueId);
}
}
@@ -57,6 +57,8 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
@@ -86,6 +88,7 @@ public class BukkitCommandManager extends CommandManager<
protected BukkitCommandCompletions completions;
MCTiming commandTiming;
protected BukkitLocales locales;
protected Map<UUID, String> issuersLocaleString = new ConcurrentHashMap<>();
private boolean cantReadLocale = false;
protected boolean autoDetectFromClient = true;
@@ -315,11 +318,15 @@ public class BukkitCommandManager extends CommandManager<
localeField.setAccessible(true);
Object localeString = localeField.get(nmsPlayer);
if (localeString instanceof String) {
String[] split = ACFPatterns.UNDERSCORE.split((String) localeString);
Locale locale = split.length > 1 ? new Locale(split[0], split[1]) : new Locale(split[0]);
Locale prev = issuersLocale.put(player.getUniqueId(), locale);
if (!Objects.equals(locale, prev)) {
this.notifyLocaleChange(getCommandIssuer(player), prev, locale);
UUID playerUniqueId = player.getUniqueId();
if (!localeString.equals(issuersLocaleString.get(playerUniqueId))) {
String[] split = ACFPatterns.UNDERSCORE.split((String) localeString);
Locale locale = split.length > 1 ? new Locale(split[0], split[1]) : new Locale(split[0]);
Locale prev = issuersLocale.put(playerUniqueId, locale);
issuersLocaleString.put(playerUniqueId, (String) localeString);
if (!Objects.equals(locale, prev)) {
this.notifyLocaleChange(getCommandIssuer(player), prev, locale);
}
}
}
}