diff --git a/bungeecord/src/main/java/me/william278/husksync/bungeecord/migrator/MPDBMigrator.java b/bungeecord/src/main/java/me/william278/husksync/bungeecord/migrator/MPDBMigrator.java
deleted file mode 100644
index 2f355d8e..00000000
--- a/bungeecord/src/main/java/me/william278/husksync/bungeecord/migrator/MPDBMigrator.java
+++ /dev/null
@@ -1,302 +0,0 @@
-package me.william278.husksync.bungeecord.migrator;
-
-import me.william278.husksync.HuskSyncBungeeCord;
-import me.william278.husksync.PlayerData;
-import me.william278.husksync.Server;
-import me.william278.husksync.Settings;
-import me.william278.husksync.migrator.MPDBPlayerData;
-import me.william278.husksync.proxy.data.sql.Database;
-import me.william278.husksync.proxy.data.sql.MySQL;
-import me.william278.husksync.redis.RedisMessage;
-import net.md_5.bungee.api.ProxyServer;
-
-import java.io.IOException;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.UUID;
-import java.util.logging.Level;
-
-/**
- * Class to handle migration of data from MySQLPlayerDataBridge
- *
- * The migrator accesses and decodes MPDB's format directly,
- * by communicating with a Spigot server
- */
-public class MPDBMigrator {
-
- public static int migratedDataSent = 0;
- public static int playersMigrated = 0;
-
- private static final HuskSyncBungeeCord plugin = HuskSyncBungeeCord.getInstance();
-
- public static HashMap incomingPlayerData;
-
- public static MigrationSettings migrationSettings = new MigrationSettings();
- private static Settings.SynchronisationCluster targetCluster;
- private static Database sourceDatabase;
-
- private static HashSet mpdbPlayerData;
-
- public void start() {
- if (ProxyServer.getInstance().getPlayers().size() > 0) {
- plugin.getBungeeLogger().log(Level.WARNING, "Failed to start migration because there are players online. " +
- "Your network has to be empty to migrate data for safety reasons.");
- return;
- }
-
- int synchronisedServersWithMpdb = 0;
- for (Server server : HuskSyncBungeeCord.synchronisedServers) {
- if (server.hasMySqlPlayerDataBridge()) {
- synchronisedServersWithMpdb++;
- }
- }
- if (synchronisedServersWithMpdb < 1) {
- plugin.getBungeeLogger().log(Level.WARNING, "Failed to start migration because at least one Spigot server with both HuskSync and MySqlPlayerDataBridge installed is not online. " +
- "Please start one Spigot server with HuskSync installed to begin migration.");
- return;
- }
-
- for (Settings.SynchronisationCluster cluster : Settings.clusters) {
- if (migrationSettings.targetCluster.equals(cluster.clusterId())) {
- targetCluster = cluster;
- break;
- }
- }
- if (targetCluster == null) {
- plugin.getBungeeLogger().log(Level.WARNING, "Failed to start migration because the target cluster could not be found. " +
- "Please ensure the target cluster is correct, configured in the proxy config file, then try again");
- return;
- }
-
- migratedDataSent = 0;
- playersMigrated = 0;
- mpdbPlayerData = new HashSet<>();
- incomingPlayerData = new HashMap<>();
- final MigrationSettings settings = migrationSettings;
-
- // Get connection to source database
- sourceDatabase = new MigratorMySQL(plugin, settings.sourceHost, settings.sourcePort,
- settings.sourceDatabase, settings.sourceUsername, settings.sourcePassword, targetCluster);
- sourceDatabase.load();
- if (sourceDatabase.isInactive()) {
- plugin.getBungeeLogger().log(Level.WARNING, "Failed to establish connection to the origin MySQL database. " +
- "Please check you have input the correct connection details and try again.");
- return;
- }
-
- ProxyServer.getInstance().getScheduler().runAsync(plugin, () -> {
- prepareTargetDatabase();
-
- getInventoryData();
-
- getEnderChestData();
-
- getExperienceData();
-
- sendEncodedData();
- });
- }
-
- // Clear the new database out of current data
- private void prepareTargetDatabase() {
- plugin.getBungeeLogger().log(Level.INFO, "Preparing target database...");
- try (Connection connection = HuskSyncBungeeCord.dataManager.getConnection(targetCluster.clusterId())) {
- try (PreparedStatement statement = connection.prepareStatement("DELETE FROM " + targetCluster.playerTableName() + ";")) {
- statement.executeUpdate();
- }
- try (PreparedStatement statement = connection.prepareStatement("DELETE FROM " + targetCluster.dataTableName() + ";")) {
- statement.executeUpdate();
- }
- } catch (SQLException e) {
- plugin.getBungeeLogger().log(Level.SEVERE, "An exception occurred preparing the target database", e);
- } finally {
- plugin.getBungeeLogger().log(Level.INFO, "Finished preparing target database!");
- }
- }
-
- private void getInventoryData() {
- plugin.getBungeeLogger().log(Level.INFO, "Getting inventory data from MySQLPlayerDataBridge...");
- try (Connection connection = sourceDatabase.getConnection()) {
- try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM " + migrationSettings.inventoryDataTable + ";")) {
- ResultSet resultSet = statement.executeQuery();
- while (resultSet.next()) {
- final UUID playerUUID = UUID.fromString(resultSet.getString("player_uuid"));
- final String playerName = resultSet.getString("player_name");
-
- MPDBPlayerData data = new MPDBPlayerData(playerUUID, playerName);
- data.inventoryData = resultSet.getString("inventory");
- data.armorData = resultSet.getString("armor");
-
- mpdbPlayerData.add(data);
- }
- }
- } catch (SQLException e) {
- plugin.getBungeeLogger().log(Level.SEVERE, "An exception occurred getting inventory data", e);
- } finally {
- plugin.getBungeeLogger().log(Level.INFO, "Finished getting inventory data from MySQLPlayerDataBridge");
- }
- }
-
- private void getEnderChestData() {
- plugin.getBungeeLogger().log(Level.INFO, "Getting ender chest data from MySQLPlayerDataBridge...");
- try (Connection connection = sourceDatabase.getConnection()) {
- try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM " + migrationSettings.enderChestDataTable + ";")) {
- ResultSet resultSet = statement.executeQuery();
- while (resultSet.next()) {
- final UUID playerUUID = UUID.fromString(resultSet.getString("player_uuid"));
-
- for (MPDBPlayerData data : mpdbPlayerData) {
- if (data.playerUUID.equals(playerUUID)) {
- data.enderChestData = resultSet.getString("enderchest");
- break;
- }
- }
- }
- }
- } catch (SQLException e) {
- plugin.getBungeeLogger().log(Level.SEVERE, "An exception occurred getting ender chest data", e);
- } finally {
- plugin.getBungeeLogger().log(Level.INFO, "Finished getting ender chest data from MySQLPlayerDataBridge");
- }
- }
-
- private void getExperienceData() {
- plugin.getBungeeLogger().log(Level.INFO, "Getting experience data from MySQLPlayerDataBridge...");
- try (Connection connection = sourceDatabase.getConnection()) {
- try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM " + migrationSettings.expDataTable + ";")) {
- ResultSet resultSet = statement.executeQuery();
- while (resultSet.next()) {
- final UUID playerUUID = UUID.fromString(resultSet.getString("player_uuid"));
-
- for (MPDBPlayerData data : mpdbPlayerData) {
- if (data.playerUUID.equals(playerUUID)) {
- data.expLevel = resultSet.getInt("exp_lvl");
- data.expProgress = resultSet.getFloat("exp");
- data.totalExperience = resultSet.getInt("total_exp");
- break;
- }
- }
- }
- }
- } catch (SQLException e) {
- plugin.getBungeeLogger().log(Level.SEVERE, "An exception occurred getting experience data", e);
- } finally {
- plugin.getBungeeLogger().log(Level.INFO, "Finished getting experience data from MySQLPlayerDataBridge");
- }
- }
-
- private void sendEncodedData() {
- for (Server processingServer : HuskSyncBungeeCord.synchronisedServers) {
- if (processingServer.hasMySqlPlayerDataBridge()) {
- for (MPDBPlayerData data : mpdbPlayerData) {
- try {
- new RedisMessage(RedisMessage.MessageType.DECODE_MPDB_DATA,
- new RedisMessage.MessageTarget(Settings.ServerType.BUKKIT, null, null),
- processingServer.serverUUID().toString(),
- RedisMessage.serialize(data))
- .send();
- migratedDataSent++;
- } catch (IOException e) {
- plugin.getBungeeLogger().log(Level.SEVERE, "Failed to serialize encoded MPDB data", e);
- }
- }
- plugin.getBungeeLogger().log(Level.INFO, "Finished dispatching encoded data for " + migratedDataSent + " players; please wait for conversion to finish");
- }
- return;
- }
- }
-
- /**
- * Loads all incoming decoded MPDB data to the cache and database
- *
- * @param dataToLoad HashMap of the {@link PlayerData} to player Usernames that will be loaded
- */
- public static void loadIncomingData(HashMap dataToLoad) {
- ProxyServer.getInstance().getScheduler().runAsync(plugin, () -> {
- int playersSaved = 0;
- plugin.getBungeeLogger().log(Level.INFO, "Saving data for " + playersMigrated + " players...");
-
- for (PlayerData playerData : dataToLoad.keySet()) {
- String playerName = dataToLoad.get(playerData);
-
- // Add the player to the MySQL table
- HuskSyncBungeeCord.dataManager.ensurePlayerExists(playerData.getPlayerUUID(), playerName);
-
- // Update the data in the cache and SQL
- for (Settings.SynchronisationCluster cluster : Settings.clusters) {
- HuskSyncBungeeCord.dataManager.updatePlayerData(playerData, cluster);
- break;
- }
-
- playersSaved++;
- plugin.getBungeeLogger().log(Level.INFO, "Saved data for " + playersSaved + "/" + playersMigrated + " players");
- }
-
- // Mark as done when done
- plugin.getBungeeLogger().log(Level.INFO, """
- === MySQLPlayerDataBridge Migration Wizard ==========
-
- Migration complete!
-
- Successfully migrated data for %1%/%2% players.
-
- You should now uninstall MySQLPlayerDataBridge from
- the rest of the Spigot servers, then restart them.
- """.replaceAll("%1%", Integer.toString(MPDBMigrator.playersMigrated))
- .replaceAll("%2%", Integer.toString(MPDBMigrator.migratedDataSent)));
- sourceDatabase.close(); // Close source database
- });
- }
-
- /**
- * Class used to hold settings for the MPDB migration
- */
- public static class MigrationSettings {
- public String sourceHost;
- public int sourcePort;
- public String sourceDatabase;
- public String sourceUsername;
- public String sourcePassword;
-
- public String inventoryDataTable;
- public String enderChestDataTable;
- public String expDataTable;
-
- public String targetCluster;
-
- public MigrationSettings() {
- sourceHost = "localhost";
- sourcePort = 3306;
- sourceDatabase = "mpdb";
- sourceUsername = "root";
- sourcePassword = "pa55w0rd";
-
- targetCluster = "main";
-
- inventoryDataTable = "mpdb_inventory";
- enderChestDataTable = "mpdb_enderchest";
- expDataTable = "mpdb_experience";
- }
- }
-
- /**
- * MySQL class used for importing data from MPDB
- */
- public static class MigratorMySQL extends MySQL {
- public MigratorMySQL(HuskSyncBungeeCord instance, String host, int port, String database, String username, String password, Settings.SynchronisationCluster cluster) {
- super(cluster, instance.getBungeeLogger());
- super.host = host;
- super.port = port;
- super.database = database;
- super.username = username;
- super.password = password;
- super.params = "?useSSL=false";
- super.dataPoolName = super.dataPoolName + "Migrator";
- }
- }
-
-}
diff --git a/velocity/src/main/java/me/william278/husksync/velocity/command/HuskSyncCommand.java b/velocity/src/main/java/me/william278/husksync/velocity/command/HuskSyncCommand.java
deleted file mode 100644
index 1e21df94..00000000
--- a/velocity/src/main/java/me/william278/husksync/velocity/command/HuskSyncCommand.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package me.william278.husksync.velocity.command;
-
-import com.velocitypowered.api.command.CommandSource;
-import com.velocitypowered.api.command.SimpleCommand;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-
-public class HuskSyncCommand implements SimpleCommand {
-
- /**
- * Executes the command for the specified invocation.
- *
- * @param invocation the invocation context
- */
- @Override
- public void execute(Invocation invocation) {
- final String[] args = invocation.arguments();
- final CommandSource source = invocation.source();
-
- }
-
- /**
- * Provides tab complete suggestions for the specified invocation.
- *
- * @param invocation the invocation context
- * @return the tab complete suggestions
- */
- @Override
- public List suggest(Invocation invocation) {
- return new ArrayList<>();
- }
-}
\ No newline at end of file