database storage support & auto save

This commit is contained in:
Kiran Hart 2021-04-15 16:29:54 -04:00
parent 689548183f
commit 46e886893e
14 changed files with 433 additions and 90 deletions

View File

@ -6,7 +6,7 @@
<groupId>ca.tweetzy</groupId>
<artifactId>auctionhouse</artifactId>
<version>2.2.0</version>
<version>2.3.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

View File

@ -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__%%";

View File

@ -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<AuctionItem> 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<Transaction> 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<String> onTab(CommandSender sender, String... args) {
return null;
}
}

View File

@ -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<AuctionItem> 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<Transaction> 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<ArrayList<Transaction>> callback) {
ArrayList<Transaction> 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<ArrayList<AuctionItem>> callback) {
ArrayList<AuctionItem> 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));
}));
}
}

View File

@ -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 )");
}
}
}

View File

@ -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();
}
}

View File

@ -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<AuctionItem> 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();
}
}

View File

@ -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();

View File

@ -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);

View File

@ -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<AuctionItem> 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<AuctionItem> 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<AuctionItem> 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<AuctionItem> 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<AuctionItem> 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();
}

View File

@ -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<Transaction> 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<Transaction> 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();
}
}
}

View File

@ -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

View File

@ -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());
}
}

View File

@ -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