From bec129d98e73d6c62bc0b2d03716ba614d7c1464 Mon Sep 17 00:00:00 2001 From: NEZNAMY Date: Sat, 18 Jan 2025 10:44:22 +0100 Subject: [PATCH] [Scoreboard & Bossbar] Save toggled players by UUID instead of names --- .../tab/shared/features/ToggleManager.java | 98 +++++++++++++++++++ .../features/bossbar/BossBarManagerImpl.java | 41 +++----- .../scoreboard/ScoreboardManagerImpl.java | 44 +++------ 3 files changed, 130 insertions(+), 53 deletions(-) create mode 100644 shared/src/main/java/me/neznamy/tab/shared/features/ToggleManager.java diff --git a/shared/src/main/java/me/neznamy/tab/shared/features/ToggleManager.java b/shared/src/main/java/me/neznamy/tab/shared/features/ToggleManager.java new file mode 100644 index 000000000..fe376d22b --- /dev/null +++ b/shared/src/main/java/me/neznamy/tab/shared/features/ToggleManager.java @@ -0,0 +1,98 @@ +package me.neznamy.tab.shared.features; + +import me.neznamy.tab.shared.config.file.ConfigurationFile; +import me.neznamy.tab.shared.platform.TabPlayer; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +/** + * This class tracks toggling of a feature using commands when "remember-toggle-choice" is enabled + * in the configuration of that specific feature. + */ +public class ToggleManager { + + /** Player data file to store toggle status in */ + @NotNull + private final ConfigurationFile playerDataFile; + + /** Name of the section to save the toggled players list as in the player data file */ + @NotNull + private final String sectionName; + + /** List of players who toggled the feature */ + @NotNull + private final Set toggledPlayers; + + /** + * Constructs new instance with given parameters and loads list of toggled players from the file. + * + * @param playerDataFile + * File where toggled players are saved + * @param sectionName + * Name of the section to save the toggled players list as in the player data file + */ + public ToggleManager(@NotNull ConfigurationFile playerDataFile, @NotNull String sectionName) { + this.playerDataFile = playerDataFile; + this.sectionName = sectionName; + toggledPlayers = new HashSet<>(playerDataFile.getStringList(sectionName, Collections.emptyList())); + } + + /** + * Checks for converting player to use UUID instead of name (from the old system). + * + * @param player + * Player to check to convert + */ + public void convert(@NotNull TabPlayer player) { + if (toggledPlayers.remove(player.getName())) { + toggledPlayers.add(player.getUniqueId().toString()); + save(); + } + } + + /** + * Returns {@code true} if the player has toggled this feature, {@code false} if not. + * + * @param player + * Player to check for + * @return {@code true} if player has toggled the feature, {@code false} if not + */ + public boolean contains(@NotNull TabPlayer player) { + return toggledPlayers.contains(player.getUniqueId().toString()); + } + + /** + * Adds player to list of toggled players. + * + * @param player + * Player to add + */ + public void add(@NotNull TabPlayer player) { + if (toggledPlayers.add(player.getUniqueId().toString())) { + save(); + } + } + + /** + * Removes player from the list of toggled players. + * + * @param player + * Player to remove + */ + public void remove(@NotNull TabPlayer player) { + if (toggledPlayers.remove(player.getUniqueId().toString())) { + save(); + } + } + + /** + * Saves list of toggled players into file. + */ + private void save() { + playerDataFile.set(sectionName, new ArrayList<>(toggledPlayers)); + } +} diff --git a/shared/src/main/java/me/neznamy/tab/shared/features/bossbar/BossBarManagerImpl.java b/shared/src/main/java/me/neznamy/tab/shared/features/bossbar/BossBarManagerImpl.java index ba5821f02..8e1627d52 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/features/bossbar/BossBarManagerImpl.java +++ b/shared/src/main/java/me/neznamy/tab/shared/features/bossbar/BossBarManagerImpl.java @@ -12,11 +12,13 @@ import me.neznamy.tab.shared.TAB; import me.neznamy.tab.shared.cpu.ThreadExecutor; import me.neznamy.tab.shared.cpu.TimedCaughtTask; +import me.neznamy.tab.shared.features.ToggleManager; import me.neznamy.tab.shared.features.bossbar.BossBarConfiguration.BossBarDefinition; import me.neznamy.tab.shared.platform.TabPlayer; import me.neznamy.tab.shared.features.types.*; import me.neznamy.tab.shared.util.cache.StringToComponentCache; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.concurrent.TimeUnit; @@ -46,8 +48,9 @@ public class BossBarManagerImpl extends RefreshableFeature implements BossBarMan //list of currently running BossBar announcements @Getter private final List announcedBossBars = new ArrayList<>(); - //players with toggled BossBar - private final List bossBarOffPlayers; + /** Manager for toggled players if remembering is enabled in config */ + @Nullable + private ToggleManager toggleManager; //time when BossBar announce ends, used for placeholder private long announceEndTime; @@ -60,8 +63,9 @@ public class BossBarManagerImpl extends RefreshableFeature implements BossBarMan */ public BossBarManagerImpl(@NonNull BossBarConfiguration configuration) { this.configuration = configuration; - bossBarOffPlayers = configuration.isRememberToggleChoice() ? TAB.getInstance().getConfiguration().getPlayerDataFile() - .getStringList("bossbar-off", new ArrayList<>()) : Collections.emptyList(); + if (configuration.isRememberToggleChoice()) { + toggleManager = new ToggleManager( TAB.getInstance().getConfiguration().getPlayerDataFile(), "bossbar-off"); + } for (Map.Entry entry : configuration.getBars().entrySet()) { String name = entry.getKey(); registeredBossBars.put(name, new BossBarLine(this, name, entry.getValue())); @@ -106,7 +110,8 @@ public void refresh(@NotNull TabPlayer p, boolean force) { @Override public void onJoin(@NotNull TabPlayer connectedPlayer) { - setBossBarVisible(connectedPlayer, configuration.isHiddenByDefault() == bossBarOffPlayers.contains(connectedPlayer.getName()), false); + if (toggleManager != null) toggleManager.convert(connectedPlayer); + setBossBarVisible(connectedPlayer, configuration.isHiddenByDefault() == (toggleManager != null && toggleManager.contains(connectedPlayer)), false); } @Override @@ -218,16 +223,11 @@ public void setBossBarVisible(@NonNull me.neznamy.tab.api.TabPlayer p, boolean v player.bossbarData.visible = true; detectBossBarsAndSend(player); if (sendToggleMessage) player.sendMessage(toggleOnMessage, true); - if (configuration.isRememberToggleChoice()) { + if (toggleManager != null) { if (configuration.isHiddenByDefault()) { - if (!bossBarOffPlayers.contains(player.getName())) { - bossBarOffPlayers.add(player.getName()); - savePlayers(); - } + toggleManager.add(player); } else { - if (bossBarOffPlayers.remove(player.getName())) { - savePlayers(); - } + toggleManager.remove(player); } } } else { @@ -236,26 +236,17 @@ public void setBossBarVisible(@NonNull me.neznamy.tab.api.TabPlayer p, boolean v l.removePlayer(player); } if (sendToggleMessage) player.sendMessage(toggleOffMessage, true); - if (configuration.isRememberToggleChoice()) { + if (toggleManager != null) { if (configuration.isHiddenByDefault()) { - if (bossBarOffPlayers.remove(player.getName())) { - savePlayers(); - } + toggleManager.remove(player); } else { - if (!bossBarOffPlayers.contains(player.getName())) { - bossBarOffPlayers.add(player.getName()); - savePlayers(); - } + toggleManager.add(player); } } } TAB.getInstance().getPlaceholderManager().getTabExpansion().setBossBarVisible(player, visible); } - private void savePlayers() { - TAB.getInstance().getConfiguration().getPlayerDataFile().set("bossbar-off", new ArrayList<>(bossBarOffPlayers)); - } - @Override public void sendBossBarTemporarily(@NonNull me.neznamy.tab.api.TabPlayer player, @NonNull String bossBar, int duration) { ensureActive(); diff --git a/shared/src/main/java/me/neznamy/tab/shared/features/scoreboard/ScoreboardManagerImpl.java b/shared/src/main/java/me/neznamy/tab/shared/features/scoreboard/ScoreboardManagerImpl.java index 416cb603f..84c1684ef 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/features/scoreboard/ScoreboardManagerImpl.java +++ b/shared/src/main/java/me/neznamy/tab/shared/features/scoreboard/ScoreboardManagerImpl.java @@ -8,6 +8,7 @@ import me.neznamy.tab.shared.TabConstants; import me.neznamy.tab.shared.cpu.ThreadExecutor; import me.neznamy.tab.shared.cpu.TimedCaughtTask; +import me.neznamy.tab.shared.features.ToggleManager; import me.neznamy.tab.shared.features.scoreboard.ScoreboardConfiguration.ScoreboardDefinition; import me.neznamy.tab.shared.features.scoreboard.lines.ScoreboardLine; import me.neznamy.tab.shared.features.types.*; @@ -44,8 +45,9 @@ public class ScoreboardManagerImpl extends RefreshableFeature implements Scorebo @Getter private final Map registeredScoreboards = new LinkedHashMap<>(); private me.neznamy.tab.api.scoreboard.Scoreboard[] definedScoreboards; - //list of players with disabled scoreboard - private final List sbOffPlayers; + /** Manager for toggled players if remembering is enabled in config */ + @Nullable + private ToggleManager toggleManager; //active scoreboard announcement @Nullable @@ -59,8 +61,9 @@ public class ScoreboardManagerImpl extends RefreshableFeature implements Scorebo */ public ScoreboardManagerImpl(@NotNull ScoreboardConfiguration configuration) { this.configuration = configuration; - sbOffPlayers = configuration.isRememberToggleChoice() ? TAB.getInstance().getConfiguration().getPlayerDataFile() - .getStringList("scoreboard-off", new ArrayList<>()) : Collections.emptyList(); + if (configuration.isRememberToggleChoice()) { + toggleManager = new ToggleManager(TAB.getInstance().getConfiguration().getPlayerDataFile(), "scoreboard-off"); + } } @Override @@ -95,14 +98,15 @@ public void onJoin(@NotNull TabPlayer connectedPlayer) { ((SafeScoreboard)connectedPlayer.getScoreboard()).setAntiOverrideScoreboard(true); TAB.getInstance().getPlaceholderManager().getTabExpansion().setScoreboardName(connectedPlayer, ""); TAB.getInstance().getPlaceholderManager().getTabExpansion().setScoreboardVisible(connectedPlayer, false); + if (toggleManager != null) toggleManager.convert(connectedPlayer); if (configuration.getJoinDelay() > 0) { connectedPlayer.scoreboardData.joinDelayed = true; customThread.executeLater(new TimedCaughtTask(TAB.getInstance().getCpu(), () -> { - setScoreboardVisible(connectedPlayer, configuration.isHiddenByDefault() == sbOffPlayers.contains(connectedPlayer.getName()), false); + setScoreboardVisible(connectedPlayer, configuration.isHiddenByDefault() == (toggleManager != null && toggleManager.contains(connectedPlayer)), false); connectedPlayer.scoreboardData.joinDelayed = false; }, getFeatureName(), TabConstants.CpuUsageCategory.PLAYER_JOIN), configuration.getJoinDelay()); } else { - setScoreboardVisible(connectedPlayer, configuration.isHiddenByDefault() == sbOffPlayers.contains(connectedPlayer.getName()), false); + setScoreboardVisible(connectedPlayer, configuration.isHiddenByDefault() == (toggleManager != null && toggleManager.contains(connectedPlayer)), false); } } @@ -191,12 +195,6 @@ public void onObjective(@NotNull TabPlayer receiver, int action, @NotNull String } } - private void savePlayers() { - synchronized (sbOffPlayers) { - TAB.getInstance().getConfiguration().getPlayerDataFile().set("scoreboard-off", new ArrayList<>(sbOffPlayers)); - } - } - @Override public void onQuit(@NotNull TabPlayer disconnectedPlayer) { ScoreboardImpl sb = disconnectedPlayer.scoreboardData.activeScoreboard; @@ -277,16 +275,11 @@ public void setScoreboardVisible(@NonNull me.neznamy.tab.api.TabPlayer p, boolea if (sendToggleMessage) { player.sendMessage(TAB.getInstance().getConfiguration().getMessages().getScoreboardOn(), true); } - if (configuration.isRememberToggleChoice()) { + if (toggleManager != null) { if (configuration.isHiddenByDefault()) { - if (!sbOffPlayers.contains(player.getName())) { - sbOffPlayers.add(player.getName()); - savePlayers(); - } + toggleManager.add(player); } else { - if (sbOffPlayers.remove(player.getName())) { - savePlayers(); - } + toggleManager.remove(player); } } } else { @@ -297,16 +290,11 @@ public void setScoreboardVisible(@NonNull me.neznamy.tab.api.TabPlayer p, boolea if (sendToggleMessage) { player.sendMessage(TAB.getInstance().getConfiguration().getMessages().getScoreboardOff(), true); } - if (configuration.isRememberToggleChoice()) { + if (toggleManager != null) { if (configuration.isHiddenByDefault()) { - if (sbOffPlayers.remove(player.getName())) { - savePlayers(); - } + toggleManager.remove(player); } else { - if (!sbOffPlayers.contains(player.getName())) { - sbOffPlayers.add(player.getName()); - savePlayers(); - } + toggleManager.add(player); } } }