Add DJ status check endpoint to music routes

Introduced `/music/{guildId}/dj/{userId}` endpoint to verify if a user has DJ permissions in a specific guild. Added `DjStatusResponse` DTO, integrated the logic into `MusicManager`, and provided OpenAPI documentation for the new route.
This commit is contained in:
anthorob committed 2026-10-03 14:34:32 -04:00
1 parent 30ff1602b2
commit 9812e6da41
2 files changed
+46

No files matched your search

@@ -18,6 +18,7 @@ import io.javalin.openapi.OpenApiParam;
import io.javalin.openapi.OpenApiRequestBody;
import io.javalin.openapi.OpenApiResponse;
import me.bobert.netneutrality.http.server.dto.CommandResultResponse;
import me.bobert.netneutrality.http.server.dto.DjStatusResponse;
import me.bobert.netneutrality.http.server.dto.ErrorResponse;
import me.bobert.netneutrality.http.server.dto.MusicSourceResponse;
import me.bobert.netneutrality.http.server.dto.MusicStatusResponse;
@@ -38,6 +39,7 @@ 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 me.bobert.netneutrality.utils.MusicUtils;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Member;
@@ -73,6 +75,7 @@ public final class MusicRoutes {
routes.put("/music/{guildId}/volume", ctx -> volume(jdaSupplier, musicService, ctx));
routes.put("/music/{guildId}/seek", ctx -> seek(jdaSupplier, musicService, ctx));
routes.post("/music/{guildId}/vote-skip/{userId}", ctx -> voteSkip(jdaSupplier, musicService, ctx));
routes.get("/music/{guildId}/dj/{userId}", ctx -> dj(jdaSupplier, musicService, ctx));
routes.post("/music/{guildId}/queue", ctx -> play(jdaSupplier, musicService, ctx));
routes.patch("/music/{guildId}/queue/reorder", ctx -> reorder(jdaSupplier, musicService, ctx));
routes.post("/music/{guildId}/search", ctx -> search(jdaSupplier, musicService, ctx));
@@ -334,6 +337,33 @@ public final class MusicRoutes {
);
}
@OpenApi(
path = "/music/{guildId}/dj/{userId}",
methods = HttpMethod.GET,
summary = "Check whether a guild member is currently allowed to control music playback as the DJ",
tags = {"Music"},
pathParams = {
@OpenApiParam(name = "guildId", description = "The Discord guild id"),
@OpenApiParam(name = "userId", description = "The Discord user id to check")
},
responses = {
@OpenApiResponse(status = "200", content = @OpenApiContent(from = DjStatusResponse.class)),
@OpenApiResponse(status = "404", content = @OpenApiContent(from = ErrorResponse.class))
}
)
private static void dj(Supplier<JDA> jdaSupplier, MusicService musicService, Context ctx) {
Guild guild = GuildRoutes.guild(jdaSupplier, ctx);
MusicManager manager = musicService.get(guild);
String userId = ctx.pathParam("userId");
CacheOrFetch.<Member>resolve(
ctx,
() -> guild.getMemberById(userId),
() -> guild.retrieveMemberById(userId),
member -> new DjStatusResponse(userId, MusicUtils.isUserDj(member, manager))
);
}
@OpenApi(
path = "/music/{guildId}/queue",
methods = HttpMethod.POST,
@@ -0,0 +1,16 @@
package me.bobert.netneutrality.http.server.dto;
/*
* Copyright (c) anthorob
*
* https://discord.gg/qUa6zNFZsd
*/
/**
* OpenAPI schema for the {@code /music/{guildId}/dj/{userId}} response.
*/
public record DjStatusResponse(
String userId,
boolean isDj
) {
}