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 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 optionalMessage = event.getMessage(); if (optionalMessage.isEmpty()) { Logger.altitudeLogs.error("Unable to find event message"); return false; } Message message = optionalMessage.get(); List 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", "", true); Guild guildById = AltitudeBot.getInstance().getJDA().getGuildById(event.getGuildId()); if (guildById != null) { List membersWithRole = guildById.getMembersWithRoles(event.getRole()); builder.addField("Participants", String.valueOf(membersWithRole.size()), true); } MessageEmbed updatedEmbed = builder.build(); message.editMessageEmbeds(updatedEmbed).queue(); return true; } }