diff --git a/bukkit/src/main/java/net/william278/husksync/command/BukkitCommand.java b/bukkit/src/main/java/net/william278/husksync/command/BukkitCommand.java index ab64b8b1..945f42d9 100644 --- a/bukkit/src/main/java/net/william278/husksync/command/BukkitCommand.java +++ b/bukkit/src/main/java/net/william278/husksync/command/BukkitCommand.java @@ -63,7 +63,7 @@ public class BukkitCommand implements CommandExecutor, TabExecutor { public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { if (this.command instanceof TabCompletable tabCompletable) { - return tabCompletable.onTabComplete(BukkitPlayer.adapt((Player) sender), args); + return tabCompletable.onTabComplete(args); } return Collections.emptyList(); } diff --git a/bukkit/src/main/java/net/william278/husksync/migrator/LegacyMigrator.java b/bukkit/src/main/java/net/william278/husksync/migrator/LegacyMigrator.java index 2ca98df5..231441a5 100644 --- a/bukkit/src/main/java/net/william278/husksync/migrator/LegacyMigrator.java +++ b/bukkit/src/main/java/net/william278/husksync/migrator/LegacyMigrator.java @@ -44,7 +44,7 @@ public class LegacyMigrator extends Migrator { this.sourceDatabase = plugin.getSettings().getStringValue(Settings.ConfigOption.DATABASE_NAME); this.sourcePlayersTable = "husksync_players"; this.sourceDataTable = "husksync_data"; - this.minecraftVersion = plugin.getMinecraftVersion().getWithoutMeta(); + this.minecraftVersion = plugin.getMinecraftVersion().toString(); } @Override @@ -72,7 +72,7 @@ public class LegacyMigrator extends Migrator { final List dataToMigrate = new ArrayList<>(); try (final Connection connection = connectionPool.getConnection()) { try (final PreparedStatement statement = connection.prepareStatement(""" - SELECT `uuid`, `name`, `inventory`, `ender_chest`, `health`, `max_health`, `health_scale`, `hunger`, `saturation`, `saturation_exhaustion`, `selected_slot`, `status_effects`, `total_experience`, `exp_level`, `exp_progress`, `game_mode`, `statistics`, `is_flying`, `advancements`, `location` + SELECT `uuid`, `username`, `inventory`, `ender_chest`, `health`, `max_health`, `health_scale`, `hunger`, `saturation`, `saturation_exhaustion`, `selected_slot`, `status_effects`, `total_experience`, `exp_level`, `exp_progress`, `game_mode`, `statistics`, `is_flying`, `advancements`, `location` FROM `%source_players_table%` INNER JOIN `%source_data_table%` ON `%source_players_table%`.`id` = `%source_data_table%`.`player_id`; @@ -83,7 +83,7 @@ public class LegacyMigrator extends Migrator { while (resultSet.next()) { dataToMigrate.add(new LegacyData( new User(UUID.fromString(resultSet.getString("uuid")), - resultSet.getString("name")), + resultSet.getString("username")), resultSet.getString("inventory"), resultSet.getString("ender_chest"), resultSet.getDouble("health"), diff --git a/bukkit/src/main/java/net/william278/husksync/migrator/MpdbMigrator.java b/bukkit/src/main/java/net/william278/husksync/migrator/MpdbMigrator.java index 73a157c3..502cc998 100644 --- a/bukkit/src/main/java/net/william278/husksync/migrator/MpdbMigrator.java +++ b/bukkit/src/main/java/net/william278/husksync/migrator/MpdbMigrator.java @@ -48,7 +48,7 @@ public class MpdbMigrator extends Migrator { this.sourceInventoryTable = "mpdb_inventory"; this.sourceEnderChestTable = "mpdb_enderchest"; this.sourceExperienceTable = "mpdb_experience"; - this.minecraftVersion = plugin.getMinecraftVersion().getWithoutMeta(); + this.minecraftVersion = plugin.getMinecraftVersion().toString(); } diff --git a/bukkit/src/main/java/net/william278/husksync/util/BukkitLogger.java b/bukkit/src/main/java/net/william278/husksync/util/BukkitLogger.java index c87a5673..068f0990 100644 --- a/bukkit/src/main/java/net/william278/husksync/util/BukkitLogger.java +++ b/bukkit/src/main/java/net/william278/husksync/util/BukkitLogger.java @@ -1,7 +1,11 @@ package net.william278.husksync.util; +import de.themoep.minedown.MineDown; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.TextComponent; import org.jetbrains.annotations.NotNull; +import java.util.Arrays; import java.util.logging.Level; public class BukkitLogger extends Logger { @@ -22,6 +26,11 @@ public class BukkitLogger extends Logger { logger.log(level, message); } + @Override + public void log(@NotNull Level level, @NotNull MineDown mineDown) { + logger.log(level, TextComponent.toLegacyText(mineDown.toComponent())); + } + @Override public void info(@NotNull String message) { logger.info(message); diff --git a/common/src/main/java/net/william278/husksync/command/EnderChestCommand.java b/common/src/main/java/net/william278/husksync/command/EnderChestCommand.java index 8fa45b5a..16aa8e7a 100644 --- a/common/src/main/java/net/william278/husksync/command/EnderChestCommand.java +++ b/common/src/main/java/net/william278/husksync/command/EnderChestCommand.java @@ -73,15 +73,15 @@ public class EnderChestCommand extends CommandBase implements TabCompletable { enderChestDataOnClose, data.getPotionEffectsData(), data.getAdvancementData(), data.getStatisticsData(), data.getLocationData(), data.getPersistentDataContainerData(), - plugin.getMinecraftVersion().getWithoutMeta()); - plugin.getDatabase().setUserData(dataOwner, updatedUserData, DataSaveCause.ENDER_CHEST_COMMAND_EDIT).join(); + plugin.getMinecraftVersion().toString()); + plugin.getDatabase().setUserData(dataOwner, updatedUserData, DataSaveCause.ENDERCHEST_COMMAND).join(); plugin.getRedisManager().sendUserDataUpdate(dataOwner, updatedUserData).join(); }); } @Override - public List onTabComplete(@NotNull OnlineUser player, @NotNull String[] args) { + public List onTabComplete(@NotNull String[] args) { return plugin.getOnlineUsers().stream().map(user -> user.username) .filter(argument -> argument.startsWith(args.length >= 1 ? args[0] : "")) .sorted().collect(Collectors.toList()); diff --git a/common/src/main/java/net/william278/husksync/command/HuskSyncCommand.java b/common/src/main/java/net/william278/husksync/command/HuskSyncCommand.java index c83dc3b8..59817690 100644 --- a/common/src/main/java/net/william278/husksync/command/HuskSyncCommand.java +++ b/common/src/main/java/net/william278/husksync/command/HuskSyncCommand.java @@ -16,7 +16,7 @@ import java.util.stream.Collectors; public class HuskSyncCommand extends CommandBase implements TabCompletable, ConsoleExecutable { - private final String[] COMMAND_ARGUMENTS = {"update", "about", "reload"}; + private final String[] COMMAND_ARGUMENTS = {"update", "about", "reload", "migrate"}; public HuskSyncCommand(@NotNull HuskSync implementor) { super("husksync", Permission.COMMAND_HUSKSYNC, implementor); @@ -37,11 +37,11 @@ public class HuskSyncCommand extends CommandBase implements TabCompletable, Cons final UpdateChecker updateChecker = new UpdateChecker(plugin.getPluginVersion(), plugin.getLoggingAdapter()); updateChecker.fetchLatestVersion().thenAccept(latestVersion -> { if (updateChecker.isUpdateAvailable(latestVersion)) { - player.sendMessage(new MineDown("[HuskSync](#00fb9a bold) [| A new update is available:](#00fb9a) [HuskSync " + updateChecker.fetchLatestVersion() + "](#00fb9a bold)" + + player.sendMessage(new MineDown("[HuskSync](#00fb9a bold) [| A new update is available:](#00fb9a) [HuskSync " + latestVersion + "](#00fb9a bold)" + "[•](white) [Currently running:](#00fb9a) [Version " + updateChecker.getCurrentVersion() + "](gray)" + "[•](white) [Download links:](#00fb9a) [[⏩ Spigot]](gray open_url=https://www.spigotmc.org/resources/husksync.97144/updates) [•](#262626) [[⏩ Polymart]](gray open_url=https://polymart.org/resource/husksync.1634/updates) [•](#262626) [[⏩ Songoda]](gray open_url=https://songoda.com/marketplace/product/husksync-a-modern-cross-server-player-data-synchronization-system.758)")); } else { - player.sendMessage(new MineDown("[HuskSync](#00fb9a bold) [| HuskSync is up-to-date, running version " + latestVersion + "](#00fb9a)")); + player.sendMessage(new MineDown("[HuskSync](#00fb9a bold) [| HuskSync is up-to-date, running version " + updateChecker.getCurrentVersion() + "](#00fb9a)")); } }); } @@ -71,8 +71,8 @@ public class HuskSyncCommand extends CommandBase implements TabCompletable, Cons switch (args[0].toLowerCase()) { case "update", "version" -> new UpdateChecker(plugin.getPluginVersion(), plugin.getLoggingAdapter()).logToConsole(); - case "info", "about" -> plugin.getLoggingAdapter().log(Level.INFO, plugin.getLocales().stripMineDown( - Locales.PLUGIN_INFORMATION.replace("%version%", plugin.getPluginVersion().toString()))); + case "info", "about" -> plugin.getLoggingAdapter().log(Level.INFO, new MineDown(plugin.getLocales().stripMineDown( + Locales.PLUGIN_INFORMATION.replace("%version%", plugin.getPluginVersion().toString())))); case "reload" -> { plugin.reload(); plugin.getLoggingAdapter().log(Level.INFO, "Reloaded config & message files."); @@ -118,7 +118,7 @@ public class HuskSyncCommand extends CommandBase implements TabCompletable, Cons } @Override - public List onTabComplete(@NotNull OnlineUser player, @NotNull String[] args) { + public List onTabComplete(@NotNull String[] args) { return Arrays.stream(COMMAND_ARGUMENTS) .filter(argument -> argument.startsWith(args.length >= 1 ? args[0] : "")) .sorted().collect(Collectors.toList()); diff --git a/common/src/main/java/net/william278/husksync/command/InventoryCommand.java b/common/src/main/java/net/william278/husksync/command/InventoryCommand.java index 3df178be..78ea60c1 100644 --- a/common/src/main/java/net/william278/husksync/command/InventoryCommand.java +++ b/common/src/main/java/net/william278/husksync/command/InventoryCommand.java @@ -73,14 +73,14 @@ public class InventoryCommand extends CommandBase implements TabCompletable { data.getEnderChestData(), data.getPotionEffectsData(), data.getAdvancementData(), data.getStatisticsData(), data.getLocationData(), data.getPersistentDataContainerData(), - plugin.getMinecraftVersion().getWithoutMeta()); - plugin.getDatabase().setUserData(dataOwner, updatedUserData, DataSaveCause.INVENTORY_COMMAND_EDIT).join(); + plugin.getMinecraftVersion().toString()); + plugin.getDatabase().setUserData(dataOwner, updatedUserData, DataSaveCause.INVENTORY_COMMAND).join(); plugin.getRedisManager().sendUserDataUpdate(dataOwner, updatedUserData).join(); }); } @Override - public List onTabComplete(@NotNull OnlineUser player, @NotNull String[] args) { + public List onTabComplete(@NotNull String[] args) { return plugin.getOnlineUsers().stream().map(user -> user.username) .filter(argument -> argument.startsWith(args.length >= 1 ? args[0] : "")) .sorted().collect(Collectors.toList()); diff --git a/common/src/main/java/net/william278/husksync/command/TabCompletable.java b/common/src/main/java/net/william278/husksync/command/TabCompletable.java index 6aca66fc..66519ba3 100644 --- a/common/src/main/java/net/william278/husksync/command/TabCompletable.java +++ b/common/src/main/java/net/william278/husksync/command/TabCompletable.java @@ -1,6 +1,5 @@ package net.william278.husksync.command; -import net.william278.husksync.player.OnlineUser; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -11,12 +10,11 @@ import java.util.List; public interface TabCompletable { /** - * What should be returned when the player attempts to TAB-complete the command + * What should be returned when the player or console attempts to TAB-complete a command * - * @param player {@link OnlineUser} doing the TAB completion - * @param args Current command arguments + * @param args Current command argumentsrf * @return List of String arguments to offer TAB suggestions */ - List onTabComplete(@NotNull OnlineUser player, @NotNull String[] args); + List onTabComplete(@NotNull String[] args); } diff --git a/common/src/main/java/net/william278/husksync/command/UserDataCommand.java b/common/src/main/java/net/william278/husksync/command/UserDataCommand.java index f8cce605..50229276 100644 --- a/common/src/main/java/net/william278/husksync/command/UserDataCommand.java +++ b/common/src/main/java/net/william278/husksync/command/UserDataCommand.java @@ -205,7 +205,7 @@ public class UserDataCommand extends CommandBase implements TabCompletable { } @Override - public List onTabComplete(@NotNull OnlineUser player, @NotNull String[] args) { + public List onTabComplete(@NotNull String[] args) { switch (args.length) { case 0, 1 -> { return Arrays.stream(COMMAND_ARGUMENTS) diff --git a/common/src/main/java/net/william278/husksync/config/Locales.java b/common/src/main/java/net/william278/husksync/config/Locales.java index 5744188a..7fe3f978 100644 --- a/common/src/main/java/net/william278/husksync/config/Locales.java +++ b/common/src/main/java/net/william278/husksync/config/Locales.java @@ -20,9 +20,9 @@ public class Locales { [• Author:](white) [William278](gray show_text=&7Click to visit website open_url=https://william278.net) [• Contributors:](white) [HarvelsX](gray show_text=&7Code) [• Translators:](white) [Namiu](gray show_text=&7\\(うにたろう\\) - Japanese, ja-jp), [anchelthe](gray show_text=&7Spanish, es-es), [Ceddix](gray show_text=&7German, de-de), [小蔡](gray show_text=&7Traditional Chinese, zh-tw), [Ghost-chu](gray show_text=&7Simplified Chinese, zh-cn), [Thourgard](gray show_text=&7Ukrainian, uk-ua) - [• Plugin Info:](white) [[Link]](#00fb9a show_text=&7Click to open link open_url=https://github.com/WiIIiam278/HuskSync/) - [• Report Issues:](white) [[Link]](#00fb9a show_text=&7Click to open link open_url=https://github.com/WiIIiam278/HuskSync/issues) - [• Support Discord:](white) [[Link]](#00fb9a show_text=&7Click to join open_url=https://discord.gg/tVYhJfyDWG)"""; + [• Documentation:](white) [[Link]](#00fb9a show_text=&7Click to open link open_url=https://william278.net/docs/husksync/Home/) + [• Bug reporting:](white) [[Link]](#00fb9a show_text=&7Click to open link open_url=https://github.com/WiIIiam278/HuskSync/issues) + [• Discord support:](white) [[Link]](#00fb9a show_text=&7Click to join open_url=https://discord.gg/tVYhJfyDWG)"""; @NotNull private final HashMap rawLocales; diff --git a/common/src/main/java/net/william278/husksync/data/DataSaveCause.java b/common/src/main/java/net/william278/husksync/data/DataSaveCause.java index ac2ce0b4..2a99fe82 100644 --- a/common/src/main/java/net/william278/husksync/data/DataSaveCause.java +++ b/common/src/main/java/net/william278/husksync/data/DataSaveCause.java @@ -37,13 +37,13 @@ public enum DataSaveCause { * * @since 2.0 */ - INVENTORY_COMMAND_EDIT, + INVENTORY_COMMAND, /** * Indicates data was saved by editing Ender Chest contents via the {@code /enderchest} command * * @since 2.0 */ - ENDER_CHEST_COMMAND_EDIT, + ENDERCHEST_COMMAND, /** * Indicates data was saved by restoring it from a previous version * diff --git a/common/src/main/java/net/william278/husksync/player/OnlineUser.java b/common/src/main/java/net/william278/husksync/player/OnlineUser.java index 4404216a..4daed578 100644 --- a/common/src/main/java/net/william278/husksync/player/OnlineUser.java +++ b/common/src/main/java/net/william278/husksync/player/OnlineUser.java @@ -268,7 +268,7 @@ public abstract class OnlineUser extends User { () -> new UserData(getStatus().join(), getInventory().join(), getEnderChest().join(), getPotionEffects().join(), getAdvancements().join(), getStatistics().join(), getLocation().join(), getPersistentDataContainer().join(), - getMinecraftVersion().getWithoutMeta())); + getMinecraftVersion().toString())); } } diff --git a/common/src/main/java/net/william278/husksync/util/Logger.java b/common/src/main/java/net/william278/husksync/util/Logger.java index d13546cc..05fd74b1 100644 --- a/common/src/main/java/net/william278/husksync/util/Logger.java +++ b/common/src/main/java/net/william278/husksync/util/Logger.java @@ -1,5 +1,6 @@ package net.william278.husksync.util; +import de.themoep.minedown.MineDown; import org.jetbrains.annotations.NotNull; import java.util.logging.Level; @@ -15,6 +16,8 @@ public abstract class Logger { public abstract void log(@NotNull Level level, @NotNull String message); + public abstract void log(@NotNull Level level, @NotNull MineDown mineDown); + public abstract void info(@NotNull String message); public abstract void severe(@NotNull String message); diff --git a/common/src/main/java/net/william278/husksync/util/Version.java b/common/src/main/java/net/william278/husksync/util/Version.java index 55e1317c..d93cc8e8 100644 --- a/common/src/main/java/net/william278/husksync/util/Version.java +++ b/common/src/main/java/net/william278/husksync/util/Version.java @@ -65,20 +65,7 @@ public class Version implements Comparable { for (int version : this.versions) { joiner.add(String.valueOf(version)); } - return joiner + this.metaSeparator + this.metadata; + return joiner + ((!this.metadata.isEmpty()) ? (this.metaSeparator + this.metadata) : ""); } - @NotNull - public String getWithoutMeta() { - final StringJoiner joiner = new StringJoiner(VERSION_SEPARATOR); - for (int version : this.versions) { - joiner.add(String.valueOf(version)); - } - return joiner.toString(); - } - - @NotNull - public String getMetadata() { - return this.metadata; - } } diff --git a/common/src/test/java/net/william278/husksync/data/DataAdaptionTests.java b/common/src/test/java/net/william278/husksync/data/DataAdaptionTests.java index dd2e5c76..a9c6c11f 100644 --- a/common/src/test/java/net/william278/husksync/data/DataAdaptionTests.java +++ b/common/src/test/java/net/william278/husksync/data/DataAdaptionTests.java @@ -45,7 +45,7 @@ public class DataAdaptionTests { final DataAdapter dataAdapter = new JsonDataAdapter(); final byte[] data = dataAdapter.toBytes(dummyUserData); final String json = new String(data, StandardCharsets.UTF_8); - final String expectedJson = "{\"status\":{\"health\":20.0,\"max_health\":20.0,\"health_scale\":0.0,\"hunger\":20,\"saturation\":5.0,\"saturation_exhaustion\":5.0,\"selected_item_slot\":1,\"total_experience\":100,\"experience_level\":1,\"experience_progress\":1.0,\"game_mode\":\"SURVIVAL\",\"is_flying\":false},\"inventory\":{\"serialized_items\":\"\"},\"ender_chest\":{\"serialized_items\":\"\"},\"potion_effects\":{\"serialized_potion_effects\":\"\"},\"advancements\":[],\"statistics\":{\"untyped_statistics\":{},\"block_statistics\":{},\"item_statistics\":{},\"entity_statistics\":{}},\"location\":{\"world_name\":\"dummy_world\",\"world_uuid\":\"00000000-0000-0000-0000-000000000000\",\"world_environment\":\"NORMAL\",\"x\":0.0,\"y\":64.0,\"z\":0.0,\"yaw\":90.0,\"pitch\":180.0},\"persistent_data_container\":{\"persistent_data_map\":{}},\"format_version\":1}"; + final String expectedJson = "{\"status\":{\"health\":20.0,\"max_health\":20.0,\"health_scale\":0.0,\"hunger\":20,\"saturation\":5.0,\"saturation_exhaustion\":5.0,\"selected_item_slot\":1,\"total_experience\":100,\"experience_level\":1,\"experience_progress\":1.0,\"game_mode\":\"SURVIVAL\",\"is_flying\":false},\"inventory\":{\"serialized_items\":\"\"},\"ender_chest\":{\"serialized_items\":\"\"},\"potion_effects\":{\"serialized_potion_effects\":\"\"},\"advancements\":[],\"statistics\":{\"untyped_statistics\":{},\"block_statistics\":{},\"item_statistics\":{},\"entity_statistics\":{}},\"location\":{\"world_name\":\"dummy_world\",\"world_uuid\":\"00000000-0000-0000-0000-000000000000\",\"world_environment\":\"NORMAL\",\"x\":0.0,\"y\":64.0,\"z\":0.0,\"yaw\":90.0,\"pitch\":180.0},\"persistent_data_container\":{\"persistent_data_map\":{}},\"minecraft_version\":\"1.19-beta123456\",\"format_version\":1}"; Assertions.assertEquals(expectedJson, json); } diff --git a/common/src/test/java/net/william278/husksync/player/DummyPlayer.java b/common/src/test/java/net/william278/husksync/player/DummyPlayer.java index 1365a4f4..5ba1eba8 100644 --- a/common/src/test/java/net/william278/husksync/player/DummyPlayer.java +++ b/common/src/test/java/net/william278/husksync/player/DummyPlayer.java @@ -3,6 +3,7 @@ package net.william278.husksync.player; import de.themoep.minedown.MineDown; import net.william278.husksync.data.*; import net.william278.husksync.editor.ItemEditorMenu; +import net.william278.husksync.util.Version; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -133,6 +134,12 @@ public class DummyPlayer extends OnlineUser { return false; } + @NotNull + @Override + public Version getMinecraftVersion() { + return Version.minecraftVersion("1.19-beta123456"); + } + @Override public void sendMessage(@NotNull MineDown mineDown) { // do nothing