Added auction command

This commit is contained in:
2022-10-21 02:59:00 +02:00
parent df47c7a709
commit d6eb332d83
13 changed files with 874 additions and 12 deletions
@@ -0,0 +1,135 @@
package com.alttd.schedulers;
import com.alttd.database.queries.QueriesAuctions.Auction;
import com.alttd.database.queries.QueriesAuctions.QueriesAuction;
import com.alttd.database.queries.commandOutputChannels.CommandOutputChannels;
import com.alttd.database.queries.commandOutputChannels.OutputType;
import com.alttd.util.Logger;
import com.alttd.util.Util;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
import net.dv8tion.jda.api.entities.channel.middleman.GuildMessageChannel;
import javax.annotation.Nullable;
import java.awt.*;
import java.util.*;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class AuctionScheduler {
private static AuctionScheduler instance = null;
private final HashMap<Long, Auction> auctions;
private Auction nextAuction;
private AuctionScheduler() {
instance = this;
auctions = QueriesAuction.getAuctions();
if (auctions == null) {
Logger.severe("Unable to retrieve auctions");
instance = null;
return;
}
setNextAuction();
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
scheduledExecutorService.scheduleWithFixedDelay(new AuctionScheduler.AuctionRun(), 0, 1, TimeUnit.SECONDS);
}
private void setNextAuction() {
Optional<Auction> first = auctions.values().stream().sorted().findFirst();
if (first.isEmpty())
nextAuction = null;
else
nextAuction = first.get();
}
public static AuctionScheduler getInstance() {
if (instance == null)
instance = new AuctionScheduler();
return instance;
}
public synchronized void addAuction(Auction auction) {
if (!QueriesAuction.saveAuction(auction))
Logger.warning("Unable to save auction %", auction.getMessageId() + "");
auctions.put(auction.getMessageId(), auction);
setNextAuction();
}
public synchronized void updateAuction(Auction auction) {
QueriesAuction.saveAuction(auction);
setNextAuction();
}
public synchronized void removeAuction(Auction auction) {
auctions.remove(auction.getMessageId());
setNextAuction();
if (!QueriesAuction.removeAuction(auction))
Logger.warning("Unable to remove auction %", auction.getMessageId() + "");
}
public Auction getAuction(long messageId) {
return auctions.getOrDefault(messageId, null);
}
public synchronized void finishAuction(Auction auction, @Nullable Member instaBuy) {
auction.updateMessage(success -> {
List<MessageEmbed> embeds = success.getEmbeds();
if (embeds.isEmpty()) {
Logger.warning("Received auction with no embed contents");
return;
}
GuildChannel outputChannel = CommandOutputChannels.getOutputChannel(success.getGuild(), OutputType.AUCTION_LOG);
if (outputChannel != null) {
if (!(outputChannel instanceof GuildMessageChannel channel)) {
Logger.warning("Error" + outputChannel.getType().name() + " is not a valid crate auction log channel type");
return;
}
if (!channel.canTalk()) {
Logger.warning("Error can't talk in auction log channel");
return;
}
if (sendEmbed(embeds.get(0), channel, instaBuy))
success.delete().queue();
} else
success.delete().queue();
}, Logger::warning);
removeAuction(auction);
}
private boolean sendEmbed(MessageEmbed embed, GuildMessageChannel textChannel, Member instaBuy) {
EmbedBuilder embedBuilder = new EmbedBuilder(embed)
.clearFields();
List<MessageEmbed.Field> fields = embed.getFields();
if (instaBuy != null)
embedBuilder.addField("Winning Bid", "Insta bought by " + instaBuy.getAsMention(), false);
else if (!fields.isEmpty()) {
MessageEmbed.Field field = fields.get(0);
if (field.getName() != null && field.getName().equals("Current Bid") && field.getValue() != null) {
embedBuilder.addField("Winning Bid", field.getValue(), false);
} else if (fields.size() == 2) {
field = fields.get(1);
if (field.getName() != null && field.getName().equals("Current Bid") && field.getValue() != null)
embedBuilder.addField("Winning Bid", field.getValue(), false);
}
}
if (embedBuilder.getFields().size() != 0)
embedBuilder.setColor(Color.GREEN);
else
embedBuilder.setColor(Color.RED);
textChannel.sendMessageEmbeds(embedBuilder.build()).queue(Util::ignoreSuccess, failure -> Logger.warning("Failed to log auction result"));
return true;
}
private class AuctionRun implements Runnable {
@Override
public void run() {
long time = new Date().getTime();
while (nextAuction != null && time > nextAuction.getExpireTime()) {
finishAuction(nextAuction, null);
}
}
}
}
@@ -0,0 +1,112 @@
package com.alttd.schedulers;
import com.alttd.database.queries.QueriesReminders.QueriesReminders;
import com.alttd.database.queries.QueriesReminders.Reminder;
import com.alttd.util.Logger;
import com.alttd.util.Util;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
import net.dv8tion.jda.api.requests.RestAction;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ReminderScheduler {
private static ReminderScheduler instance = null;
private final ArrayList<Reminder> reminders;
private Reminder nextReminder;
private final JDA jda;
private ReminderScheduler(JDA jda) {
instance = this;
this.jda = jda;
reminders = QueriesReminders.getReminders();
if (reminders == null) {
Logger.severe("Unable to retrieve reminders");
instance = null;
return;
}
reminders.sort(Comparator.comparingLong(Reminder::remindDate));
if (reminders.size() == 0)
nextReminder = null;
else
nextReminder = reminders.get(0);
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
scheduledExecutorService.scheduleWithFixedDelay(new ReminderRun(), 0, 1, TimeUnit.MINUTES);
}
public static ReminderScheduler getInstance(JDA jda) {
if (instance == null)
instance = new ReminderScheduler(jda);
return instance;
}
public synchronized void addReminder(Reminder reminder) {
reminders.add(reminder);
reminders.sort(Comparator.comparingLong(Reminder::remindDate));
nextReminder = reminders.get(0);
}
public synchronized void removeReminder(Reminder reminder) {
reminders.remove(reminder);
if (reminders.size() == 0)
nextReminder = null;
else
nextReminder = reminders.get(0);
QueriesReminders.removeReminder(reminder.id());
}
private class ReminderRun implements Runnable {
@Override
public void run() {
long time = new Date().getTime();
while (nextReminder != null && time > nextReminder.remindDate()) {
//TODO run reminder
TextChannel channel = nextReminder.getChannel(jda);
if (channel == null || !channel.canTalk()) {
Logger.warning("Unable to run reminder: " + nextReminder.id() +
"\ntitle: [" + nextReminder.title() +
"]\ndescription: [" + nextReminder.description() + "]");
return;
}
sendEmbed(nextReminder, channel);
removeReminder(nextReminder);
}
}
private void sendEmbed(Reminder reminder, TextChannel channel) {
EmbedBuilder embedBuilder = new EmbedBuilder()
.setTitle(reminder.title())
.setDescription(reminder.description())
.appendDescription("\n\nRequested <t:" + TimeUnit.MILLISECONDS.toSeconds(reminder.creationDate()) + ":R>");
Guild guild = reminder.getGuild(jda);
if (guild == null) {
sendEmbed(reminder, channel, embedBuilder);
return;
}
guild.retrieveMemberById(reminder.userId()).queue(
member -> sendEmbed(reminder, channel, embedBuilder, member),
failed -> sendEmbed(reminder, channel, embedBuilder));
}
private void sendEmbed(Reminder reminder, TextChannel channel, EmbedBuilder embedBuilder, Member member) {
embedBuilder.setAuthor(member.getEffectiveName(), null, member.getEffectiveAvatarUrl());
channel.sendMessageEmbeds(embedBuilder.build()).queue(RestAction.getDefaultSuccess(), Util::handleFailure);
}
private void sendEmbed(Reminder reminder, TextChannel channel, EmbedBuilder embedBuilder) {
embedBuilder.setAuthor(reminder.userId() + "");
channel.sendMessageEmbeds(embedBuilder.build()).queue(RestAction.getDefaultSuccess(), Util::handleFailure);
}
}
}