Added functionalities to create and manage events, including the creation of necessary database tables, context menus, modals, and scheduling tasks. Introduced `UserToMessageTracker` utility for tracking user messages within modals.
102 lines
4.0 KiB
Java
102 lines
4.0 KiB
Java
package com.alttd.buttonManager.buttons.eventButton;
|
|
|
|
import com.alttd.AltitudeBot;
|
|
import com.alttd.buttonManager.DiscordButton;
|
|
import com.alttd.database.queries.events.Event;
|
|
import com.alttd.util.Logger;
|
|
import com.alttd.util.Util;
|
|
import net.dv8tion.jda.api.EmbedBuilder;
|
|
import net.dv8tion.jda.api.entities.*;
|
|
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
|
|
import net.dv8tion.jda.api.interactions.components.buttons.Button;
|
|
|
|
import java.time.Instant;
|
|
import java.util.List;
|
|
import java.util.Optional;
|
|
|
|
public class EventButton extends DiscordButton {
|
|
|
|
public EventButton() {
|
|
}
|
|
|
|
@Override
|
|
public String getButtonId() {
|
|
return "event_button";
|
|
}
|
|
|
|
@Override
|
|
public void execute(ButtonInteractionEvent event) {
|
|
Event eventForButton = Event.getEvent(event.getMessageIdLong());
|
|
if (eventForButton == null) {
|
|
event.replyEmbeds(Util.genericErrorEmbed("Error", "Event not found")).setEphemeral(true).queue();
|
|
return;
|
|
}
|
|
|
|
Member member = event.getMember();
|
|
if (member == null) {
|
|
event.replyEmbeds(Util.genericErrorEmbed("Error", "This button can only be used within a guild")).setEphemeral(true).queue();
|
|
return;
|
|
}
|
|
|
|
if (Instant.now().isAfter(eventForButton.getStartTime())) {
|
|
event.replyEmbeds(Util.genericErrorEmbed("Error", "Unable to process you joining" + eventForButton.getTitle() + ", the event might have ended!")).setEphemeral(true).queue();
|
|
return;
|
|
}
|
|
|
|
Optional<Role> any = member.getRoles().stream().filter(role -> role.getIdLong() == eventForButton.getRoleId()).findAny();
|
|
if (any.isPresent()) {
|
|
updateJoinedEventUsersInEmbed(eventForButton);
|
|
event.replyEmbeds(Util.genericSuccessEmbed("Success", "Removed you from " + eventForButton.getTitle() + "!")).setEphemeral(true).queue();
|
|
try {
|
|
eventForButton.getRole().getGuild().removeRoleFromMember(member, eventForButton.getRole()).queue();
|
|
} catch (Exception e) {
|
|
Logger.altitudeLogs.error(e);
|
|
}
|
|
return;
|
|
}
|
|
|
|
try {
|
|
eventForButton.getRole().getGuild().addRoleToMember(member, eventForButton.getRole()).queue();
|
|
} catch (Exception e) {
|
|
Logger.altitudeLogs.error(e);
|
|
}
|
|
if (updateJoinedEventUsersInEmbed(eventForButton)) {
|
|
event.replyEmbeds(Util.genericSuccessEmbed("Success", "You joined " + eventForButton.getTitle() + "!")).setEphemeral(true).queue();
|
|
} else {
|
|
event.replyEmbeds(Util.genericErrorEmbed("Error", "Failed to add you to the event, contact an admin for help if needed")).setEphemeral(true).queue();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public Button getButton() {
|
|
return Button.primary(getButtonId(), "Join Event");
|
|
}
|
|
|
|
private boolean updateJoinedEventUsersInEmbed(Event event) {
|
|
Optional<Message> optionalMessage = event.getMessage();
|
|
if (optionalMessage.isEmpty()) {
|
|
Logger.altitudeLogs.error("Unable to find event message");
|
|
return false;
|
|
}
|
|
Message message = optionalMessage.get();
|
|
List<MessageEmbed> embeds = message.getEmbeds();
|
|
if (embeds.isEmpty()) {
|
|
Logger.altitudeLogs.error("Unable to find event embed");
|
|
return false;
|
|
}
|
|
|
|
EmbedBuilder builder = new EmbedBuilder(embeds.get(0));
|
|
builder.clearFields()
|
|
.addField("Event Start", "<t:" + event.getStartTime().getEpochSecond() + ":F>", true);
|
|
Guild guildById = AltitudeBot.getInstance().getJDA().getGuildById(event.getGuildId());
|
|
if (guildById != null) {
|
|
List<Member> membersWithRole = guildById.getMembersWithRoles(event.getRole());
|
|
builder.addField("Participants", String.valueOf(membersWithRole.size()), true);
|
|
}
|
|
MessageEmbed updatedEmbed = builder.build();
|
|
message.editMessageEmbeds(updatedEmbed).queue();
|
|
return true;
|
|
}
|
|
|
|
}
|