From 216b5067d0de728989136774ff4bdb6d11b1c3db Mon Sep 17 00:00:00 2001 From: Pedro Souza Date: Mon, 16 Jun 2025 10:02:52 -0300 Subject: [PATCH 1/3] feature: enable/disable in commands --- .../velocitywhitelist/WhitelistManager.java | 10 ++++-- .../command/WhitelistCommand.java | 35 +++++++++++++++---- .../config/Configuration.java | 22 ------------ .../velocitywhitelist/config/PlayerList.java | 29 ++++++++++----- src/main/resources/config.yml | 4 --- 5 files changed, 57 insertions(+), 43 deletions(-) diff --git a/src/main/java/me/fallenbreath/velocitywhitelist/WhitelistManager.java b/src/main/java/me/fallenbreath/velocitywhitelist/WhitelistManager.java index 7a0d83d..5346a0c 100644 --- a/src/main/java/me/fallenbreath/velocitywhitelist/WhitelistManager.java +++ b/src/main/java/me/fallenbreath/velocitywhitelist/WhitelistManager.java @@ -35,8 +35,8 @@ public WhitelistManager(Logger logger, Configuration config, Path dataDirectory, { this.logger = logger; this.config = config; - this.whitelist = new PlayerList("Whitelist", dataDirectory.resolve("whitelist.yml"), this.config::isWhitelistEnabled); - this.blacklist = new PlayerList("Blacklist", dataDirectory.resolve("blacklist.yml"), this.config::isBlacklistEnabled); + this.whitelist = new PlayerList("Whitelist", dataDirectory.resolve("whitelist.yml")); + this.blacklist = new PlayerList("Blacklist", dataDirectory.resolve("blacklist.yml")); this.server = server; } @@ -56,6 +56,12 @@ public void loadLists() this.loadOneList(this.blacklist); } + public void enableList(PlayerList list, boolean enabled) + { + list.setEnabled(enabled); + saveList(list); + } + private boolean isPlayerInList(GameProfile profile, PlayerList list) { return switch (this.config.getIdentifyMode()) diff --git a/src/main/java/me/fallenbreath/velocitywhitelist/command/WhitelistCommand.java b/src/main/java/me/fallenbreath/velocitywhitelist/command/WhitelistCommand.java index 73cd112..eed000e 100644 --- a/src/main/java/me/fallenbreath/velocitywhitelist/command/WhitelistCommand.java +++ b/src/main/java/me/fallenbreath/velocitywhitelist/command/WhitelistCommand.java @@ -33,6 +33,13 @@ private void registerOne(CommandManager commandManager, String[] roots, PlayerLi var root = literal(roots[0]). requires(s -> s.hasPermission(PluginMeta.ID + ".command")). executes(c -> showListStatus(c.getSource(), list)). + then(literal("enable") + .executes(c -> enable(c.getSource(), list)) + ). + then( + literal("disable") + .executes(c -> disable(c.getSource(), list)) + ). then(literal("add"). then(argument("name", word()). executes(c -> addPlayer(c.getSource(), list, getString(c, "name"))) @@ -77,10 +84,30 @@ private int showListStatus(CommandSource source, PlayerList list) protected static void showListStatus(CommandSource source, PlayerList list, String prefix) { - source.sendMessage(Component.text(String.format("%sActivated: %s (config enabled: %s, load ok: %s)", prefix, list.isActivated(), list.isConfigEnabled(), list.isLoadOk()))); + source.sendMessage(Component.text(String.format("%sActivated: %s (enabled: %s, load ok: %s)", prefix, list.isActivated(), list.isEnabled(), list.isLoadOk()))); source.sendMessage(Component.text(String.format("%sSize: %d player names, %d player UUIDs", prefix, list.getPlayerNames().size(), list.getPlayerUuidMappingEntries().size()))); } + private int enable(CommandSource source, PlayerList list) { + if (list.isEnabled()) { + source.sendMessage(Component.text(String.format("%s is already enabled.", list.getName()))); + return 0; + } + manager.enableList(list, true); + source.sendMessage(Component.text(String.format("%s was enabled.", list.getName()))); + return 1; + } + + private int disable(CommandSource source, PlayerList list) { + if (!list.isEnabled()) { + source.sendMessage(Component.text(String.format("%s is already disabled", list.getName()))); + return 0; + } + manager.enableList(list, false); + source.sendMessage(Component.text(String.format("%s was disabled.", list.getName()))); + return 1; + } + private int addPlayer(CommandSource source, PlayerList list, String playerName) { if (!list.isActivated()) @@ -129,12 +156,6 @@ private int listPlayers(CommandSource source, PlayerList list) private int reloadList(CommandSource source, PlayerList list) { - if (!list.isConfigEnabled()) - { - source.sendMessage(Component.text(String.format("%s is disabled by config", list.getName()))); - return 0; - } - if (this.manager.loadOneList(list)) { source.sendMessage(Component.text(String.format("%s reloaded", list.getName()))); diff --git a/src/main/java/me/fallenbreath/velocitywhitelist/config/Configuration.java b/src/main/java/me/fallenbreath/velocitywhitelist/config/Configuration.java index 307d7f4..9209418 100644 --- a/src/main/java/me/fallenbreath/velocitywhitelist/config/Configuration.java +++ b/src/main/java/me/fallenbreath/velocitywhitelist/config/Configuration.java @@ -55,9 +55,7 @@ private void migrate() Map newOptions = Maps.newLinkedHashMap(); newOptions.put("_version", 1); newOptions.put("identify_mode", Optional.ofNullable(this.options.get("identify_mode")).orElse("name")); - newOptions.put("whitelist_enabled", Optional.ofNullable(this.options.get("enabled")).orElse(true)); newOptions.put("whitelist_kick_message", Optional.ofNullable(this.options.get("kick_message")).orElse("You are not in the whitelist!")); - newOptions.put("blacklist_enabled", Optional.ofNullable(this.options.get("enabled")).orElse(true)); // it's ok to enable an empty blacklist newOptions.put("blacklist_kick_message", "You are banned from the server!"); this.options.clear(); @@ -100,26 +98,6 @@ private IdentifyMode makeIdentifyMode() return IdentifyMode.DEFAULT; } - public boolean isWhitelistEnabled() - { - Object enabled = this.options.get("whitelist_enabled"); - if (enabled instanceof Boolean) - { - return (Boolean)enabled; - } - return false; - } - - public boolean isBlacklistEnabled() - { - Object enabled = this.options.get("blacklist_enabled"); - if (enabled instanceof Boolean) - { - return (Boolean)enabled; - } - return false; - } - public IdentifyMode getIdentifyMode() { return this.identifyMode; diff --git a/src/main/java/me/fallenbreath/velocitywhitelist/config/PlayerList.java b/src/main/java/me/fallenbreath/velocitywhitelist/config/PlayerList.java index de17a12..35ec21b 100644 --- a/src/main/java/me/fallenbreath/velocitywhitelist/config/PlayerList.java +++ b/src/main/java/me/fallenbreath/velocitywhitelist/config/PlayerList.java @@ -26,15 +26,14 @@ public class PlayerList private final Map uuids = Maps.newLinkedHashMap(); private final String name; private final Path filePath; - private final Supplier configEnableGetter; private boolean loadOk = false; private final Object lock = new Object(); + private boolean enabled; - public PlayerList(String name, Path filePath, Supplier configEnableGetter) + public PlayerList(String name, Path filePath) { this.name = name; this.filePath = filePath; - this.configEnableGetter = configEnableGetter; } public String getName() @@ -55,19 +54,26 @@ public boolean isLoadOk() } } - public boolean isConfigEnabled() - { + public boolean isEnabled() { synchronized (this.lock) { - return this.configEnableGetter.get(); + return this.enabled; } } + public void setEnabled(boolean enabled) + { + synchronized (this.lock) + { + this.enabled = enabled; + } + } + public boolean isActivated() { synchronized (this.lock) { - return this.isLoadOk() && this.isConfigEnabled(); + return this.isLoadOk() && this.isEnabled(); } } @@ -181,7 +187,7 @@ public void resetTo(@NotNull PlayerList newList) public PlayerList createNewEmptyList() { - return new PlayerList(this.name, this.filePath, this.configEnableGetter); + return new PlayerList(this.name, this.filePath); } @SuppressWarnings({"unchecked", "rawtypes"}) @@ -194,6 +200,12 @@ public void load(Logger logger) throws IOException synchronized (this.lock) { + if (options.get("enabled") instanceof Boolean bool) { + this.enabled = bool; + } else { + this.enabled = false; + } + this.names.clear(); if (options.get("names") instanceof List list) { @@ -248,6 +260,7 @@ public void save() throws IOException synchronized (this.lock) { + options.put("enabled", this.enabled); options.put("names", Lists.newArrayList(this.names)); List uuidList = this.uuids.entrySet().stream() .map(e -> e.getValue() != null ? Map.of(e.getKey().toString(), e.getValue()) : e.getKey().toString()) diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 2a8918d..35b6f62 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -7,12 +7,8 @@ _version: 1 # since it can keep tracking on the mojang account of the player identify_mode: name -# If the whitelist functionality is enabled -whitelist_enabled: true # Message sent to those not whitelisted players whitelist_kick_message: You are not in the whitelist! -# If the blacklist functionality is enabled -blacklist_enabled: true # Message sent to those blacklisted players blacklist_kick_message: You are banned from the server! From 41f7b9ff7f873b308b3fb90a2c0a10bcad63730d Mon Sep 17 00:00:00 2001 From: Pedro Souza Date: Thu, 2 Oct 2025 17:33:46 -0300 Subject: [PATCH 2/3] feature: migrate config v1 to v2 / fix: fixed not persist list enable value --- .../velocitywhitelist/WhitelistManager.java | 4 +-- .../config/Configuration.java | 35 +++++++++++++++++++ .../velocitywhitelist/config/PlayerList.java | 30 +++++++++++----- src/main/resources/config.yml | 2 +- 4 files changed, 59 insertions(+), 12 deletions(-) diff --git a/src/main/java/me/fallenbreath/velocitywhitelist/WhitelistManager.java b/src/main/java/me/fallenbreath/velocitywhitelist/WhitelistManager.java index 5346a0c..e9c86d6 100644 --- a/src/main/java/me/fallenbreath/velocitywhitelist/WhitelistManager.java +++ b/src/main/java/me/fallenbreath/velocitywhitelist/WhitelistManager.java @@ -35,8 +35,8 @@ public WhitelistManager(Logger logger, Configuration config, Path dataDirectory, { this.logger = logger; this.config = config; - this.whitelist = new PlayerList("Whitelist", dataDirectory.resolve("whitelist.yml")); - this.blacklist = new PlayerList("Blacklist", dataDirectory.resolve("blacklist.yml")); + this.whitelist = new PlayerList("Whitelist", dataDirectory.resolve("whitelist.yml"), config::getMigrateWhitelistEnabled); + this.blacklist = new PlayerList("Blacklist", dataDirectory.resolve("blacklist.yml"), config::getMigrateBlacklistEnabled); this.server = server; } diff --git a/src/main/java/me/fallenbreath/velocitywhitelist/config/Configuration.java b/src/main/java/me/fallenbreath/velocitywhitelist/config/Configuration.java index 9209418..fc3cf0a 100644 --- a/src/main/java/me/fallenbreath/velocitywhitelist/config/Configuration.java +++ b/src/main/java/me/fallenbreath/velocitywhitelist/config/Configuration.java @@ -4,6 +4,7 @@ import me.fallenbreath.velocitywhitelist.IdentifyMode; import me.fallenbreath.velocitywhitelist.PluginMeta; import me.fallenbreath.velocitywhitelist.utils.FileUtils; +import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.yaml.snakeyaml.Yaml; @@ -21,6 +22,9 @@ public class Configuration private IdentifyMode identifyMode = IdentifyMode.DEFAULT; + private Boolean migrateWhitelistEnabled; + private Boolean migrateBlacklistEnabled; + public Configuration(Logger logger, Path configFilePath) { this.logger = logger; @@ -62,6 +66,27 @@ private void migrate() this.options.putAll(newOptions); migrated = true; } + if (this.options.get("_version") instanceof Integer version) { + if (version == 1) { + // migrate config version 1 to 2 + + Object whitelistEnabled = this.options.get("whitelist_enabled"); + if (whitelistEnabled instanceof Boolean boolWhitelistEnabled) { + this.migrateWhitelistEnabled = boolWhitelistEnabled; + } + this.options.remove("whitelist_enabled"); + Object blacklistEnabled = this.options.get("blacklist_enabled"); + if (blacklistEnabled instanceof Boolean boolBlacklistEnabled) { + this.migrateBlacklistEnabled = boolBlacklistEnabled; + } + this.options.remove("blacklist_enabled"); + + this.options.remove("_version"); + this.options.put("_version", 2); + + migrated = true; + } + } if (migrated) { @@ -103,6 +128,16 @@ public IdentifyMode getIdentifyMode() return this.identifyMode; } + public @Nullable Boolean getMigrateWhitelistEnabled() + { + return this.migrateWhitelistEnabled; + } + + public @Nullable Boolean getMigrateBlacklistEnabled() + { + return this.migrateBlacklistEnabled; + } + public String getWhitelistKickMessage() { Object maxPlayer = this.options.get("whitelist_kick_message"); diff --git a/src/main/java/me/fallenbreath/velocitywhitelist/config/PlayerList.java b/src/main/java/me/fallenbreath/velocitywhitelist/config/PlayerList.java index 35ec21b..e41a6cc 100644 --- a/src/main/java/me/fallenbreath/velocitywhitelist/config/PlayerList.java +++ b/src/main/java/me/fallenbreath/velocitywhitelist/config/PlayerList.java @@ -10,6 +10,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.yaml.snakeyaml.Yaml; import java.io.IOException; @@ -22,18 +23,21 @@ public class PlayerList { - private final Set names = Sets.newLinkedHashSet(); + private static final Logger log = LoggerFactory.getLogger(PlayerList.class); + private final Set names = Sets.newLinkedHashSet(); private final Map uuids = Maps.newLinkedHashMap(); private final String name; private final Path filePath; + private final Supplier migrateConfigEnable; private boolean loadOk = false; private final Object lock = new Object(); private boolean enabled; - public PlayerList(String name, Path filePath) + public PlayerList(String name, Path filePath, Supplier migrateConfigEnable) { this.name = name; this.filePath = filePath; + this.migrateConfigEnable = migrateConfigEnable; } public String getName() @@ -181,13 +185,14 @@ public void resetTo(@NotNull PlayerList newList) this.names.addAll(newList.names); this.uuids.clear(); this.uuids.putAll(newList.uuids); + this.enabled = newList.enabled; this.loadOk = true; } } public PlayerList createNewEmptyList() { - return new PlayerList(this.name, this.filePath); + return new PlayerList(this.name, this.filePath, migrateConfigEnable); } @SuppressWarnings({"unchecked", "rawtypes"}) @@ -200,11 +205,18 @@ public void load(Logger logger) throws IOException synchronized (this.lock) { - if (options.get("enabled") instanceof Boolean bool) { - this.enabled = bool; - } else { - this.enabled = false; - } + Boolean migrateValue = migrateConfigEnable.get(); + if (migrateValue != null) { + logger.info("List {} migrated enable value from configuration.", getName()); + setEnabled(migrateValue); + save(); + } else { + if (options.get("enabled") instanceof Boolean bool) { + setEnabled(bool); + } else { + setEnabled(false); + } + } this.names.clear(); if (options.get("names") instanceof List list) @@ -251,7 +263,7 @@ else if (item instanceof Map map) this.loadOk = true; logger.info("{} loaded with {} names and {} uuids", this.name, this.names.size(), this.uuids.size()); - } + } } public void save() throws IOException diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 35b6f62..7388d4d 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,5 +1,5 @@ # Config file version. Do not edit it -_version: 1 +_version: 2 # The way to identify a player # Options: name, uuid. Default: name From 3386b11d280c062fce9a3f07c1158c3d8a4fa445 Mon Sep 17 00:00:00 2001 From: Pedro Souza Date: Thu, 2 Oct 2025 17:35:52 -0300 Subject: [PATCH 3/3] fix: removed unused log --- .../me/fallenbreath/velocitywhitelist/config/PlayerList.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/me/fallenbreath/velocitywhitelist/config/PlayerList.java b/src/main/java/me/fallenbreath/velocitywhitelist/config/PlayerList.java index e41a6cc..c70e2b8 100644 --- a/src/main/java/me/fallenbreath/velocitywhitelist/config/PlayerList.java +++ b/src/main/java/me/fallenbreath/velocitywhitelist/config/PlayerList.java @@ -23,7 +23,6 @@ public class PlayerList { - private static final Logger log = LoggerFactory.getLogger(PlayerList.class); private final Set names = Sets.newLinkedHashSet(); private final Map uuids = Maps.newLinkedHashMap(); private final String name;