package com.alttd.database.queries.events; import com.alttd.AltitudeBot; import com.alttd.util.Logger; import lombok.Getter; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import java.time.Instant; import java.util.Comparator; import java.util.HashMap; import java.util.Optional; public final class Event { private static final HashMap eventMap = new HashMap<>(); @Getter private final long messageId, guildId, channelId, roleId; @Getter private final Instant startTime; @Getter private Role role = null; @Getter private final String title; public static Event getEvent(long messageId) { return eventMap.get(messageId); } private Message message = null; public Event(long messageId, long guildId, long channelId, Instant startTime, long roleId, String title) { this.messageId = messageId; this.guildId = guildId; this.channelId = channelId; this.startTime = startTime; this.roleId = roleId; this.title = title; eventMap.put(messageId, this); loadMessageAndRole(); Logger.altitudeLogs.info(String.format("Loaded event with title [%s] and message id [%s]", title, messageId)); } public static Optional getNextEvent() { return eventMap.values().stream().min(Comparator.comparing(Event::getStartTime)); } public static void removeEvent(Event event) { eventMap.remove(event.getMessageId()); } private void loadMessageAndRole() { Guild guild = AltitudeBot.getInstance().getJDA().getGuildById(guildId); if (guild == null) { Logger.altitudeLogs.error(String.format("Unable to find guild %s when creating event", guildId)); return; } TextChannel textChannel = guild.getTextChannelById(channelId); if (textChannel == null) { Logger.altitudeLogs.error(String.format("Unable to find text channel %s when creating event", channelId)); return; } textChannel.retrieveMessageById(messageId).queue(message -> { this.message = message; Logger.altitudeLogs.debug(String.format("Loaded message for event with title [%s]", title)); }); role = guild.getRoleById(roleId); } public Optional getMessage() { return message == null ? Optional.empty() : Optional.of(message); } };