Skip to content

Commit

Permalink
feat(API): POST join voice channel
Browse files Browse the repository at this point in the history
  • Loading branch information
benjaspet committed Jul 22, 2024
1 parent 0ce0ffe commit b59ceb7
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 13 deletions.
4 changes: 2 additions & 2 deletions src/main/java/dev/benpetrillo/elixir/api/APIHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@
import io.javalin.Javalin;
import io.javalin.apibuilder.EndpointGroup;

import static io.javalin.apibuilder.ApiBuilder.path;
import static io.javalin.apibuilder.ApiBuilder.get;
import static io.javalin.apibuilder.ApiBuilder.*;

public final class APIHandler {

Expand All @@ -35,6 +34,7 @@ public static void initialize() {

EndpointGroup endpoints = () -> path("/api/v1", () -> {
get("/{guild}/nowplaying", PlayerController::getNowPlaying);
post("/{guild}/join", PlayerController::postJoinChannel);
});

Javalin.create(config -> config.router.apiBuilder(endpoints))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,60 @@

package dev.benpetrillo.elixir.api.controllers;

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import dev.benpetrillo.elixir.ElixirClient;
import dev.benpetrillo.elixir.api.APIError;
import dev.benpetrillo.elixir.api.types.AuthObject;
import dev.benpetrillo.elixir.api.types.NowPlayingObject;
import dev.benpetrillo.elixir.managers.ElixirMusicManager;
import dev.benpetrillo.elixir.managers.GuildMusicManager;
import dev.benpetrillo.elixir.utils.APIAuthUtil;
import dev.benpetrillo.elixir.utils.Utilities;
import io.javalin.http.Context;
import jdk.jshell.execution.Util;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.entities.channel.concrete.VoiceChannel;
import net.dv8tion.jda.api.managers.AudioManager;

import java.util.Objects;

public class PlayerController {

public static Context postJoinChannel(Context ctx) {
String guildId = ctx.pathParam("guild");
Objects.requireNonNull(guildId, "No guild ID provided.");
String authHeader = ctx.header("Authorization");
Objects.requireNonNull(authHeader, "No authorization header provided.");
String apiKey = authHeader.split(" ")[1];

JsonObject body = Utilities.deserialize(ctx.body(), JsonObject.class);
String channelId = body.get("channel").getAsString();
String userId = body.get("user").getAsString();
Objects.requireNonNull(channelId, "No voice channel provided.");
Objects.requireNonNull(userId, "No user provided.");

Guild guild = ElixirClient.getJda().getGuildById(guildId);
Objects.requireNonNull(guild, "Guild not found.");
VoiceChannel channel = guild.getVoiceChannelById(channelId);
Objects.requireNonNull(channel, "Voice channel not found.");
User user = ElixirClient.getJda().getUserById(userId);
Objects.requireNonNull(user, "User not found.");

if (!APIAuthUtil.isValidAPIKey(userId, guildId, apiKey)) {
return ctx.status(401).json(APIError.from("Invalid API key."));
}

AudioManager audioManager = guild.getAudioManager();
audioManager.openAudioConnection(guild.getVoiceChannelById(channelId));

return ctx.status(200).json(Utilities.serialize("Joined voice channel."));

}

public static Context getNowPlaying(Context ctx) {
String guildId = ctx.pathParam("guild");
ElixirMusicManager inst = ElixirMusicManager.getInstance();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package dev.benpetrillo.elixir.api.types;

public record AuthObject(String user, String guild) {

public static AuthObject create(String user, String guild) {
return new AuthObject(user, guild);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package dev.benpetrillo.elixir.commands.misc;

import dev.benpetrillo.elixir.CommandChecks;
import dev.benpetrillo.elixir.ElixirClient;
import dev.benpetrillo.elixir.utils.APIAuthUtil;
import dev.benpetrillo.elixir.ElixirConstants;
Expand All @@ -30,21 +31,20 @@

public final class GenKeyCommand extends Command {

private static final String INVITE = ElixirConstants.INVITE
.replace("{}", ElixirClient.getId());

public GenKeyCommand() {
super("genkey", "Generate an API key.");
}

@Override
public void execute(Interaction interaction) {

CommandChecks.runIsInGuildCheck(interaction);

interaction.setEphemeral(true);
interaction.deferReply();

Member member = interaction.getMember();
if (member == null) {
if (member == null || interaction.getGuild() == null) {
interaction.reply("You must be in a server to use this command.", false);
return;
}
Expand All @@ -55,19 +55,21 @@ public void execute(Interaction interaction) {


String id = member.getId();
String guildId = interaction.getGuild().getId();


if (APIAuthUtil.hasAPIKey(id)) {
if (APIAuthUtil.hasAPIKey(id, guildId)) {
interaction.reply("You already have an API key. Please contact a developer.", false);
return;
}

try {
String key= APIAuthUtil.createAPIKey(id);
String key= APIAuthUtil.createAPIKey(id, guildId);

String avatar = ElixirClient.getInstance().jda.getSelfUser().getEffectiveAvatarUrl();

MessageEmbed embed = new EmbedBuilder()
.setDescription("Successfully generated. Save this for later use!")
.setDescription("API key for guild %s generated.".formatted(interaction.getGuild().getName()))
.setColor(ElixirConstants.DEFAULT_EMBED_COLOR)
.addField("API Key", String.format("`%s`", key), false)
.setFooter("Elixir Music", avatar)
Expand Down
16 changes: 12 additions & 4 deletions src/main/java/dev/benpetrillo/elixir/utils/APIAuthUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,22 +28,30 @@

public final class APIAuthUtil {

public static String createAPIKey(String userId) {
public static String createAPIKey(String userId, String guildId) {

String key = generateAPIKey();

MongoCollection<Document> dbCollection = DatabaseManager.getAPIKeyCollection();
dbCollection.insertOne(new Document("userId", userId)
.append("guildId", guildId)
.append("apiKey", key)
.append("createdAt", System.currentTimeMillis() / 1000L)
);

return key;
}

public static boolean hasAPIKey(String userId) {
public static boolean hasAPIKey(String userId, String guildId) {
MongoCollection<Document> dbCollection = DatabaseManager.getAPIKeyCollection();
return dbCollection.find(new Document("userId", userId)).first() != null;
return dbCollection.find(new Document("userId", userId)
.append("guildId", guildId)).first() != null;
}

public static boolean isValidAPIKey(String userId, String guildId, String apiKey) {
MongoCollection<Document> dbCollection = DatabaseManager.getAPIKeyCollection();
return dbCollection.find(new Document("userId", userId)
.append("guildId", guildId)
.append("apiKey", apiKey)).first() != null;
}

private static String generateAPIKey() {
Expand Down

0 comments on commit b59ceb7

Please sign in to comment.