diff --git a/src/main/java/com/alttd/altitudequests/AQuest.java b/src/main/java/com/alttd/altitudequests/AQuest.java index c61d00a..b0e7a64 100644 --- a/src/main/java/com/alttd/altitudequests/AQuest.java +++ b/src/main/java/com/alttd/altitudequests/AQuest.java @@ -3,8 +3,10 @@ package com.alttd.altitudequests; import com.alttd.altitudequests.commands.CommandManager; import com.alttd.altitudequests.config.*; import com.alttd.altitudequests.events.*; +import com.alttd.altitudequests.objects.Quest; import com.alttd.altitudequests.util.Logger; import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitRunnable; public final class AQuest extends JavaPlugin { @@ -24,6 +26,7 @@ public final class AQuest extends JavaPlugin { reloadConfigs(); registerEvents(); new CommandManager(); + scheduleTasks(); Logger.info("--------------------------------------------------"); Logger.info("AQuest started"); @@ -52,4 +55,15 @@ public final class AQuest extends JavaPlugin { getServer().getMessenger().registerOutgoingPluginChannel(this, "aquest:player-data"); getServer().getMessenger().registerIncomingPluginChannel(this, "aquest:player-data", new PluginMessageListener()); } + + private void scheduleTasks() { + new BukkitRunnable() { + @Override + public void run() { + if (Config.DEBUG) + Logger.info("Syncing users."); + Quest.saveAll(); + } + }.runTaskTimerAsynchronously(getInstance(), 10 * 60 * 20L, 10 * 60 * 20L); + } } diff --git a/src/main/java/com/alttd/altitudequests/database/Database.java b/src/main/java/com/alttd/altitudequests/database/Database.java index 931efcc..8cd946a 100644 --- a/src/main/java/com/alttd/altitudequests/database/Database.java +++ b/src/main/java/com/alttd/altitudequests/database/Database.java @@ -21,11 +21,14 @@ public class Database { public static Database getDatabase(){ if (instance == null) + { instance = new Database(); + instance.init(); + } return (instance); } - public void init() { + protected void init() { try { openConnection(); } catch (SQLException e) { diff --git a/src/main/java/com/alttd/altitudequests/events/LogoutEvent.java b/src/main/java/com/alttd/altitudequests/events/LogoutEvent.java index e5e7013..7161e5a 100644 --- a/src/main/java/com/alttd/altitudequests/events/LogoutEvent.java +++ b/src/main/java/com/alttd/altitudequests/events/LogoutEvent.java @@ -10,6 +10,7 @@ import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.scheduler.BukkitRunnable; import java.util.UUID; @@ -18,14 +19,22 @@ public class LogoutEvent implements Listener { public void onPlayerQuit(PlayerQuitEvent event) { UUID uuid = event.getPlayer().getUniqueId(); - if (Config.DEBUG) - Logger.info("Syncing %", event.getPlayer().getName()); - Quest.unloadUser(uuid); - ByteArrayDataOutput out = ByteStreams.newDataOutput(); - out.writeUTF("try-unlock"); - out.writeUTF(uuid.toString()); - Bukkit.getServer().sendPluginMessage(AQuest.getInstance(), - "aquest:player-data", - out.toByteArray()); + new BukkitRunnable() { + @Override + public void run() { + if (Config.DEBUG) + Logger.info("Syncing %", event.getPlayer().getName()); + Quest dailyQuest = Quest.getDailyQuest(uuid); + if (dailyQuest != null) + dailyQuest.save(); + Quest.unloadUser(uuid); + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF("try-unlock"); + out.writeUTF(uuid.toString()); + Bukkit.getServer().sendPluginMessage(AQuest.getInstance(), + "aquest:player-data", + out.toByteArray()); + } + }.runTaskAsynchronously(AQuest.getInstance()); } } diff --git a/src/main/java/com/alttd/altitudequests/events/PluginMessageListener.java b/src/main/java/com/alttd/altitudequests/events/PluginMessageListener.java index d50869c..aeb878c 100644 --- a/src/main/java/com/alttd/altitudequests/events/PluginMessageListener.java +++ b/src/main/java/com/alttd/altitudequests/events/PluginMessageListener.java @@ -2,6 +2,7 @@ package com.alttd.altitudequests.events; import com.alttd.altitudequests.AQuest; import com.alttd.altitudequests.config.Config; +import com.alttd.altitudequests.database.Database; import com.alttd.altitudequests.objects.Quest; import com.alttd.altitudequests.util.Logger; import com.google.common.io.ByteArrayDataInput; @@ -11,6 +12,9 @@ import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.NotNull; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.UUID; public class PluginMessageListener implements org.bukkit.plugin.messaging.PluginMessageListener { @@ -61,9 +65,27 @@ public class PluginMessageListener implements org.bukkit.plugin.messaging.Plugin new BukkitRunnable() { @Override public void run() { - //TODO load user from database - //TODO if no quest in database create one - System.out.println("creating quest"); + String sql = "SELECT * FROM generic_quest_progress WHERE uuid = ?"; + try { + PreparedStatement statement = Database.getDatabase().getConnection().prepareStatement(sql); + statement.setString(1, uuid.toString()); + ResultSet resultSet = statement.executeQuery(); + if (resultSet.next()) { + Quest.loadDailyQuest( + resultSet.getString("quest"), + resultSet.getString("quest_variant"), + resultSet.getInt("step_1_progress"), + resultSet.getInt("step_2_progress"), + uuid); + if (Config.DEBUG) + Logger.info("Loading daily quest for %", uuid.toString()); + return; + } + } catch (SQLException exception) { + exception.printStackTrace(); + } + if (Config.DEBUG) + Logger.info("Creating new daily quest for %", uuid.toString()); Quest.createDailyQuest(Bukkit.getPlayer(uuid)); } }.runTaskAsynchronously(AQuest.getInstance()); diff --git a/src/main/java/com/alttd/altitudequests/objects/Quest.java b/src/main/java/com/alttd/altitudequests/objects/Quest.java index b78d2a3..2efcb2f 100644 --- a/src/main/java/com/alttd/altitudequests/objects/Quest.java +++ b/src/main/java/com/alttd/altitudequests/objects/Quest.java @@ -89,12 +89,33 @@ public abstract class Quest { }.runTaskAsynchronously(AQuest.getInstance()); } - protected abstract void save(); + public static void saveAll() { + for (Quest quest : dailyQuests.values()) { + quest.save(); + } + } + + public static void loadDailyQuest(String quest, String quest_variant, int step_1_progress, int step_2_progress, UUID uuid) { + Optional> any = possibleQuests.stream().filter(q -> q.getSimpleName().equals(quest)).findAny(); + if (any.isEmpty()) { + //TODO error + return; + } + Class aClass = any.get(); + Constructor constructor; + try { + constructor = aClass.getConstructor(String.class, int.class, int.class, UUID.class); + Quest quest1 = constructor.newInstance(quest_variant, step_1_progress, step_2_progress, uuid); + dailyQuests.put(uuid, quest1); + } catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) { + e.printStackTrace(); + } + } + + public abstract void save(); public abstract boolean isDone(); - public abstract String getName(); - public abstract List getPages(); public abstract TagResolver getTagResolvers(); diff --git a/src/main/java/com/alttd/altitudequests/objects/quests/MineQuest.java b/src/main/java/com/alttd/altitudequests/objects/quests/MineQuest.java index f0a4d55..61306e4 100644 --- a/src/main/java/com/alttd/altitudequests/objects/quests/MineQuest.java +++ b/src/main/java/com/alttd/altitudequests/objects/quests/MineQuest.java @@ -5,12 +5,12 @@ import com.alttd.altitudequests.database.Database; import com.alttd.altitudequests.objects.MineQuestObject; import com.alttd.altitudequests.objects.Quest; import com.alttd.altitudequests.objects.QuestCompleteEvent; +import com.alttd.altitudequests.util.Logger; import com.alttd.altitudequests.util.Utilities; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.bukkit.block.Block; import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import java.sql.PreparedStatement; @@ -32,36 +32,38 @@ public class MineQuest extends Quest { this.mineQuestObject = QuestsConfig.MINE_QUESTS.get(Utilities.randomOr0(QuestsConfig.MINE_QUESTS.size() - 1)); } - public MineQuest(int mined, int turnedIn, String variantInternalName, UUID uuid) { + public MineQuest(String variantInternalName, int mined, int turnedIn, UUID uuid) { this.mined = mined; this.turnedIn = turnedIn; this.uuid = uuid; Optional any = QuestsConfig.MINE_QUESTS.stream().filter(object -> variantInternalName.equals(object.getInternalName())).findAny(); if (any.isEmpty()) { this.mineQuestObject = null; + Logger.warning("Tried to create MineQuest but unable to find variant: %.", variantInternalName); return; //TODO error } this.mineQuestObject = any.get(); } @Override - protected void save() { + public void save() { String sql = "INSERT INTO generic_quest_progress " + "(uuid, quest, quest_variant, step_1_progress, step_2_progress) " + - "VALUES (?, ?, ?, ?) " + - "ON DUPLICATE KEY UPDATE" + + "VALUES (?, ?, ?, ?, ?) " + + "ON DUPLICATE KEY UPDATE " + "quest = ?, quest_variant = ?, step_1_progress = ?, step_2_progress = ?"; try { PreparedStatement statement = Database.getDatabase().getConnection().prepareStatement(sql); statement.setString(1, uuid.toString()); - statement.setString(2, getName()); + statement.setString(2, MineQuest.class.getSimpleName()); statement.setString(3, mineQuestObject.getInternalName()); statement.setInt(4, mined); statement.setInt(5, turnedIn); - statement.setString(6, getName()); + statement.setString(6, MineQuest.class.getSimpleName()); statement.setString(7, mineQuestObject.getInternalName()); statement.setInt(8, mined); statement.setInt(9, turnedIn); + statement.execute(); } catch (SQLException exception) { exception.printStackTrace(); } @@ -72,11 +74,6 @@ public class MineQuest extends Quest { return isDone; } - @Override - public String getName() { - return "mining"; - } - @Override public List getPages() { return mineQuestObject.getPages();