diff --git a/pom.xml b/pom.xml
index 56cd3e0..b0e2ee4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
ca.tweetzy
auctionhouse
- 2.2.0
+ 2.3.0
UTF-8
diff --git a/src/main/java/ca/tweetzy/auctionhouse/AuctionHouse.java b/src/main/java/ca/tweetzy/auctionhouse/AuctionHouse.java
index bd40814..384ae35 100644
--- a/src/main/java/ca/tweetzy/auctionhouse/AuctionHouse.java
+++ b/src/main/java/ca/tweetzy/auctionhouse/AuctionHouse.java
@@ -3,12 +3,15 @@ package ca.tweetzy.auctionhouse;
import ca.tweetzy.auctionhouse.api.UpdateChecker;
import ca.tweetzy.auctionhouse.auction.AuctionPlayer;
import ca.tweetzy.auctionhouse.commands.*;
+import ca.tweetzy.auctionhouse.database.DataManager;
+import ca.tweetzy.auctionhouse.database.migrations._1_InitialMigration;
import ca.tweetzy.auctionhouse.listeners.AuctionListeners;
import ca.tweetzy.auctionhouse.listeners.PlayerListeners;
import ca.tweetzy.auctionhouse.managers.AuctionItemManager;
import ca.tweetzy.auctionhouse.managers.AuctionPlayerManager;
import ca.tweetzy.auctionhouse.managers.TransactionManager;
import ca.tweetzy.auctionhouse.settings.Settings;
+import ca.tweetzy.auctionhouse.tasks.AutoSaveTask;
import ca.tweetzy.auctionhouse.tasks.TickAuctionsTask;
import ca.tweetzy.core.TweetyCore;
import ca.tweetzy.core.TweetyPlugin;
@@ -16,8 +19,12 @@ import ca.tweetzy.core.commands.CommandManager;
import ca.tweetzy.core.compatibility.ServerVersion;
import ca.tweetzy.core.configuration.Config;
import ca.tweetzy.core.core.PluginID;
+import ca.tweetzy.core.database.DataMigrationManager;
+import ca.tweetzy.core.database.DatabaseConnector;
+import ca.tweetzy.core.database.MySQLConnector;
import ca.tweetzy.core.gui.GuiManager;
import ca.tweetzy.core.utils.Metrics;
+import lombok.Getter;
import net.milkbowl.vault.economy.Economy;
import org.bukkit.Bukkit;
import org.bukkit.plugin.RegisteredServiceProvider;
@@ -36,17 +43,36 @@ public class AuctionHouse extends TweetyPlugin {
private static AuctionHouse instance;
+ @Getter
private Economy economy;
+ @Getter
private final GuiManager guiManager = new GuiManager(this);
+
+ @Getter
private final Config data = new Config(this, "data.yml");
protected Metrics metrics;
+
+ @Getter
private CommandManager commandManager;
+
+ @Getter
private AuctionPlayerManager auctionPlayerManager;
+
+ @Getter
private AuctionItemManager auctionItemManager;
+
+ @Getter
private TransactionManager transactionManager;
+ @Getter
+ private DatabaseConnector databaseConnector;
+
+ @Getter
+ private DataManager dataManager;
+
+ @Getter
private UpdateChecker.UpdateStatus status;
@Override
@@ -86,13 +112,21 @@ public class AuctionHouse extends TweetyPlugin {
this.auctionPlayerManager = new AuctionPlayerManager();
Bukkit.getOnlinePlayers().forEach(p -> this.auctionPlayerManager.addPlayer(new AuctionPlayer(p)));
+ // Setup the database if enabled
+ if (Settings.DATABASE_USE.getBoolean()) {
+ this.databaseConnector = new MySQLConnector(this, Settings.DATABASE_HOST.getString(), Settings.DATABASE_PORT.getInt(), Settings.DATABASE_NAME.getString(), Settings.DATABASE_USERNAME.getString(), Settings.DATABASE_PASSWORD.getString(), Settings.DATABASE_USE_SSL.getBoolean());
+ this.dataManager = new DataManager(this.databaseConnector, this);
+ DataMigrationManager dataMigrationManager = new DataMigrationManager(this.databaseConnector, this.dataManager, new _1_InitialMigration());
+ dataMigrationManager.runMigrations();
+ }
+
// load auction items
this.auctionItemManager = new AuctionItemManager();
- this.auctionItemManager.loadItems();
+ this.auctionItemManager.loadItems(Settings.DATABASE_USE.getBoolean());
// load transactions
this.transactionManager = new TransactionManager();
- this.transactionManager.loadTransactions();
+ this.transactionManager.loadTransactions(Settings.DATABASE_USE.getBoolean());
// gui manager
this.guiManager.init();
@@ -107,11 +141,16 @@ public class AuctionHouse extends TweetyPlugin {
new CommandSearch(),
new CommandSettings(),
new CommandConvert(),
- new CommandReload()
+ new CommandReload(),
+ new CommandUpload()
);
// start the auction tick task
TickAuctionsTask.startTask();
+ // auto save task
+ if (Settings.AUTO_SAVE_ENABLED.getBoolean()) {
+ AutoSaveTask.startTask();
+ }
// update check
getServer().getScheduler().runTaskLaterAsynchronously(this, () -> this.status = new UpdateChecker(this, 60325, getConsole()).check().getStatus(), 1L);
@@ -122,8 +161,8 @@ public class AuctionHouse extends TweetyPlugin {
@Override
public void onPluginDisable() {
- this.auctionItemManager.saveItems();
- this.transactionManager.saveTransactions();
+ this.auctionItemManager.saveItems(Settings.DATABASE_USE.getBoolean(), false);
+ this.transactionManager.saveTransactions(Settings.DATABASE_USE.getBoolean(), false);
instance = null;
}
@@ -142,38 +181,6 @@ public class AuctionHouse extends TweetyPlugin {
return instance;
}
- public Config getData() {
- return data;
- }
-
- public Economy getEconomy() {
- return economy;
- }
-
- public CommandManager getCommandManager() {
- return commandManager;
- }
-
- public AuctionItemManager getAuctionItemManager() {
- return auctionItemManager;
- }
-
- public AuctionPlayerManager getAuctionPlayerManager() {
- return auctionPlayerManager;
- }
-
- public TransactionManager getTransactionManager() {
- return transactionManager;
- }
-
- public GuiManager getGuiManager() {
- return guiManager;
- }
-
- public UpdateChecker.UpdateStatus getUpdateStatus() {
- return status;
- }
-
String IS_SONGODA_DOWNLOAD = "%%__SONGODA__%%";
String SONGODA_NODE = "%%__SONGODA_NODE__%%";
String TIMESTAMP = "%%__TIMESTAMP__%%";
diff --git a/src/main/java/ca/tweetzy/auctionhouse/commands/CommandUpload.java b/src/main/java/ca/tweetzy/auctionhouse/commands/CommandUpload.java
new file mode 100644
index 0000000..22a5fde
--- /dev/null
+++ b/src/main/java/ca/tweetzy/auctionhouse/commands/CommandUpload.java
@@ -0,0 +1,74 @@
+package ca.tweetzy.auctionhouse.commands;
+
+import ca.tweetzy.auctionhouse.AuctionHouse;
+import ca.tweetzy.auctionhouse.api.AuctionAPI;
+import ca.tweetzy.auctionhouse.auction.AuctionItem;
+import ca.tweetzy.auctionhouse.settings.Settings;
+import ca.tweetzy.auctionhouse.transaction.Transaction;
+import ca.tweetzy.core.commands.AbstractCommand;
+import ca.tweetzy.core.utils.TextUtils;
+import org.bukkit.command.CommandSender;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * The current file has been created by Kiran Hart
+ * Date Created: April 15 2021
+ * Time Created: 4:17 p.m.
+ * Usage of any code found within this class is prohibited unless given explicit permission otherwise
+ */
+public class CommandUpload extends AbstractCommand {
+
+ public CommandUpload() {
+ super(CommandType.CONSOLE_OK, "upload");
+ }
+
+ @Override
+ protected ReturnType runCommand(CommandSender sender, String... args) {
+ if (!Settings.DATABASE_USE.getBoolean()) {
+ AuctionHouse.getInstance().getLocale().newMessage(TextUtils.formatText("&cYou must be using a database to use this command")).sendPrefixedMessage(sender);
+ return ReturnType.FAILURE;
+ }
+
+ if (AuctionHouse.getInstance().getData().contains("auction items") && AuctionHouse.getInstance().getData().isList("auction items")) {
+ List items = AuctionHouse.getInstance().getData().getStringList("auction items").stream().map(AuctionAPI.getInstance()::convertBase64ToObject).map(object -> (AuctionItem) object).collect(Collectors.toList());
+ items.forEach(AuctionHouse.getInstance().getAuctionItemManager()::addItem);
+ }
+
+ if (AuctionHouse.getInstance().getData().contains("transactions") && AuctionHouse.getInstance().getData().isList("transactions")) {
+ List transactions = AuctionHouse.getInstance().getData().getStringList("transactions").stream().map(AuctionAPI.getInstance()::convertBase64ToObject).map(object -> (Transaction) object).collect(Collectors.toList());
+ transactions.forEach(AuctionHouse.getInstance().getTransactionManager()::addTransaction);
+ }
+
+ AuctionHouse.getInstance().getData().set("auction items", null);
+ AuctionHouse.getInstance().getData().set("transactions", null);
+ AuctionHouse.getInstance().getData().save();
+
+ AuctionHouse.getInstance().getDataManager().saveItems(AuctionHouse.getInstance().getAuctionItemManager().getAuctionItems(), true);
+ AuctionHouse.getInstance().getDataManager().saveTransactions(AuctionHouse.getInstance().getTransactionManager().getTransactions(), true);
+
+ AuctionHouse.getInstance().getLocale().newMessage(TextUtils.formatText("&aLoaded file items/transactions and saved them to the database.")).sendPrefixedMessage(sender);
+ return ReturnType.SUCCESS;
+ }
+
+ @Override
+ public String getPermissionNode() {
+ return "auctionhouse.cmd.upload";
+ }
+
+ @Override
+ public String getSyntax() {
+ return "upload";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Used to upload flat file data to the database";
+ }
+
+ @Override
+ protected List onTab(CommandSender sender, String... args) {
+ return null;
+ }
+}
diff --git a/src/main/java/ca/tweetzy/auctionhouse/database/DataManager.java b/src/main/java/ca/tweetzy/auctionhouse/database/DataManager.java
new file mode 100644
index 0000000..54f4d0b
--- /dev/null
+++ b/src/main/java/ca/tweetzy/auctionhouse/database/DataManager.java
@@ -0,0 +1,140 @@
+package ca.tweetzy.auctionhouse.database;
+
+import ca.tweetzy.auctionhouse.api.AuctionAPI;
+import ca.tweetzy.auctionhouse.auction.AuctionItem;
+import ca.tweetzy.auctionhouse.transaction.Transaction;
+import ca.tweetzy.core.database.DataManagerAbstract;
+import ca.tweetzy.core.database.DatabaseConnector;
+import org.bukkit.plugin.Plugin;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+
+/**
+ * The current file has been created by Kiran Hart
+ * Date Created: April 15 2021
+ * Time Created: 2:41 p.m.
+ * Usage of any code found within this class is prohibited unless given explicit permission otherwise
+ */
+public class DataManager extends DataManagerAbstract {
+
+ public DataManager(DatabaseConnector databaseConnector, Plugin plugin) {
+ super(databaseConnector, plugin);
+ }
+
+ public void saveItems(List items, boolean async) {
+ if (async) {
+ this.async(() -> this.databaseConnector.connect(connection -> {
+ String saveItems = "INSERT IGNORE INTO " + this.getTablePrefix() + "items SET data = ?";
+ String truncate = "TRUNCATE TABLE " + this.getTablePrefix() + "items";
+ try (PreparedStatement statement = connection.prepareStatement(truncate)) {
+ statement.execute();
+ }
+
+ PreparedStatement statement = connection.prepareStatement(saveItems);
+ items.forEach(item -> {
+ try {
+ statement.setString(1, AuctionAPI.getInstance().convertToBase64(item));
+ statement.addBatch();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ });
+ statement.executeBatch();
+ }));
+ } else {
+ this.databaseConnector.connect(connection -> {
+ String saveItems = "INSERT IGNORE INTO " + this.getTablePrefix() + "items SET data = ?";
+ String truncate = "TRUNCATE TABLE " + this.getTablePrefix() + "items";
+ connection.prepareStatement(truncate).executeUpdate();
+ PreparedStatement statement = connection.prepareStatement(saveItems);
+ items.forEach(item -> {
+ try {
+ statement.setString(1, AuctionAPI.getInstance().convertToBase64(item));
+ statement.addBatch();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ });
+ statement.executeBatch();
+ });
+ }
+ }
+
+ public void saveTransactions(List transactions, boolean async) {
+ if (async) {
+ this.async(() -> this.databaseConnector.connect(connection -> {
+ String saveItems = "INSERT IGNORE INTO " + this.getTablePrefix() + "transactions SET data = ?";
+ String truncate = "TRUNCATE TABLE " + this.getTablePrefix() + "transactions";
+ try (PreparedStatement statement = connection.prepareStatement(truncate)) {
+ statement.execute();
+ }
+
+ PreparedStatement statement = connection.prepareStatement(saveItems);
+ transactions.forEach(transaction -> {
+ try {
+ statement.setString(1, AuctionAPI.getInstance().convertToBase64(transaction));
+ statement.addBatch();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ });
+ statement.executeBatch();
+ }));
+ } else {
+ this.databaseConnector.connect(connection -> {
+ String saveItems = "INSERT IGNORE INTO " + this.getTablePrefix() + "transactions SET data = ?";
+ String truncate = "TRUNCATE TABLE " + this.getTablePrefix() + "transactions";
+ try (PreparedStatement statement = connection.prepareStatement(truncate)) {
+ statement.execute();
+ }
+
+ PreparedStatement statement = connection.prepareStatement(saveItems);
+ transactions.forEach(transaction -> {
+ try {
+ statement.setString(1, AuctionAPI.getInstance().convertToBase64(transaction));
+ statement.addBatch();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ });
+ statement.executeBatch();
+ });
+ }
+ }
+
+ public void getTransactions(Consumer> callback) {
+ ArrayList transactions = new ArrayList<>();
+ this.async(() -> this.databaseConnector.connect(connection -> {
+ String select = "SELECT * FROM " + this.getTablePrefix() + "transactions";
+
+ try (Statement statement = connection.createStatement()) {
+ ResultSet result = statement.executeQuery(select);
+ while (result.next()) {
+ transactions.add((Transaction) AuctionAPI.getInstance().convertBase64ToObject(result.getString("data")));
+ }
+ }
+ this.sync(() -> callback.accept(transactions));
+ }));
+ }
+
+ public void getItems(Consumer> callback) {
+ ArrayList items = new ArrayList<>();
+ this.async(() -> this.databaseConnector.connect(connection -> {
+ String select = "SELECT * FROM " + this.getTablePrefix() + "items";
+
+ try (Statement statement = connection.createStatement()) {
+ ResultSet result = statement.executeQuery(select);
+ while (result.next()) {
+ items.add((AuctionItem) AuctionAPI.getInstance().convertBase64ToObject(result.getString("data")));
+ }
+ }
+ this.sync(() -> callback.accept(items));
+ }));
+ }
+}
diff --git a/src/main/java/ca/tweetzy/auctionhouse/database/migrations/_1_InitialMigration.java b/src/main/java/ca/tweetzy/auctionhouse/database/migrations/_1_InitialMigration.java
new file mode 100644
index 0000000..89e6d94
--- /dev/null
+++ b/src/main/java/ca/tweetzy/auctionhouse/database/migrations/_1_InitialMigration.java
@@ -0,0 +1,37 @@
+package ca.tweetzy.auctionhouse.database.migrations;
+
+import ca.tweetzy.auctionhouse.AuctionHouse;
+import ca.tweetzy.core.database.DataMigration;
+import ca.tweetzy.core.database.MySQLConnector;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+/**
+ * The current file has been created by Kiran Hart
+ * Date Created: April 15 2021
+ * Time Created: 2:41 p.m.
+ * Usage of any code found within this class is prohibited unless given explicit permission otherwise
+ */
+public class _1_InitialMigration extends DataMigration {
+
+ public _1_InitialMigration() {
+ super(1);
+ }
+
+ @Override
+ public void migrate(Connection connection, String tablePrefix) throws SQLException {
+ String autoIncrement = AuctionHouse.getInstance().getDatabaseConnector() instanceof MySQLConnector ? " AUTO_INCREMENT" : "";
+
+ try (Statement statement = connection.createStatement()) {
+ statement.execute("CREATE TABLE " + tablePrefix + "items (" +
+ "id INTEGER PRIMARY KEY" + autoIncrement + ", " +
+ "data LONGTEXT NOT NULL )");
+
+ statement.execute("CREATE TABLE " + tablePrefix + "transactions (" +
+ "id INTEGER PRIMARY KEY" + autoIncrement + ", " +
+ "data LONGTEXT NOT NULL )");
+ }
+ }
+}
diff --git a/src/main/java/ca/tweetzy/auctionhouse/guis/GUIActiveAuctions.java b/src/main/java/ca/tweetzy/auctionhouse/guis/GUIActiveAuctions.java
index bb5b2ec..f2ea003 100644
--- a/src/main/java/ca/tweetzy/auctionhouse/guis/GUIActiveAuctions.java
+++ b/src/main/java/ca/tweetzy/auctionhouse/guis/GUIActiveAuctions.java
@@ -11,6 +11,7 @@ import ca.tweetzy.core.gui.Gui;
import ca.tweetzy.core.utils.TextUtils;
import ca.tweetzy.core.utils.items.TItemBuilder;
import org.bukkit.Bukkit;
+import org.bukkit.scheduler.BukkitTask;
import java.util.Comparator;
import java.util.List;
@@ -27,6 +28,7 @@ public class GUIActiveAuctions extends Gui {
final AuctionPlayer auctionPlayer;
+ private BukkitTask task;
private int taskId;
public GUIActiveAuctions(AuctionPlayer auctionPlayer) {
@@ -37,8 +39,20 @@ public class GUIActiveAuctions extends Gui {
draw();
if (Settings.AUTO_REFRESH_AUCTION_PAGES.getBoolean()) {
- setOnOpen(e -> startTask());
- setOnClose(e -> killTask());
+ setOnOpen(e -> {
+ if (Settings.USE_ASYNC_GUI_REFRESH.getBoolean()) {
+ startTaskAsync();
+ } else {
+ startTask();
+ }
+ });
+ setOnClose(e -> {
+ if (Settings.USE_ASYNC_GUI_REFRESH.getBoolean()) {
+ killAsyncTask();
+ } else {
+ killTask();
+ }
+ });
}
}
@@ -79,7 +93,15 @@ public class GUIActiveAuctions extends Gui {
taskId = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(AuctionHouse.getInstance(), this::draw, 0L, Settings.TICK_UPDATE_TIME.getInt());
}
+ private void startTaskAsync() {
+ task = Bukkit.getServer().getScheduler().runTaskTimerAsynchronously(AuctionHouse.getInstance(), this::draw, 0L, Settings.TICK_UPDATE_TIME.getInt());
+ }
+
private void killTask() {
Bukkit.getServer().getScheduler().cancelTask(taskId);
}
+
+ private void killAsyncTask() {
+ task.cancel();
+ }
}
diff --git a/src/main/java/ca/tweetzy/auctionhouse/guis/GUIAuctionHouse.java b/src/main/java/ca/tweetzy/auctionhouse/guis/GUIAuctionHouse.java
index 95af8ae..3a5b664 100644
--- a/src/main/java/ca/tweetzy/auctionhouse/guis/GUIAuctionHouse.java
+++ b/src/main/java/ca/tweetzy/auctionhouse/guis/GUIAuctionHouse.java
@@ -18,6 +18,7 @@ import org.bukkit.block.BlockState;
import org.bukkit.block.ShulkerBox;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BlockStateMeta;
+import org.bukkit.scheduler.BukkitTask;
import java.util.Comparator;
import java.util.HashMap;
@@ -37,6 +38,7 @@ public class GUIAuctionHouse extends Gui {
List items;
private int taskId;
+ private BukkitTask task;
private AuctionItemCategory filterCategory = AuctionItemCategory.ALL;
private AuctionSaleType filterAuctionType = AuctionSaleType.BOTH;
@@ -49,8 +51,20 @@ public class GUIAuctionHouse extends Gui {
draw();
if (Settings.AUTO_REFRESH_AUCTION_PAGES.getBoolean()) {
- setOnOpen(e -> startTask());
- setOnClose(e -> killTask());
+ setOnOpen(e -> {
+ if (Settings.USE_ASYNC_GUI_REFRESH.getBoolean()) {
+ startTaskAsync();
+ } else {
+ startTask();
+ }
+ });
+ setOnClose(e -> {
+ if (Settings.USE_ASYNC_GUI_REFRESH.getBoolean()) {
+ killAsyncTask();
+ } else {
+ killTask();
+ }
+ });
}
}
@@ -212,7 +226,15 @@ public class GUIAuctionHouse extends Gui {
taskId = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(AuctionHouse.getInstance(), this::draw, 0L, Settings.TICK_UPDATE_TIME.getInt());
}
+ private void startTaskAsync() {
+ task = Bukkit.getServer().getScheduler().runTaskTimerAsynchronously(AuctionHouse.getInstance(), this::draw, 0L, Settings.TICK_UPDATE_TIME.getInt());
+ }
+
private void killTask() {
Bukkit.getServer().getScheduler().cancelTask(taskId);
}
+
+ private void killAsyncTask() {
+ task.cancel();
+ }
}
diff --git a/src/main/java/ca/tweetzy/auctionhouse/guis/GUIExpiredItems.java b/src/main/java/ca/tweetzy/auctionhouse/guis/GUIExpiredItems.java
index 992f03a..2de44bc 100644
--- a/src/main/java/ca/tweetzy/auctionhouse/guis/GUIExpiredItems.java
+++ b/src/main/java/ca/tweetzy/auctionhouse/guis/GUIExpiredItems.java
@@ -53,7 +53,6 @@ public class GUIExpiredItems extends Gui {
setButton(5, 0, ConfigurationItemHelper.createConfigurationItem(Settings.GUI_CLOSE_BTN_ITEM.getString(), Settings.GUI_CLOSE_BTN_NAME.getString(), Settings.GUI_CLOSE_BTN_LORE.getStringList(), null), e -> e.manager.showGUI(e.player, new GUIAuctionHouse(this.auctionPlayer)));
setButton(5, 1, ConfigurationItemHelper.createConfigurationItem(Settings.GUI_EXPIRED_AUCTIONS_ITEM.getString(), Settings.GUI_EXPIRED_AUCTIONS_NAME.getString(), Settings.GUI_EXPIRED_AUCTIONS_LORE.getStringList(), null), e -> {
this.auctionPlayer.getItems(true).forEach(item -> {
- AuctionHouse.getInstance().getAuctionItemManager().adjustItemsInFile(item, false);
AuctionHouse.getInstance().getAuctionItemManager().removeItem(item.getKey());
PlayerUtils.giveItem(e.player, AuctionAPI.getInstance().deserializeItem(item.getRawItem()));
});
@@ -64,7 +63,6 @@ public class GUIExpiredItems extends Gui {
int slot = 0;
for (AuctionItem item : data) {
setButton(slot++, AuctionAPI.getInstance().deserializeItem(item.getRawItem()), e -> {
- AuctionHouse.getInstance().getAuctionItemManager().adjustItemsInFile(item, false);
AuctionHouse.getInstance().getAuctionItemManager().removeItem(item.getKey());
PlayerUtils.giveItem(e.player, AuctionAPI.getInstance().deserializeItem(item.getRawItem()));
draw();
diff --git a/src/main/java/ca/tweetzy/auctionhouse/listeners/PlayerListeners.java b/src/main/java/ca/tweetzy/auctionhouse/listeners/PlayerListeners.java
index 98aa169..05a408d 100644
--- a/src/main/java/ca/tweetzy/auctionhouse/listeners/PlayerListeners.java
+++ b/src/main/java/ca/tweetzy/auctionhouse/listeners/PlayerListeners.java
@@ -24,7 +24,7 @@ public class PlayerListeners implements Listener {
Player player = e.getPlayer();
Bukkit.getServer().getScheduler().runTaskLaterAsynchronously(AuctionHouse.getInstance(), () -> {
AuctionHouse.getInstance().getAuctionPlayerManager().addPlayer(new AuctionPlayer(player));
- if (AuctionHouse.getInstance().getUpdateStatus() == UpdateChecker.UpdateStatus.UNRELEASED_VERSION && player.isOp()) {
+ if (AuctionHouse.getInstance().getStatus() == UpdateChecker.UpdateStatus.UNRELEASED_VERSION && player.isOp()) {
AuctionHouse.getInstance().getLocale().getMessage(TextUtils.formatText(String.format("&dYou're running an unreleased version of Auction House &f(&c%s&f)", AuctionHouse.getInstance().getDescription().getVersion()))).sendPrefixedMessage(player);
}
}, 20);
diff --git a/src/main/java/ca/tweetzy/auctionhouse/managers/AuctionItemManager.java b/src/main/java/ca/tweetzy/auctionhouse/managers/AuctionItemManager.java
index 9f90c8b..b9dd91d 100644
--- a/src/main/java/ca/tweetzy/auctionhouse/managers/AuctionItemManager.java
+++ b/src/main/java/ca/tweetzy/auctionhouse/managers/AuctionItemManager.java
@@ -50,48 +50,30 @@ public class AuctionItemManager {
return Collections.unmodifiableList(auctionItems.stream().filter(auctionItem -> MaterialCategorizer.getMaterialCategory(AuctionAPI.getInstance().deserializeItem(auctionItem.getRawItem())) == category).collect(Collectors.toList()));
}
- public void loadItems() {
- if (AuctionHouse.getInstance().getData().contains("auction items") && AuctionHouse.getInstance().getData().isList("auction items")) {
- List items = AuctionHouse.getInstance().getData().getStringList("auction items").stream().map(AuctionAPI.getInstance()::convertBase64ToObject).map(object -> (AuctionItem) object).collect(Collectors.toList());
- long start = System.currentTimeMillis();
- items.forEach(this::addItem);
- AuctionHouse.getInstance().getLocale().newMessage(TextUtils.formatText(String.format("&aLoaded &2%d &aauction items(s) in &e%d&fms", items.size(), System.currentTimeMillis() - start))).sendPrefixedMessage(Bukkit.getConsoleSender());
- AuctionHouse.getInstance().getData().set("auction items", null);
- AuctionHouse.getInstance().getData().save();
+ public void loadItems(boolean useDatabase) {
+ if (useDatabase) {
+ AuctionHouse.getInstance().getDataManager().getItems(all -> all.forEach(this::addItem));
+ } else {
+ if (AuctionHouse.getInstance().getData().contains("auction items") && AuctionHouse.getInstance().getData().isList("auction items")) {
+ List items = AuctionHouse.getInstance().getData().getStringList("auction items").stream().map(AuctionAPI.getInstance()::convertBase64ToObject).map(object -> (AuctionItem) object).collect(Collectors.toList());
+ long start = System.currentTimeMillis();
+ items.forEach(this::addItem);
+ AuctionHouse.getInstance().getLocale().newMessage(TextUtils.formatText(String.format("&aLoaded &2%d &aauction items(s) in &e%d&fms", items.size(), System.currentTimeMillis() - start))).sendPrefixedMessage(Bukkit.getConsoleSender());
+ AuctionHouse.getInstance().getData().set("auction items", null);
+ AuctionHouse.getInstance().getData().save();
+ }
}
}
- public void saveItems() {
- this.adjustItemsInFile(this.getAuctionItems());
+ public void saveItems(boolean useDatabase, boolean async) {
+ if (useDatabase) {
+ AuctionHouse.getInstance().getDataManager().saveItems(getAuctionItems(), async);
+ } else {
+ this.adjustItemsInFile(this.getAuctionItems());
+ }
}
public void adjustItemsInFile(List items) {
- if (!AuctionHouse.getInstance().getData().contains("auction items")) {
- AuctionHouse.getInstance().getData().set("auction items", items.stream().map(AuctionAPI.getInstance()::convertToBase64).collect(Collectors.toList()));
- AuctionHouse.getInstance().getData().save();
- return;
- }
-
- List foundItems = AuctionHouse.getInstance().getData().getStringList("auction items").stream().map(AuctionAPI.getInstance()::convertBase64ToObject).map(object -> (AuctionItem) object).collect(Collectors.toList());
- foundItems.addAll(items);
- AuctionHouse.getInstance().getData().set("auction items", foundItems.stream().map(AuctionAPI.getInstance()::convertToBase64).collect(Collectors.toList()));
- AuctionHouse.getInstance().getData().save();
- }
-
- public void adjustItemsInFile(AuctionItem item, boolean add) {
- if (!AuctionHouse.getInstance().getData().contains("auction items") && add) {
- AuctionHouse.getInstance().getData().set("auction items", Collections.singletonList(AuctionAPI.getInstance().convertToBase64(item)));
- AuctionHouse.getInstance().getData().save();
- return;
- }
-
- List items = AuctionHouse.getInstance().getData().getStringList("auction items").stream().map(AuctionAPI.getInstance()::convertBase64ToObject).map(object -> (AuctionItem) object).collect(Collectors.toList());
- if (items.stream().anyMatch(i -> i.getKey().equals(item.getKey())) || !add) {
- items.removeIf(i -> i.getKey().equals(item.getKey()));
- } else {
- items.add(item);
- }
-
AuctionHouse.getInstance().getData().set("auction items", items.stream().map(AuctionAPI.getInstance()::convertToBase64).collect(Collectors.toList()));
AuctionHouse.getInstance().getData().save();
}
diff --git a/src/main/java/ca/tweetzy/auctionhouse/managers/TransactionManager.java b/src/main/java/ca/tweetzy/auctionhouse/managers/TransactionManager.java
index b017733..a57dca0 100644
--- a/src/main/java/ca/tweetzy/auctionhouse/managers/TransactionManager.java
+++ b/src/main/java/ca/tweetzy/auctionhouse/managers/TransactionManager.java
@@ -2,6 +2,7 @@ package ca.tweetzy.auctionhouse.managers;
import ca.tweetzy.auctionhouse.AuctionHouse;
import ca.tweetzy.auctionhouse.api.AuctionAPI;
+import ca.tweetzy.auctionhouse.settings.Settings;
import ca.tweetzy.auctionhouse.transaction.Transaction;
import ca.tweetzy.core.utils.TextUtils;
import org.bukkit.Bukkit;
@@ -39,17 +40,25 @@ public class TransactionManager {
return Collections.unmodifiableList(this.transactions);
}
- public void loadTransactions() {
- if (AuctionHouse.getInstance().getData().contains("transactions") && AuctionHouse.getInstance().getData().isList("transactions")) {
- List transactions = AuctionHouse.getInstance().getData().getStringList("transactions").stream().map(AuctionAPI.getInstance()::convertBase64ToObject).map(object -> (Transaction) object).collect(Collectors.toList());
- long start = System.currentTimeMillis();
- transactions.forEach(this::addTransaction);
- AuctionHouse.getInstance().getLocale().newMessage(TextUtils.formatText(String.format("&aLoaded &2%d &atransaction(s) in &e%d&fms", transactions.size(), System.currentTimeMillis() - start))).sendPrefixedMessage(Bukkit.getConsoleSender());
+ public void loadTransactions(boolean useDatabase) {
+ if (useDatabase) {
+ AuctionHouse.getInstance().getDataManager().getTransactions(all -> all.forEach(this::addTransaction));
+ } else {
+ if (AuctionHouse.getInstance().getData().contains("transactions") && AuctionHouse.getInstance().getData().isList("transactions")) {
+ List transactions = AuctionHouse.getInstance().getData().getStringList("transactions").stream().map(AuctionAPI.getInstance()::convertBase64ToObject).map(object -> (Transaction) object).collect(Collectors.toList());
+ long start = System.currentTimeMillis();
+ transactions.forEach(this::addTransaction);
+ AuctionHouse.getInstance().getLocale().newMessage(TextUtils.formatText(String.format("&aLoaded &2%d &atransaction(s) in &e%d&fms", transactions.size(), System.currentTimeMillis() - start))).sendPrefixedMessage(Bukkit.getConsoleSender());
+ }
}
}
- public void saveTransactions() {
- AuctionHouse.getInstance().getData().set("transactions", this.transactions.stream().map(AuctionAPI.getInstance()::convertToBase64).collect(Collectors.toList()));
- AuctionHouse.getInstance().getData().save();
+ public void saveTransactions(boolean useDatabase, boolean async) {
+ if (useDatabase) {
+ AuctionHouse.getInstance().getDataManager().saveTransactions(getTransactions(), async);
+ } else {
+ AuctionHouse.getInstance().getData().set("transactions", this.transactions.stream().map(AuctionAPI.getInstance()::convertToBase64).collect(Collectors.toList()));
+ AuctionHouse.getInstance().getData().save();
+ }
}
}
diff --git a/src/main/java/ca/tweetzy/auctionhouse/settings/Settings.java b/src/main/java/ca/tweetzy/auctionhouse/settings/Settings.java
index 60ddfba..b069b18 100644
--- a/src/main/java/ca/tweetzy/auctionhouse/settings/Settings.java
+++ b/src/main/java/ca/tweetzy/auctionhouse/settings/Settings.java
@@ -42,6 +42,21 @@ public class Settings {
public static final ConfigSetting RECORD_TRANSACTIONS = new ConfigSetting(config, "auction setting.record transactions", true, "Should every transaction be recorded (everything an auction is won or an item is bought)");
public static final ConfigSetting BROADCAST_AUCTION_LIST = new ConfigSetting(config, "auction setting.broadcast auction list", false, "Should the entire server be alerted when a player lists an item?");
public static final ConfigSetting PLAYER_NEEDS_TOTAL_PRICE_TO_BID = new ConfigSetting(config, "auction setting.bidder must have funds in account", false, "Should the player who is placing a bid on an item have the money in their account to cover the cost?");
+ public static final ConfigSetting USE_ASYNC_GUI_REFRESH = new ConfigSetting(config, "auction setting.use async gui refresh", false, "Should the gui refresh be done using asynchronous tasks?", "This may reduce lag that can be caused, but", "items may have a flickering effect inside the gui.");
+ public static final ConfigSetting AUTO_SAVE_ENABLED = new ConfigSetting(config, "auction setting.auto save.enabled", true, "Should the auto save task be enabled?");
+ public static final ConfigSetting AUTO_SAVE_EVERY = new ConfigSetting(config, "auction setting.auto save.time", 900, "How often should the auto save active? (in seconds. Ex. 900 = 15min)");
+
+ /* ===============================
+ * DATABASE OPTIONS
+ * ===============================*/
+ public static final ConfigSetting DATABASE_USE = new ConfigSetting(config, "database.use database", false, "Should the plugin use a database to store shop data?");
+ public static final ConfigSetting DATABASE_HOST = new ConfigSetting(config, "database.host", "kiranhart.com", "What is the connection url/host");
+ public static final ConfigSetting DATABASE_PORT = new ConfigSetting(config, "database.port", 3306, "What is the port to database (default is 3306)");
+ public static final ConfigSetting DATABASE_NAME = new ConfigSetting(config, "database.name", "kiranhar_temporary", "What is the name of the database?");
+ public static final ConfigSetting DATABASE_USERNAME = new ConfigSetting(config, "database.username", "kiranhar_temp", "What is the name of the user connecting?");
+ public static final ConfigSetting DATABASE_PASSWORD = new ConfigSetting(config, "database.password", "Tw33tyHart1.", "What is the password to the user connecting?");
+ public static final ConfigSetting DATABASE_USE_SSL = new ConfigSetting(config, "database.use ssl", true, "Should the database connection use ssl?");
+
/* ===============================
* DISCORD WEBHOOK
diff --git a/src/main/java/ca/tweetzy/auctionhouse/tasks/AutoSaveTask.java b/src/main/java/ca/tweetzy/auctionhouse/tasks/AutoSaveTask.java
new file mode 100644
index 0000000..11d8780
--- /dev/null
+++ b/src/main/java/ca/tweetzy/auctionhouse/tasks/AutoSaveTask.java
@@ -0,0 +1,33 @@
+package ca.tweetzy.auctionhouse.tasks;
+
+import ca.tweetzy.auctionhouse.AuctionHouse;
+import ca.tweetzy.auctionhouse.settings.Settings;
+import ca.tweetzy.core.utils.TextUtils;
+import org.bukkit.Bukkit;
+import org.bukkit.scheduler.BukkitRunnable;
+
+/**
+ * The current file has been created by Kiran Hart
+ * Date Created: April 15 2021
+ * Time Created: 2:28 p.m.
+ * Usage of any code found within this class is prohibited unless given explicit permission otherwise
+ */
+public class AutoSaveTask extends BukkitRunnable {
+
+ private static AutoSaveTask instance;
+
+ public static AutoSaveTask startTask() {
+ if (instance == null) {
+ instance = new AutoSaveTask();
+ instance.runTaskTimerAsynchronously(AuctionHouse.getInstance(), 20 * 5, (long) 20 * Settings.AUTO_SAVE_EVERY.getInt());
+ }
+ return instance;
+ }
+
+ @Override
+ public void run() {
+ AuctionHouse.getInstance().getAuctionItemManager().saveItems(Settings.DATABASE_USE.getBoolean(), true);
+ AuctionHouse.getInstance().getTransactionManager().saveTransactions(Settings.DATABASE_USE.getBoolean(), true);
+ AuctionHouse.getInstance().getLocale().newMessage(TextUtils.formatText("&aAuto saved auction items & transactions")).sendPrefixedMessage(Bukkit.getConsoleSender());
+ }
+}
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index cc43d33..7a05882 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -26,6 +26,7 @@ permissions:
auctionhouse.cmd.transactions: true
auctionhouse.cmd.search: true
auctionhouse.cmd.convert: true
+ auctionhouse.cmd.upload: true
auctionhouse.cmd:
description: Allows the user to use /ah
default: op
@@ -49,4 +50,7 @@ permissions:
default: op
auctionhouse.cmd.convert:
description: Allows the user to run conversion command
+ default: op
+ auctionhouse.cmd.upload:
+ description: Allows the user to run upload command
default: op
\ No newline at end of file