Skip to content

Commit

Permalink
[Scoreboard & Bossbar] Save toggled players by UUID instead of names
Browse files Browse the repository at this point in the history
  • Loading branch information
NEZNAMY committed Jan 18, 2025
1 parent 152c04e commit bec129d
Show file tree
Hide file tree
Showing 3 changed files with 130 additions and 53 deletions.
Original file line number Diff line number Diff line change
@@ -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<String> 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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -46,8 +48,9 @@ public class BossBarManagerImpl extends RefreshableFeature implements BossBarMan
//list of currently running BossBar announcements
@Getter private final List<BossBar> announcedBossBars = new ArrayList<>();

//players with toggled BossBar
private final List<String> 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;
Expand All @@ -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<String, BossBarDefinition> entry : configuration.getBars().entrySet()) {
String name = entry.getKey();
registeredBossBars.put(name, new BossBarLine(this, name, entry.getValue()));
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 {
Expand All @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.*;
Expand Down Expand Up @@ -44,8 +45,9 @@ public class ScoreboardManagerImpl extends RefreshableFeature implements Scorebo
@Getter private final Map<String, me.neznamy.tab.api.scoreboard.Scoreboard> registeredScoreboards = new LinkedHashMap<>();
private me.neznamy.tab.api.scoreboard.Scoreboard[] definedScoreboards;

//list of players with disabled scoreboard
private final List<String> sbOffPlayers;
/** Manager for toggled players if remembering is enabled in config */
@Nullable
private ToggleManager toggleManager;

//active scoreboard announcement
@Nullable
Expand All @@ -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
Expand Down Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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 {
Expand All @@ -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);
}
}
}
Expand Down

0 comments on commit bec129d

Please sign in to comment.