From 80bbf8c55b36bbf83ec68c270dc746ebb244381d Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Tue, 3 Aug 2021 23:19:56 -0400 Subject: [PATCH] Add DiscordService#getRole & DiscordService#modifyMemberRoles --- .../v2/services/discord/DiscordService.java | 17 ++++++++ .../v2/services/discord/InteractionRole.java | 36 ++++++++++++++++ .../discord/JDADiscordService.java | 36 ++++++++++++++++ .../interactions/InteractionRoleImpl.java | 41 +++++++++++++++++++ 4 files changed, 130 insertions(+) create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionRole.java create mode 100644 EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionRoleImpl.java diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/DiscordService.java b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/DiscordService.java index 1f6a4b2b0..c92e3d905 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/DiscordService.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/DiscordService.java @@ -4,6 +4,7 @@ import net.essentialsx.api.v2.events.discord.DiscordChatMessageEvent; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; +import java.util.Collection; import java.util.concurrent.CompletableFuture; /** @@ -56,6 +57,22 @@ public interface DiscordService { */ CompletableFuture getMemberById(final String id); + /** + * Gets an {@link InteractionRole} by its Discord ID. + * @param id The ID of the role to look up. + * @return the role or null if none by that ID exists. + */ + InteractionRole getRole(final String id); + + /** + * Adds or removes {@link InteractionRole roles} to the given {@link InteractionMember}. + * @param member The member to add/remove roles to/from. + * @param addRoles The roles to add to the {@link InteractionMember member}, or null to add none. + * @param removeRoles The roles to remove from the {@link InteractionMember member}, or null to remove none. + * @return A future which will complete when all requests operations have been completed. + */ + CompletableFuture modifyMemberRoles(final InteractionMember member, final Collection addRoles, final Collection removeRoles); + /** * Gets unstable API that is subject to change at any time. * @return {@link Unsafe the unsafe} instance. diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionRole.java b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionRole.java new file mode 100644 index 000000000..ca1122f15 --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/InteractionRole.java @@ -0,0 +1,36 @@ +package net.essentialsx.api.v2.services.discord; + +/** + * Represents a role of an interaction member. + */ +public interface InteractionRole { + /** + * Gets the name of this role. + * @return this role's name. + */ + String getName(); + + /** + * Whether this role is mentionable. + * @return true if the role is mentionable. + */ + boolean isManaged(); + + /** + * Gets the raw RGB color value of this role. + * @return this role's color value. + */ + int getColorRaw(); + + /** + * Whether this role's color is the default one (has no color). + * @return true if the role has no color. + */ + boolean isDefaultColor(); + + /** + * Gets the ID of this role. + * @return this role's ID. + */ + String getId(); +} diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java index 9f2d94417..c7614543b 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java @@ -13,6 +13,7 @@ import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; import net.dv8tion.jda.api.entities.Emote; import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.entities.TextChannel; import net.dv8tion.jda.api.entities.Webhook; import net.dv8tion.jda.api.events.ShutdownEvent; @@ -27,10 +28,12 @@ import net.essentialsx.api.v2.services.discord.DiscordService; import net.essentialsx.api.v2.services.discord.InteractionController; import net.essentialsx.api.v2.services.discord.InteractionException; import net.essentialsx.api.v2.services.discord.InteractionMember; +import net.essentialsx.api.v2.services.discord.InteractionRole; import net.essentialsx.api.v2.services.discord.MessageType; import net.essentialsx.api.v2.services.discord.Unsafe; import net.essentialsx.discord.interactions.InteractionControllerImpl; import net.essentialsx.discord.interactions.InteractionMemberImpl; +import net.essentialsx.discord.interactions.InteractionRoleImpl; import net.essentialsx.discord.interactions.commands.ExecuteCommand; import net.essentialsx.discord.interactions.commands.ListCommand; import net.essentialsx.discord.interactions.commands.MessageCommand; @@ -48,7 +51,10 @@ import org.bukkit.plugin.ServicePriority; import org.jetbrains.annotations.NotNull; import javax.security.auth.login.LoginException; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -481,6 +487,36 @@ public class JDADiscordService implements DiscordService, IEssentialsModule { return future; } + @Override + public InteractionRole getRole(String id) { + final Role role = getGuild().getRoleById(id); + return role == null ? null : new InteractionRoleImpl(role); + } + + @Override + public CompletableFuture modifyMemberRoles(InteractionMember member, Collection addRoles, Collection removeRoles) { + if ((addRoles == null || addRoles.isEmpty()) && (removeRoles == null || removeRoles.isEmpty())) { + return CompletableFuture.completedFuture(null); + } + + final List add = new ArrayList<>(); + final List remove = new ArrayList<>(); + if (addRoles != null) { + for (final InteractionRole role : addRoles) { + add.add(((InteractionRoleImpl) role).getJdaObject()); + } + } + if (removeRoles != null) { + for (final InteractionRole role : removeRoles) { + remove.add(((InteractionRoleImpl) role).getJdaObject()); + } + } + + final CompletableFuture future = new CompletableFuture<>(); + guild.modifyMemberRoles(((InteractionMemberImpl) member).getJdaObject(), add, remove).queue(future::complete); + return future; + } + public JDA getJda() { return jda; } diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionRoleImpl.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionRoleImpl.java new file mode 100644 index 000000000..ca3ac9bbb --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/interactions/InteractionRoleImpl.java @@ -0,0 +1,41 @@ +package net.essentialsx.discord.interactions; + +import net.dv8tion.jda.api.entities.Role; +import net.essentialsx.api.v2.services.discord.InteractionRole; + +public class InteractionRoleImpl implements InteractionRole { + private final Role role; + + public InteractionRoleImpl(Role role) { + this.role = role; + } + + @Override + public String getName() { + return role.getName(); + } + + @Override + public boolean isManaged() { + return role.isManaged(); + } + + @Override + public int getColorRaw() { + return role.getColorRaw(); + } + + @Override + public boolean isDefaultColor() { + return role.getColorRaw() == Role.DEFAULT_COLOR_RAW; + } + + public Role getJdaObject() { + return role; + } + + @Override + public String getId() { + return role.getId(); + } +}