From 22103d800c195084d6332596e03a2aa170e69fc9 Mon Sep 17 00:00:00 2001 From: Simon <9295182+grimsi@users.noreply.github.com> Date: Wed, 30 Oct 2024 16:06:33 +0100 Subject: [PATCH] Added support for 3rd party dependencies in plugins (#434) --- plugin-api/build.gradle.kts | 4 +- plugins/build.gradle.kts | 50 +++++-------------- plugins/igdb/build.gradle.kts | 18 +++++++ .../gameyfin/plugins/igdb/IgdbPlugin.kt | 14 +++++- 4 files changed, 46 insertions(+), 40 deletions(-) diff --git a/plugin-api/build.gradle.kts b/plugin-api/build.gradle.kts index 48a1835..96f562a 100644 --- a/plugin-api/build.gradle.kts +++ b/plugin-api/build.gradle.kts @@ -10,7 +10,9 @@ repositories { dependencies { // PF4J (shared) - api("org.pf4j:pf4j:${rootProject.extra["pf4jVersion"]}") + api("org.pf4j:pf4j:${rootProject.extra["pf4jVersion"]}") { + exclude(group = "org.slf4j") + } implementation(kotlin("stdlib")) diff --git a/plugins/build.gradle.kts b/plugins/build.gradle.kts index 0135936..7e80179 100644 --- a/plugins/build.gradle.kts +++ b/plugins/build.gradle.kts @@ -1,5 +1,3 @@ -val pluginDir: File by rootProject.extra - plugins { kotlin("jvm") } @@ -8,48 +6,24 @@ subprojects { apply(plugin = "org.jetbrains.kotlin.jvm") dependencies { - implementation(project(":plugin-api")) - } - - tasks.register("plugin") { - archiveBaseName.set("plugin-${project.name}") - - // first taking the classes generated by the jar task - into("classes") { - with(tasks.named("jar").get()) - } - // and then we also need to include any libraries that are needed by the plugin - dependsOn(configurations.runtimeClasspath) - into("lib") { - from({ - configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") } - }) - } - archiveExtension.set("jar") - } - - tasks.register("assemblePlugin") { - from(project.tasks.named("plugin")) - into(pluginDir) + compileOnly(project(":plugin-api")) } tasks.jar { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + isZip64 = true + archiveBaseName.set("plugin-${project.name}") + manifest { from("./src/main/resources/MANIFEST.MF") } - } - tasks.named("build") { - dependsOn(tasks.named("plugin")) - } -} - -tasks.register("assemblePlugins") { - dependsOn(subprojects.map { it.tasks.named("assemblePlugin") }) -} - -tasks { - "build" { - dependsOn(named("assemblePlugins")) + from(configurations.runtimeClasspath.get().map { project.zipTree(it) }) { + exclude("META-INF/*.SF") + exclude("META-INF/*.DSA") + exclude("META-INF/*.RSA") + } + from(sourceSets["main"].output.classesDirs) + from(sourceSets["main"].resources) } } \ No newline at end of file diff --git a/plugins/igdb/build.gradle.kts b/plugins/igdb/build.gradle.kts index 6f15a8b..c3f4084 100644 --- a/plugins/igdb/build.gradle.kts +++ b/plugins/igdb/build.gradle.kts @@ -4,4 +4,22 @@ plugins { dependencies { ksp("care.better.pf4j:pf4j-kotlin-symbol-processing:2.0.20-1.0.1") + + // IGDB API client + implementation("io.github.husnjak:igdb-api-jvm:1.2.0") +} + +tasks.register("copyDependencyClasses") { + dependsOn(tasks.jar) + + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + + from(configurations.runtimeClasspath.get().map { project.zipTree(it) }) { + include("**/*.class") + } + into(layout.buildDirectory.get().asFile.resolve("classes/kotlin/main")) +} + +tasks.build { + dependsOn("copyDependencyClasses") } \ No newline at end of file diff --git a/plugins/igdb/src/main/kotlin/de/grimsi/gameyfin/plugins/igdb/IgdbPlugin.kt b/plugins/igdb/src/main/kotlin/de/grimsi/gameyfin/plugins/igdb/IgdbPlugin.kt index 78dd4bd..668d2cf 100644 --- a/plugins/igdb/src/main/kotlin/de/grimsi/gameyfin/plugins/igdb/IgdbPlugin.kt +++ b/plugins/igdb/src/main/kotlin/de/grimsi/gameyfin/plugins/igdb/IgdbPlugin.kt @@ -1,5 +1,7 @@ package de.grimsi.gameyfin.plugins.igdb +import com.api.igdb.request.IGDBWrapper +import com.api.igdb.request.TwitchAuthenticator import de.grimsi.gameyfin.pluginapi.gamemetadata.GameMetadata import de.grimsi.gameyfin.pluginapi.gamemetadata.GameMetadataFetcher import org.pf4j.Extension @@ -10,13 +12,23 @@ import java.time.Instant class IgdbPlugin(wrapper: PluginWrapper) : Plugin(wrapper) { override fun start() { - println("IgdbPlugin.start()") + authenticate() } override fun stop() { println("IgdbPlugin.stop()") } + private fun authenticate() { + // Kotlin example + val token = TwitchAuthenticator.requestTwitchToken("CLIENT_ID", "CLIENT_SECRET") + if (token == null) { + println("Failed to authenticate with Twitch") + return + } + IGDBWrapper.setCredentials("client_id", token.access_token) + } + @Extension class IgdbMetadataFetcher : GameMetadataFetcher { override fun getConfig(): Map {