From d600c20cd5d600520274fc20f4093d71e70e48cb Mon Sep 17 00:00:00 2001 From: HarvelsX Date: Sun, 19 Dec 2021 18:16:41 +0300 Subject: [PATCH] Revert "Remove use MPDB & internal migrator;" --- bukkit/build.gradle | 1 + .../william278/husksync/HuskSyncBukkit.java | 16 ++- .../bukkit/migrator/MPDBDeserializer.java | 100 ++++++++++++++++++ .../husksync/migrator/MPDBPlayerData.java | 35 ++++++ 4 files changed, 149 insertions(+), 3 deletions(-) create mode 100644 bukkit/src/main/java/me/william278/husksync/bukkit/migrator/MPDBDeserializer.java create mode 100644 common/src/main/java/me/william278/husksync/migrator/MPDBPlayerData.java diff --git a/bukkit/build.gradle b/bukkit/build.gradle index 72b29d5d..b6858d4c 100644 --- a/bukkit/build.gradle +++ b/bukkit/build.gradle @@ -7,6 +7,7 @@ dependencies { implementation 'org.bstats:bstats-bukkit:2.2.1' implementation 'de.themoep:minedown:1.7.1-SNAPSHOT' + compileOnly 'net.craftersland.data:bridge:4.0.1' compileOnly 'org.spigotmc:spigot-api:1.16.5-R0.1-SNAPSHOT' } diff --git a/bukkit/src/main/java/me/william278/husksync/HuskSyncBukkit.java b/bukkit/src/main/java/me/william278/husksync/HuskSyncBukkit.java index a61cec74..a654e082 100644 --- a/bukkit/src/main/java/me/william278/husksync/HuskSyncBukkit.java +++ b/bukkit/src/main/java/me/william278/husksync/HuskSyncBukkit.java @@ -1,15 +1,17 @@ package me.william278.husksync; +import me.william278.husksync.bukkit.util.BukkitUpdateChecker; +import me.william278.husksync.bukkit.util.PlayerSetter; import me.william278.husksync.bukkit.config.ConfigLoader; import me.william278.husksync.bukkit.data.BukkitDataCache; -import me.william278.husksync.bukkit.listener.BukkitEventListener; import me.william278.husksync.bukkit.listener.BukkitRedisListener; -import me.william278.husksync.bukkit.util.BukkitUpdateChecker; -import me.william278.husksync.bukkit.util.PlayerSetter; +import me.william278.husksync.bukkit.listener.BukkitEventListener; +import me.william278.husksync.bukkit.migrator.MPDBDeserializer; import me.william278.husksync.redis.RedisMessage; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitTask; @@ -102,6 +104,14 @@ public final class HuskSyncBukkit extends JavaPlugin { new BukkitUpdateChecker().logToConsole(); } + // Check if MySqlPlayerDataBridge is installed + Plugin mySqlPlayerDataBridge = Bukkit.getPluginManager().getPlugin("MySqlPlayerDataBridge"); + if (mySqlPlayerDataBridge != null) { + isMySqlPlayerDataBridgeInstalled = mySqlPlayerDataBridge.isEnabled(); + MPDBDeserializer.setMySqlPlayerDataBridge(); + getLogger().info("MySQLPlayerDataBridge detected! Disabled data synchronisation to prevent data loss. To perform a migration, run \"husksync migrate\" in your Proxy (Bungeecord, Waterfall, etc) server console."); + } + // Initialize last data update UUID cache bukkitCache = new BukkitDataCache(); diff --git a/bukkit/src/main/java/me/william278/husksync/bukkit/migrator/MPDBDeserializer.java b/bukkit/src/main/java/me/william278/husksync/bukkit/migrator/MPDBDeserializer.java new file mode 100644 index 00000000..f2709cf9 --- /dev/null +++ b/bukkit/src/main/java/me/william278/husksync/bukkit/migrator/MPDBDeserializer.java @@ -0,0 +1,100 @@ +package me.william278.husksync.bukkit.migrator; + +import me.william278.husksync.HuskSyncBukkit; +import me.william278.husksync.PlayerData; +import me.william278.husksync.bukkit.util.PlayerSetter; +import me.william278.husksync.bukkit.data.DataSerializer; +import me.william278.husksync.migrator.MPDBPlayerData; +import net.craftersland.data.bridge.PD; +import org.bukkit.Bukkit; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import java.lang.reflect.InvocationTargetException; +import java.util.logging.Level; + +public class MPDBDeserializer { + + private static final HuskSyncBukkit plugin = HuskSyncBukkit.getInstance(); + + // Instance of MySqlPlayerDataBridge + private static PD mySqlPlayerDataBridge; + + public static void setMySqlPlayerDataBridge() { + mySqlPlayerDataBridge = (PD) Bukkit.getPluginManager().getPlugin("MySqlPlayerDataBridge"); + } + + /** + * Convert MySqlPlayerDataBridge ({@link MPDBPlayerData}) data to HuskSync's {@link PlayerData} + * + * @param mpdbPlayerData The {@link MPDBPlayerData} to convert + * @return The converted {@link PlayerData} + */ + public static PlayerData convertMPDBData(MPDBPlayerData mpdbPlayerData) { + PlayerData playerData = PlayerData.DEFAULT_PLAYER_DATA(mpdbPlayerData.playerUUID); + playerData.useDefaultData = false; + if (!HuskSyncBukkit.isMySqlPlayerDataBridgeInstalled) { + plugin.getLogger().log(Level.SEVERE, "MySqlPlayerDataBridge is not installed, failed to serialize data!"); + return null; + } + + // Convert the data + try { + // Set inventory contents + Inventory inventory = Bukkit.createInventory(null, InventoryType.PLAYER); + if (!mpdbPlayerData.inventoryData.isEmpty() && !mpdbPlayerData.inventoryData.equalsIgnoreCase("none")) { + PlayerSetter.setInventory(inventory, getItemStackArrayFromMPDBBase64String(mpdbPlayerData.inventoryData)); + } + + // Set armor (if there is data; MPDB stores empty data with literally the word "none". Obviously.) + int armorSlot = 36; + if (!mpdbPlayerData.armorData.isEmpty() && !mpdbPlayerData.armorData.equalsIgnoreCase("none")) { + ItemStack[] armorItems = getItemStackArrayFromMPDBBase64String(mpdbPlayerData.armorData); + for (ItemStack armorPiece : armorItems) { + if (armorPiece != null) { + inventory.setItem(armorSlot, armorPiece); + } + armorSlot++; + } + + } + + // Now apply the contents and clear the temporary inventory variable + playerData.setSerializedInventory(DataSerializer.serializeInventory(inventory.getContents())); + + // Set ender chest (again, if there is data) + ItemStack[] enderChestData; + if (!mpdbPlayerData.enderChestData.isEmpty() && !mpdbPlayerData.enderChestData.equalsIgnoreCase("none")) { + enderChestData = getItemStackArrayFromMPDBBase64String(mpdbPlayerData.enderChestData); + } else { + enderChestData = new ItemStack[0]; + } + playerData.setSerializedEnderChest(DataSerializer.serializeInventory(enderChestData)); + + // Set experience + playerData.setExpLevel(mpdbPlayerData.expLevel); + playerData.setExpProgress(mpdbPlayerData.expProgress); + playerData.setTotalExperience(mpdbPlayerData.totalExperience); + } catch (Exception e) { + plugin.getLogger().log(Level.WARNING, "Failed to convert MPDB data to HuskSync's format!"); + e.printStackTrace(); + } + return playerData; + } + + /** + * Returns an ItemStack array from a decoded base 64 string in MySQLPlayerDataBridge's format + * + * @param data The encoded ItemStack[] string from MySQLPlayerDataBridge + * @return The {@link ItemStack[]} array + * @throws InvocationTargetException If an error occurs during decoding + * @throws IllegalAccessException If an error occurs during decoding + */ + public static ItemStack[] getItemStackArrayFromMPDBBase64String(String data) throws InvocationTargetException, IllegalAccessException { + if (data.isEmpty()) { + return new ItemStack[0]; + } + return mySqlPlayerDataBridge.getItemStackSerializer().fromBase64(data); + } +} diff --git a/common/src/main/java/me/william278/husksync/migrator/MPDBPlayerData.java b/common/src/main/java/me/william278/husksync/migrator/MPDBPlayerData.java new file mode 100644 index 00000000..2630edf1 --- /dev/null +++ b/common/src/main/java/me/william278/husksync/migrator/MPDBPlayerData.java @@ -0,0 +1,35 @@ +package me.william278.husksync.migrator; + +import java.io.Serializable; +import java.util.UUID; + +/** + * A class that stores player data taken from MPDB's database, that can then be converted into HuskSync's format + */ +public class MPDBPlayerData implements Serializable { + + /* + * Player information + */ + public final UUID playerUUID; + public final String playerName; + + /* + * Inventory, ender chest and armor data + */ + public String inventoryData; + public String armorData; + public String enderChestData; + + /* + * Experience data + */ + public int expLevel; + public float expProgress; + public int totalExperience; + + public MPDBPlayerData(UUID playerUUID, String playerName) { + this.playerUUID = playerUUID; + this.playerName = playerName; + } +}