From 80ad84f2e8c0c83181aa6ca33bdc466ef39b75bc Mon Sep 17 00:00:00 2001 From: p5nbTgip0r Date: Mon, 25 Jan 2021 17:22:58 -0800 Subject: [PATCH] JDA: Guild isolation for user argument --- .../jda/JDACommandManager.java | 3 +- .../jda/parsers/UserArgument.java | 80 ++++++++++++++++--- 2 files changed, 70 insertions(+), 13 deletions(-) diff --git a/cloud-discord/cloud-jda/src/main/java/cloud/commandframework/jda/JDACommandManager.java b/cloud-discord/cloud-jda/src/main/java/cloud/commandframework/jda/JDACommandManager.java index ed8e542b..bfe1896a 100644 --- a/cloud-discord/cloud-jda/src/main/java/cloud/commandframework/jda/JDACommandManager.java +++ b/cloud-discord/cloud-jda/src/main/java/cloud/commandframework/jda/JDACommandManager.java @@ -107,7 +107,8 @@ public class JDACommandManager extends CommandManager { /* Register JDA Parsers */ this.getParserRegistry().registerParserSupplier(TypeToken.get(User.class), parserParameters -> new UserArgument.UserParser<>( - new HashSet<>(Arrays.asList(UserArgument.ParserMode.values())) + new HashSet<>(Arrays.asList(UserArgument.ParserMode.values())), + UserArgument.Isolation.GUILD )); this.getParserRegistry().registerParserSupplier(TypeToken.get(MessageChannel.class), parserParameters -> new ChannelArgument.MessageParser<>( diff --git a/cloud-discord/cloud-jda/src/main/java/cloud/commandframework/jda/parsers/UserArgument.java b/cloud-discord/cloud-jda/src/main/java/cloud/commandframework/jda/parsers/UserArgument.java index 01b096e2..645ce023 100644 --- a/cloud-discord/cloud-jda/src/main/java/cloud/commandframework/jda/parsers/UserArgument.java +++ b/cloud-discord/cloud-jda/src/main/java/cloud/commandframework/jda/parsers/UserArgument.java @@ -28,15 +28,18 @@ import cloud.commandframework.arguments.parser.ArgumentParseResult; import cloud.commandframework.arguments.parser.ArgumentParser; import cloud.commandframework.context.CommandContext; import cloud.commandframework.exceptions.parsing.NoInputProvidedException; -import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.User; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import org.checkerframework.checker.nullness.qual.NonNull; import org.jetbrains.annotations.NotNull; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Queue; import java.util.Set; +import java.util.stream.Collectors; /** * Command Argument for {@link User} @@ -48,13 +51,16 @@ import java.util.Set; public final class UserArgument extends CommandArgument { private final Set modes; + private final Isolation isolationLevel; private UserArgument( final boolean required, final @NonNull String name, - final @NonNull Set modes + final @NonNull Set modes, + final @NonNull Isolation isolationLevel ) { - super(required, name, new UserParser<>(modes), User.class); + super(required, name, new UserParser<>(modes, isolationLevel), User.class); this.modes = modes; + this.isolationLevel = isolationLevel; } /** @@ -106,10 +112,16 @@ public final class UserArgument extends CommandArgument { NAME } + public enum Isolation { + GLOBAL, + GUILD + } + public static final class Builder extends CommandArgument.Builder { private Set modes = new HashSet<>(); + private Isolation isolationLevel = Isolation.GUILD; private Builder(final @NonNull String name) { super(User.class, name); @@ -137,6 +149,17 @@ public final class UserArgument extends CommandArgument { return this; } + /** + * Set the isolation level of the parser + * + * @param isolation Isolation level + * @return Builder instance + */ + public @NonNull Builder withIsolationLevel(final @NonNull Isolation isolation) { + this.isolationLevel = isolation; + return this; + } + /** * Builder a new example component * @@ -144,7 +167,7 @@ public final class UserArgument extends CommandArgument { */ @Override public @NonNull UserArgument build() { - return new UserArgument<>(this.isRequired(), this.getName(), modes); + return new UserArgument<>(this.isRequired(), this.getName(), modes, isolationLevel); } } @@ -153,19 +176,22 @@ public final class UserArgument extends CommandArgument { public static final class UserParser implements ArgumentParser { private final Set modes; + private final Isolation isolationLevel; /** * Construct a new argument parser for {@link User} * * @param modes List of parsing modes to use when parsing - * @throws java.lang.IllegalStateException If no parsing modes were provided + * @param isolationLevel Level of isolation to maintain when parsing + * @throws java.lang.IllegalArgumentException If no parsing modes were provided */ - public UserParser(final @NonNull Set modes) { + public UserParser(final @NonNull Set modes, final @NonNull Isolation isolationLevel) { if (modes.isEmpty()) { throw new IllegalArgumentException("At least one parsing mode is required"); } this.modes = modes; + this.isolationLevel = isolationLevel; } @Override @@ -181,7 +207,13 @@ public final class UserArgument extends CommandArgument { )); } - final JDA jda = commandContext.get("JDA"); + if (!commandContext.contains("MessageReceivedEvent")) { + return ArgumentParseResult.failure(new IllegalStateException( + "MessageReceivedEvent was not in the command context." + )); + } + + final MessageReceivedEvent event = commandContext.get("MessageReceivedEvent"); Exception exception = null; if (modes.contains(ParserMode.MENTION)) { @@ -194,7 +226,7 @@ public final class UserArgument extends CommandArgument { } try { - final ArgumentParseResult result = this.userFromId(jda, input, id); + final ArgumentParseResult result = this.userFromId(event, input, id); inputQueue.remove(); return result; } catch (final UserNotFoundParseException | NumberFormatException e) { @@ -209,7 +241,7 @@ public final class UserArgument extends CommandArgument { if (modes.contains(ParserMode.ID)) { try { - final ArgumentParseResult result = this.userFromId(jda, input, input); + final ArgumentParseResult result = this.userFromId(event, input, input); inputQueue.remove(); return result; } catch (final UserNotFoundParseException | NumberFormatException e) { @@ -218,7 +250,19 @@ public final class UserArgument extends CommandArgument { } if (modes.contains(ParserMode.NAME)) { - final List users = jda.getUsersByName(input, true); + final List users; + + if (isolationLevel == Isolation.GLOBAL) { + users = event.getJDA().getUsersByName(input, true); + } else if (event.isFromGuild()) { + users = event.getGuild().getMembersByEffectiveName(input, true) + .stream().map(Member::getUser) + .collect(Collectors.toList()); + } else if (event.getAuthor().getName().equalsIgnoreCase(input)) { + users = Collections.singletonList(event.getAuthor()); + } else { + users = Collections.emptyList(); + } if (users.size() == 0) { exception = new UserNotFoundParseException(input); @@ -240,11 +284,23 @@ public final class UserArgument extends CommandArgument { } private @NonNull ArgumentParseResult userFromId( - final @NonNull JDA jda, final @NonNull String input, + final @NonNull MessageReceivedEvent event, + final @NonNull String input, final @NonNull String id ) throws UserNotFoundParseException, NumberFormatException { - final User user = jda.getUserById(id); + final User user; + if (isolationLevel == Isolation.GLOBAL) { + user = event.getJDA().getUserById(id); + } else if (event.isFromGuild()) { + Member member = event.getGuild().getMemberById(id); + + user = member != null ? member.getUser() : null; + } else if (event.getAuthor().getId().equalsIgnoreCase(id)) { + user = event.getAuthor(); + } else { + user = null; + } if (user == null) { throw new UserNotFoundParseException(input);