diff --git a/src/main/java/me/bobert/netneutrality/command/music/ClearQueueCommand.java b/src/main/java/me/bobert/netneutrality/command/music/ClearQueueCommand.java index 444e6bd..933f3ef 100644 --- a/src/main/java/me/bobert/netneutrality/command/music/ClearQueueCommand.java +++ b/src/main/java/me/bobert/netneutrality/command/music/ClearQueueCommand.java @@ -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(); diff --git a/src/main/java/me/bobert/netneutrality/command/music/QueueCommand.java b/src/main/java/me/bobert/netneutrality/command/music/QueueCommand.java index 2d64416..90fa22a 100644 --- a/src/main/java/me/bobert/netneutrality/command/music/QueueCommand.java +++ b/src/main/java/me/bobert/netneutrality/command/music/QueueCommand.java @@ -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)); } } } diff --git a/src/main/java/me/bobert/netneutrality/command/music/ResumeCommand.java b/src/main/java/me/bobert/netneutrality/command/music/ResumeCommand.java index bf9f9b0..1909d66 100644 --- a/src/main/java/me/bobert/netneutrality/command/music/ResumeCommand.java +++ b/src/main/java/me/bobert/netneutrality/command/music/ResumeCommand.java @@ -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(); diff --git a/src/main/java/me/bobert/netneutrality/command/music/ShuffleCommand.java b/src/main/java/me/bobert/netneutrality/command/music/ShuffleCommand.java index 6fa082a..a9fa3a0 100644 --- a/src/main/java/me/bobert/netneutrality/command/music/ShuffleCommand.java +++ b/src/main/java/me/bobert/netneutrality/command/music/ShuffleCommand.java @@ -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(); diff --git a/src/main/java/me/bobert/netneutrality/command/music/SkipCommand.java b/src/main/java/me/bobert/netneutrality/command/music/SkipCommand.java index d075258..f52a1f4 100644 --- a/src/main/java/me/bobert/netneutrality/command/music/SkipCommand.java +++ b/src/main/java/me/bobert/netneutrality/command/music/SkipCommand.java @@ -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())); } } diff --git a/src/main/java/me/bobert/netneutrality/command/music/VoteSkipCommand.java b/src/main/java/me/bobert/netneutrality/command/music/VoteSkipCommand.java index b90340e..01c0e07 100644 --- a/src/main/java/me/bobert/netneutrality/command/music/VoteSkipCommand.java +++ b/src/main/java/me/bobert/netneutrality/command/music/VoteSkipCommand.java @@ -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(); diff --git a/src/main/java/me/bobert/netneutrality/core/command/CommandExecutionResult.java b/src/main/java/me/bobert/netneutrality/core/command/CommandExecutionResult.java index bc64784..4e8aba1 100644 --- a/src/main/java/me/bobert/netneutrality/core/command/CommandExecutionResult.java +++ b/src/main/java/me/bobert/netneutrality/core/command/CommandExecutionResult.java @@ -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(); + }; + } } diff --git a/src/main/java/me/bobert/netneutrality/http/server/MusicRoutes.java b/src/main/java/me/bobert/netneutrality/http/server/MusicRoutes.java index 9653f79..69d543a 100644 --- a/src/main/java/me/bobert/netneutrality/http/server/MusicRoutes.java +++ b/src/main/java/me/bobert/netneutrality/http/server/MusicRoutes.java @@ -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 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 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 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 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 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 resultBody(QueueActionResult result) { Map body = new LinkedHashMap<>(); - body.put("status", result.getResult().name()); + body.put("status", result.getStatus().name()); body.put("message", result.getMessage()); return body; } diff --git a/src/main/java/me/bobert/netneutrality/music/MusicManager.java b/src/main/java/me/bobert/netneutrality/music/MusicManager.java index 839be57..388216c 100644 --- a/src/main/java/me/bobert/netneutrality/music/MusicManager.java +++ b/src/main/java/me/bobert/netneutrality/music/MusicManager.java @@ -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}. + * + *

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); } diff --git a/src/main/java/me/bobert/netneutrality/music/QueueActionResult.java b/src/main/java/me/bobert/netneutrality/music/QueueActionResult.java new file mode 100644 index 0000000..0f9b8c8 --- /dev/null +++ b/src/main/java/me/bobert/netneutrality/music/QueueActionResult.java @@ -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); + } +} diff --git a/src/main/java/me/bobert/netneutrality/music/QueueManager.java b/src/main/java/me/bobert/netneutrality/music/QueueManager.java index 916b176..8585cc5 100644 --- a/src/main/java/me/bobert/netneutrality/music/QueueManager.java +++ b/src/main/java/me/bobert/netneutrality/music/QueueManager.java @@ -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(); } } diff --git a/src/main/java/me/bobert/netneutrality/music/VoteSkipService.java b/src/main/java/me/bobert/netneutrality/music/VoteSkipService.java index ac4ba60..a102fae 100644 --- a/src/main/java/me/bobert/netneutrality/music/VoteSkipService.java +++ b/src/main/java/me/bobert/netneutrality/music/VoteSkipService.java @@ -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.

*/ - 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)) ); diff --git a/src/test/java/me/bobert/netneutrality/music/QueueManagerTest.java b/src/test/java/me/bobert/netneutrality/music/QueueManagerTest.java index 24bde7a..d7de999 100644 --- a/src/test/java/me/bobert/netneutrality/music/QueueManagerTest.java +++ b/src/test/java/me/bobert/netneutrality/music/QueueManagerTest.java @@ -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 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 --- diff --git a/src/test/java/me/bobert/netneutrality/music/VoteSkipServiceTest.java b/src/test/java/me/bobert/netneutrality/music/VoteSkipServiceTest.java index fefdc63..e84b8e0 100644 --- a/src/test/java/me/bobert/netneutrality/music/VoteSkipServiceTest.java +++ b/src/test/java/me/bobert/netneutrality/music/VoteSkipServiceTest.java @@ -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(); }