diff --git a/pom.xml b/pom.xml
index 7a28930..e4d19b9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
4.0.0
ca.tweetzy
auctionhouse
- 2.14.0
+ 2.15.0
UTF-8
diff --git a/src/main/java/ca/tweetzy/auctionhouse/AuctionHouse.java b/src/main/java/ca/tweetzy/auctionhouse/AuctionHouse.java
index 1984626..0d01562 100644
--- a/src/main/java/ca/tweetzy/auctionhouse/AuctionHouse.java
+++ b/src/main/java/ca/tweetzy/auctionhouse/AuctionHouse.java
@@ -5,10 +5,12 @@ 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.database.migrations._2_FilterWhitelistMigration;
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.FilterManager;
import ca.tweetzy.auctionhouse.managers.TransactionManager;
import ca.tweetzy.auctionhouse.settings.LocaleSettings;
import ca.tweetzy.auctionhouse.settings.Settings;
@@ -72,6 +74,9 @@ public class AuctionHouse extends TweetyPlugin {
@Getter
private TransactionManager transactionManager;
+ @Getter
+ private FilterManager filterManager;
+
@Getter
private DatabaseConnector databaseConnector;
@@ -126,7 +131,7 @@ public class AuctionHouse extends TweetyPlugin {
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 dataMigrationManager = new DataMigrationManager(this.databaseConnector, this.dataManager, new _1_InitialMigration(), new _2_FilterWhitelistMigration());
dataMigrationManager.runMigrations();
}
@@ -138,6 +143,10 @@ public class AuctionHouse extends TweetyPlugin {
this.transactionManager = new TransactionManager();
this.transactionManager.loadTransactions(Settings.DATABASE_USE.getBoolean());
+ // load the filter whitelist items
+ this.filterManager = new FilterManager();
+ this.filterManager.loadItems(Settings.DATABASE_USE.getBoolean());
+
// gui manager
this.guiManager.init();
@@ -154,6 +163,7 @@ public class AuctionHouse extends TweetyPlugin {
new CommandSettings(),
new CommandConvert(),
new CommandReload(),
+ new CommandFilter(),
new CommandUpload(),
new CommandStatus(),
new CommandAdmin()
@@ -177,6 +187,7 @@ public class AuctionHouse extends TweetyPlugin {
public void onPluginDisable() {
this.auctionItemManager.saveItems(Settings.DATABASE_USE.getBoolean(), false);
this.transactionManager.saveTransactions(Settings.DATABASE_USE.getBoolean(), false);
+ this.filterManager.saveFilterWhitelist(Settings.DATABASE_USE.getBoolean(), false);
instance = null;
}
diff --git a/src/main/java/ca/tweetzy/auctionhouse/auction/AuctionFilterItem.java b/src/main/java/ca/tweetzy/auctionhouse/auction/AuctionFilterItem.java
new file mode 100644
index 0000000..66bc409
--- /dev/null
+++ b/src/main/java/ca/tweetzy/auctionhouse/auction/AuctionFilterItem.java
@@ -0,0 +1,33 @@
+package ca.tweetzy.auctionhouse.auction;
+
+import ca.tweetzy.auctionhouse.AuctionHouse;
+import ca.tweetzy.auctionhouse.api.AuctionAPI;
+import lombok.Getter;
+import lombok.Setter;
+import org.bukkit.inventory.ItemStack;
+
+import java.io.Serializable;
+
+/**
+ * The current file has been created by Kiran Hart
+ * Date Created: June 22 2021
+ * Time Created: 3:39 p.m.
+ * Usage of any code found within this class is prohibited unless given explicit permission otherwise
+ */
+
+@Getter
+@Setter
+public class AuctionFilterItem implements Serializable {
+
+ private byte[] rawItem;
+ private AuctionItemCategory category;
+
+ public AuctionFilterItem(ItemStack item, AuctionItemCategory category) {
+ this.rawItem = AuctionAPI.getInstance().serializeItem(item);
+ this.category = category;
+ }
+
+ public ItemStack getItemStack() {
+ return AuctionAPI.getInstance().deserializeItem(this.rawItem);
+ }
+}
diff --git a/src/main/java/ca/tweetzy/auctionhouse/auction/AuctionItemCategory.java b/src/main/java/ca/tweetzy/auctionhouse/auction/AuctionItemCategory.java
index ad146b0..e142158 100644
--- a/src/main/java/ca/tweetzy/auctionhouse/auction/AuctionItemCategory.java
+++ b/src/main/java/ca/tweetzy/auctionhouse/auction/AuctionItemCategory.java
@@ -10,29 +10,35 @@ import ca.tweetzy.auctionhouse.AuctionHouse;
*/
public enum AuctionItemCategory {
- ALL("All"),
- FOOD("Food"),
- ARMOR("Armor"),
- BLOCKS("Blocks"),
- TOOLS("Tools"),
- WEAPONS("Weapons"),
- SPAWNERS("Spawners"),
- ENCHANTS("Enchants"),
- MISC("Misc"),
- SEARCH("Search"),
- SELF("Self");
+ ALL("All", false),
+ FOOD("Food", true),
+ ARMOR("Armor", true),
+ BLOCKS("Blocks", true),
+ TOOLS("Tools", true),
+ WEAPONS("Weapons", true),
+ SPAWNERS("Spawners", true),
+ ENCHANTS("Enchants", true),
+ MISC("Misc", true),
+ SEARCH("Search", false),
+ SELF("Self", false);
private final String type;
+ private final boolean whitelistAllowed;
- AuctionItemCategory(String type) {
+ AuctionItemCategory(String type, boolean whitelistAllowed) {
this.type = type;
+ this.whitelistAllowed = whitelistAllowed;
}
public String getType() {
return type;
}
+ public boolean isWhitelistAllowed() {
+ return whitelistAllowed;
+ }
+
public String getTranslatedType() {
switch (this) {
case ALL:
diff --git a/src/main/java/ca/tweetzy/auctionhouse/commands/CommandFilter.java b/src/main/java/ca/tweetzy/auctionhouse/commands/CommandFilter.java
new file mode 100644
index 0000000..f1e966d
--- /dev/null
+++ b/src/main/java/ca/tweetzy/auctionhouse/commands/CommandFilter.java
@@ -0,0 +1,95 @@
+package ca.tweetzy.auctionhouse.commands;
+
+import ca.tweetzy.auctionhouse.AuctionHouse;
+import ca.tweetzy.auctionhouse.api.AuctionAPI;
+import ca.tweetzy.auctionhouse.auction.AuctionFilterItem;
+import ca.tweetzy.auctionhouse.auction.AuctionItemCategory;
+import ca.tweetzy.auctionhouse.guis.filter.GUIFilterWhitelist;
+import ca.tweetzy.auctionhouse.helpers.PlayerHelper;
+import ca.tweetzy.core.commands.AbstractCommand;
+import ca.tweetzy.core.compatibility.XMaterial;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * The current file has been created by Kiran Hart
+ * Date Created: June 22 2021
+ * Time Created: 3:18 p.m.
+ * Usage of any code found within this class is prohibited unless given explicit permission otherwise
+ */
+public class CommandFilter extends AbstractCommand {
+
+ public CommandFilter() {
+ super(CommandType.PLAYER_ONLY, "filter");
+ }
+
+ @Override
+ protected ReturnType runCommand(CommandSender sender, String... args) {
+ Player player = (Player) sender;
+
+ if (args.length == 0) {
+ AuctionHouse.getInstance().getGuiManager().showGUI(player, new GUIFilterWhitelist());
+ return ReturnType.SUCCESS;
+ }
+
+ if (args.length == 2 && args[0].equalsIgnoreCase("additem")) {
+ boolean isValid = false;
+ for (AuctionItemCategory value : AuctionItemCategory.values()) {
+ if (args[1].toUpperCase().equals(value.name())) {
+ isValid = true;
+ break;
+ }
+ }
+
+ if (isValid && AuctionItemCategory.valueOf(args[1].toUpperCase()).isWhitelistAllowed()) {
+
+ ItemStack held = PlayerHelper.getHeldItem(player);
+ if (held.getType() == XMaterial.AIR.parseMaterial()) {
+ AuctionHouse.getInstance().getLocale().getMessage("general.filter air").sendPrefixedMessage(player);
+ return ReturnType.FAILURE;
+ }
+
+
+ if (AuctionHouse.getInstance().getFilterManager().getFilteredItem(held) != null && AuctionHouse.getInstance().getFilterManager().getFilteredItem(held).getCategory() == AuctionItemCategory.valueOf(args[1].toUpperCase())) {
+ AuctionHouse.getInstance().getLocale().getMessage("general.filteritemaddedalready").sendPrefixedMessage(player);
+ return ReturnType.FAILURE;
+ }
+
+ AuctionFilterItem filterItem = new AuctionFilterItem(held, AuctionItemCategory.valueOf(args[1].toUpperCase()));
+ AuctionHouse.getInstance().getFilterManager().addFilterItem(filterItem);
+ AuctionHouse.getInstance().getLocale().getMessage("general.addeditemtofilterwhitelist").processPlaceholder("item_name", AuctionAPI.getInstance().getItemName(held)).processPlaceholder("filter_category", args[1]).sendPrefixedMessage(player);
+ }
+ }
+
+ return ReturnType.SUCCESS;
+ }
+
+ @Override
+ public String getPermissionNode() {
+ return "auctionhouse.cmd.filter";
+ }
+
+ @Override
+ public String getSyntax() {
+ return AuctionHouse.getInstance().getLocale().getMessage("commands.syntax.filter").getMessage();
+ }
+
+ @Override
+ public String getDescription() {
+ return AuctionHouse.getInstance().getLocale().getMessage("commands.description.filter").getMessage();
+ }
+
+ @Override
+ protected List onTab(CommandSender sender, String... args) {
+ if (args.length == 1) return Collections.singletonList("additem");
+ if (args.length == 2)
+ return Arrays.stream(AuctionItemCategory.values()).filter(AuctionItemCategory::isWhitelistAllowed).map(AuctionItemCategory::getTranslatedType).collect(Collectors.toList());
+ return null;
+ }
+}
diff --git a/src/main/java/ca/tweetzy/auctionhouse/database/DataManager.java b/src/main/java/ca/tweetzy/auctionhouse/database/DataManager.java
index 54f4d0b..68cc36d 100644
--- a/src/main/java/ca/tweetzy/auctionhouse/database/DataManager.java
+++ b/src/main/java/ca/tweetzy/auctionhouse/database/DataManager.java
@@ -1,6 +1,7 @@
package ca.tweetzy.auctionhouse.database;
import ca.tweetzy.auctionhouse.api.AuctionAPI;
+import ca.tweetzy.auctionhouse.auction.AuctionFilterItem;
import ca.tweetzy.auctionhouse.auction.AuctionItem;
import ca.tweetzy.auctionhouse.transaction.Transaction;
import ca.tweetzy.core.database.DataManagerAbstract;
@@ -66,6 +67,48 @@ public class DataManager extends DataManagerAbstract {
}
}
+ public void saveFilterWhitelist(List filterItems, boolean async){
+ if (async) {
+ this.async(() -> this.databaseConnector.connect(connection -> {
+ String saveItems = "INSERT IGNORE INTO " + this.getTablePrefix() + "filter_whitelist SET data = ?";
+ String truncate = "TRUNCATE TABLE " + this.getTablePrefix() + "filter_whitelist";
+ try (PreparedStatement statement = connection.prepareStatement(truncate)) {
+ statement.execute();
+ }
+
+ PreparedStatement statement = connection.prepareStatement(saveItems);
+ filterItems.forEach(filterItem -> {
+ try {
+ statement.setString(1, AuctionAPI.getInstance().convertToBase64(filterItem));
+ statement.addBatch();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ });
+ statement.executeBatch();
+ }));
+ } else {
+ this.databaseConnector.connect(connection -> {
+ String saveItems = "INSERT IGNORE INTO " + this.getTablePrefix() + "filter_whitelist SET data = ?";
+ String truncate = "TRUNCATE TABLE " + this.getTablePrefix() + "filter_whitelist";
+ try (PreparedStatement statement = connection.prepareStatement(truncate)) {
+ statement.execute();
+ }
+
+ PreparedStatement statement = connection.prepareStatement(saveItems);
+ filterItems.forEach(filterItem -> {
+ try {
+ statement.setString(1, AuctionAPI.getInstance().convertToBase64(filterItem));
+ statement.addBatch();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ });
+ statement.executeBatch();
+ });
+ }
+ }
+
public void saveTransactions(List transactions, boolean async) {
if (async) {
this.async(() -> this.databaseConnector.connect(connection -> {
@@ -123,6 +166,21 @@ public class DataManager extends DataManagerAbstract {
}));
}
+ public void getFilterWhitelist(Consumer> callback) {
+ ArrayList filterItems = new ArrayList<>();
+ this.async(() -> this.databaseConnector.connect(connection -> {
+ String select = "SELECT * FROM " + this.getTablePrefix() + "filter_whitelist";
+
+ try (Statement statement = connection.createStatement()) {
+ ResultSet result = statement.executeQuery(select);
+ while (result.next()) {
+ filterItems.add((AuctionFilterItem) AuctionAPI.getInstance().convertBase64ToObject(result.getString("data")));
+ }
+ }
+ this.sync(() -> callback.accept(filterItems));
+ }));
+ }
+
public void getItems(Consumer> callback) {
ArrayList items = new ArrayList<>();
this.async(() -> this.databaseConnector.connect(connection -> {
diff --git a/src/main/java/ca/tweetzy/auctionhouse/database/migrations/_2_FilterWhitelistMigration.java b/src/main/java/ca/tweetzy/auctionhouse/database/migrations/_2_FilterWhitelistMigration.java
new file mode 100644
index 0000000..cb73d52
--- /dev/null
+++ b/src/main/java/ca/tweetzy/auctionhouse/database/migrations/_2_FilterWhitelistMigration.java
@@ -0,0 +1,33 @@
+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: June 22 2021
+ * Time Created: 3:46 p.m.
+ * Usage of any code found within this class is prohibited unless given explicit permission otherwise
+ */
+public class _2_FilterWhitelistMigration extends DataMigration {
+
+ public _2_FilterWhitelistMigration() {
+ super(2);
+ }
+
+ @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 + "filter_whitelist (" +
+ "id INTEGER PRIMARY KEY" + autoIncrement + ", " +
+ "data LONGTEXT NOT NULL )");
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/ca/tweetzy/auctionhouse/guis/GUIAuctionHouse.java b/src/main/java/ca/tweetzy/auctionhouse/guis/GUIAuctionHouse.java
index 155b0ac..badfed4 100644
--- a/src/main/java/ca/tweetzy/auctionhouse/guis/GUIAuctionHouse.java
+++ b/src/main/java/ca/tweetzy/auctionhouse/guis/GUIAuctionHouse.java
@@ -3,6 +3,7 @@ package ca.tweetzy.auctionhouse.guis;
import ca.tweetzy.auctionhouse.AuctionHouse;
import ca.tweetzy.auctionhouse.api.AuctionAPI;
import ca.tweetzy.auctionhouse.auction.*;
+import ca.tweetzy.auctionhouse.guis.filter.GUIFilterSelection;
import ca.tweetzy.auctionhouse.guis.transaction.GUITransactionList;
import ca.tweetzy.auctionhouse.helpers.ConfigurationItemHelper;
import ca.tweetzy.auctionhouse.managers.SoundManager;
@@ -72,7 +73,7 @@ public class GUIAuctionHouse extends Gui {
}
if (this.auctionPlayer.getSelectedFilter() != AuctionItemCategory.ALL && this.auctionPlayer.getSelectedFilter() != AuctionItemCategory.SEARCH && this.auctionPlayer.getSelectedFilter() != AuctionItemCategory.SELF) {
- this.items = this.items.stream().filter(item -> item.getCategory() == this.auctionPlayer.getSelectedFilter()).collect(Collectors.toList());
+ this.items = this.items.stream().filter(item -> checkFilterCriteria(item, this.auctionPlayer.getSelectedFilter())).collect(Collectors.toList());
} else if (this.auctionPlayer.getSelectedFilter() == AuctionItemCategory.SELF) {
this.items = this.items.stream().filter(item -> item.getOwner().equals(this.auctionPlayer.getPlayer().getUniqueId())).collect(Collectors.toList());
} else if (this.auctionPlayer.getSelectedFilter() == AuctionItemCategory.SEARCH && this.auctionPlayer.getCurrentSearchPhrase().length() != 0) {
@@ -103,6 +104,11 @@ public class GUIAuctionHouse extends Gui {
}).execute();
}
+ private boolean checkFilterCriteria(AuctionItem auctionItem, AuctionItemCategory category) {
+ return auctionItem.getCategory() == category ||
+ AuctionHouse.getInstance().getFilterManager().getFilterWhitelist(category).stream().anyMatch(item -> item.isSimilar(AuctionAPI.getInstance().deserializeItem(auctionItem.getRawItem())));
+ }
+
private boolean checkSearchCriteria(String phrase, AuctionItem item) {
return AuctionAPI.getInstance().match(phrase, item.getItemName()) ||
AuctionAPI.getInstance().match(phrase, item.getCategory().getTranslatedType()) ||
diff --git a/src/main/java/ca/tweetzy/auctionhouse/guis/GUIFilterSelection.java b/src/main/java/ca/tweetzy/auctionhouse/guis/filter/GUIFilterSelection.java
similarity index 98%
rename from src/main/java/ca/tweetzy/auctionhouse/guis/GUIFilterSelection.java
rename to src/main/java/ca/tweetzy/auctionhouse/guis/filter/GUIFilterSelection.java
index 407fd87..5780a0c 100644
--- a/src/main/java/ca/tweetzy/auctionhouse/guis/GUIFilterSelection.java
+++ b/src/main/java/ca/tweetzy/auctionhouse/guis/filter/GUIFilterSelection.java
@@ -1,9 +1,10 @@
-package ca.tweetzy.auctionhouse.guis;
+package ca.tweetzy.auctionhouse.guis.filter;
import ca.tweetzy.auctionhouse.AuctionHouse;
import ca.tweetzy.auctionhouse.api.AuctionAPI;
import ca.tweetzy.auctionhouse.auction.AuctionItemCategory;
import ca.tweetzy.auctionhouse.auction.AuctionPlayer;
+import ca.tweetzy.auctionhouse.guis.GUIAuctionHouse;
import ca.tweetzy.auctionhouse.helpers.ConfigurationItemHelper;
import ca.tweetzy.auctionhouse.settings.Settings;
import ca.tweetzy.core.gui.Gui;
diff --git a/src/main/java/ca/tweetzy/auctionhouse/guis/filter/GUIFilterWhitelist.java b/src/main/java/ca/tweetzy/auctionhouse/guis/filter/GUIFilterWhitelist.java
new file mode 100644
index 0000000..c674f6d
--- /dev/null
+++ b/src/main/java/ca/tweetzy/auctionhouse/guis/filter/GUIFilterWhitelist.java
@@ -0,0 +1,61 @@
+package ca.tweetzy.auctionhouse.guis.filter;
+
+import ca.tweetzy.auctionhouse.auction.AuctionItemCategory;
+import ca.tweetzy.auctionhouse.helpers.ConfigurationItemHelper;
+import ca.tweetzy.auctionhouse.settings.Settings;
+import ca.tweetzy.core.gui.Gui;
+import ca.tweetzy.core.utils.TextUtils;
+
+/**
+ * The current file has been created by Kiran Hart
+ * Date Created: June 22 2021
+ * Time Created: 3:14 p.m.
+ * Usage of any code found within this class is prohibited unless given explicit permission otherwise
+ */
+public class GUIFilterWhitelist extends Gui {
+
+ public GUIFilterWhitelist() {
+ setTitle(TextUtils.formatText(Settings.GUI_FILTER_WHITELIST_TITLE.getString()));
+ setRows(6);
+ setAcceptsItems(false);
+ setDefaultItem(Settings.GUI_FILTER_WHITELIST_BG_ITEM.getMaterial().parseItem());
+ setUseLockedCells(true);
+ draw();
+ }
+
+ private void draw() {
+ setButton(2, 1, ConfigurationItemHelper.createConfigurationItem(Settings.GUI_FILTER_WHITELIST_ITEMS_BLOCKS_ITEM.getString(), Settings.GUI_FILTER_WHITELIST_ITEMS_BLOCKS_NAME.getString(), Settings.GUI_FILTER_WHITELIST_ITEMS_BLOCKS_LORE.getStringList(), null), e -> {
+ e.manager.showGUI(e.player, new GUIFilterWhitelistList(AuctionItemCategory.BLOCKS));
+ });
+
+ setButton(2, 3, ConfigurationItemHelper.createConfigurationItem(Settings.GUI_FILTER_WHITELIST_ITEMS_FOOD_ITEM.getString(), Settings.GUI_FILTER_WHITELIST_ITEMS_FOOD_NAME.getString(), Settings.GUI_FILTER_WHITELIST_ITEMS_FOOD_LORE.getStringList(), null), e -> {
+ e.manager.showGUI(e.player, new GUIFilterWhitelistList(AuctionItemCategory.FOOD));
+ });
+
+ setButton(2, 5, ConfigurationItemHelper.createConfigurationItem(Settings.GUI_FILTER_WHITELIST_ITEMS_ARMOR_ITEM.getString(), Settings.GUI_FILTER_WHITELIST_ITEMS_ARMOR_NAME.getString(), Settings.GUI_FILTER_WHITELIST_ITEMS_ARMOR_LORE.getStringList(), null), e -> {
+ e.manager.showGUI(e.player, new GUIFilterWhitelistList(AuctionItemCategory.ARMOR));
+ });
+
+ setButton(2, 7, ConfigurationItemHelper.createConfigurationItem(Settings.GUI_FILTER_WHITELIST_ITEMS_TOOLS_ITEM.getString(), Settings.GUI_FILTER_WHITELIST_ITEMS_TOOLS_NAME.getString(), Settings.GUI_FILTER_WHITELIST_ITEMS_TOOLS_LORE.getStringList(), null), e -> {
+ e.manager.showGUI(e.player, new GUIFilterWhitelistList(AuctionItemCategory.TOOLS));
+ });
+
+ // 2ND ROW STARTS
+
+ setButton(3, 1, ConfigurationItemHelper.createConfigurationItem(Settings.GUI_FILTER_WHITELIST_ITEMS_SPAWNERS_ITEM.getString(), Settings.GUI_FILTER_WHITELIST_ITEMS_SPAWNERS_NAME.getString(), Settings.GUI_FILTER_WHITELIST_ITEMS_SPAWNERS_LORE.getStringList(), null), e -> {
+ e.manager.showGUI(e.player, new GUIFilterWhitelistList(AuctionItemCategory.SPAWNERS));
+ });
+
+ setButton(3, 3, ConfigurationItemHelper.createConfigurationItem(Settings.GUI_FILTER_WHITELIST_ITEMS_ENCHANTS_ITEM.getString(), Settings.GUI_FILTER_WHITELIST_ITEMS_ENCHANTS_NAME.getString(), Settings.GUI_FILTER_WHITELIST_ITEMS_ENCHANTS_LORE.getStringList(), null), e -> {
+ e.manager.showGUI(e.player, new GUIFilterWhitelistList(AuctionItemCategory.ENCHANTS));
+ });
+
+ setButton(3, 5, ConfigurationItemHelper.createConfigurationItem(Settings.GUI_FILTER_WHITELIST_ITEMS_WEAPONS_ITEM.getString(), Settings.GUI_FILTER_WHITELIST_ITEMS_WEAPONS_NAME.getString(), Settings.GUI_FILTER_WHITELIST_ITEMS_WEAPONS_LORE.getStringList(), null), e -> {
+ e.manager.showGUI(e.player, new GUIFilterWhitelistList(AuctionItemCategory.WEAPONS));
+ });
+
+ setButton(3, 7, ConfigurationItemHelper.createConfigurationItem(Settings.GUI_FILTER_WHITELIST_ITEMS_MISC_ITEM.getString(), Settings.GUI_FILTER_WHITELIST_ITEMS_MISC_NAME.getString(), Settings.GUI_FILTER_WHITELIST_ITEMS_MISC_LORE.getStringList(), null), e -> {
+ e.manager.showGUI(e.player, new GUIFilterWhitelistList(AuctionItemCategory.MISC));
+ });
+ }
+}
diff --git a/src/main/java/ca/tweetzy/auctionhouse/guis/filter/GUIFilterWhitelistList.java b/src/main/java/ca/tweetzy/auctionhouse/guis/filter/GUIFilterWhitelistList.java
new file mode 100644
index 0000000..d4ee1cd
--- /dev/null
+++ b/src/main/java/ca/tweetzy/auctionhouse/guis/filter/GUIFilterWhitelistList.java
@@ -0,0 +1,65 @@
+package ca.tweetzy.auctionhouse.guis.filter;
+
+import ca.tweetzy.auctionhouse.AuctionHouse;
+import ca.tweetzy.auctionhouse.auction.AuctionFilterItem;
+import ca.tweetzy.auctionhouse.auction.AuctionItemCategory;
+import ca.tweetzy.auctionhouse.settings.Settings;
+import ca.tweetzy.core.compatibility.XSound;
+import ca.tweetzy.core.gui.Gui;
+import ca.tweetzy.core.utils.TextUtils;
+import ca.tweetzy.core.utils.items.TItemBuilder;
+import org.bukkit.event.inventory.ClickType;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * The current file has been created by Kiran Hart
+ * Date Created: June 22 2021
+ * Time Created: 4:06 p.m.
+ * Usage of any code found within this class is prohibited unless given explicit permission otherwise
+ */
+public class GUIFilterWhitelistList extends Gui {
+
+ final AuctionItemCategory filerCategory;
+ List items;
+
+ public GUIFilterWhitelistList(AuctionItemCategory filerCategory) {
+ this.filerCategory = filerCategory;
+ setTitle(TextUtils.formatText(Settings.GUI_FILTER_WHITELIST_LIST_TITLE.getString().replace("%filter_category%", filerCategory.getTranslatedType())));
+ setRows(6);
+ setAcceptsItems(false);
+ setDefaultItem(Settings.GUI_FILTER_WHITELIST_LIST_BG_ITEM.getMaterial().parseItem());
+ setUseLockedCells(true);
+ draw();
+
+ setOnClose(close -> close.manager.showGUI(close.player, new GUIFilterWhitelist()));
+ }
+
+ private void draw() {
+ reset();
+ setPrevPage(5, 3, new TItemBuilder(Objects.requireNonNull(Settings.GUI_BACK_BTN_ITEM.getMaterial().parseMaterial())).setName(Settings.GUI_BACK_BTN_NAME.getString()).setLore(Settings.GUI_BACK_BTN_LORE.getStringList()).toItemStack());
+ setButton(5, 4, new TItemBuilder(Objects.requireNonNull(Settings.GUI_CLOSE_BTN_ITEM.getMaterial().parseMaterial())).setName(Settings.GUI_CLOSE_BTN_NAME.getString()).setLore(Settings.GUI_CLOSE_BTN_LORE.getStringList()).toItemStack(), e -> e.manager.showGUI(e.player, new GUIFilterWhitelist()));
+ setNextPage(5, 5, new TItemBuilder(Objects.requireNonNull(Settings.GUI_NEXT_BTN_ITEM.getMaterial().parseMaterial())).setName(Settings.GUI_NEXT_BTN_NAME.getString()).setLore(Settings.GUI_NEXT_BTN_LORE.getStringList()).toItemStack());
+ setOnPage(e -> draw());
+
+ AuctionHouse.newChain().asyncFirst(() -> {
+ this.items = AuctionHouse.getInstance().getFilterManager().getFilterWhitelist().stream().filter(item -> item.getCategory() == filerCategory).collect(Collectors.toList());
+ return this.items.stream().skip((page - 1) * 28L).limit(28L).collect(Collectors.toList());
+ }).asyncLast((data) -> {
+ pages = (int) Math.max(1, Math.ceil(this.items.size() / (double) 28L));
+ int slot = 10;
+ for (AuctionFilterItem item : data) {
+ setButton(slot, item.getItemStack(), ClickType.RIGHT, e -> {
+ AuctionHouse.getInstance().getFilterManager().removeFilterItem(item);
+ draw();
+ });
+
+ slot = Arrays.asList(16, 25, 34).contains(slot) ? slot + 3 : slot + 1;
+ }
+ }).execute();
+
+ }
+}
diff --git a/src/main/java/ca/tweetzy/auctionhouse/helpers/ConfigurationItemHelper.java b/src/main/java/ca/tweetzy/auctionhouse/helpers/ConfigurationItemHelper.java
index 3d3ac18..ce13ea6 100644
--- a/src/main/java/ca/tweetzy/auctionhouse/helpers/ConfigurationItemHelper.java
+++ b/src/main/java/ca/tweetzy/auctionhouse/helpers/ConfigurationItemHelper.java
@@ -40,6 +40,7 @@ public class ConfigurationItemHelper {
}
meta.setDisplayName(TextUtils.formatText(title));
+ meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES, ItemFlag.HIDE_ENCHANTS);
meta.setLore(lore.stream().map(TextUtils::formatText).collect(Collectors.toList()));
stack.setItemMeta(meta);
if (nbtData != null) {
diff --git a/src/main/java/ca/tweetzy/auctionhouse/managers/AuctionItemManager.java b/src/main/java/ca/tweetzy/auctionhouse/managers/AuctionItemManager.java
index af5affe..38bd542 100644
--- a/src/main/java/ca/tweetzy/auctionhouse/managers/AuctionItemManager.java
+++ b/src/main/java/ca/tweetzy/auctionhouse/managers/AuctionItemManager.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.auction.AuctionFilterItem;
import ca.tweetzy.auctionhouse.auction.AuctionItem;
import ca.tweetzy.core.utils.TextUtils;
import org.bukkit.Bukkit;
@@ -45,6 +46,7 @@ public class AuctionItemManager {
return this.auctionItems;
}
+
public Set getGarbageBin() {
return garbageBin;
}
diff --git a/src/main/java/ca/tweetzy/auctionhouse/managers/FilterManager.java b/src/main/java/ca/tweetzy/auctionhouse/managers/FilterManager.java
new file mode 100644
index 0000000..afecae7
--- /dev/null
+++ b/src/main/java/ca/tweetzy/auctionhouse/managers/FilterManager.java
@@ -0,0 +1,74 @@
+package ca.tweetzy.auctionhouse.managers;
+
+import ca.tweetzy.auctionhouse.AuctionHouse;
+import ca.tweetzy.auctionhouse.api.AuctionAPI;
+import ca.tweetzy.auctionhouse.auction.AuctionFilterItem;
+import ca.tweetzy.auctionhouse.auction.AuctionItemCategory;
+import ca.tweetzy.core.utils.TextUtils;
+import org.bukkit.Bukkit;
+import org.bukkit.inventory.ItemStack;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * The current file has been created by Kiran Hart
+ * Date Created: June 22 2021
+ * Time Created: 3:41 p.m.
+ * Usage of any code found within this class is prohibited unless given explicit permission otherwise
+ */
+public class FilterManager {
+
+ private final List filterWhitelist = new ArrayList<>();
+
+ public void addFilterItem(AuctionFilterItem auctionFilterItem) {
+ if (auctionFilterItem == null) return;
+ this.filterWhitelist.add(auctionFilterItem);
+ }
+
+ public void removeFilterItem(AuctionFilterItem auctionFilterItem) {
+ if (auctionFilterItem == null) return;
+ this.filterWhitelist.remove(auctionFilterItem);
+ }
+
+ public AuctionFilterItem getFilteredItem(ItemStack itemStack) {
+ return this.filterWhitelist.stream().filter(items -> items.getItemStack().isSimilar(itemStack)).findFirst().orElse(null);
+ }
+
+ public List getFilterWhitelist() {
+ return this.filterWhitelist;
+ }
+
+ public List getFilterWhitelist(AuctionItemCategory category) {
+ return this.filterWhitelist.stream().filter(item -> item.getCategory() == category).map(item -> AuctionAPI.getInstance().deserializeItem(item.getRawItem())).collect(Collectors.toList());
+ }
+
+ public void loadItems(boolean useDatabase) {
+ if (useDatabase) {
+ AuctionHouse.getInstance().getDataManager().getFilterWhitelist(all -> all.forEach(this::addFilterItem));
+ } else {
+ if (AuctionHouse.getInstance().getData().contains("auction filter whitelist") && AuctionHouse.getInstance().getData().isList("auction filter whitelist")) {
+ List items = AuctionHouse.getInstance().getData().getStringList("auction filter whitelist").stream().map(AuctionAPI.getInstance()::convertBase64ToObject).map(object -> (AuctionFilterItem) object).collect(Collectors.toList());
+ long start = System.currentTimeMillis();
+ items.forEach(this::addFilterItem);
+ AuctionHouse.getInstance().getLocale().newMessage(TextUtils.formatText(String.format("&aLoaded &2%d &aauction filter items(s) in &e%d&fms", items.size(), System.currentTimeMillis() - start))).sendPrefixedMessage(Bukkit.getConsoleSender());
+ AuctionHouse.getInstance().getData().set("auction filter whitelist", null);
+ AuctionHouse.getInstance().getData().save();
+ }
+ }
+ }
+
+ public void saveFilterWhitelist(boolean useDatabase, boolean async) {
+ if (useDatabase) {
+ AuctionHouse.getInstance().getDataManager().saveFilterWhitelist(getFilterWhitelist(), async);
+ } else {
+ this.adjustItemsInFile(this.getFilterWhitelist());
+ }
+ }
+
+ public void adjustItemsInFile(List items) {
+ AuctionHouse.getInstance().getData().set("auction filter whitelist", items.stream().map(AuctionAPI.getInstance()::convertToBase64).collect(Collectors.toList()));
+ AuctionHouse.getInstance().getData().save();
+ }
+}
diff --git a/src/main/java/ca/tweetzy/auctionhouse/settings/LocaleSettings.java b/src/main/java/ca/tweetzy/auctionhouse/settings/LocaleSettings.java
index 02ff723..016666a 100644
--- a/src/main/java/ca/tweetzy/auctionhouse/settings/LocaleSettings.java
+++ b/src/main/java/ca/tweetzy/auctionhouse/settings/LocaleSettings.java
@@ -26,6 +26,7 @@ public class LocaleSettings {
languageNodes.put("general.blockedname", "&cThat item contains a blocked name phrase");
languageNodes.put("general.blockedlore", "&cThat item contains a blocked lore phrase");
languageNodes.put("general.air", "&cSorry, but you cannot sell air o.O");
+ languageNodes.put("general.filter air", "&cSorry, but you cannot add air to a filter whitelist");
languageNodes.put("general.blocked", "&cSorry, you are not allowed to sell &e%item%");
languageNodes.put("general.sellinglimit", "&cYou cannot sell more items, please remove/sell current active items");
languageNodes.put("general.noroom", "&cPlease clear room in your inventory to purchase that item.");
@@ -33,7 +34,9 @@ public class LocaleSettings {
languageNodes.put("general.endedallauctions", "&cYou force ended all active auctions");
languageNodes.put("general.relisteditems", "&aYou relisted all expired items!");
languageNodes.put("general.cannotsellbundleditem", "&cYou cannot sell a bundled item as a bundle.");
- languageNodes.put("general.entersearchphrase", "&Enter a search phrase into chat");
+ languageNodes.put("general.entersearchphrase", "&aEnter a search phrase into chat");
+ languageNodes.put("general.filteritemaddedalready", "&cThat item already exists within that category's filter whitelist.");
+ languageNodes.put("general.addeditemtofilterwhitelist", "&aAdded &2%item_name%&a to the &2%filter_category%&a's whitelist");
languageNodes.put("pricing.minbaseprice", "&cThe minimum base price must be &a$%price%");
@@ -100,6 +103,7 @@ public class LocaleSettings {
languageNodes.put("commands.syntax.settings", "settings");
languageNodes.put("commands.syntax.transactions", "transactions");
languageNodes.put("commands.syntax.upload", "upload");
+ languageNodes.put("commands.syntax.filter", "filter [additem] [category]");
languageNodes.put("commands.description.active", "View all your auction listings");
languageNodes.put("commands.description.auctionhouse", "Main command for the plugin, it opens the auction window.");
@@ -111,6 +115,7 @@ public class LocaleSettings {
languageNodes.put("commands.description.settings", "Open the in-game config editor");
languageNodes.put("commands.description.transactions", "Used to open the transactions menu");
languageNodes.put("commands.description.upload", "Used to upload flat file data to the database");
+ languageNodes.put("commands.description.filter", "Edit the filter whitelist items");
}
public static void setup() {
diff --git a/src/main/java/ca/tweetzy/auctionhouse/settings/Settings.java b/src/main/java/ca/tweetzy/auctionhouse/settings/Settings.java
index c9e3fd1..776232f 100644
--- a/src/main/java/ca/tweetzy/auctionhouse/settings/Settings.java
+++ b/src/main/java/ca/tweetzy/auctionhouse/settings/Settings.java
@@ -524,6 +524,50 @@ public class Settings {
public static final ConfigSetting GUI_FILTER_ITEMS_BLOCKS_NAME = new ConfigSetting(config, "gui.filter.items.blocks.name", "&e&lBlocks");
public static final ConfigSetting GUI_FILTER_ITEMS_BLOCKS_LORE = new ConfigSetting(config, "gui.filter.items.blocks.lore", Collections.singletonList("&7Click to set the filter to&f: &eBlocks"));
+ /* ===============================
+ * CUSTOM ITEM FILTER GUI
+ * ===============================*/
+ public static final ConfigSetting GUI_FILTER_WHITELIST_TITLE = new ConfigSetting(config, "gui.filter whitelist.title", "&7Auction Filter - &eWhitelist");
+ public static final ConfigSetting GUI_FILTER_WHITELIST_BG_ITEM = new ConfigSetting(config, "gui.filter whitelist.bg item", XMaterial.BLACK_STAINED_GLASS_PANE.name());
+
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_BLOCKS_ITEM = new ConfigSetting(config, "gui.filter whitelist.items.blocks.item", XMaterial.GRASS_BLOCK.name());
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_BLOCKS_NAME = new ConfigSetting(config, "gui.filter whitelist.items.blocks.name", "&e&lBlock Filters");
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_BLOCKS_LORE = new ConfigSetting(config, "gui.filter whitelist.items.blocks.lore", Collections.singletonList("&7Click to adjust the item whitelist for this filter"));
+
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_FOOD_ITEM = new ConfigSetting(config, "gui.filter whitelist.items.food.item", XMaterial.CAKE.name());
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_FOOD_NAME = new ConfigSetting(config, "gui.filter whitelist.items.food.name", "&e&lFood Filters");
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_FOOD_LORE = new ConfigSetting(config, "gui.filter whitelist.items.food.lore", Collections.singletonList("&7Click to adjust the item whitelist for this filter"));
+
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_ARMOR_ITEM = new ConfigSetting(config, "gui.filter whitelist.items.armor.item", XMaterial.DIAMOND_HELMET.name());
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_ARMOR_NAME = new ConfigSetting(config, "gui.filter whitelist.items.armor.name", "&e&LArmor Filters");
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_ARMOR_LORE = new ConfigSetting(config, "gui.filter whitelist.items.armor.lore", Collections.singletonList("&7Click to adjust the item whitelist for this filter"));
+
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_TOOLS_ITEM = new ConfigSetting(config, "gui.filter whitelist.items.tools.item", XMaterial.IRON_PICKAXE.name());
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_TOOLS_NAME = new ConfigSetting(config, "gui.filter whitelist.items.tools.name", "&e&lTool Filters");
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_TOOLS_LORE = new ConfigSetting(config, "gui.filter whitelist.items.tools.lore", Collections.singletonList("&7Click to adjust the item whitelist for this filter"));
+
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_SPAWNERS_ITEM = new ConfigSetting(config, "gui.filter whitelist.items.spawners.item", XMaterial.SPAWNER.name());
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_SPAWNERS_NAME = new ConfigSetting(config, "gui.filter whitelist.items.spawners.name", "&e&lSpawner Filters");
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_SPAWNERS_LORE = new ConfigSetting(config, "gui.filter whitelist.items.spawners.lore", Collections.singletonList("&7Click to adjust the item whitelist for this filter"));
+
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_ENCHANTS_ITEM = new ConfigSetting(config, "gui.filter whitelist.items.enchants.item", XMaterial.ENCHANTED_BOOK.name());
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_ENCHANTS_NAME = new ConfigSetting(config, "gui.filter whitelist.items.enchants.name", "&e&lEnchantment Filters");
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_ENCHANTS_LORE = new ConfigSetting(config, "gui.filter whitelist.items.enchants.lore", Collections.singletonList("&7Click to adjust the item whitelist for this filter"));
+
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_WEAPONS_ITEM = new ConfigSetting(config, "gui.filter whitelist.items.weapons.item", XMaterial.DIAMOND_SWORD.name());
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_WEAPONS_NAME = new ConfigSetting(config, "gui.filter whitelist.items.weapons.name", "&e&lWeapon Filters");
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_WEAPONS_LORE = new ConfigSetting(config, "gui.filter whitelist.items.weapons.lore", Collections.singletonList("&7Click to adjust the item whitelist for this filter"));
+
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_MISC_ITEM = new ConfigSetting(config, "gui.filter whitelist.items.misc.item", XMaterial.BONE_MEAL.name());
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_MISC_NAME = new ConfigSetting(config, "gui.filter whitelist.items.misc.name", "&e&lMiscellaneous Filters");
+ public static final ConfigSetting GUI_FILTER_WHITELIST_ITEMS_MISC_LORE = new ConfigSetting(config, "gui.filter whitelist.items.misc.lore", Collections.singletonList("&7Click to adjust the item whitelist for this filter"));
+
+ /* ===============================
+ * CUSTOM ITEM FILTER GUI
+ * ===============================*/
+ public static final ConfigSetting GUI_FILTER_WHITELIST_LIST_TITLE = new ConfigSetting(config, "gui.filter whitelist list.title", "&7Filter Whitelist - &e%filter_category%");
+ public static final ConfigSetting GUI_FILTER_WHITELIST_LIST_BG_ITEM = new ConfigSetting(config, "gui.filter whitelist list.bg item", XMaterial.BLACK_STAINED_GLASS_PANE.name());
+
/* ===============================
* AUCTION STACKS
diff --git a/src/main/java/ca/tweetzy/auctionhouse/tasks/AutoSaveTask.java b/src/main/java/ca/tweetzy/auctionhouse/tasks/AutoSaveTask.java
index 11d8780..3558fdd 100644
--- a/src/main/java/ca/tweetzy/auctionhouse/tasks/AutoSaveTask.java
+++ b/src/main/java/ca/tweetzy/auctionhouse/tasks/AutoSaveTask.java
@@ -28,6 +28,7 @@ public class AutoSaveTask extends BukkitRunnable {
public void run() {
AuctionHouse.getInstance().getAuctionItemManager().saveItems(Settings.DATABASE_USE.getBoolean(), true);
AuctionHouse.getInstance().getTransactionManager().saveTransactions(Settings.DATABASE_USE.getBoolean(), true);
+ AuctionHouse.getInstance().getFilterManager().saveFilterWhitelist(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 99f60db..2f17388 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -29,6 +29,7 @@ permissions:
auctionhouse.cmd.upload: true
auctionhouse.cmd.status: true
auctionhouse.cmd.admin: true
+ auctionhouse.cmd.filter: true
auctionhouse.cmd:
description: Allows the user to use /ah
default: op
@@ -61,4 +62,7 @@ permissions:
default: op
auctionhouse.cmd.admin:
description: Allows the user to access admin commands
+ default: op
+ auctionhouse.cmd.filter:
+ description: Allows the user to access the filter whitelist menu
default: op
\ No newline at end of file