Refactor account linking to use InteractionHook

Updated the account linking process to use `InteractionHook` for improved response handling and consistency. Replaced direct event replies with deferred interactions and streamlined role management and error messages. This ensures better compatibility with asynchronous operations and cleaner user feedback.
This commit is contained in:
Teriuihi 2025-01-24 20:23:08 +01:00
parent baf88ed43e
commit 7083235d68
2 changed files with 25 additions and 17 deletions

View File

@ -11,6 +11,7 @@ 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.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.InteractionHook;
import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions;
import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.OptionType;
@ -53,23 +54,25 @@ public class CommandLink extends DiscordCommand {
return;
}
List<DiscordRole> discordRoles = Utilities.getDiscordRolesForUser(uuid, member);
event.deferReply(true).queue(interactionHook -> {
List<DiscordRole> discordRoles = Utilities.getDiscordRolesForUser(uuid, member);
DiscordLinkPlayer discordLinkPlayer = new DiscordLinkPlayer(
member.getIdLong(),
uuid,
getUsername(uuid),
member.getUser().getName(),
false,
true,
discordRoles.stream()
.map(DiscordRole::getInternalName)
.collect(Collectors.toList()));
DiscordLinkPlayer discordLinkPlayer = new DiscordLinkPlayer(
member.getIdLong(),
uuid,
getUsername(uuid),
member.getUser().getName(),
false,
true,
discordRoles.stream()
.map(DiscordRole::getInternalName)
.collect(Collectors.toList()));
linkAccount(discordLinkPlayer, event);
linkAccount(discordLinkPlayer, event, interactionHook);
});
}
private void linkAccount(DiscordLinkPlayer discordLinkPlayer, SlashCommandInteractionEvent event) {
private void linkAccount(DiscordLinkPlayer discordLinkPlayer, SlashCommandInteractionEvent event, InteractionHook interactionHook) {
discordLinkPlayer.updateDiscord(
DiscordRole.getDiscordRoles().stream()
.filter(role -> discordLinkPlayer.getRoles().contains(role.getInternalName()))
@ -87,7 +90,7 @@ public class CommandLink extends DiscordCommand {
Guild guild = event.getGuild();
Member member = event.getMember();
if (guild == null || member == null) {
Utilities.commandErrAutoRem("Unable to find guild", event);
Utilities.commandErrAutoRem("Unable to find guild", interactionHook);
return;
}
if (player != null || user != null) {
@ -104,11 +107,10 @@ public class CommandLink extends DiscordCommand {
discordLinkPlayer.getUsername());
}
event.replyEmbeds(Utilities.genericSuccessEmbed("Success","You have successfully linked " +
interactionHook.editOriginalEmbeds(Utilities.genericSuccessEmbed("Success","You have successfully linked " +
discordLinkPlayer.getUsername() + " with " +
discordLinkPlayer.getDiscordUsername() + "!"))
.setEphemeral(true)
.queue(result -> result.deleteOriginal().queueAfter(5, TimeUnit.SECONDS));
.queue(result -> result.delete().queueAfter(5, TimeUnit.SECONDS));
DiscordLinkPlayer.addDiscordLinkPlayer(discordLinkPlayer);
DiscordLink.getPlugin().getDatabase().syncPlayer(discordLinkPlayer);

View File

@ -15,6 +15,7 @@ import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.entities.Role;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.interactions.InteractionHook;
import net.dv8tion.jda.api.interactions.commands.build.CommandData;
import net.dv8tion.jda.api.requests.RestAction;
import net.kyori.adventure.text.minimessage.MiniMessage;
@ -218,6 +219,11 @@ public class Utilities {
.queue(res -> res.deleteOriginal().queueAfter(5, TimeUnit.SECONDS));
}
public static void commandErrAutoRem(String text, InteractionHook event) {
event.editOriginalEmbeds(Utilities.genericErrorEmbed("Error", text))
.queue(res -> res.delete().queueAfter(5, TimeUnit.SECONDS));
}
public static boolean removeRole(UUID uuid, String group) {
User user = getLuckPerms().getUserManager().getUser(uuid);