From a988ffbd2303a79ee18be7263ef6cd45c7bc4daf Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Mon, 29 Jan 2024 03:46:17 +0100 Subject: [PATCH] feat: Add CLI --- build.gradle.kts | 9 ++++- gradle/libs.versions.toml | 2 + .../kotlin/app/revanced/api/Application.kt | 22 ----------- .../app/revanced/api/command/MainCommand.kt | 34 ++++++++++++++++ .../revanced/api/command/StartAPICommand.kt | 39 +++++++++++++++++++ .../app/revanced/api/plugins/Dependencies.kt | 6 +-- .../app/revanced/api/plugins/Routing.kt | 3 +- .../revanced/api/{ => schema}/APISchema.kt | 22 ++++++++++- .../api/{ => schema}/ConfigurationSchema.kt | 2 +- .../app.revanced.api/version.properties | 1 + 10 files changed, 107 insertions(+), 33 deletions(-) delete mode 100644 src/main/kotlin/app/revanced/api/Application.kt create mode 100644 src/main/kotlin/app/revanced/api/command/MainCommand.kt create mode 100644 src/main/kotlin/app/revanced/api/command/StartAPICommand.kt rename src/main/kotlin/app/revanced/api/{ => schema}/APISchema.kt (72%) rename src/main/kotlin/app/revanced/api/{ => schema}/ConfigurationSchema.kt (93%) create mode 100644 src/main/resources/app.revanced.api/version.properties diff --git a/build.gradle.kts b/build.gradle.kts index d1c7c33..bfc4d3f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,12 +7,18 @@ plugins { group = "app.revanced" application { - mainClass.set("app.revanced.api.ApplicationKt") + mainClass.set("app.revanced.api.command.MainCommandKt") val isDevelopment: Boolean = project.ext.has("development") applicationDefaultJvmArgs = listOf("-Dio.ktor.development=$isDevelopment") } +tasks { + processResources { + expand("projectVersion" to project.version) + } +} + repositories { mavenCentral() } @@ -44,6 +50,7 @@ dependencies { implementation(libs.dotenv.kotlin) implementation(libs.ktoml.core) implementation(libs.ktoml.file) + implementation(libs.picocli) testImplementation(libs.ktor.server.tests) testImplementation(libs.kotlin.test.junit) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5074e91..413b850 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,6 +7,7 @@ koin="3.5.3" dotenv="6.4.1" ktor = "2.3.7" ktoml = "0.5.1" +picocli = "4.7.3" [libraries] ktor-client-core = { module = "io.ktor:ktor-client-core" } @@ -37,6 +38,7 @@ ktor-server-tests = { module = "io.ktor:ktor-server-tests" } kotlin-test-junit = { module = "org.jetbrains.kotlin:kotlin-test-junit", version.ref = "kotlin" } ktoml-core = { module = "com.akuleshov7:ktoml-core", version.ref = "ktoml" } ktoml-file = { module = "com.akuleshov7:ktoml-file", version.ref = "ktoml" } +picocli = { module = "info.picocli:picocli", version.ref = "picocli" } [plugins] serilization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } diff --git a/src/main/kotlin/app/revanced/api/Application.kt b/src/main/kotlin/app/revanced/api/Application.kt deleted file mode 100644 index 0b7c571..0000000 --- a/src/main/kotlin/app/revanced/api/Application.kt +++ /dev/null @@ -1,22 +0,0 @@ -package app.revanced.api - -import app.revanced.api.plugins.* -import io.github.cdimascio.dotenv.Dotenv -import io.ktor.server.application.* -import io.ktor.server.engine.* -import io.ktor.server.netty.* - -fun main() { - embeddedServer(Netty, port = 8080, host = "0.0.0.0", configure = { - connectionGroupSize = 1 - workerGroupSize = 1 - callGroupSize = 1 - }) { - configureHTTP() - configureSerialization() - configureDatabases() - configureSecurity() - configureDependencies() - configureRouting() - }.start(wait = true) -} diff --git a/src/main/kotlin/app/revanced/api/command/MainCommand.kt b/src/main/kotlin/app/revanced/api/command/MainCommand.kt new file mode 100644 index 0000000..3038e96 --- /dev/null +++ b/src/main/kotlin/app/revanced/api/command/MainCommand.kt @@ -0,0 +1,34 @@ +package app.revanced.api.command + +import picocli.CommandLine +import java.util.* + +fun main(args: Array) { + CommandLine(MainCommand).execute(*args).let(System::exit) +} + +private object CLIVersionProvider : CommandLine.IVersionProvider { + override fun getVersion() = + arrayOf( + MainCommand::class.java.getResourceAsStream( + "/app/revanced/api/version.properties", + )?.use { stream -> + Properties().apply { + load(stream) + }.let { + "ReVanced API v${it.getProperty("version")}" + } + } ?: "ReVanced API", + ) +} + +@CommandLine.Command( + name = "revanced-api", + description = ["API server for ReVanced"], + mixinStandardHelpOptions = true, + versionProvider = CLIVersionProvider::class, + subcommands = [ + StartAPICommand::class, + ], +) +private object MainCommand \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/api/command/StartAPICommand.kt b/src/main/kotlin/app/revanced/api/command/StartAPICommand.kt new file mode 100644 index 0000000..be7abfb --- /dev/null +++ b/src/main/kotlin/app/revanced/api/command/StartAPICommand.kt @@ -0,0 +1,39 @@ +package app.revanced.api.command + +import app.revanced.api.plugins.* +import io.ktor.server.engine.* +import io.ktor.server.netty.* +import picocli.CommandLine + +@CommandLine.Command( + name = "start", + description = ["Start the API server"], +) +internal object StartAPICommand : Runnable { + @CommandLine.Option( + names = ["-h", "--host"], + description = ["The host address to bind to."], + ) + private var host: String = "0.0.0.0" + + @CommandLine.Option( + names = ["-p", "--port"], + description = ["The port to listen on."], + ) + private var port: Int = 8080 + + override fun run() { + embeddedServer(Netty, port, host, configure = { + connectionGroupSize = 1 + workerGroupSize = 1 + callGroupSize = 1 + }) { + configureHTTP() + configureSerialization() + configureDatabases() + configureSecurity() + configureDependencies() + configureRouting() + }.start(wait = true) + } +} diff --git a/src/main/kotlin/app/revanced/api/plugins/Dependencies.kt b/src/main/kotlin/app/revanced/api/plugins/Dependencies.kt index 7e0a3d3..7667e3f 100644 --- a/src/main/kotlin/app/revanced/api/plugins/Dependencies.kt +++ b/src/main/kotlin/app/revanced/api/plugins/Dependencies.kt @@ -1,16 +1,12 @@ package app.revanced.api.plugins -import app.revanced.api.APIConfiguration +import app.revanced.api.schema.APIConfiguration import app.revanced.api.backend.github.GitHubBackend import com.akuleshov7.ktoml.Toml import com.akuleshov7.ktoml.source.decodeFromStream import io.github.cdimascio.dotenv.Dotenv import io.ktor.server.application.* -import kotlinx.serialization.decodeFromString -import kotlinx.serialization.encodeToString -import org.koin.core.context.startKoin import org.koin.dsl.module -import org.koin.ktor.ext.inject import org.koin.ktor.plugin.Koin import java.io.File diff --git a/src/main/kotlin/app/revanced/api/plugins/Routing.kt b/src/main/kotlin/app/revanced/api/plugins/Routing.kt index 1bd019f..8736aff 100644 --- a/src/main/kotlin/app/revanced/api/plugins/Routing.kt +++ b/src/main/kotlin/app/revanced/api/plugins/Routing.kt @@ -1,8 +1,7 @@ package app.revanced.api.plugins -import app.revanced.api.* import app.revanced.api.backend.github.GitHubBackend -import io.ktor.client.utils.EmptyContent.contentType +import app.revanced.api.schema.* import io.ktor.http.* import io.ktor.server.application.* import io.ktor.server.http.content.* diff --git a/src/main/kotlin/app/revanced/api/APISchema.kt b/src/main/kotlin/app/revanced/api/schema/APISchema.kt similarity index 72% rename from src/main/kotlin/app/revanced/api/APISchema.kt rename to src/main/kotlin/app/revanced/api/schema/APISchema.kt index 5e2de99..4432470 100644 --- a/src/main/kotlin/app/revanced/api/APISchema.kt +++ b/src/main/kotlin/app/revanced/api/schema/APISchema.kt @@ -1,4 +1,4 @@ -package app.revanced.api +package app.revanced.api.schema import kotlinx.serialization.Serializable @@ -52,4 +52,22 @@ class APIAsset( @Serializable class APIReleaseVersion( val version: String -) \ No newline at end of file +) + +@Serializable +class APIAnnouncement( + val id: Int, + val author: APIUser?, + val title: String, + val content: APIAnnouncementContent, + val channel: String, + val createdAt: String, + val archivedAt: String?, + val level: Int, +) + +@Serializable +class APIAnnouncementContent( + val message: String, + val attachmentUrls: Set +) diff --git a/src/main/kotlin/app/revanced/api/ConfigurationSchema.kt b/src/main/kotlin/app/revanced/api/schema/ConfigurationSchema.kt similarity index 93% rename from src/main/kotlin/app/revanced/api/ConfigurationSchema.kt rename to src/main/kotlin/app/revanced/api/schema/ConfigurationSchema.kt index 0a5979a..db90377 100644 --- a/src/main/kotlin/app/revanced/api/ConfigurationSchema.kt +++ b/src/main/kotlin/app/revanced/api/schema/ConfigurationSchema.kt @@ -1,4 +1,4 @@ -package app.revanced.api +package app.revanced.api.schema import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/src/main/resources/app.revanced.api/version.properties b/src/main/resources/app.revanced.api/version.properties new file mode 100644 index 0000000..308c9f8 --- /dev/null +++ b/src/main/resources/app.revanced.api/version.properties @@ -0,0 +1 @@ +version=${projectVersion} \ No newline at end of file