added option to delay sending new auction/bin listing discord messages

Took 26 minutes
This commit is contained in:
Kiran Hart 2024-08-05 14:29:58 -04:00
parent 141b17e590
commit fa931c1027
No known key found for this signature in database
GPG Key ID: 5F36C7BC79D3EBC3
7 changed files with 70 additions and 18 deletions

View File

@ -28,6 +28,7 @@ import ca.tweetzy.auctionhouse.listeners.*;
import ca.tweetzy.auctionhouse.managers.*; import ca.tweetzy.auctionhouse.managers.*;
import ca.tweetzy.auctionhouse.model.manager.BanManager; import ca.tweetzy.auctionhouse.model.manager.BanManager;
import ca.tweetzy.auctionhouse.model.manager.CurrencyManager; import ca.tweetzy.auctionhouse.model.manager.CurrencyManager;
import ca.tweetzy.auctionhouse.model.manager.ListingManager;
import ca.tweetzy.auctionhouse.model.manager.PaymentsManager; import ca.tweetzy.auctionhouse.model.manager.PaymentsManager;
import ca.tweetzy.auctionhouse.settings.LocaleSettings; import ca.tweetzy.auctionhouse.settings.LocaleSettings;
import ca.tweetzy.auctionhouse.settings.Settings; import ca.tweetzy.auctionhouse.settings.Settings;
@ -85,6 +86,7 @@ public class AuctionHouse extends TweetyPlugin {
private final CurrencyManager currencyManager = new CurrencyManager(); private final CurrencyManager currencyManager = new CurrencyManager();
private final CommandManager commandManager = new CommandManager(this); private final CommandManager commandManager = new CommandManager(this);
private final GuiManager guiManager = new GuiManager(this); private final GuiManager guiManager = new GuiManager(this);
private final ListingManager listingManager = new ListingManager();
private final AuctionPlayerManager auctionPlayerManager = new AuctionPlayerManager(); private final AuctionPlayerManager auctionPlayerManager = new AuctionPlayerManager();
private final AuctionItemManager auctionItemManager = new AuctionItemManager(); private final AuctionItemManager auctionItemManager = new AuctionItemManager();
@ -96,6 +98,8 @@ public class AuctionHouse extends TweetyPlugin {
private final PaymentsManager paymentsManager = new PaymentsManager(); private final PaymentsManager paymentsManager = new PaymentsManager();
// the default vault economy // the default vault economy
private Economy economy = null; private Economy economy = null;
@ -318,6 +322,8 @@ public class AuctionHouse extends TweetyPlugin {
shutdownDataManager(this.dataManager); shutdownDataManager(this.dataManager);
getServer().getScheduler().cancelTasks(this); getServer().getScheduler().cancelTasks(this);
// send out remaining webhooks
// this.listingManager.sendPendingDiscordWebhooks();
} }
@Override @Override
@ -394,6 +400,10 @@ public class AuctionHouse extends TweetyPlugin {
return getInstance().currencyManager; return getInstance().currencyManager;
} }
public static ListingManager getListingManager() {
return getInstance().listingManager;
}
public static Economy getEconomy() { public static Economy getEconomy() {
return getInstance().economy; return getInstance().economy;
} }

View File

