From 740166f79fe1d0ded55f47c2a6402ae7797d281b Mon Sep 17 00:00:00 2001 From: tueem Date: Tue, 11 Feb 2025 14:25:17 +0100 Subject: [PATCH] Add Nodes parsing --- .gitignore | 1 + .../net/tomatentum/tomatenmusic3/App.java | 4 ++ .../lavalink/IRegionFilterDeserializer.java | 36 +++++++++++++ .../lavalink/LavalinkNodeOptions.java | 16 ++++++ .../lavalink/LavalinkWrapper.java | 53 ++++++++++++++++--- 5 files changed, 102 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/net/tomatentum/tomatenmusic3/lavalink/IRegionFilterDeserializer.java create mode 100644 app/src/main/java/net/tomatentum/tomatenmusic3/lavalink/LavalinkNodeOptions.java diff --git a/.gitignore b/.gitignore index 6b3b6e1..b5f6def 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ build .vscode .env +lavanodes.json diff --git a/app/src/main/java/net/tomatentum/tomatenmusic3/App.java b/app/src/main/java/net/tomatentum/tomatenmusic3/App.java index f1573cf..a877340 100644 --- a/app/src/main/java/net/tomatentum/tomatenmusic3/App.java +++ b/app/src/main/java/net/tomatentum/tomatenmusic3/App.java @@ -6,6 +6,8 @@ import org.javacord.api.entity.intent.Intent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.fasterxml.jackson.core.JsonFactory; + import ch.qos.logback.classic.Level; import ch.qos.logback.classic.LoggerContext; import io.github.cdimascio.dotenv.Dotenv; @@ -19,6 +21,7 @@ public class App { new App().connect(); } + private JsonFactory jsonFactory; private Config config; private DiscordApi client; private Logger logger = LoggerFactory.getLogger(getClass()); @@ -26,6 +29,7 @@ public class App { private Marinara marinara; private App() { + this.jsonFactory = JsonFactory.builder().build(); Dotenv env = Dotenv.configure().ignoreIfMissing().load(); this.config = new Config(env); diff --git a/app/src/main/java/net/tomatentum/tomatenmusic3/lavalink/IRegionFilterDeserializer.java b/app/src/main/java/net/tomatentum/tomatenmusic3/lavalink/IRegionFilterDeserializer.java new file mode 100644 index 0000000..2dc0c76 --- /dev/null +++ b/app/src/main/java/net/tomatentum/tomatenmusic3/lavalink/IRegionFilterDeserializer.java @@ -0,0 +1,36 @@ +package net.tomatentum.tomatenmusic3.lavalink; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.Version; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import com.fasterxml.jackson.databind.module.SimpleModule; + +import dev.arbjerg.lavalink.client.loadbalancing.IRegionFilter; +import dev.arbjerg.lavalink.client.loadbalancing.RegionGroup; + +public class IRegionFilterDeserializer extends StdDeserializer { + + public static ObjectMapper register(ObjectMapper mapper) { + SimpleModule module = + new SimpleModule("IRegionFilterDeserializer", new Version(1, 0, 0, null, null, null)); + module.addDeserializer(IRegionFilter.class, new IRegionFilterDeserializer()); + mapper.registerModule(module); + return mapper; + } + + public IRegionFilterDeserializer() { + super(IRegionFilter.class); + } + + @Override + public IRegionFilter deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException, JacksonException { + String regionString = parser.getValueAsString(); + return RegionGroup.INSTANCE.valueOf(regionString); + } + +} diff --git a/app/src/main/java/net/tomatentum/tomatenmusic3/lavalink/LavalinkNodeOptions.java b/app/src/main/java/net/tomatentum/tomatenmusic3/lavalink/LavalinkNodeOptions.java new file mode 100644 index 0000000..fe64202 --- /dev/null +++ b/app/src/main/java/net/tomatentum/tomatenmusic3/lavalink/LavalinkNodeOptions.java @@ -0,0 +1,16 @@ +package net.tomatentum.tomatenmusic3.lavalink; + +import dev.arbjerg.lavalink.client.NodeOptions; +import dev.arbjerg.lavalink.client.loadbalancing.IRegionFilter; + +public record LavalinkNodeOptions(String name, String host, int port, String password, IRegionFilter regionGroup) { + + public NodeOptions toNodeOptions() { + return new NodeOptions.Builder() + .setName(name) + .setServerUri("ws://{}:{}".formatted(host, port)) + .setPassword(password) + .setRegionFilter(regionGroup) + .build(); + } +} diff --git a/app/src/main/java/net/tomatentum/tomatenmusic3/lavalink/LavalinkWrapper.java b/app/src/main/java/net/tomatentum/tomatenmusic3/lavalink/LavalinkWrapper.java index 32d5724..9c39457 100644 --- a/app/src/main/java/net/tomatentum/tomatenmusic3/lavalink/LavalinkWrapper.java +++ b/app/src/main/java/net/tomatentum/tomatenmusic3/lavalink/LavalinkWrapper.java @@ -1,32 +1,69 @@ package net.tomatentum.tomatenmusic3.lavalink; +import java.io.File; +import java.io.IOException; import java.util.Collections; +import java.util.HashSet; +import java.util.List; import java.util.Set; import org.javacord.api.DiscordApi; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import dev.arbjerg.lavalink.client.Helpers; import dev.arbjerg.lavalink.client.LavalinkClient; -import dev.arbjerg.lavalink.client.NodeOptions; import net.tomatentum.tomatenmusic3.Config; public class LavalinkWrapper { - private Config config; + private static final String NODES_FILE_NAME = "lavanodes.json"; + private static final String NODES_INFO_FORMAT = "Node {} info:\n\tURI: {}\n\tRegion: {}"; + + private Logger logger = LoggerFactory.getLogger(getClass()); + private DiscordApi client; + private JsonFactory jsonFactory; private LavalinkClient lavaClient; - public LavalinkWrapper(Config config, DiscordApi client) { - this.config = config; + public LavalinkWrapper(Config config, DiscordApi client, JsonFactory jsonFactory) { this.client = client; + this.jsonFactory = jsonFactory; this.lavaClient = new LavalinkClient(Helpers.getUserIdFromToken(config.token())); - getNodes().forEach((x) -> lavaClient.addNode(x)); + getNodes().forEach(node -> { + lavaClient.addNode(node.toNodeOptions()); + logger.info("Registered node {}", node.name()); + logger.debug(NODES_INFO_FORMAT, node.name(), node.toNodeOptions().getServerUri(), node.regionGroup()); + }); } - protected Set getNodes() { - //TODO - return Collections.emptySet(); + protected Set getNodes() { + File nodesFile = new File( + new File(getClass().getProtectionDomain().getCodeSource().getLocation().getFile()).getParent(), + NODES_FILE_NAME); + ObjectMapper objectMapper = new ObjectMapper(jsonFactory); + IRegionFilterDeserializer.register(objectMapper); + + try { + List nodes = objectMapper.readValue(nodesFile, new TypeReference>(){}); + return new HashSet<>(nodes); + } catch (IOException e) { + logger.error("lavanodes.json seems to not exist.", e); + return Collections.emptySet(); + } + } + + public LavalinkClient client() { + return this.lavaClient; + } + + public DiscordApi discordClient() { + return this.client; } }