diff options
| author | LMBishop <13875753+LMBishop@users.noreply.github.com> | 2022-04-22 17:41:20 +0100 |
|---|---|---|
| committer | LMBishop <13875753+LMBishop@users.noreply.github.com> | 2022-04-22 17:41:20 +0100 |
| commit | 43e647990b611205676bb42623a3814a904fe0e8 (patch) | |
| tree | b655eddd0c6046158124d2ac99a782a50dfbb39d /bukkit/src | |
| parent | 5258cbfaeb871b5d402a107f278e2de2f552dc41 (diff) | |
Make moddata commands IO async (closes #359)
Diffstat (limited to 'bukkit/src')
6 files changed, 112 insertions, 77 deletions
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataCompleteCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataCompleteCommandHandler.java index 48265aad..feb11925 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataCompleteCommandHandler.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataCompleteCommandHandler.java @@ -25,21 +25,19 @@ public class AdminModdataCompleteCommandHandler implements CommandHandler { @Override public void handle(CommandSender sender, String[] args) { if (args.length > 4) { - QPlayer qPlayer = CommandUtils.getOtherPlayer(sender, args[3], plugin); - if (qPlayer == null) return; - QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); Quest quest = plugin.getQuestManager().getQuestById(args[4]); if (quest == null) { Messages.COMMAND_QUEST_START_DOESNTEXIST.send(sender, "{quest}", args[4]); return; } - qPlayer.completeQuest(quest); - plugin.getPlayerManager().savePlayerSync(qPlayer.getPlayerUUID(), questProgressFile); - Messages.COMMAND_QUEST_ADMIN_COMPLETE_SUCCESS.send(sender, "{player}", args[3], "{quest}", quest.getId()); - if (Bukkit.getPlayer(qPlayer.getPlayerUUID()) == null) { - plugin.getPlayerManager().dropPlayer(qPlayer.getPlayerUUID()); - } + CommandUtils.useOtherPlayer(sender, args[3], plugin, (qPlayer) -> { + QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); + qPlayer.completeQuest(quest); + Messages.COMMAND_QUEST_ADMIN_COMPLETE_SUCCESS.send(sender, "{player}", args[3], "{quest}", quest.getId()); + + CommandUtils.doSafeSave(qPlayer, questProgressFile, plugin); + }); return; } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataFullresetCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataFullresetCommandHandler.java index de57b0aa..1d908823 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataFullresetCommandHandler.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataFullresetCommandHandler.java @@ -24,19 +24,14 @@ public class AdminModdataFullresetCommandHandler implements CommandHandler { @Override public void handle(CommandSender sender, String[] args) { if (args.length > 3) { - QPlayer qPlayer = CommandUtils.getOtherPlayer(sender, args[3], plugin); - if (qPlayer == null) return; - QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); - questProgressFile.reset(); - plugin.getPlayerManager().savePlayerSync(qPlayer.getPlayerUUID(), questProgressFile); - if (Bukkit.getPlayer(qPlayer.getPlayerUUID()) == null) { - plugin.getPlayerManager().dropPlayer(qPlayer.getPlayerUUID()); - } - Messages.COMMAND_QUEST_ADMIN_FULLRESET.send(sender, "{player}", args[3]); + CommandUtils.useOtherPlayer(sender, args[3], plugin, (qPlayer) -> { + QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); + questProgressFile.reset(); + Messages.COMMAND_QUEST_ADMIN_FULLRESET.send(sender, "{player}", args[3]); + + CommandUtils.doSafeSave(qPlayer, questProgressFile, plugin); + }); - if (Bukkit.getPlayer(qPlayer.getPlayerUUID()) == null) { - plugin.getPlayerManager().dropPlayer(qPlayer.getPlayerUUID()); - } return; } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataRandomCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataRandomCommandHandler.java index df871c04..bec1cdbe 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataRandomCommandHandler.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataRandomCommandHandler.java @@ -29,63 +29,59 @@ public class AdminModdataRandomCommandHandler implements CommandHandler { @Override public void handle(CommandSender sender, String[] args) { if (args.length >= 4) { - QPlayer qPlayer = CommandUtils.getOtherPlayer(sender, args[3], plugin); - if (qPlayer == null) return; - QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); + CommandUtils.useOtherPlayer(sender, args[3], plugin, (qPlayer) -> { + QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); - List<Quest> validQuests = new ArrayList<>(); - boolean fromCategory = args.length != 4; - if (!fromCategory) { - for (Quest quest : plugin.getQuestManager().getQuests().values()) { - if (qPlayer.canStartQuest(quest) == QuestStartResult.QUEST_SUCCESS) { - validQuests.add(quest); - } - } - } else { - Category category = plugin.getQuestManager().getCategoryById(args[4]); - if (category == null) { - Messages.COMMAND_CATEGORY_OPEN_DOESNTEXIST.send(sender, "{category}", args[1]); - } else { - for (String questId : category.getRegisteredQuestIds()) { - Quest quest = plugin.getQuestManager().getQuestById(questId); - if (quest == null) continue; + List<Quest> validQuests = new ArrayList<>(); + boolean fromCategory = args.length != 4; + if (!fromCategory) { + for (Quest quest : plugin.getQuestManager().getQuests().values()) { if (qPlayer.canStartQuest(quest) == QuestStartResult.QUEST_SUCCESS) { validQuests.add(quest); } } + } else { + Category category = plugin.getQuestManager().getCategoryById(args[4]); + if (category == null) { + Messages.COMMAND_CATEGORY_OPEN_DOESNTEXIST.send(sender, "{category}", args[1]); + } else { + for (String questId : category.getRegisteredQuestIds()) { + Quest quest = plugin.getQuestManager().getQuestById(questId); + if (quest == null) continue; + if (qPlayer.canStartQuest(quest) == QuestStartResult.QUEST_SUCCESS) { + validQuests.add(quest); + } + } + } } - } - if (validQuests.isEmpty()) { + if (validQuests.isEmpty()) { + if (fromCategory) { + Messages.COMMAND_QUEST_ADMIN_RANDOM_CATEGORY_NONE.send(sender, + "{player}", args[3], + "{category}", args[4]); + } else { + Messages.COMMAND_QUEST_ADMIN_RANDOM_NONE.send(sender, "{player}", args[3]); + } + return; + } + int random = ThreadLocalRandom.current().nextInt(0, validQuests.size()); + Quest quest = validQuests.get(random); + qPlayer.startQuest(quest); + if (fromCategory) { - Messages.COMMAND_QUEST_ADMIN_RANDOM_CATEGORY_NONE.send(sender, + Messages.COMMAND_QUEST_ADMIN_RANDOM_CATEGORY_SUCCESS.send(sender, "{player}", args[3], - "{category}", args[4]); + "{category}", args[4], + "{quest}", quest.getId()); } else { - Messages.COMMAND_QUEST_ADMIN_RANDOM_NONE.send(sender, "{player}", args[3]); + Messages.COMMAND_QUEST_ADMIN_RANDOM_SUCCESS.send(sender, + "{player}", args[3], + "{quest}", quest.getId()); } - return; - } - int random = ThreadLocalRandom.current().nextInt(0, validQuests.size()); - Quest quest = validQuests.get(random); - qPlayer.startQuest(quest); - - plugin.getPlayerManager().savePlayerSync(qPlayer.getPlayerUUID(), questProgressFile); - if (fromCategory) { - Messages.COMMAND_QUEST_ADMIN_RANDOM_CATEGORY_SUCCESS.send(sender, - "{player}", args[3], - "{category}", args[4], - "{quest}", quest.getId()); - } else { - Messages.COMMAND_QUEST_ADMIN_RANDOM_SUCCESS.send(sender, - "{player}", args[3], - "{quest}", quest.getId()); - } - if (Bukkit.getPlayer(qPlayer.getPlayerUUID()) == null) { - plugin.getPlayerManager().dropPlayer(qPlayer.getPlayerUUID()); - } - return; + CommandUtils.doSafeSave(qPlayer, questProgressFile, plugin); + }); } sender.sendMessage(ChatColor.RED + "/quests a/admin moddata random <player> [category]"); diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataResetCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataResetCommandHandler.java index ce598473..1de4aaef 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataResetCommandHandler.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataResetCommandHandler.java @@ -25,7 +25,7 @@ public class AdminModdataResetCommandHandler implements CommandHandler { @Override public void handle(CommandSender sender, String[] args) { if (args.length > 4) { - QPlayer qPlayer = CommandUtils.getOtherPlayer(sender, args[3], plugin); + QPlayer qPlayer = CommandUtils.getOtherPlayerSync(sender, args[3], plugin); if (qPlayer == null) return; Quest quest = plugin.getQuestManager().getQuestById(args[4]); if (quest == null) { @@ -34,12 +34,9 @@ public class AdminModdataResetCommandHandler implements CommandHandler { } QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); questProgressFile.generateBlankQuestProgress(quest, true); - plugin.getPlayerManager().savePlayerSync(qPlayer.getPlayerUUID(), questProgressFile); Messages.COMMAND_QUEST_ADMIN_RESET_SUCCESS.send(sender, "{player}", args[3], "{quest}", quest.getId()); - if (Bukkit.getPlayer(qPlayer.getPlayerUUID()) == null) { - plugin.getPlayerManager().dropPlayer(qPlayer.getPlayerUUID()); - } + CommandUtils.doSafeSave(qPlayer, questProgressFile, plugin); return; } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataStartCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataStartCommandHandler.java index 5653ba50..e0fedd7e 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataStartCommandHandler.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataStartCommandHandler.java @@ -26,7 +26,7 @@ public class AdminModdataStartCommandHandler implements CommandHandler { @Override public void handle(CommandSender sender, String[] args) { if (args.length > 4) { - QPlayer qPlayer = CommandUtils.getOtherPlayer(sender, args[3], plugin); + QPlayer qPlayer = CommandUtils.getOtherPlayerSync(sender, args[3], plugin); if (qPlayer == null) return; QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); Quest quest = plugin.getQuestManager().getQuestById(args[4]); @@ -59,12 +59,9 @@ public class AdminModdataStartCommandHandler implements CommandHandler { return; } - plugin.getPlayerManager().savePlayerSync(qPlayer.getPlayerUUID(), questProgressFile); Messages.COMMAND_QUEST_ADMIN_START_SUCCESS.send(sender, "{player}", args[3], "{quest}", quest.getId()); - if (Bukkit.getPlayer(qPlayer.getPlayerUUID()) == null) { - plugin.getPlayerManager().dropPlayer(qPlayer.getPlayerUUID()); - } + CommandUtils.doSafeSave(qPlayer, questProgressFile, plugin); return; } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/CommandUtils.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/CommandUtils.java index ed62fd63..90e529a2 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/CommandUtils.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/CommandUtils.java @@ -4,12 +4,14 @@ import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; import com.leonardobishop.quests.bukkit.util.chat.Chat; import com.leonardobishop.quests.common.config.ConfigProblem; import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.player.questprogressfile.QuestProgressFile; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandSender; import java.util.*; +import java.util.function.Consumer; public class CommandUtils { @@ -69,7 +71,7 @@ public class CommandUtils { } } - public static QPlayer getOtherPlayer(CommandSender sender, String name, BukkitQuestsPlugin plugin) { + public static QPlayer getOtherPlayerSync(CommandSender sender, String name, BukkitQuestsPlugin plugin) { OfflinePlayer ofp = Bukkit.getOfflinePlayer(name); UUID uuid; String username; @@ -93,4 +95,54 @@ public class CommandUtils { return qPlayer; } + public static void useOtherPlayer(CommandSender sender, String name, BukkitQuestsPlugin plugin, Consumer<QPlayer> callback) { + OfflinePlayer ofp = Bukkit.getOfflinePlayer(name); + UUID uuid; + String username; + if (ofp.getName() != null) { + uuid = ofp.getUniqueId(); + username = ofp.getName(); + } else { + Messages.COMMAND_QUEST_ADMIN_PLAYERNOTFOUND.send(sender, "{player}", name); + return; + } + + { + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(uuid); + if (qPlayer != null) { + callback.accept(qPlayer); + return; + } + } + + plugin.getScheduler().doAsync(() -> { + if (plugin.getPlayerManager().getPlayer(uuid) == null) { + Messages.COMMAND_QUEST_ADMIN_LOADDATA.send(sender, "{player}", username); + plugin.getPlayerManager().loadPlayer(uuid); + } + + final QPlayer qPlayer = plugin.getPlayerManager().getPlayer(uuid); + + if (qPlayer == null) { + Messages.COMMAND_QUEST_ADMIN_NODATA.send(sender, "{player}", username); + return; + } + + plugin.getScheduler().doSync(() -> callback.accept(qPlayer)); + }); + } + + public static void doSafeSave(QPlayer qPlayer, QuestProgressFile questProgressFile, BukkitQuestsPlugin plugin) { + if (Bukkit.getPlayer(qPlayer.getPlayerUUID()) == null) { + plugin.getScheduler().doAsync(() -> { + plugin.getPlayerManager().savePlayerSync(qPlayer.getPlayerUUID(), questProgressFile); + plugin.getScheduler().doSync(() -> { + if (Bukkit.getPlayer(qPlayer.getPlayerUUID()) == null) { + plugin.getPlayerManager().dropPlayer(qPlayer.getPlayerUUID()); + } + }); + }); + } + } + } |
