Fix custom senders on Cloud-JDA

Switches the command sender class to JDACommandSender and allows for it to be constructed with a nullable MessageReceivedEvent allowing for poeple to have backwards mappers
This commit is contained in:
broccolai 2020-10-20 08:47:27 +01:00 committed by Alexander Söderberg
parent 433cd88c90
commit c0bc1e7523
6 changed files with 126 additions and 31 deletions

View file

@ -59,7 +59,8 @@ public class JDACommandListener<C> extends ListenerAdapter {
@Override @Override
public final void onMessageReceived(final @NonNull MessageReceivedEvent event) { public final void onMessageReceived(final @NonNull MessageReceivedEvent event) {
final Message message = event.getMessage(); final Message message = event.getMessage();
final C sender = this.commandManager.getCommandSenderMapper().apply(event); final JDACommandSender jdaCommandSender = JDACommandSender.of(event);
final C sender = this.commandManager.getCommandSenderMapper().apply(jdaCommandSender);
if (this.commandManager.getBotId() == event.getAuthor().getIdLong()) { if (this.commandManager.getBotId() == event.getAuthor().getIdLong()) {
return; return;
@ -126,7 +127,7 @@ public class JDACommandListener<C> extends ListenerAdapter {
} }
private void sendMessage(final @NonNull MessageReceivedEvent event, final @NonNull String message) { private void sendMessage(final @NonNull MessageReceivedEvent event, final @NonNull String message) {
event.getChannel().sendMessage(message).queue(); event.getChannel().sendMessage(message).complete();
} }
} }

View file

@ -32,7 +32,6 @@ import cloud.commandframework.meta.SimpleCommandMeta;
import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
@ -51,8 +50,8 @@ public class JDACommandManager<C> extends CommandManager<C> {
private final Function<@NonNull C, @NonNull String> prefixMapper; private final Function<@NonNull C, @NonNull String> prefixMapper;
private final BiFunction<@NonNull C, @NonNull String, @NonNull Boolean> permissionMapper; private final BiFunction<@NonNull C, @NonNull String, @NonNull Boolean> permissionMapper;
private final Function<@NonNull MessageReceivedEvent, @NonNull C> commandSenderMapper; private final Function<@NonNull JDACommandSender, @NonNull C> commandSenderMapper;
private final Function<@NonNull C, @NonNull MessageReceivedEvent> backwardsCommandSenderMapper; private final Function<@NonNull C, @NonNull JDACommandSender> backwardsCommandSenderMapper;
/** /**
* Construct a new JDA Command Manager * Construct a new JDA Command Manager
@ -61,8 +60,8 @@ public class JDACommandManager<C> extends CommandManager<C> {
* @param prefixMapper Function that maps the sender to a command prefix string * @param prefixMapper Function that maps the sender to a command prefix string
* @param permissionMapper Function used to check if a command sender has the permission to execute a command * @param permissionMapper Function used to check if a command sender has the permission to execute a command
* @param commandExecutionCoordinator Coordination provider * @param commandExecutionCoordinator Coordination provider
* @param commandSenderMapper Function that maps {@link MessageReceivedEvent} to the command sender type * @param commandSenderMapper Function that maps {@link JDACommandSender} to the command sender type
* @param backwardsCommandSenderMapper Function that maps the command sender type to {@link MessageReceivedEvent} * @param backwardsCommandSenderMapper Function that maps the command sender type to {@link Member}
* @throws InterruptedException If the jda instance does not ready correctly * @throws InterruptedException If the jda instance does not ready correctly
*/ */
public JDACommandManager( public JDACommandManager(
@ -70,8 +69,8 @@ public class JDACommandManager<C> extends CommandManager<C> {
final @NonNull Function<@NonNull C, @NonNull String> prefixMapper, final @NonNull Function<@NonNull C, @NonNull String> prefixMapper,
final @Nullable BiFunction<@NonNull C, @NonNull String, @NonNull Boolean> permissionMapper, final @Nullable BiFunction<@NonNull C, @NonNull String, @NonNull Boolean> permissionMapper,
final @NonNull Function<CommandTree<C>, CommandExecutionCoordinator<C>> commandExecutionCoordinator, final @NonNull Function<CommandTree<C>, CommandExecutionCoordinator<C>> commandExecutionCoordinator,
final @NonNull Function<@NonNull MessageReceivedEvent, @NonNull C> commandSenderMapper, final @NonNull Function<@NonNull JDACommandSender, @NonNull C> commandSenderMapper,
final @NonNull Function<@NonNull C, @NonNull MessageReceivedEvent> backwardsCommandSenderMapper final @NonNull Function<@NonNull C, @NonNull JDACommandSender> backwardsCommandSenderMapper
) )
throws InterruptedException { throws InterruptedException {
super(commandExecutionCoordinator, CommandRegistrationHandler.nullCommandRegistrationHandler()); super(commandExecutionCoordinator, CommandRegistrationHandler.nullCommandRegistrationHandler());
@ -111,7 +110,7 @@ public class JDACommandManager<C> extends CommandManager<C> {
* *
* @return Command sender mapper * @return Command sender mapper
*/ */
public final @NonNull Function<@NonNull MessageReceivedEvent, @NonNull C> getCommandSenderMapper() { public final @NonNull Function<@NonNull JDACommandSender, @NonNull C> getCommandSenderMapper() {
return this.commandSenderMapper; return this.commandSenderMapper;
} }
@ -120,7 +119,7 @@ public class JDACommandManager<C> extends CommandManager<C> {
* *
* @return The backwards command sender mapper * @return The backwards command sender mapper
*/ */
public final @NonNull Function<@NonNull C, @NonNull MessageReceivedEvent> getBackwardsCommandSenderMapper() { public final @NonNull Function<@NonNull C, @NonNull JDACommandSender> getBackwardsCommandSenderMapper() {
return this.backwardsCommandSenderMapper; return this.backwardsCommandSenderMapper;
} }
@ -143,13 +142,15 @@ public class JDACommandManager<C> extends CommandManager<C> {
return this.permissionMapper.apply(sender, permission); return this.permissionMapper.apply(sender, permission);
} }
final MessageReceivedEvent message = this.backwardsCommandSenderMapper.apply(sender); final JDACommandSender jdaSender = this.backwardsCommandSenderMapper.apply(sender);
final Member member = message.getMember();
if (member == null) { if (!(jdaSender instanceof JDAGuildSender)) {
return false; return true;
} }
return member.hasPermission(Permission.valueOf(permission)); final JDAGuildSender guildSender = (JDAGuildSender) jdaSender;
return guildSender.getMember().hasPermission(Permission.valueOf(permission));
} }
@Override @Override

View file

@ -51,8 +51,6 @@ final class JDACommandPreprocessor<C> implements CommandPreprocessor<C> {
*/ */
@Override @Override
public void accept(final @NonNull CommandPreprocessingContext<C> context) { public void accept(final @NonNull CommandPreprocessingContext<C> context) {
context.getCommandContext().store("MessageReceivedEvent", mgr.getBackwardsCommandSenderMapper().apply(
context.getCommandContext().getSender()));
context.getCommandContext().store("JDA", mgr.getJDA()); context.getCommandContext().store("JDA", mgr.getJDA());
} }

View file

@ -23,9 +23,15 @@
// //
package cloud.commandframework.jda; package cloud.commandframework.jda;
import java.util.Objects;
import java.util.Optional;
import net.dv8tion.jda.api.entities.ChannelType; import net.dv8tion.jda.api.entities.ChannelType;
import net.dv8tion.jda.api.entities.MessageChannel;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
/** /**
* Wrapper for {@link MessageReceivedEvent} * Wrapper for {@link MessageReceivedEvent}
@ -33,14 +39,24 @@ import org.checkerframework.checker.nullness.qual.NonNull;
public class JDACommandSender { public class JDACommandSender {
private final MessageReceivedEvent event; private final MessageReceivedEvent event;
private final User user;
private final MessageChannel channel;
/** /**
* Construct a JDA Command Sender using an event * Construct a JDA Command Sender
* *
* @param event Message Received Event * @param event Message received event
* @param user Sending user
* @param channel Channel sent in
*/ */
public JDACommandSender(final @NonNull MessageReceivedEvent event) { protected JDACommandSender(
final @Nullable MessageReceivedEvent event,
final @NonNull User user,
final @NonNull MessageChannel channel
) {
this.event = event; this.event = event;
this.user = user;
this.channel = channel;
} }
/** /**
@ -51,19 +67,37 @@ public class JDACommandSender {
*/ */
public static JDACommandSender of(final @NonNull MessageReceivedEvent event) { public static JDACommandSender of(final @NonNull MessageReceivedEvent event) {
if (event.isFromType(ChannelType.PRIVATE)) { if (event.isFromType(ChannelType.PRIVATE)) {
return new JDAPrivateSender(event); return new JDAPrivateSender(event, event.getAuthor(), event.getPrivateChannel());
} }
return new JDAGuildSender(event); return new JDAGuildSender(event, Objects.requireNonNull(event.getMember()), event.getTextChannel());
} }
/** /**
* Get the {@link MessageReceivedEvent} * Get the message receive event
* *
* @return Message Received Event * @return Optional of the message receive event
*/ */
public @NonNull MessageReceivedEvent getEvent() { public final @NonNull Optional<MessageReceivedEvent> getEvent() {
return event; return Optional.ofNullable(event);
}
/**
* Get the user the command sender represents
*
* @return User that sent the message
*/
public final @NonNull User getUser() {
return user;
}
/**
* Get the channel the user sent the message in
*
* @return Channel that the message was sent in
*/
public final @NonNull MessageChannel getChannel() {
return channel;
} }
} }

View file

@ -23,16 +23,53 @@
// //
package cloud.commandframework.jda; package cloud.commandframework.jda;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.TextChannel;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
/** /**
* Guild specific JDA Command Sender * Guild specific JDA Command Sender
*/ */
public class JDAGuildSender extends JDACommandSender { public class JDAGuildSender extends JDACommandSender {
JDAGuildSender(final @NonNull MessageReceivedEvent event) { private final Member member;
super(event); private final TextChannel channel;
/**
* Construct a JDA Guild Sender using an event
*
* @param event Message received event
* @param member Sending member
* @param channel Channel sent in
*/
public JDAGuildSender(
final @Nullable MessageReceivedEvent event,
final @NonNull Member member,
final @NonNull TextChannel channel
) {
super(event, member.getUser(), channel);
this.member = member;
this.channel = channel;
}
/**
* Get the member the command sender represents
*
* @return Member that sent the message
*/
public @NonNull Member getMember() {
return member;
}
/**
* Get the channel the user sent the message in
*
* @return Channel that the message was sent in
*/
public @NonNull TextChannel getTextChannel() {
return channel;
} }
} }

View file

@ -23,16 +23,40 @@
// //
package cloud.commandframework.jda; package cloud.commandframework.jda;
import net.dv8tion.jda.api.entities.PrivateChannel;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
/** /**
* Private message specific JDA Command Sender * Private message specific JDA Command Sender
*/ */
public class JDAPrivateSender extends JDACommandSender { public class JDAPrivateSender extends JDACommandSender {
JDAPrivateSender(final @NonNull MessageReceivedEvent event) { private final PrivateChannel channel;
super(event);
/**
* Construct a JDA Private Sender using an event
*
* @param event Message received event
* @param user Sending user
* @param channel Channel sent in
*/
public JDAPrivateSender(
final @Nullable MessageReceivedEvent event, final @NonNull User user, final @NonNull PrivateChannel channel
) {
super(event, user, channel);
this.channel = channel;
}
/**
* Get the channel the user sent the message in
*
* @return Channel that the message was sent in
*/
public PrivateChannel getPrivateChannel() {
return channel;
} }
} }