Add Nodes parsing
All checks were successful
github-mirror / push-github (push) Successful in 4s
Build / Gradle-Build (push) Successful in 25s
Test / Gradle-Test (push) Successful in 10s

This commit is contained in:
tueem 2025-02-11 14:25:17 +01:00
parent ef0c5f5d29
commit 740166f79f
Signed by: tueem
GPG Key ID: 65C8667EC17A88FB
5 changed files with 102 additions and 8 deletions

1
.gitignore vendored
View File

@ -5,3 +5,4 @@
build
.vscode
.env
lavanodes.json

View File

@ -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);

View File

@ -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<IRegionFilter> {
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);
}
}

View File

@ -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();
}
}

View File

@ -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<NodeOptions> getNodes() {
//TODO
return Collections.emptySet();
protected Set<LavalinkNodeOptions> 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<LavalinkNodeOptions> nodes = objectMapper.readValue(nodesFile, new TypeReference<List<LavalinkNodeOptions>>(){});
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;
}
}