Skip to content

Commit

Permalink
Make moddata commands IO async (closes #359)
Browse files Browse the repository at this point in the history
  • Loading branch information
LMBishop committed Apr 22, 2022
1 parent 5258cbf commit 43e6479
Show file tree
Hide file tree
Showing 6 changed files with 113 additions and 78 deletions.
Expand Up @@ -25,21 +25,19 @@ public AdminModdataCompleteCommandHandler(BukkitQuestsPlugin plugin) {
@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;
}

Expand Down
Expand Up @@ -24,19 +24,14 @@ public AdminModdataFullresetCommandHandler(BukkitQuestsPlugin plugin) {
@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]);

if (Bukkit.getPlayer(qPlayer.getPlayerUUID()) == null) {
plugin.getPlayerManager().dropPlayer(qPlayer.getPlayerUUID());
}
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);
});

return;
}

Expand Down
Expand Up @@ -29,63 +29,59 @@ public AdminModdataRandomCommandHandler(BukkitQuestsPlugin plugin) {
@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]");
Expand Down
Expand Up @@ -25,7 +25,7 @@ public AdminModdataResetCommandHandler(BukkitQuestsPlugin plugin) {
@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) {
Expand All @@ -34,12 +34,9 @@ public void handle(CommandSender sender, String[] args) {
}
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;
}

Expand Down
Expand Up @@ -26,7 +26,7 @@ public AdminModdataStartCommandHandler(BukkitQuestsPlugin plugin) {
@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]);
Expand Down Expand Up @@ -59,12 +59,9 @@ public void handle(CommandSender sender, String[] args) {
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;
}

Expand Down
Expand Up @@ -4,12 +4,14 @@
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 {

Expand Down Expand Up @@ -69,7 +71,7 @@ public static void showProblems(CommandSender sender, Map<String, List<ConfigPro
}
}

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;
Expand All @@ -93,4 +95,54 @@ public static QPlayer getOtherPlayer(CommandSender sender, String name, BukkitQu
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());
}
});
});
}
}

}

0 comments on commit 43e6479

Please sign in to comment.