diff --git a/.gitignore b/.gitignore index 3c37caf..3ffa09b 100644 --- a/.gitignore +++ b/.gitignore @@ -116,3 +116,6 @@ run/ # Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) !gradle-wrapper.jar + +# Foundation Server +/server diff --git a/build.gradle.kts b/build.gradle.kts index 9dbe165..8cbbb92 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,9 +5,7 @@ import java.io.FileWriter plugins { java - id("org.jetbrains.kotlin.jvm") version "1.6.10" apply false - id("org.jetbrains.kotlin.plugin.serialization") version "1.6.10" apply false - id("com.github.johnrengelman.shadow") version "7.1.1" apply false + id("foundation-gradle") } fun Project.isFoundationPlugin() = name.startsWith("foundation-") @@ -23,6 +21,7 @@ allprojects { name = "papermc-repo" url = uri("https://papermc.io/repo/repository/maven-public/") } + maven { name = "sonatype" url = uri("https://oss.sonatype.org/content/groups/public/") @@ -135,3 +134,8 @@ subprojects { dependsOn("shadowJar") } } + +tasks.setupPaperServer { + minecraftServerPath = "server" + paperVersionGroup = "1.18" +} diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 0000000..311e94b --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,18 @@ +plugins { + `kotlin-dsl` + kotlin("plugin.serialization") version "1.5.31" +} + +repositories { + gradlePluginPortal() +} + +dependencies { + implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10") + implementation("org.jetbrains.kotlin:kotlin-serialization:1.6.10") + implementation("gradle.plugin.com.github.johnrengelman:shadow:7.1.1") + implementation("com.google.code.gson:gson:2.8.9") +} + +java.sourceCompatibility = JavaVersion.VERSION_1_8 +java.targetCompatibility = JavaVersion.VERSION_1_8 diff --git a/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/FoundationGradlePlugin.kt b/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/FoundationGradlePlugin.kt new file mode 100644 index 0000000..d7977cc --- /dev/null +++ b/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/FoundationGradlePlugin.kt @@ -0,0 +1,10 @@ +package cloud.kubelet.foundation.gradle + +import org.gradle.api.Plugin +import org.gradle.api.Project + +class FoundationGradlePlugin : Plugin { + override fun apply(project: Project) { + project.tasks.create("setupPaperServer", SetupPaperServer::class.java) + } +} diff --git a/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/PaperVersionClient.kt b/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/PaperVersionClient.kt new file mode 100644 index 0000000..deb9c2f --- /dev/null +++ b/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/PaperVersionClient.kt @@ -0,0 +1,44 @@ +package cloud.kubelet.foundation.gradle + +import com.google.gson.Gson +import java.net.URI +import java.net.http.HttpClient +import java.net.http.HttpRequest +import java.net.http.HttpResponse + +class PaperVersionClient(val client: HttpClient = HttpClient.newHttpClient()) { + private val apiBaseUrl = URI.create("https://papermc.io/api/v2/") + private val gson = Gson() + + fun getVersionBuilds(group: String): List { + val response = client.send( + HttpRequest.newBuilder() + .GET() + .uri(apiBaseUrl.resolve("projects/paper/version_group/${group}/builds")) + .build(), + HttpResponse.BodyHandlers.ofString() + ) + + val body = response.body() + val root = gson.fromJson(body, PaperVersionRoot::class.java) + return root.builds + } + + fun resolveDownloadUrl(build: PaperBuild, download: PaperVersionDownload): URI = + apiBaseUrl.resolve("projects/paper/versions/${build.version}/builds/${build.build}/downloads/${download.name}") + + data class PaperVersionRoot( + val builds: List + ) + + data class PaperBuild( + val version: String, + val build: Int, + val downloads: Map + ) + + data class PaperVersionDownload( + val name: String, + val sha256: String + ) +} diff --git a/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/SetupPaperServer.kt b/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/SetupPaperServer.kt new file mode 100644 index 0000000..316a971 --- /dev/null +++ b/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/SetupPaperServer.kt @@ -0,0 +1,55 @@ +package cloud.kubelet.foundation.gradle + +import org.gradle.api.DefaultTask +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.TaskAction +import java.nio.file.Files + +open class SetupPaperServer : DefaultTask() { + @get:Input + lateinit var paperVersionGroup: String + + @get:Input + lateinit var minecraftServerPath: String + + @TaskAction + fun downloadPaperTask() { + val minecraftServerDirectory = project.file(minecraftServerPath) + val client = PaperVersionClient() + val builds = client.getVersionBuilds(paperVersionGroup) + val build = builds.last() + val download = build.downloads["application"]!! + val url = client.resolveDownloadUrl(build, download) + + if (!minecraftServerDirectory.exists()) { + minecraftServerDirectory.mkdirs() + } + + ant.invokeMethod( + "get", mapOf( + "src" to url.toString(), + "dest" to project.file("${minecraftServerPath}/paper.jar").absolutePath + ) + ) + + val paperPluginsDirectory = minecraftServerDirectory.resolve("plugins") + + if (!paperPluginsDirectory.exists()) { + paperPluginsDirectory.mkdirs() + } + + for (project in project.subprojects) { + if (!project.name.startsWith("foundation-")) { + continue + } + + val pluginJarFile = project.buildDir.resolve("libs/${project.name}-DEV-plugin.jar") + val pluginLinkFile = paperPluginsDirectory.resolve("${project.name}.jar") + if (pluginLinkFile.exists()) { + pluginLinkFile.delete() + } + + Files.createSymbolicLink(pluginLinkFile.toPath(), pluginJarFile.toPath()) + } + } +} diff --git a/buildSrc/src/main/resources/META-INF/gradle-plugins/foundation-gradle.properties b/buildSrc/src/main/resources/META-INF/gradle-plugins/foundation-gradle.properties new file mode 100644 index 0000000..13d6f09 --- /dev/null +++ b/buildSrc/src/main/resources/META-INF/gradle-plugins/foundation-gradle.properties @@ -0,0 +1 @@ +implementation-class=cloud.kubelet.foundation.gradle.FoundationGradlePlugin