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