Compare commits

...

13 Commits

Author SHA1 Message Date
740166f79f 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
2025-02-11 14:25:17 +01:00
ef0c5f5d29 add lavanodes.json example 2025-02-10 10:30:02 +01:00
b1431a165a add Jackson dependecy 2025-02-10 09:15:09 +01:00
bf17ae800c add Lavalink Dependency and impl stub
All checks were successful
github-mirror / push-github (push) Successful in 4s
Build / Gradle-Build (push) Successful in 26s
Test / Gradle-Test (push) Successful in 10s
2025-02-10 00:34:52 +01:00
9aae9cd77b add Project settings and artifact naming
All checks were successful
github-mirror / push-github (push) Successful in 4s
Build / Gradle-Build (push) Successful in 23s
Test / Gradle-Test (push) Successful in 13s
2025-02-08 16:51:21 +01:00
ca52d8f04c Merge pull request 'Add CI/CD' (#2) from feat/ci-cd into master
All checks were successful
github-mirror / push-github (push) Successful in 4s
Build / Gradle-Build (push) Successful in 45s
Test / Gradle-Test (push) Successful in 17s
Reviewed-on: #2
2025-02-07 13:44:44 +00:00
6dc1446143 fix directory not existing failing the job
All checks were successful
github-mirror / push-github (push) Successful in 4s
Build / Gradle-Build (push) Successful in 1m2s
Test / Gradle-Test (push) Successful in 31s
2025-02-07 14:40:22 +01:00
eb18df79c9 add test workflow
Some checks failed
github-mirror / push-github (push) Successful in 4s
Build / Gradle-Build (push) Successful in 1m50s
Test / Gradle-Test (push) Failing after 51s
2025-02-07 10:33:26 +01:00
e1f20aeeaf bump gradle version
All checks were successful
github-mirror / push-github (push) Successful in 4s
Build / Gradle-Build (push) Successful in 1m56s
2025-02-06 14:15:59 +01:00
a2e96c7df9 x2
Some checks failed
github-mirror / push-github (push) Successful in 3s
Build / Gradle-Build (push) Failing after 1m36s
2025-02-06 14:00:51 +01:00
be62aad19c fix disappeared part of name
Some checks failed
github-mirror / push-github (push) Successful in 3s
Build / Gradle-Build (push) Failing after 1s
2025-02-06 13:59:56 +01:00
d6d37f391a test different java version
Some checks failed
github-mirror / push-github (push) Successful in 4s
Build / Gradle-Build (push) Failing after 1s
2025-02-06 13:57:50 +01:00
9e80e06d18 add gradle build workflow
Some checks failed
github-mirror / push-github (push) Successful in 4s
Build / Gradle-Build (push) Failing after 1m2s
2025-02-06 12:13:40 +01:00
12 changed files with 261 additions and 4 deletions

View File

@@ -0,0 +1,47 @@
name: Build
on:
push:
jobs:
Gradle-Build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up JDK
uses: actions/setup-java@v4
with:
java-version: '23'
check-latest: true
distribution: 'zulu'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
with:
add-job-summary: always
cache-cleanup: on-success
- name: Cache Gradle dependencies
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Build
run: chmod +x gradlew; ./gradlew assemble
- name: Move artifacts
run: mkdir artifacts; mv app/build/libs/*.jar artifacts;
- name: Upload artifact
uses: christopherhx/gitea-upload-artifact@v4
with:
name: artifacts
path: artifacts

View File

@@ -0,0 +1,53 @@
name: Test
on:
push:
jobs:
Gradle-Test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up JDK
uses: actions/setup-java@v4
with:
java-version: '23'
check-latest: true
distribution: 'zulu'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
with:
add-job-summary: always
cache-cleanup: on-success
- name: Cache Gradle dependencies
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Test
env:
DISCORD_TEST_TOKEN: ${{ secrets.DISCORD_TOKEN }}
run: chmod +x gradlew; ./gradlew test
- name: Move Test Results
if: always()
continue-on-error: true
run: |
mkdir test-results/;
[ -d app/build/test-results/test/ ] && mv app/build/test-results/test/*.xml test-results/ || true
- name: Upload Test Result
uses: christopherhx/gitea-upload-artifact@v4
if: always()
with:
name: test-results
path: test-results/

1
.gitignore vendored
View File

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

View File

@@ -14,9 +14,8 @@ plugins {
repositories { repositories {
// Use Maven Central for resolving dependencies. // Use Maven Central for resolving dependencies.
mavenCentral() mavenCentral()
maven { maven("https://maven.lavalink.dev/releases")
url = uri("https://git.tomatentum.net/api/packages/tueem/maven") maven("https://git.tomatentum.net/api/packages/tueem/maven")
}
} }
dependencies { dependencies {
@@ -32,6 +31,8 @@ dependencies {
implementation(libs.logback) implementation(libs.logback)
implementation(libs.log4jtoslf4j) implementation(libs.log4jtoslf4j)
implementation(libs.jultoslf4j) implementation(libs.jultoslf4j)
implementation(libs.jackson)
implementation(libs.lavalink)
implementation(libs.marinaralib) implementation(libs.marinaralib)
implementation(libs.marinarajavacord) implementation(libs.marinarajavacord)

View File

@@ -6,6 +6,8 @@ import org.javacord.api.entity.intent.Intent;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.core.JsonFactory;
import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.LoggerContext;
import io.github.cdimascio.dotenv.Dotenv; import io.github.cdimascio.dotenv.Dotenv;
@@ -19,6 +21,7 @@ public class App {
new App().connect(); new App().connect();
} }
private JsonFactory jsonFactory;
private Config config; private Config config;
private DiscordApi client; private DiscordApi client;
private Logger logger = LoggerFactory.getLogger(getClass()); private Logger logger = LoggerFactory.getLogger(getClass());
@@ -26,6 +29,7 @@ public class App {
private Marinara marinara; private Marinara marinara;
private App() { private App() {
this.jsonFactory = JsonFactory.builder().build();
Dotenv env = Dotenv.configure().ignoreIfMissing().load(); Dotenv env = Dotenv.configure().ignoreIfMissing().load();
this.config = new Config(env); this.config = new Config(env);
@@ -50,4 +54,5 @@ public class App {
marinara.getRegistry().registerCommands(); marinara.getRegistry().registerCommands();
} }
} }

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

@@ -0,0 +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 net.tomatentum.tomatenmusic3.Config;
public class LavalinkWrapper {
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, JsonFactory jsonFactory) {
this.client = client;
this.jsonFactory = jsonFactory;
this.lavaClient = new LavalinkClient(Helpers.getUserIdFromToken(config.token()));
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<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;
}
}

16
build.gradle.kts Normal file
View File

@@ -0,0 +1,16 @@
import java.io.ByteArrayOutputStream
allprojects {
group = "net.tomatentum.tomatenmusic3"
version = "1.0.0-RC1" + (if (!project.hasProperty("release")) ("-" + getGitHash()) else "")
description = "A simple Discord Music Bot written in Java with Javacord"
}
fun getGitHash(): String {
val output = ByteArrayOutputStream()
project.exec {
commandLine("git", "rev-parse", "--short", "HEAD")
standardOutput = output
}
return output.toString().trim()
}

View File

@@ -9,7 +9,9 @@ logback = "1.5.15"
slf4j = "2.0.16" slf4j = "2.0.16"
log4jtoslf4j = "2.24.3" log4jtoslf4j = "2.24.3"
jultoslf4j = "2.0.16" jultoslf4j = "2.0.16"
jackson = "2.18.2"
marinara = "1.0.0-RC1-9d88ca9" marinara = "1.0.0-RC1-9d88ca9"
lavalink = "3.1.0"
[libraries] [libraries]
junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit-jupiter" } junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit-jupiter" }
@@ -19,6 +21,8 @@ logback = { module = "ch.qos.logback:logback-classic", version.ref = "logback"}
slf4j = { module = "org.slf4j:slf4j-api", version.ref = "slf4j"} slf4j = { module = "org.slf4j:slf4j-api", version.ref = "slf4j"}
log4jtoslf4j = { module = "org.apache.logging.log4j:log4j-to-slf4j", version.ref = "log4jtoslf4j"} log4jtoslf4j = { module = "org.apache.logging.log4j:log4j-to-slf4j", version.ref = "log4jtoslf4j"}
jultoslf4j = { module = "org.slf4j:jul-to-slf4j", version.ref = "jultoslf4j"} jultoslf4j = { module = "org.slf4j:jul-to-slf4j", version.ref = "jultoslf4j"}
jackson = { module = "com.fasterxml.jackson.core:jackson-databind", version.ref = "jackson"}
lavalink = { module = "dev.arbjerg:lavalink-client", version.ref = "lavalink"}
marinaralib = { module = "net.tomatentum.Marinara:lib-dev", version.ref = "marinara"} marinaralib = { module = "net.tomatentum.Marinara:lib-dev", version.ref = "marinara"}
marinarajavacord = { module = "net.tomatentum.Marinara:wrapper-javacord-dev", version.ref = "marinara"} marinarajavacord = { module = "net.tomatentum.Marinara:wrapper-javacord-dev", version.ref = "marinara"}

View File

@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME

9
lavanodes.example.json Normal file
View File

@@ -0,0 +1,9 @@
[
{
"name": "node1",
"host": "localhost",
"port": 2333,
"password": "youshallnotpass",
"regionGroup": "EUROPE"
}
]