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
public final void onMessageReceived(final @NonNull MessageReceivedEvent event) {
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()) {
return;
@ -126,7 +127,7 @@ public class JDACommandListener<C> extends ListenerAdapter {
}
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.Permission;
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.Nullable;
@ -51,8 +50,8 @@ public class JDACommandManager<C> extends CommandManager<C> {
private final Function<@NonNull C, @NonNull String> prefixMapper;
private final BiFunction<@NonNull C, @NonNull String, @NonNull Boolean> permissionMapper;
private final Function<@NonNull MessageReceivedEvent, @NonNull C> commandSenderMapper;
private final Function<@NonNull C, @NonNull MessageReceivedEvent> backwardsCommandSenderMapper;
private final Function<@NonNull JDACommandSender, @NonNull C> commandSenderMapper;
private final Function<@NonNull C, @NonNull JDACommandSender> backwardsCommandSenderMapper;
/**
* 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 permissionMapper Function used to check if a command sender has the permission to execute a command
* @param commandExecutionCoordinator Coordination provider
* @param commandSenderMapper Function that maps {@link MessageReceivedEvent} to the command sender type
* @param backwardsCommandSenderMapper Function that maps the command sender type to {@link MessageReceivedEvent}
* @param commandSenderMapper Function that maps {@link JDACommandSender} to the command sender type
* @param backwardsCommandSenderMapper Function that maps the command sender type to {@link Member}
* @throws InterruptedException If the jda instance does not ready correctly
*/
public JDACommandManager(
@ -70,8 +69,8 @@ public class JDACommandManager<C> extends CommandManager<C> {
final @NonNull Function<@NonNull C, @NonNull String> prefixMapper,
final @Nullable BiFunction<@NonNull C, @NonNull String, @NonNull Boolean> permissionMapper,
final @NonNull Function<CommandTree<C>, CommandExecutionCoordinator<C>> commandExecutionCoordinator,
final @NonNull Function<@NonNull MessageReceivedEvent, @NonNull C> commandSenderMapper,
final @NonNull Function<@NonNull C, @NonNull MessageReceivedEvent> backwardsCommandSenderMapper
final @NonNull Function<@NonNull JDACommandSender, @NonNull C> commandSenderMapper,
final @NonNull Function<@NonNull C, @NonNull JDACommandSender> backwardsCommandSenderMapper
)
throws InterruptedException {
super(commandExecutionCoordinator, CommandRegistrationHandler.nullCommandRegistrationHandler());
@ -111,7 +110,7 @@ public class JDACommandManager<C> extends CommandManager<C> {
*
* @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;
}
@ -120,7 +119,7 @@ public class JDACommandManager<C> extends CommandManager<C> {
*
* @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;
}
@ -143,13 +142,15 @@ public class JDACommandManager<C> extends CommandManager<C> {
return this.permissionMapper.apply(sender, permission);
}
final MessageReceivedEvent message = this.backwardsCommandSenderMapper.apply(sender);
final Member member = message.getMember();
if (member == null) {
return false;
final JDACommandSender jdaSender = this.backwardsCommandSenderMapper.apply(sender);
if (!(jdaSender instanceof JDAGuildSender)) {
return true;
}
return member.hasPermission(Permission.valueOf(permission));
final JDAGuildSender guildSender = (JDAGuildSender) jdaSender;
return guildSender.getMember().hasPermission(Permission.valueOf(permission));
}
@Override

View file

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

View file

@ -23,9 +23,15 @@
//
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.MessageChannel;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
/**
* Wrapper for {@link MessageReceivedEvent}
@ -33,14 +39,24 @@ import org.checkerframework.checker.nullness.qual.NonNull;
public class JDACommandSender {
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.user = user;
this.channel = channel;
}
/**
@ -51,19 +67,37 @@ public class JDACommandSender {
*/
public static JDACommandSender of(final @NonNull MessageReceivedEvent event) {
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() {
return event;
public final @NonNull Optional<MessageReceivedEvent> getEvent() {
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;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.TextChannel;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
/**
* Guild specific JDA Command Sender
*/
public class JDAGuildSender extends JDACommandSender {
JDAGuildSender(final @NonNull MessageReceivedEvent event) {
super(event);
private final Member member;
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;
import net.dv8tion.jda.api.entities.PrivateChannel;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
/**
* Private message specific JDA Command Sender
*/
public class JDAPrivateSender extends JDACommandSender {
JDAPrivateSender(final @NonNull MessageReceivedEvent event) {
super(event);
private final PrivateChannel channel;
/**
* 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;
}
}