Added auction command
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user