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 e04bad6..62d5f21 100644 --- a/src/main/java/me/bobert/netneutrality/http/server/MusicRoutes.java +++ b/src/main/java/me/bobert/netneutrality/http/server/MusicRoutes.java @@ -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 jdaSupplier, MusicService musicService, Context ctx) { + Guild guild = GuildRoutes.guild(jdaSupplier, ctx); + MusicManager manager = musicService.get(guild); + String userId = ctx.pathParam("userId"); + + CacheOrFetch.resolve( + ctx, + () -> guild.getMemberById(userId), + () -> guild.retrieveMemberById(userId), + member -> new DjStatusResponse(userId, MusicUtils.isUserDj(member, manager)) + ); + } + @OpenApi( path = "/music/{guildId}/queue", methods = HttpMethod.POST, diff --git a/src/main/java/me/bobert/netneutrality/http/server/dto/DjStatusResponse.java b/src/main/java/me/bobert/netneutrality/http/server/dto/DjStatusResponse.java new file mode 100644 index 0000000..200f3ff --- /dev/null +++ b/src/main/java/me/bobert/netneutrality/http/server/dto/DjStatusResponse.java @@ -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 +) { +}