@ -182,7 +182,7 @@ public class GUIActiveAuctions extends AuctionUpdatingPagedGUI<AuctionedItem> {
continue; continue;
if (item.isRequest()) { if (item.isRequest()) {
AuctionHouse.getInstance().getAuctionItemManager().sendToGarbage(item); AuctionHouse.getAuctionItemManager().sendToGarbage(item);
} else { } else {
item.setExpired(true); item.setExpired(true);
} }

View File

@ -27,7 +27,7 @@ import ca.tweetzy.auctionhouse.events.AuctionAdminEvent;
import ca.tweetzy.auctionhouse.events.AuctionBidEvent; import ca.tweetzy.auctionhouse.events.AuctionBidEvent;
import ca.tweetzy.auctionhouse.events.AuctionEndEvent; import ca.tweetzy.auctionhouse.events.AuctionEndEvent;
import ca.tweetzy.auctionhouse.events.AuctionStartEvent; import ca.tweetzy.auctionhouse.events.AuctionStartEvent;
import ca.tweetzy.auctionhouse.helpers.discord.DiscordMessageCreator; import ca.tweetzy.auctionhouse.model.discord.DiscordMessageCreator;
import ca.tweetzy.auctionhouse.settings.Settings; import ca.tweetzy.auctionhouse.settings.Settings;
import ca.tweetzy.auctionhouse.transaction.Transaction; import ca.tweetzy.auctionhouse.transaction.Transaction;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -62,20 +62,32 @@ public class AuctionListeners implements Listener {
Settings.DISCORD_WEBHOOKS.getStringList().forEach(hook -> { Settings.DISCORD_WEBHOOKS.getStringList().forEach(hook -> {
final boolean isBid = e.getAuctionItem().isBidItem(); final boolean isBid = e.getAuctionItem().isBidItem();
if (isBid && Settings.DISCORD_ALERT_ON_AUCTION_START.getBoolean()) if (isBid && Settings.DISCORD_ALERT_ON_AUCTION_START.getBoolean()) {
DiscordMessageCreator DiscordMessageCreator webhook = DiscordMessageCreator
.of(hook, DiscordMessageCreator.MessageType.NEW_AUCTION_LISTING) .of(hook, DiscordMessageCreator.MessageType.NEW_AUCTION_LISTING)
.seller(seller) .seller(seller)
.listing(auctionedItem) .listing(auctionedItem);
.send();
if (!isBid && Settings.DISCORD_ALERT_ON_BIN_START.getBoolean()) if (Settings.DISCORD_DELAY_LISTINGS.getBoolean()) {
DiscordMessageCreator AuctionHouse.getListingManager().addListingWebhook(auctionedItem.getId(), webhook);
return;
}
webhook.send();
}
if (!isBid && Settings.DISCORD_ALERT_ON_BIN_START.getBoolean()) {
DiscordMessageCreator webhook = DiscordMessageCreator
.of(hook, DiscordMessageCreator.MessageType.NEW_BIN_LISTING) .of(hook, DiscordMessageCreator.MessageType.NEW_BIN_LISTING)
.seller(seller) .seller(seller)
.listing(auctionedItem) .listing(auctionedItem);
.send();
if (Settings.DISCORD_DELAY_LISTINGS.getBoolean()) {
AuctionHouse.getListingManager().addListingWebhook(auctionedItem.getId(), webhook);
return;
}
webhook.send();
}
}); });
}).execute(); }).execute();
@ -94,18 +106,18 @@ public class AuctionListeners implements Listener {
new AuctionStatistic(originalOwnerUUID, AuctionStatisticType.MONEY_EARNED, e.getSaleType() == AuctionSaleType.USED_BIDDING_SYSTEM ? auctionedItem.getCurrentPrice() : auctionedItem.getBasePrice()).store(null); new AuctionStatistic(originalOwnerUUID, AuctionStatisticType.MONEY_EARNED, e.getSaleType() == AuctionSaleType.USED_BIDDING_SYSTEM ? auctionedItem.getCurrentPrice() : auctionedItem.getBasePrice()).store(null);
} }
AuctionHouse.getListingManager().cancelListingWebhook(auctionedItem.getId());
new AuctionStatistic(buyerUUID, AuctionStatisticType.MONEY_SPENT, e.getSaleType() == AuctionSaleType.USED_BIDDING_SYSTEM ? auctionedItem.getCurrentPrice() : auctionedItem.getBasePrice()).store(null); new AuctionStatistic(buyerUUID, AuctionStatisticType.MONEY_SPENT, e.getSaleType() == AuctionSaleType.USED_BIDDING_SYSTEM ? auctionedItem.getCurrentPrice() : auctionedItem.getBasePrice()).store(null);
AuctionHouse.newChain().async(() -> { AuctionHouse.newChain().async(() -> {
if (Settings.RECORD_TRANSACTIONS.getBoolean()) { if (Settings.RECORD_TRANSACTIONS.getBoolean()) {
final AuctionHouse instance = AuctionHouse.getInstance();
double price = auctionedItem.getBasePrice(); double price = auctionedItem.getBasePrice();
if (e.getSaleType() == AuctionSaleType.USED_BIDDING_SYSTEM) { if (e.getSaleType() == AuctionSaleType.USED_BIDDING_SYSTEM) {
price = auctionedItem.getCurrentPrice(); price = auctionedItem.getCurrentPrice();
} }
instance.getDataManager().insertTransaction(new Transaction( AuctionHouse.getDataManager().insertTransaction(new Transaction(
UUID.randomUUID(), UUID.randomUUID(),
originalOwnerUUID, originalOwnerUUID,
buyerUUID, buyerUUID,
@ -117,7 +129,7 @@ public class AuctionListeners implements Listener {
price price
), (error, transaction) -> { ), (error, transaction) -> {
if (error == null) { if (error == null) {
instance.getTransactionManager().addTransaction(transaction); AuctionHouse.getTransactionManager().addTransaction(transaction);
} }
}); });
} }
@ -166,6 +178,7 @@ public class AuctionListeners implements Listener {
@EventHandler @EventHandler
public void onAdminAction(AuctionAdminEvent event) { public void onAdminAction(AuctionAdminEvent event) {
if (!Settings.LOG_ADMIN_ACTIONS.getBoolean()) return; if (!Settings.LOG_ADMIN_ACTIONS.getBoolean()) return;
AuctionHouse.getInstance().getDataManager().insertLog(event.getAuctionAdminLog()); AuctionHouse.getListingManager().cancelListingWebhook(event.getAuctionAdminLog().getItemId());
AuctionHouse.getDataManager().insertLog(event.getAuctionAdminLog());
} }
} }

View File

@ -16,8 +16,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package ca.tweetzy.auctionhouse.helpers.discord; package ca.tweetzy.auctionhouse.model.discord;
import ca.tweetzy.auctionhouse.AuctionHouse;
import ca.tweetzy.auctionhouse.api.AuctionAPI; import ca.tweetzy.auctionhouse.api.AuctionAPI;
import ca.tweetzy.auctionhouse.auction.AuctionedItem; import ca.tweetzy.auctionhouse.auction.AuctionedItem;
import ca.tweetzy.auctionhouse.helpers.AuctionCreator; import ca.tweetzy.auctionhouse.helpers.AuctionCreator;
@ -197,6 +198,7 @@ public final class DiscordMessageCreator {
@SneakyThrows @SneakyThrows
public void send() { public void send() {
generate().execute(); final DiscordWebhook hook = generate();
hook.execute();
} }
} }

View File

@ -16,7 +16,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package ca.tweetzy.auctionhouse.helpers.discord; package ca.tweetzy.auctionhouse.model.discord;
import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.HttpsURLConnection;
import java.awt.*; import java.awt.*;

View File

@ -1,18 +1,43 @@
package ca.tweetzy.auctionhouse.model.manager; package ca.tweetzy.auctionhouse.model.manager;
import ca.tweetzy.auctionhouse.AuctionHouse;
import ca.tweetzy.auctionhouse.api.auction.Auction; import ca.tweetzy.auctionhouse.api.auction.Auction;
import ca.tweetzy.auctionhouse.api.manager.KeyValueManager; import ca.tweetzy.auctionhouse.api.manager.KeyValueManager;
import ca.tweetzy.auctionhouse.auction.AuctionedItem;
import ca.tweetzy.auctionhouse.model.discord.DiscordMessageCreator;
import ca.tweetzy.auctionhouse.settings.Settings;
import ca.tweetzy.flight.collection.expiringmap.ExpiringMap;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.TimeUnit;
public final class ListingManager extends KeyValueManager<UUID, Auction> { public final class ListingManager extends KeyValueManager<UUID, Auction> {
private final ExpiringMap<UUID, DiscordMessageCreator> PENDING_DISCORD_WEBHOOKS = ExpiringMap.builder().variableExpiration().build();
public ListingManager() { public ListingManager() {
super("Listing"); super("Listing");
this.PENDING_DISCORD_WEBHOOKS.addAsyncExpirationListener((id, hookCreator) -> {
final AuctionedItem item = AuctionHouse.getAuctionItemManager().getItem(id);
if (item == null || item.isExpired()) return;
hookCreator.send();
});
}
public void addListingWebhook(UUID uuid, DiscordMessageCreator hook) {
this.PENDING_DISCORD_WEBHOOKS.put(uuid, hook, Settings.DISCORD_DELAY_LISTING_TIME.getInt(), TimeUnit.SECONDS);
}
public void cancelListingWebhook(UUID uuid) {
this.PENDING_DISCORD_WEBHOOKS.remove(uuid);
}
public void sendPendingDiscordWebhooks() {
this.PENDING_DISCORD_WEBHOOKS.keySet().forEach(id -> this.PENDING_DISCORD_WEBHOOKS.setExpiration(id, 1L, TimeUnit.NANOSECONDS));
} }
@Override @Override
public void load() { public void load() {
} }
} }

View File

@ -390,6 +390,8 @@ public class Settings {
public static final ConfigSetting DISCORD_MSG_USERNAME = new ConfigSetting(config, "discord.user.username", "Auction House", "The name of the user who will send the message"); public static final ConfigSetting DISCORD_MSG_USERNAME = new ConfigSetting(config, "discord.user.username", "Auction House", "The name of the user who will send the message");
public static final ConfigSetting DISCORD_MSG_PFP = new ConfigSetting(config, "discord.user.avatar picture", "https://cdn.kiranhart.com/spigot/auctionhouse/icon.png", "The avatar image of the discord user"); public static final ConfigSetting DISCORD_MSG_PFP = new ConfigSetting(config, "discord.user.avatar picture", "https://cdn.kiranhart.com/spigot/auctionhouse/icon.png", "The avatar image of the discord user");
public static final ConfigSetting DISCORD_WEBHOOKS = new ConfigSetting(config, "discord.webhooks", Collections.singletonList("https://discord.com/api/webhooks/1077667480920653840/CZbJG7DBoGhPXYICgp2--Ey_itVVmYqaQgorBfpvL7nQoQZWWMxz1TQgs1xG45Mzlpsn"), "A list of webhook urls (channels) you want a message sent to"); public static final ConfigSetting DISCORD_WEBHOOKS = new ConfigSetting(config, "discord.webhooks", Collections.singletonList("https://discord.com/api/webhooks/1077667480920653840/CZbJG7DBoGhPXYICgp2--Ey_itVVmYqaQgorBfpvL7nQoQZWWMxz1TQgs1xG45Mzlpsn"), "A list of webhook urls (channels) you want a message sent to");
public static final ConfigSetting DISCORD_DELAY_LISTINGS = new ConfigSetting(config, "discord.delay options.delay listing", false, "If true AuctionHouse will delay sending new listing messages by the specified seconds.");
public static final ConfigSetting DISCORD_DELAY_LISTING_TIME = new ConfigSetting(config, "discord.delay options.delay listing time", 10, "How many seconds should Auction House wait to send the discord message for new listings");
// options for when the alerts should be sent // options for when the alerts should be sent
public static final ConfigSetting DISCORD_ALERT_ON_AUCTION_START = new ConfigSetting(config, "discord.alerts.new auction listing", true, "Should a message be sent when a new auction listing is made"); public static final ConfigSetting DISCORD_ALERT_ON_AUCTION_START = new ConfigSetting(config, "discord.alerts.new auction listing", true, "Should a message be sent when a new auction listing is made");