Refactor music commands to return QueueActionResult

Replaced `CommandExecutionResult` with `QueueActionResult` in music-related commands, improving result clarity and alignment with queue-specific operations. Updated command logic, tests, and REST API endpoints to use the new result type, ensuring consistent handling and messaging.
This commit is contained in:
anthorob committed 2026-10-03 13:54:04 -04:00
1 parent 9cd1317659
commit 470f5a33aa
14 files changed
+190 -94

No files matched your search

@@ -63,7 +63,7 @@ public class ClearQueueCommand extends MusicCommand {
context.ack();
if (MusicUtils.checkIfConnected(context, manager)) {
return manager.getQueueManager().clearQueue();
return CommandExecutionResult.from(manager.getQueueManager().clearQueue());
}
return CommandExecutionResult.none();
@@ -83,18 +83,18 @@ public class QueueCommand extends MusicCommand {
switch (sub) {
case "clear-all" -> {
return manager.getQueueManager().clearQueue();
return CommandExecutionResult.from(manager.getQueueManager().clearQueue());
}
case "delete-track" -> {
int position = context.getOption("position", 0, CommandOption::getAsInt);
return manager.getQueueManager().removeFromQueue(position);
return CommandExecutionResult.from(manager.getQueueManager().removeFromQueue(position));
}
case "show-queue" -> context.reply(MessageFunction.buildViewQueueMessage(manager));
case "shuffle" -> {
return manager.getQueueManager().shuffle();
return CommandExecutionResult.from(manager.getQueueManager().shuffle());
}
case "from-user" -> {
@@ -112,7 +112,7 @@ public class QueueCommand extends MusicCommand {
return CommandExecutionResult.warn("The user isn't from this guild");
}
return manager.getQueueManager().removeTracksFromUser(member);
return CommandExecutionResult.from(manager.getQueueManager().removeTracksFromUser(member));
}
}
}
@@ -60,7 +60,7 @@ public class ResumeCommand extends MusicCommand {
MusicManager manager = musicService.get(context.getGuild());
if (MusicUtils.checkIfConnected(context, manager)) {
return manager.resume();
return CommandExecutionResult.from(manager.resume());
}
return CommandExecutionResult.none();
@@ -57,7 +57,7 @@ public class ShuffleCommand extends MusicCommand {
context.ack();
if (MusicUtils.checkIfConnected(context, manager)) {
return manager.getQueueManager().shuffle();
return CommandExecutionResult.from(manager.getQueueManager().shuffle());
}
return CommandExecutionResult.none();
@@ -65,9 +65,9 @@ public class SkipCommand extends MusicCommand {
if (MusicUtils.checkIfConnected(context, manager)) {
int skips = context.getOption("skip", 1, CommandOption::getAsInt);
if (UserFunction.isAdmin(context) || MusicUtils.isUserDj(context, manager)) {
return manager.getQueueManager().skip(skips);
return CommandExecutionResult.from(manager.getQueueManager().skip(skips));
} else {
return manager.voteSkip(context);
return CommandExecutionResult.from(manager.voteSkip(context.getGuildUser()));
}
}
@@ -56,7 +56,7 @@ public class VoteSkipCommand extends MusicCommand {
MusicManager manager = musicService.get(context.getGuild());
if (MusicUtils.checkIfConnected(context, manager)) {
return manager.voteSkip(context);
return CommandExecutionResult.from(manager.voteSkip(context.getGuildUser()));
}
return CommandExecutionResult.none();
@@ -6,6 +6,7 @@ package me.bobert.netneutrality.core.command;
*/
import me.bobert.netneutrality.core.tasks.Task;
import me.bobert.netneutrality.music.QueueActionResult;
public class CommandExecutionResult {
@@ -80,4 +81,18 @@ public class CommandExecutionResult {
public static CommandExecutionResult task(Task task) {
return new CommandExecutionResult(Result.TASK, null, task, null);
}
/**
* Adapts a {@link QueueActionResult} returned by {@link me.bobert.netneutrality.music.QueueManager}
* into a {@link CommandExecutionResult} so it can be surfaced as a Discord reply or HTTP response.
*/
public static CommandExecutionResult from(QueueActionResult result) {
return switch (result.getStatus()) {
case SUCCESS -> success(result.getMessage());
case INFO -> info(result.getMessage());
case WARN -> warn(result.getMessage());
case ERROR -> error(result.getMessage());
case NOACTION -> none();
};
}
}
@@ -17,7 +17,6 @@ import io.javalin.openapi.OpenApiContent;
import io.javalin.openapi.OpenApiParam;
import io.javalin.openapi.OpenApiRequestBody;
import io.javalin.openapi.OpenApiResponse;
import me.bobert.netneutrality.core.command.CommandExecutionResult;
import me.bobert.netneutrality.http.server.dto.CommandResultResponse;
import me.bobert.netneutrality.http.server.dto.ErrorResponse;
import me.bobert.netneutrality.http.server.dto.MusicSourceResponse;
@@ -32,6 +31,7 @@ import me.bobert.netneutrality.music.MusicManager;
import me.bobert.netneutrality.music.MusicService;
import me.bobert.netneutrality.music.PendingSearchResults;
import me.bobert.netneutrality.music.PlayOutcome;
import me.bobert.netneutrality.music.QueueActionResult;
import me.bobert.netneutrality.music.SourceFinder;
import me.bobert.netneutrality.music.TrackInfo;
import net.dv8tion.jda.api.JDA;
@@ -150,7 +150,9 @@ public final class MusicRoutes {
)
private static void skip(Supplier<JDA> jdaSupplier, MusicService musicService, Context ctx) {
MusicManager manager = manager(jdaSupplier, musicService, ctx);
ctx.json(resultBody(manager.getQueueManager().skip()));
QueueActionResult result = manager.getQueueManager().skip();
announce(manager, result.getMessage());
ctx.json(resultBody(result));
}
@OpenApi(
@@ -167,6 +169,7 @@ public final class MusicRoutes {
private static void stop(Supplier<JDA> jdaSupplier, MusicService musicService, Context ctx) {
MusicManager manager = manager(jdaSupplier, musicService, ctx);
manager.stopTrack();
announce(manager, "Stopping current track");
ctx.json(Map.of("status", "ok", "message", "Stopping current track"));
}
@@ -184,6 +187,7 @@ public final class MusicRoutes {
private static void pause(Supplier<JDA> jdaSupplier, MusicService musicService, Context ctx) {
MusicManager manager = manager(jdaSupplier, musicService, ctx);
manager.pauseTrack();
announce(manager, "Pausing current track");
ctx.json(Map.of("status", "ok", "message", "Pausing current track"));
}
@@ -201,6 +205,7 @@ public final class MusicRoutes {
private static void resumePlayback(Supplier<JDA> jdaSupplier, MusicService musicService, Context ctx) {
MusicManager manager = manager(jdaSupplier, musicService, ctx);
manager.unpauseTrack();
announce(manager, "Resuming current track");
ctx.json(Map.of("status", "ok", "message", "Resuming current track"));
}
@@ -222,6 +227,7 @@ public final class MusicRoutes {
int newVolume = volume(ctx);
manager.setVolume(newVolume);
announce(manager, "Setting volume to " + newVolume);
ctx.json(Map.of("status", "ok", "volume", newVolume));
}
@@ -268,7 +274,11 @@ public final class MusicRoutes {
ctx,
() -> guild.getMemberById(userId),
() -> guild.retrieveMemberById(userId),
member -> resultBody(manager.voteSkip(member))
member -> {
QueueActionResult result = manager.voteSkip(member);
announce(manager, result.getMessage());
return resultBody(result);
}
);
}
@@ -367,6 +377,8 @@ public final class MusicRoutes {
ctx.future(() -> resolveMember(guild, userId)
.thenApply(member -> {
candidates.forEach(candidate -> manager.getQueueManager().queue(candidate, member));
announce(manager, String.format("Queued %d track%s requested by %s",
candidates.size(), candidates.size() > 1 ? "s" : "", member.getEffectiveName()));
ctx.json(queuedAllBody(candidates, manager.getQueueSize()));
return null;
}));
@@ -378,6 +390,8 @@ public final class MusicRoutes {
ctx.future(() -> resolveMember(guild, userId)
.thenApply(member -> {
manager.getQueueManager().queue(track, member);
announce(manager, String.format("Queued %s requested by %s",
track.getInfo().getTitle(), member.getEffectiveName()));
ctx.json(queuedBody(track, manager.getQueueSize()));
return null;
}));
@@ -475,11 +489,24 @@ public final class MusicRoutes {
}
/**
* Builds a JSON-friendly summary for a {@link CommandExecutionResult}.
* Announces the result of an API-driven music action in the guild's music channel, mirroring
* the feedback slash commands post. No-op when no {@link me.bobert.netneutrality.core.context.Context}
* is currently attached to the guild's {@link me.bobert.netneutrality.music.TrackScheduler}
* (e.g. the bot was never joined to a voice channel through a Discord command).
*/
private static Map<String, Object> resultBody(CommandExecutionResult result) {
private static void announce(MusicManager manager, String message) {
me.bobert.netneutrality.core.context.Context context = manager.getScheduler().getContext();
if (context != null && message != null) {
context.reply(message);
}
}
/**
* Builds a JSON-friendly summary for a {@link QueueActionResult}.
*/
private static Map<String, Object> resultBody(QueueActionResult result) {
Map<String, Object> body = new LinkedHashMap<>();
body.put("status", result.getResult().name());
body.put("status", result.getStatus().name());
body.put("message", result.getMessage());
return body;
}
@@ -12,7 +12,6 @@ import dev.arbjerg.lavalink.client.player.LavalinkPlayer;
import dev.arbjerg.lavalink.client.player.PlayerUpdateBuilder;
import dev.arbjerg.lavalink.client.player.Track;
import me.bobert.netneutrality.core.LogHandler;
import me.bobert.netneutrality.core.command.CommandExecutionResult;
import me.bobert.netneutrality.core.context.CommandContext;
import me.bobert.netneutrality.core.tasks.TaskManager;
import me.bobert.netneutrality.db.GSettings;
@@ -103,7 +102,10 @@ public class MusicManager implements MusicManagerCallback {
try {
return client.getOrCreateLink(guild.getIdLong());
} catch (RuntimeException e) {
logger.error("Guild {}: no Lavalink node available", guild.getId(), e);
// No Lavalink node is currently available. This is an expected, recoverable
// condition (e.g. the node is restarting), so it's logged without a stacktrace to
// avoid flooding the logs; callers already handle a null link gracefully.
logger.warn("Guild {}: no Lavalink node available: {}", guild.getId(), e.getMessage());
return null;
}
}
@@ -311,7 +313,7 @@ public class MusicManager implements MusicManagerCallback {
updatePlayer("stop track", PlayerUpdateBuilder::stopTrack);
}
public synchronized CommandExecutionResult resume() {
public synchronized QueueActionResult resume() {
return getQueueManager().resume();
}
@@ -341,15 +343,14 @@ public class MusicManager implements MusicManagerCallback {
return player != null && player.getPaused();
}
public synchronized CommandExecutionResult voteSkip(CommandContext context) {
return voteSkip(context.getGuildUser());
}
/**
* Same as {@link #voteSkip(CommandContext)} but driven directly by a {@link Member}, so it
* can be invoked from non-command callers such as the REST API.
* Casts a vote to skip the currently playing track on behalf of {@code member}.
*
* <p>Driven directly by a {@link Member} so it can be invoked both from the command layer
* (via {@link CommandContext#getGuildUser()}) and from non-command callers such as the REST
* API.
*/
public synchronized CommandExecutionResult voteSkip(Member member) {
public synchronized QueueActionResult voteSkip(Member member) {
int threshold = parseVoteSkipThreshold(guildService);
return voteSkipService.voteSkip(member, guild.getId(), getQueueManager(), getConnectedChannel(), isCurrentlyPlaying(), threshold);
}
@@ -0,0 +1,57 @@
package me.bobert.netneutrality.music;
/*
* Copyright (c) anthorob
*
* https://discord.gg/qUa6zNFZsd
*/
/**
* Outcome of a queue-mutating operation on {@link QueueManager}, independent of how it is later
* presented to the user (e.g. as a Discord reply or an HTTP response).
*/
public class QueueActionResult {
public enum Status {
SUCCESS, INFO, WARN, ERROR, NOACTION
}
private final Status status;
private final String message;
private QueueActionResult(Status status, String message) {
this.status = status;
this.message = message;
}
public Status getStatus() {
return status;
}
public String getMessage() {
return message;
}
public static QueueActionResult success(String message) {
return new QueueActionResult(Status.SUCCESS, message);
}
public static QueueActionResult success(String format, Object... args) {
return success(String.format(format, args));
}
public static QueueActionResult info(String message) {
return new QueueActionResult(Status.INFO, message);
}
public static QueueActionResult warn(String message) {
return new QueueActionResult(Status.WARN, message);
}
public static QueueActionResult error(String message) {
return new QueueActionResult(Status.ERROR, message);
}
public static QueueActionResult none() {
return new QueueActionResult(Status.NOACTION, null);
}
}
@@ -6,7 +6,6 @@ package me.bobert.netneutrality.music;
*/
import dev.arbjerg.lavalink.client.player.Track;
import me.bobert.netneutrality.core.command.CommandExecutionResult;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import org.apache.logging.log4j.LogManager;
@@ -72,24 +71,24 @@ public class QueueManager {
}
}
public CommandExecutionResult clearQueue() {
public QueueActionResult clearQueue() {
synchronized (queue) {
int queueSize = queue.size();
if (queueSize == 0) {
return CommandExecutionResult.warn("Queue is empty!");
return QueueActionResult.warn("Queue is empty!");
}
queue.clear();
scheduler.getCallback().onQueueEmpty();
return CommandExecutionResult.success(String.format("Removed %d track%s from the queue", queueSize, (queueSize > 1 ? "s" : "")));
return QueueActionResult.success(String.format("Removed %d track%s from the queue", queueSize, (queueSize > 1 ? "s" : "")));
}
}
public CommandExecutionResult removeTracksFromUser(Member member) {
public QueueActionResult removeTracksFromUser(Member member) {
synchronized (queue) {
int size = (int) queue.stream().filter(trackInfo -> member.equals(trackInfo.getRequester())).count();
if (size == 0) {
return CommandExecutionResult.info(String.format("No tracks added by user %s", member.getEffectiveName()));
return QueueActionResult.info(String.format("No tracks added by user %s", member.getEffectiveName()));
}
if (size == queue.size()) {
@@ -103,7 +102,7 @@ public class QueueManager {
skip(1);
}
return CommandExecutionResult.success(String.format("Removed all tracks from user %s", member.getEffectiveName()));
return QueueActionResult.success(String.format("Removed all tracks from user %s", member.getEffectiveName()));
}
}
@@ -166,17 +165,17 @@ public class QueueManager {
scheduler.getMusicManager().stopTrack();
}
public CommandExecutionResult resume() {
public QueueActionResult resume() {
synchronized (queue) {
TrackInfo next = queue.peek();
if (next != null) {
startTrack(next.getTrack().makeClone(), false);
return CommandExecutionResult.success("Starting playback of track " + next.getTrack().getInfo().getTitle());
return QueueActionResult.success("Starting playback of track " + next.getTrack().getInfo().getTitle());
}
stopTrack();
return CommandExecutionResult.info("Queue is empty, leaving voice channel");
return QueueActionResult.info("Queue is empty, leaving voice channel");
}
}
@@ -193,11 +192,11 @@ public class QueueManager {
}
}
public CommandExecutionResult skip() {
public QueueActionResult skip() {
return skip(1);
}
public CommandExecutionResult skip(int nbTrack) {
public QueueActionResult skip(int nbTrack) {
if (nbTrack < 1) {
nbTrack = 1;
}
@@ -205,7 +204,7 @@ public class QueueManager {
synchronized (queue) {
if (queue.isEmpty()) {
scheduler.getMusicManager().disconnect();
return CommandExecutionResult.info("Queue is empty, leaving voice channel");
return QueueActionResult.info("Queue is empty, leaving voice channel");
}
if (nbTrack > queue.size()) {
@@ -219,19 +218,19 @@ public class QueueManager {
if (queue.isEmpty()) {
scheduler.getMusicManager().disconnect();
return CommandExecutionResult.info("Queue is empty, leaving voice channel");
return QueueActionResult.info("Queue is empty, leaving voice channel");
}
startNextTrack();
return CommandExecutionResult.success(String.format("Skipping %s track%s..", nbTrack, (nbTrack > 1 ? "s" : "")));
return QueueActionResult.success(String.format("Skipping %s track%s..", nbTrack, (nbTrack > 1 ? "s" : "")));
}
}
public CommandExecutionResult shuffle() {
public QueueActionResult shuffle() {
synchronized (queue) {
if (queue.size() <= 3) {
return CommandExecutionResult.warn("The queue is too small to be shuffled");
return QueueActionResult.warn("The queue is too small to be shuffled");
}
logger.debug("Guild {}: shuffling queue", guild.getId());
@@ -245,18 +244,18 @@ public class QueueManager {
queue.add(current);
queue.addAll(newQueue);
return CommandExecutionResult.success("The queue is now shuffled.");
return QueueActionResult.success("The queue is now shuffled.");
}
}
public CommandExecutionResult removeFromQueue(int index) {
public QueueActionResult removeFromQueue(int index) {
synchronized (queue) {
if (queue.isEmpty() || index < 1) {
return CommandExecutionResult.none();
return QueueActionResult.none();
}
if (index > queue.size()) {
return CommandExecutionResult.error("Position is out of bounds");
return QueueActionResult.error("Position is out of bounds");
}
logger.debug("Guild {}: removing index {} from queue", guild.getId(), index - 1);
@@ -268,11 +267,11 @@ public class QueueManager {
queue.clear();
queue.addAll(newQueue);
return CommandExecutionResult.success(String.format("Removed track #%d from the queue", index));
return QueueActionResult.success(String.format("Removed track #%d from the queue", index));
}
skip();
return CommandExecutionResult.none();
return QueueActionResult.none();
}
}
@@ -6,7 +6,6 @@ package me.bobert.netneutrality.music;
* https://discord.gg/qUa6zNFZsd
*/
import me.bobert.netneutrality.core.command.CommandExecutionResult;
import me.bobert.netneutrality.core.context.CommandContext;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.channel.middleman.AudioChannel;
@@ -29,7 +28,7 @@ public class VoteSkipService {
* from the same user are idempotent and the worst-case outcome is a single extra "vote
* recorded" message before the skip fires on the next invocation.</p>
*/
public CommandExecutionResult voteSkip(CommandContext context, QueueManager queueManager, AudioChannel audioChannel, boolean isCurrentlyPlaying) {
public QueueActionResult voteSkip(CommandContext context, QueueManager queueManager, AudioChannel audioChannel, boolean isCurrentlyPlaying) {
return voteSkip(context, queueManager, audioChannel, isCurrentlyPlaying, DEFAULT_VOTE_THRESHOLD_PERCENT);
}
@@ -37,7 +36,7 @@ public class VoteSkipService {
* Same as {@link #voteSkip(CommandContext, QueueManager, AudioChannel, boolean)} but with a
* configurable vote threshold percentage of connected listeners.
*/
public CommandExecutionResult voteSkip(CommandContext context, QueueManager queueManager, AudioChannel audioChannel, boolean isCurrentlyPlaying, int thresholdPercent) {
public QueueActionResult voteSkip(CommandContext context, QueueManager queueManager, AudioChannel audioChannel, boolean isCurrentlyPlaying, int thresholdPercent) {
return voteSkip(context.getGuildUser(), context.getGuild().getId(), queueManager, audioChannel, isCurrentlyPlaying, thresholdPercent);
}
@@ -46,18 +45,18 @@ public class VoteSkipService {
* driven directly by a {@link Member}, so it can be invoked from non-command callers such as
* the REST API, which has no {@link CommandContext} to work with.
*/
public CommandExecutionResult voteSkip(Member voter, String guildId, QueueManager queueManager, AudioChannel audioChannel, boolean isCurrentlyPlaying, int thresholdPercent) {
public QueueActionResult voteSkip(Member voter, String guildId, QueueManager queueManager, AudioChannel audioChannel, boolean isCurrentlyPlaying, int thresholdPercent) {
if (audioChannel == null) {
return CommandExecutionResult.warn("Bot is not connected to a voice channel");
return QueueActionResult.warn("Bot is not connected to a voice channel");
}
if (!isCurrentlyPlaying) {
return CommandExecutionResult.warn("No tracks are currently playing");
return QueueActionResult.warn("No tracks are currently playing");
}
TrackInfo info = queueManager.peekHeadOfQueue();
if (info == null) {
return CommandExecutionResult.warn("Queue is empty");
return QueueActionResult.warn("Queue is empty");
}
// Minus the bot itself
@@ -65,7 +64,7 @@ public class VoteSkipService {
if (connected < MIN_MEMBERS_FOR_VOTE) {
queueManager.skip();
return CommandExecutionResult.info("Skipping current track since not enough people are connected to the voice channel.");
return QueueActionResult.info("Skipping current track since not enough people are connected to the voice channel.");
}
double needed = connected * (thresholdPercent / 100.0);
@@ -77,7 +76,7 @@ public class VoteSkipService {
return queueManager.skip();
}
return CommandExecutionResult.success(String.format("Adding your vote to skip the current track. Current votes: %d/%d",
return QueueActionResult.success(String.format("Adding your vote to skip the current track. Current votes: %d/%d",
info.getSkipCount(),
(int) Math.ceil(needed))
);
@@ -6,7 +6,6 @@ package me.bobert.netneutrality.music;
*/
import dev.arbjerg.lavalink.client.player.Track;
import me.bobert.netneutrality.core.command.CommandExecutionResult;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
import org.junit.jupiter.api.BeforeEach;
@@ -126,8 +125,8 @@ public class QueueManagerTest {
@Test
public void clearQueueOnEmptyReturnsWarn() {
CommandExecutionResult result = queueManager.clearQueue();
assertEquals(CommandExecutionResult.Result.WARN, result.getResult());
QueueActionResult result = queueManager.clearQueue();
assertEquals(QueueActionResult.Status.WARN, result.getStatus());
verify(callback, never()).onQueueEmpty();
}
@@ -137,9 +136,9 @@ public class QueueManagerTest {
queueManager.queue(mockTrack("t1"), mockMember("u1"));
queueManager.queue(mockTrack("t2"), mockMember("u1"));
CommandExecutionResult result = queueManager.clearQueue();
QueueActionResult result = queueManager.clearQueue();
assertEquals(CommandExecutionResult.Result.SUCCESS, result.getResult());
assertEquals(QueueActionResult.Status.SUCCESS, result.getStatus());
assertTrue(queueManager.isEmpty());
verify(callback).onQueueEmpty();
}
@@ -148,8 +147,8 @@ public class QueueManagerTest {
@Test
public void skipOnEmptyQueueDisconnects() {
CommandExecutionResult result = queueManager.skip();
assertEquals(CommandExecutionResult.Result.INFO, result.getResult());
QueueActionResult result = queueManager.skip();
assertEquals(QueueActionResult.Status.INFO, result.getStatus());
verify(musicManager).disconnect();
}
@@ -163,8 +162,8 @@ public class QueueManagerTest {
queueManager.queue(t1, member);
queueManager.queue(t2, member);
CommandExecutionResult result = queueManager.skip(1);
assertEquals(CommandExecutionResult.Result.SUCCESS, result.getResult());
QueueActionResult result = queueManager.skip(1);
assertEquals(QueueActionResult.Status.SUCCESS, result.getStatus());
// After skip(1): head (t1) removed via startNextTrack, t2 is now head
assertEquals(1, queueManager.getQueueSize());
}
@@ -192,8 +191,8 @@ public class QueueManagerTest {
when(scheduler.getCurrentTrack()).thenReturn(null).thenReturn(t1);
queueManager.queue(t1, mockMember("u1"));
CommandExecutionResult result = queueManager.shuffle();
assertEquals(CommandExecutionResult.Result.WARN, result.getResult());
QueueActionResult result = queueManager.shuffle();
assertEquals(QueueActionResult.Status.WARN, result.getStatus());
}
@Test
@@ -207,8 +206,8 @@ public class QueueManagerTest {
queueManager.queue(mockTrack("t3"), member);
queueManager.queue(mockTrack("t4"), member);
CommandExecutionResult result = queueManager.shuffle();
assertEquals(CommandExecutionResult.Result.SUCCESS, result.getResult());
QueueActionResult result = queueManager.shuffle();
assertEquals(QueueActionResult.Status.SUCCESS, result.getStatus());
// First track should still be t1
List<TrackInfo> q = queueManager.getQueue();
@@ -220,8 +219,8 @@ public class QueueManagerTest {
@Test
public void removeFromQueueEmptyReturnsNone() {
CommandExecutionResult result = queueManager.removeFromQueue(1);
assertEquals(CommandExecutionResult.Result.NOACTION, result.getResult());
QueueActionResult result = queueManager.removeFromQueue(1);
assertEquals(QueueActionResult.Status.NOACTION, result.getStatus());
}
@Test
@@ -229,8 +228,8 @@ public class QueueManagerTest {
when(scheduler.getCurrentTrack()).thenReturn(null).thenReturn(mockTrack("t1"));
queueManager.queue(mockTrack("t1"), mockMember("u1"));
CommandExecutionResult result = queueManager.removeFromQueue(5);
assertEquals(CommandExecutionResult.Result.ERROR, result.getResult());
QueueActionResult result = queueManager.removeFromQueue(5);
assertEquals(QueueActionResult.Status.ERROR, result.getStatus());
}
@Test
@@ -238,8 +237,8 @@ public class QueueManagerTest {
when(scheduler.getCurrentTrack()).thenReturn(null).thenReturn(mockTrack("t1"));
queueManager.queue(mockTrack("t1"), mockMember("u1"));
CommandExecutionResult result = queueManager.removeFromQueue(0);
assertEquals(CommandExecutionResult.Result.NOACTION, result.getResult());
QueueActionResult result = queueManager.removeFromQueue(0);
assertEquals(QueueActionResult.Status.NOACTION, result.getStatus());
}
// --- RemoveTracksFromUser ---
@@ -247,8 +246,8 @@ public class QueueManagerTest {
@Test
public void removeTracksFromUserNoMatchReturnsInfo() {
Member member = mockMember("u1");
CommandExecutionResult result = queueManager.removeTracksFromUser(member);
assertEquals(CommandExecutionResult.Result.INFO, result.getResult());
QueueActionResult result = queueManager.removeTracksFromUser(member);
assertEquals(QueueActionResult.Status.INFO, result.getStatus());
}
// --- isEmpty / getQueueSize ---
@@ -5,7 +5,6 @@ package me.bobert.netneutrality.music;
* https://discord.gg/qUa6zNFZsd
*/
import me.bobert.netneutrality.core.command.CommandExecutionResult;
import me.bobert.netneutrality.core.context.CommandContext;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
@@ -53,21 +52,21 @@ public class VoteSkipServiceTest {
@Test
public void returnsWarnWhenNotConnected() {
CommandExecutionResult result = service.voteSkip(context, queueManager, null, true);
assertEquals(CommandExecutionResult.Result.WARN, result.getResult());
QueueActionResult result = service.voteSkip(context, queueManager, null, true);
assertEquals(QueueActionResult.Status.WARN, result.getStatus());
}
@Test
public void returnsWarnWhenNotPlaying() {
CommandExecutionResult result = service.voteSkip(context, queueManager, audioChannel, false);
assertEquals(CommandExecutionResult.Result.WARN, result.getResult());
QueueActionResult result = service.voteSkip(context, queueManager, audioChannel, false);
assertEquals(QueueActionResult.Status.WARN, result.getStatus());
}
@Test
public void returnsWarnWhenQueueEmpty() {
when(queueManager.peekHeadOfQueue()).thenReturn(null);
CommandExecutionResult result = service.voteSkip(context, queueManager, audioChannel, true);
assertEquals(CommandExecutionResult.Result.WARN, result.getResult());
QueueActionResult result = service.voteSkip(context, queueManager, audioChannel, true);
assertEquals(QueueActionResult.Status.WARN, result.getStatus());
}
@Test
@@ -78,10 +77,10 @@ public class VoteSkipServiceTest {
Member u2 = mockMember("u2");
when(audioChannel.getMembers()).thenReturn(List.of(bot, u1, u2));
when(context.getGuildUser()).thenReturn(u1);
when(queueManager.skip()).thenReturn(CommandExecutionResult.success("Skipping"));
when(queueManager.skip()).thenReturn(QueueActionResult.success("Skipping"));
CommandExecutionResult result = service.voteSkip(context, queueManager, audioChannel, true);
assertEquals(CommandExecutionResult.Result.INFO, result.getResult());
QueueActionResult result = service.voteSkip(context, queueManager, audioChannel, true);
assertEquals(QueueActionResult.Status.INFO, result.getStatus());
verify(queueManager).skip();
}
@@ -96,8 +95,8 @@ public class VoteSkipServiceTest {
when(audioChannel.getMembers()).thenReturn(List.of(bot, u1, u2, u3));
when(context.getGuildUser()).thenReturn(voter);
CommandExecutionResult result = service.voteSkip(context, queueManager, audioChannel, true);
assertEquals(CommandExecutionResult.Result.SUCCESS, result.getResult());
QueueActionResult result = service.voteSkip(context, queueManager, audioChannel, true);
assertEquals(QueueActionResult.Status.SUCCESS, result.getStatus());
assertTrue(result.getMessage().contains("Adding your vote"));
assertEquals(1, trackInfo.getSkipCount());
}
@@ -112,7 +111,7 @@ public class VoteSkipServiceTest {
Member voter1 = mockMember("voter1");
Member voter2 = mockMember("voter2");
when(audioChannel.getMembers()).thenReturn(List.of(bot, u1, u2, u3));
when(queueManager.skip()).thenReturn(CommandExecutionResult.success("Skipping"));
when(queueManager.skip()).thenReturn(QueueActionResult.success("Skipping"));
// First vote
when(context.getGuildUser()).thenReturn(voter1);
@@ -120,8 +119,8 @@ public class VoteSkipServiceTest {
// Second vote triggers skip
when(context.getGuildUser()).thenReturn(voter2);
CommandExecutionResult result = service.voteSkip(context, queueManager, audioChannel, true);
assertEquals(CommandExecutionResult.Result.SUCCESS, result.getResult());
QueueActionResult result = service.voteSkip(context, queueManager, audioChannel, true);
assertEquals(QueueActionResult.Status.SUCCESS, result.getStatus());
verify(queueManager).skip();
}