Implement built-in tasks, improve message commands with arguments, fix command context in DM, better help message

This commit is contained in:
anthorob committed 2026-08-24 17:03:26 -04:00
1 parent c98d47b5ca
commit 247f217e2e
9 files changed
+78 -56

No files matched your search

@@ -14,7 +14,9 @@ import net.dv8tion.jda.api.interactions.components.LayoutComponent;
import net.dv8tion.jda.api.interactions.modals.Modal; import net.dv8tion.jda.api.interactions.modals.Modal;
import net.dv8tion.jda.api.utils.messages.MessageCreateData; import net.dv8tion.jda.api.utils.messages.MessageCreateData;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.function.Consumer; import java.util.function.Consumer;
@@ -23,7 +25,7 @@ public class MessageCommandContext extends CommandContext {
private final Message message; private final Message message;
public MessageCommandContext(MessageReceivedEvent event) { public MessageCommandContext(MessageReceivedEvent event) {
super(event.getJDA(), event.getGuild(), event.getChannel(), event.getMember(), event.getAuthor()); super(event.getJDA(), event.isFromGuild() ? event.getGuild() : null, event.getChannel(), event.getMember(), event.getAuthor());
this.event = event; this.event = event;
this.message = event.getMessage(); this.message = event.getMessage();
} }
@@ -34,24 +36,31 @@ public class MessageCommandContext extends CommandContext {
} }
public String getArgument(int index) { public String getArgument(int index) {
return getArgs()[index]; return getArgs().get(index);
} }
public String[] getArgs() { public Map<Integer, String> getArgs() {
String msg = message.getContentDisplay().trim(); Map<Integer, String> args = new HashMap<>();
msg = msg.substring(Settings.getInstance().get("NETNEUTRALITY_BOT_PREFIX", "$").length()).trim();
String cmd = msg.split(" ", 2)[0];
String[] args = msg.replaceFirst("(" + cmd + ")(\\s+)?", "").split(" ");
if (args.length == 1 && args[0].isEmpty()) String msg = message.getContentDisplay().trim();
args = new String[0]; msg = msg.substring(Settings.getInstance().getPrefix().length()).trim();
String cmd = msg.split(" ", 2)[0];
String[] array = msg.replaceFirst("(" + cmd + ")(\\s+)?", "").split(" ");
for (int i = 0; i < array.length; i++) {
args.put(i, array[i]);
}
if (args.size() == 1 && args.get(0).isEmpty()) {
args.remove(0);
}
return args; return args;
} }
public String getMessageText() { public String getMessageText() {
String msg = message.getContentDisplay().trim(); String msg = message.getContentDisplay().trim();
msg = msg.substring(Settings.getInstance().get("NETNEUTRALITY_BOT_PREFIX", "$").length()).trim(); msg = msg.substring(Settings.getInstance().getPrefix().length()).trim();
String cmd = msg.split(" ", 2)[0]; String cmd = msg.split(" ", 2)[0];
return msg.replaceFirst("(" + cmd + ")( )?", ""); return msg.replaceFirst("(" + cmd + ")( )?", "");
@@ -123,7 +132,7 @@ public class MessageCommandContext extends CommandContext {
@Override @Override
public String parseCommandName() { public String parseCommandName() {
String rawMessage = message.getContentDisplay().trim(); String rawMessage = message.getContentDisplay().trim();
String prefix = Settings.getInstance().get("NETNEUTRALITY_BOT_PREFIX", "$"); String prefix = Settings.getInstance().getPrefix();
if (rawMessage.startsWith(prefix)) { if (rawMessage.startsWith(prefix)) {
rawMessage = rawMessage.replaceFirst(String.format("^[%s\\s]{1,}", prefix), "").trim(); rawMessage = rawMessage.replaceFirst(String.format("^[%s\\s]{1,}", prefix), "").trim();
@@ -137,7 +146,7 @@ public class MessageCommandContext extends CommandContext {
@Override @Override
public String getSubCommand() { public String getSubCommand() {
if (getArgs().length > 0) { if (!getArgs().isEmpty()) {
return getArgument(0); return getArgument(0);
} }
@@ -0,0 +1,36 @@
package me.bobert.netneutrality.core.tasks;
/*
* Copyright (c) anthorob
*
* https://discord.gg/qUa6zNFZsd
*/
import me.bobert.netneutrality.core.context.CommandContext;
public abstract class AbstractBuiltInTask extends AbstractTask implements BuiltInTask {
@Override
public String getName() {
return getId();
}
@Override
public boolean isInsertable() {
return true;
}
@Override
public boolean oneshot() {
return false;
}
@Override
public boolean isExpired() {
return false;
}
@Override
public void replyToInteraction(CommandContext context) {
// Task is loaded at runtime, this will never be called
}
}
@@ -27,7 +27,7 @@ public abstract class AbstractPersistableTask extends AbstractTask implements Pe
@Override @Override
public void replyToInteraction(CommandContext context) { public void replyToInteraction(CommandContext context) {
// Task loaded from database, this will never be called
} }
@Override @Override
@@ -25,6 +25,11 @@ public abstract class AbstractTask implements Task {
return creationTime; return creationTime;
} }
@Override
public TaskButtonCreator createButton() {
return new TaskButtonCreator(getId());
}
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) return true; if (this == o) return true;
@@ -5,8 +5,6 @@ package me.bobert.netneutrality.tasks;
* https://discord.gg/qUa6zNFZsd * https://discord.gg/qUa6zNFZsd
*/ */
import me.bobert.netneutrality.context.tasks.ButtonTaskContext;
import me.bobert.netneutrality.core.context.TaskContext;
import me.bobert.netneutrality.core.tasks.AbstractTask; import me.bobert.netneutrality.core.tasks.AbstractTask;
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
@@ -20,17 +18,6 @@ public abstract class ButtonTask extends AbstractTask {
return id.toString(); return id.toString();
} }
@Override
public void execute(TaskContext context) {
if (context instanceof ButtonTaskContext) {
execute((ButtonTaskContext) context);
} else {
throw new IllegalArgumentException("Invalid context for this task");
}
}
public abstract void execute(ButtonTaskContext context);
@Override @Override
public boolean oneshot() { public boolean oneshot() {
return true; return true;
@@ -5,8 +5,6 @@ package me.bobert.netneutrality.tasks;
* https://discord.gg/qUa6zNFZsd * https://discord.gg/qUa6zNFZsd
*/ */
import me.bobert.netneutrality.context.tasks.EmojiTaskContext;
import me.bobert.netneutrality.core.context.TaskContext;
import me.bobert.netneutrality.core.tasks.AbstractPersistableTask; import me.bobert.netneutrality.core.tasks.AbstractPersistableTask;
public abstract class EmojiTask extends AbstractPersistableTask { public abstract class EmojiTask extends AbstractPersistableTask {
@@ -30,15 +28,4 @@ public abstract class EmojiTask extends AbstractPersistableTask {
public String getId() { public String getId() {
return String.format("%s:%s", getGuildId(), getMessageId()); return String.format("%s:%s", getGuildId(), getMessageId());
} }
@Override
public void execute(TaskContext context) {
if (context instanceof EmojiTaskContext) {
execute((EmojiTaskContext) context);
} else {
throw new IllegalArgumentException("Invalid context for this task");
}
}
public abstract void execute(EmojiTaskContext context);
} }
@@ -5,11 +5,12 @@ package me.bobert.netneutrality.tasks;
* https://discord.gg/qUa6zNFZsd * https://discord.gg/qUa6zNFZsd
*/ */
import me.bobert.netneutrality.context.tasks.ModalTaskContext;
import me.bobert.netneutrality.core.context.TaskContext; import me.bobert.netneutrality.core.context.TaskContext;
import me.bobert.netneutrality.core.tasks.AbstractTask; import me.bobert.netneutrality.core.tasks.AbstractTask;
import net.dv8tion.jda.api.interactions.modals.ModalMapping;
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
import java.util.List;
import java.util.UUID; import java.util.UUID;
public abstract class ModalTask extends AbstractTask { public abstract class ModalTask extends AbstractTask {
@@ -20,17 +21,6 @@ public abstract class ModalTask extends AbstractTask {
return id.toString(); return id.toString();
} }
@Override
public void execute(TaskContext context) {
if (context instanceof ModalTaskContext) {
execute((ModalTaskContext) context);
} else {
throw new IllegalArgumentException("Invalid context for this task");
}
}
public abstract void execute(ModalTaskContext context);
@Override @Override
public boolean oneshot() { public boolean oneshot() {
return true; return true;
@@ -40,4 +30,13 @@ public abstract class ModalTask extends AbstractTask {
public boolean isExpired() { public boolean isExpired() {
return getCreationTime().plusMinutes(5).isBefore(OffsetDateTime.now()); return getCreationTime().plusMinutes(5).isBefore(OffsetDateTime.now());
} }
public ModalMapping getValue(String key, TaskContext context) {
List<?> mappings = (List<?>) context.getContextData("values");
return mappings.stream()
.filter(o -> o instanceof ModalMapping)
.map(o -> (ModalMapping) o)
.filter(mapping -> mapping.getId().equals(key))
.findFirst().orElse(null);
}
} }
@@ -6,12 +6,11 @@ package me.bobert.netneutrality.tasks.music;
*/ */
import com.sedmelluq.discord.lavaplayer.track.AudioTrack; import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import me.bobert.netneutrality.context.tasks.ButtonTaskContext;
import me.bobert.netneutrality.core.context.CommandContext; import me.bobert.netneutrality.core.context.CommandContext;
import me.bobert.netneutrality.core.context.TaskContext;
import me.bobert.netneutrality.core.tasks.trait.WithParent; import me.bobert.netneutrality.core.tasks.trait.WithParent;
import me.bobert.netneutrality.music.MusicManager; import me.bobert.netneutrality.music.MusicManager;
import me.bobert.netneutrality.music.SourceFinder; import me.bobert.netneutrality.music.SourceFinder;
import me.bobert.netneutrality.music.TrackScheduler;
import me.bobert.netneutrality.tasks.ButtonTask; import me.bobert.netneutrality.tasks.ButtonTask;
import me.bobert.netneutrality.utils.MessageFunction; import me.bobert.netneutrality.utils.MessageFunction;
import me.bobert.netneutrality.utils.MusicUtils; import me.bobert.netneutrality.utils.MusicUtils;
@@ -39,7 +38,7 @@ public class AddAllTracksTask extends ButtonTask implements WithParent<LoadPlayl
} }
@Override @Override
public void execute(ButtonTaskContext context) { public void execute(TaskContext context) {
MusicManager manager = MusicManager.get(context.getGuild()); MusicManager manager = MusicManager.get(context.getGuild());
Member member = context.getGuildUser(); Member member = context.getGuildUser();
@@ -5,8 +5,8 @@ package me.bobert.netneutrality.tasks.music;
* https://discord.gg/qUa6zNFZsd * https://discord.gg/qUa6zNFZsd
*/ */
import me.bobert.netneutrality.context.tasks.ButtonTaskContext;
import me.bobert.netneutrality.core.context.CommandContext; import me.bobert.netneutrality.core.context.CommandContext;
import me.bobert.netneutrality.core.context.TaskContext;
import me.bobert.netneutrality.core.tasks.trait.NotAcknowledgeable; import me.bobert.netneutrality.core.tasks.trait.NotAcknowledgeable;
import me.bobert.netneutrality.core.tasks.trait.WithParent; import me.bobert.netneutrality.core.tasks.trait.WithParent;
import me.bobert.netneutrality.tasks.ButtonTask; import me.bobert.netneutrality.tasks.ButtonTask;
@@ -39,7 +39,7 @@ public class CancelLoadTask extends ButtonTask implements WithParent<LoadPlaylis
} }
@Override @Override
public void execute(ButtonTaskContext context) { public void execute(TaskContext context) {
// Interaction will get removed after execution // Interaction will get removed after execution
} }
} }