From bdcd7b3481b2757d7dbb3dd3b06a2e6df1b5db49 Mon Sep 17 00:00:00 2001 From: InvalidJoker <0limitdev@gmail.com> Date: Tue, 28 Jan 2025 16:41:17 +0100 Subject: [PATCH] fix: mojang api ratelimits --- build.gradle.kts | 1 + .../cc/modlabs/kpaper/utils/MojangAPI.kt | 36 ++++++++++--------- .../kotlin/cc/modlabs/kpaper/MojangTest.kt | 27 ++++++++++++++ 3 files changed, 48 insertions(+), 16 deletions(-) create mode 100644 src/test/kotlin/cc/modlabs/kpaper/MojangTest.kt diff --git a/build.gradle.kts b/build.gradle.kts index 7076259..2f683d6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -36,6 +36,7 @@ dependencies { testImplementation("io.kotest:kotest-runner-junit5:$koTestVersion") testImplementation("io.mockk:mockk:${mockkVersion}") + testImplementation("com.google.code.gson:gson:2.11.0") } paperweight { diff --git a/src/main/kotlin/cc/modlabs/kpaper/utils/MojangAPI.kt b/src/main/kotlin/cc/modlabs/kpaper/utils/MojangAPI.kt index a787e3d..d707ae2 100644 --- a/src/main/kotlin/cc/modlabs/kpaper/utils/MojangAPI.kt +++ b/src/main/kotlin/cc/modlabs/kpaper/utils/MojangAPI.kt @@ -1,28 +1,32 @@ package cc.modlabs.kpaper.utils import com.google.gson.Gson -import java.net.URL +import java.net.URI class MojangAPI { private val gson = Gson() - fun getUUID(name: String): String { - val baseUrl = "https://api.mojang.com/users/profiles/minecraft/$name" - val response = URL(baseUrl).readText() - val uuidResponse = gson.fromJson(response, MojangUUIDResponse::class.java) - return uuidResponse.id.replace("(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})".toRegex(), "$1-$2-$3-$4-$5") - } + fun getUser(user: String): MclSuccessResponse? { + val url = "https://mcl.flawcra.cc/$user" + val response = URI.create(url).toURL().readText() + + val errorResponse = gson.fromJson(response, MclErrorResponse::class.java) + if (errorResponse.error != null) { + return null + } - fun getUsername(uuid: String): String { - // http request to mojang api to get username - val responseUrl = "https://sessionserver.mojang.com/session/minecraft/profile/$uuid" - val response = URL(responseUrl).readText() - val skinResponse = gson.fromJson(response, SkinResponse::class.java) - return skinResponse.name + return gson.fromJson(response, MclSuccessResponse::class.java) } } -data class SkinResponse(val id: String, val name: String, val properties: List) -data class MojangProperty(val name: String, val value: String) +data class MclErrorResponse( + val code: String? = null, + val error: String? = null +) -data class MojangUUIDResponse(val name: String, val id: String) \ No newline at end of file +data class MclSuccessResponse( + val username: String, + val id: String, // already hyphenated + val avatar: String, + val skin_texture: String, +) \ No newline at end of file diff --git a/src/test/kotlin/cc/modlabs/kpaper/MojangTest.kt b/src/test/kotlin/cc/modlabs/kpaper/MojangTest.kt new file mode 100644 index 0000000..98229e7 --- /dev/null +++ b/src/test/kotlin/cc/modlabs/kpaper/MojangTest.kt @@ -0,0 +1,27 @@ +package cc.modlabs.kpaper + +import cc.modlabs.kpaper.utils.MojangAPI +import io.kotest.core.spec.style.FunSpec +import io.kotest.matchers.shouldBe + +class MojangTest: FunSpec() { + + init { + coroutineTestScope = true + test("testMojangAPI") { + val api = MojangAPI() + val uuid = api.getUser("Notch") + println("UUID: $uuid") + + val username = api.getUser(uuid!!.id) + + username?.username shouldBe "Notch" + println("Username: $username") + + val fail = api.getUser("NotchNotch2348723467823467887462387") + fail shouldBe null + + println("Fail: $fail") + } + } +} \ No newline at end of file