package com.alttd.commandManager.commands; import com.alttd.commandManager.CommandManager; import com.alttd.commandManager.DiscordCommand; import com.alttd.config.MessagesConfig; import com.alttd.database.queries.QueriesUserByRole; import com.alttd.database.queries.QueriesUserDiscordId; import com.alttd.util.Util; 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.events.interaction.command.CommandAutoCompleteInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.interactions.InteractionContextType; import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions; import net.dv8tion.jda.api.interactions.commands.build.CommandData; import net.dv8tion.jda.api.interactions.commands.build.Commands; import net.dv8tion.jda.api.requests.RestAction; import net.dv8tion.jda.api.requests.restaction.interactions.ReplyCallbackAction; import java.util.Collections; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class CommandSyncNitro extends DiscordCommand { private final CommandData commandData; private final JDA jda; public CommandSyncNitro(JDA jda, CommandManager commandManager) { this.jda = jda; commandData = Commands.slash(getName(), "Sync nitro users.") .setContexts(InteractionContextType.GUILD) .setDefaultPermissions(DefaultMemberPermissions.DISABLED); Util.registerCommand(commandManager, jda, commandData, getName()); } @Override public String getName() { return "syncnitro"; } @Override public void execute(SlashCommandInteractionEvent event) { Guild guildById = jda.getGuildById(141644560005595136L); if (guildById == null) { event.replyEmbeds(Util.genericErrorEmbed("Error", "Unable to find guild.")) .setEphemeral(true).queue(RestAction.getDefaultSuccess(), Util::handleFailure); return; } ReplyCallbackAction replyCallbackAction = event.deferReply(true); QueriesUserByRole.getUserIdsByRole("alpha").thenAcceptAsync(optionalUserIdList -> { if (optionalUserIdList.isEmpty()) { replyCallbackAction.setEmbeds(Util.genericErrorEmbed("Error", "No users found.")) .setEphemeral(true).queue(RestAction.getDefaultSuccess(), Util::handleFailure); return; } checkAllMembers(optionalUserIdList.get(), guildById, replyCallbackAction); }); } private void checkAllMembers(List userIdList, Guild guildById, ReplyCallbackAction replyCallbackAction) { ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); for (int i = 0; i < userIdList.size(); i++) { long userId = userIdList.get(i); scheduler.schedule(() -> { Member member = guildById.getMemberById(userId); if (member == null) { guildById.retrieveMemberById(userId) .queue(retrievedMember -> checkMember(retrievedMember, userId)); } else { checkMember(member, userId); } }, i, TimeUnit.SECONDS); } replyCallbackAction.setEmbeds(Util.genericSuccessEmbed("Success", "Syncing " + userIdList.size() + " users in background")); scheduler.shutdown(); } private void checkMember(Member member, long userId) { if (member == null) { QueriesUserDiscordId.removeLinkedUserByDiscordId(userId); return; } boolean hasNitro = member.getRoles().stream().anyMatch(role -> role.getIdLong() == 585557866275012633L); if (!hasNitro) { QueriesUserDiscordId.removeRole(userId, "nitro"); } } @Override public void suggest(CommandAutoCompleteInteractionEvent event) { event.replyChoices(Collections.emptyList()) .queue(RestAction.getDefaultSuccess(), Util::handleFailure); } @Override public String getHelpMessage() { return MessagesConfig.HELP_SYNC_NITRO; } @Override public CommandData getCommandData() { return commandData; } }