From fd1064754670b45cab91c1b754722d62ee9da7de Mon Sep 17 00:00:00 2001 From: Ka0rX Date: Tue, 26 Jul 2022 10:25:10 +0200 Subject: [PATCH] Creatin of /mmocore transferdata to transfer sql data to yml and yml to sql --- .../java/net/Indyuce/mmocore/MMOCore.java | 5 +- .../mmocore/api/player/PlayerData.java | 3 +- .../command/MMOCoreCommandTreeRoot.java | 2 + .../command/rpg/TransferDataTreeNode.java | 71 +++++++++++++++++++ .../data/mysql/MySQLPlayerDataManager.java | 6 +- .../manager/data/mysql/MySQLTableEditor.java | 7 +- 6 files changed, 84 insertions(+), 10 deletions(-) create mode 100644 src/main/java/net/Indyuce/mmocore/command/rpg/TransferDataTreeNode.java diff --git a/src/main/java/net/Indyuce/mmocore/MMOCore.java b/src/main/java/net/Indyuce/mmocore/MMOCore.java index 267de06e..2c8e784f 100644 --- a/src/main/java/net/Indyuce/mmocore/MMOCore.java +++ b/src/main/java/net/Indyuce/mmocore/MMOCore.java @@ -374,9 +374,8 @@ public class MMOCore extends JavaPlugin { }.runTaskTimerAsynchronously(MMOCore.plugin, autosave, autosave); } } - - public void disable() { - + @Override + public void onDisable() { // Save player data for (PlayerData data : PlayerData.getAll()) if (data.isFullyLoaded()) { diff --git a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java index c98a805e..cc8bb1e0 100644 --- a/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java +++ b/src/main/java/net/Indyuce/mmocore/api/player/PlayerData.java @@ -514,9 +514,8 @@ public class PlayerData extends OfflinePlayerData implements Closable, Experienc public String toJson() { - //We create the JSON correspondign to player Data + //We create the JSON corresponding to player Data JsonObject jsonObject = new JsonObject(); - MySQLTableEditor sql = new MySQLTableEditor(MySQLTableEditor.Table.PLAYERDATA, getUniqueId()); MMOCore.sqlDebug("Saving data for: '" + getUniqueId() + "'..."); jsonObject.addProperty("class_points", getClassPoints()); diff --git a/src/main/java/net/Indyuce/mmocore/command/MMOCoreCommandTreeRoot.java b/src/main/java/net/Indyuce/mmocore/command/MMOCoreCommandTreeRoot.java index dcefd387..11466232 100644 --- a/src/main/java/net/Indyuce/mmocore/command/MMOCoreCommandTreeRoot.java +++ b/src/main/java/net/Indyuce/mmocore/command/MMOCoreCommandTreeRoot.java @@ -6,6 +6,7 @@ import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.command.rpg.CoinsCommandTreeNode; import net.Indyuce.mmocore.command.rpg.NoteCommandTreeNode; import net.Indyuce.mmocore.command.rpg.ReloadCommandTreeNode; +import net.Indyuce.mmocore.command.rpg.TransferDataTreeNode; import net.Indyuce.mmocore.command.rpg.admin.AdminCommandTreeNode; import net.Indyuce.mmocore.command.rpg.booster.BoosterCommandTreeNode; import net.Indyuce.mmocore.command.rpg.debug.DebugCommandTreeNode; @@ -26,6 +27,7 @@ public class MMOCoreCommandTreeRoot extends CommandTreeRoot implements CommandEx super("mmocore", "mmocore.admin"); addChild(new ReloadCommandTreeNode(this)); + addChild(new TransferDataTreeNode(this)); addChild(new CoinsCommandTreeNode(this)); addChild(new NoteCommandTreeNode(this)); addChild(new AdminCommandTreeNode(this)); diff --git a/src/main/java/net/Indyuce/mmocore/command/rpg/TransferDataTreeNode.java b/src/main/java/net/Indyuce/mmocore/command/rpg/TransferDataTreeNode.java new file mode 100644 index 00000000..e7d8f9ad --- /dev/null +++ b/src/main/java/net/Indyuce/mmocore/command/rpg/TransferDataTreeNode.java @@ -0,0 +1,71 @@ +package net.Indyuce.mmocore.command.rpg; + +import io.lumine.mythic.lib.command.api.CommandTreeNode; +import net.Indyuce.mmocore.MMOCore; +import net.Indyuce.mmocore.api.player.PlayerData; +import net.Indyuce.mmocore.guild.provided.Guild; +import net.Indyuce.mmocore.manager.data.DataProvider; +import net.Indyuce.mmocore.manager.data.mysql.MySQLDataProvider; +import net.Indyuce.mmocore.manager.data.yaml.YAMLDataProvider; +import org.bukkit.command.CommandSender; +import org.bukkit.scheduler.BukkitRunnable; + + +/** + * This command allows to transfer data from your actual datatype (yaml or sql) to the other one to make a change + * in the data storage type. + */ +public class TransferDataTreeNode extends CommandTreeNode { + + + public TransferDataTreeNode(CommandTreeNode parent) { + super(parent, "transferdata"); + } + + @Override + public CommandResult execute(CommandSender commandSender, String[] strings) { + DataProvider provider=null; + + try { + + if (MMOCore.plugin.dataProvider instanceof YAMLDataProvider) { + provider = new MySQLDataProvider(MMOCore.plugin.getConfig()); + ((MySQLDataProvider) provider).load(); + } else { + provider = new YAMLDataProvider(); + } + + // Save player data + for (PlayerData data : PlayerData.getAll()) + if (data.isFullyLoaded()) + provider.getDataManager().saveData(data); + + // Save guild info + for (Guild guild : provider.getGuildManager().getAll()) + provider.getGuildManager().save(guild); + } catch (Exception e) { + commandSender.sendMessage("Couldn't transfer properly the data."); + e.printStackTrace(); + if(provider!=null&&provider instanceof MySQLDataProvider) { + ((MySQLDataProvider) provider).close(); + } + return CommandResult.FAILURE; + } + DataProvider finalProvider = provider; + + //We close the connection 10 s later to avoid memory leaks. + new BukkitRunnable() { + + @Override + public void run() { + if(finalProvider !=null&& finalProvider instanceof MySQLDataProvider) { + ((MySQLDataProvider) finalProvider).close(); + } + } + }.runTaskLater(MMOCore.plugin,200); + + + return CommandResult.SUCCESS; + + } +} diff --git a/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java b/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java index 34432b56..d9c696eb 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java +++ b/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLPlayerDataManager.java @@ -110,7 +110,7 @@ public class MySQLPlayerDataManager extends PlayerDataManager { } //We now change the saved status to false because the data on SQL won't be the same as in the RAM - MySQLTableEditor sql = new MySQLTableEditor(MySQLTableEditor.Table.PLAYERDATA, data.getUniqueId()); + MySQLTableEditor sql = new MySQLTableEditor(MySQLTableEditor.Table.PLAYERDATA, data.getUniqueId(),provider); //We set the saved status to false sql.updateData("is_saved", 0); @@ -155,7 +155,7 @@ public class MySQLPlayerDataManager extends PlayerDataManager { @Override public void saveData(PlayerData data) { - MySQLTableEditor sql = new MySQLTableEditor(MySQLTableEditor.Table.PLAYERDATA, data.getUniqueId()); + MySQLTableEditor sql = new MySQLTableEditor(MySQLTableEditor.Table.PLAYERDATA, data.getUniqueId(),provider); MMOCore.sqlDebug("Saving data for: '" + data.getUniqueId() + "'..."); sql.updateData("class_points", data.getClassPoints()); @@ -232,7 +232,7 @@ public class MySQLPlayerDataManager extends PlayerDataManager { @Override public void removeFriend(UUID uuid) { friends.remove(uuid); - new MySQLTableEditor(MySQLTableEditor.Table.PLAYERDATA, uuid).updateData("friends", friends.stream().map(UUID::toString).collect(Collectors.toList())); + new MySQLTableEditor(MySQLTableEditor.Table.PLAYERDATA, uuid,provider).updateData("friends", friends.stream().map(UUID::toString).collect(Collectors.toList())); } @Override diff --git a/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLTableEditor.java b/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLTableEditor.java index 8f5cbea7..16f387ac 100644 --- a/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLTableEditor.java +++ b/src/main/java/net/Indyuce/mmocore/manager/data/mysql/MySQLTableEditor.java @@ -14,13 +14,16 @@ public class MySQLTableEditor { private final Table table; private final UUID uuid; - public MySQLTableEditor(Table table, UUID uuid) { + private final MySQLDataProvider provider; + + public MySQLTableEditor(Table table, UUID uuid,MySQLDataProvider provider) { this.table = table; this.uuid = uuid; + this.provider=provider; } public void updateData(String key, Object value) { - ((MySQLDataProvider) MMOCore.plugin.dataProvider).executeUpdate("INSERT INTO " + table + "(uuid, " + key + provider.executeUpdate("INSERT INTO " + table + "(uuid, " + key + ") VALUES('" + uuid + "', '" + value + "') ON DUPLICATE KEY UPDATE " + key + "='" + value + "';"); }