From 50656d011f8eb0e37c4e1ac52d6609b0a6696427 Mon Sep 17 00:00:00 2001 From: jie65535 Date: Tue, 30 Apr 2024 16:26:43 +0800 Subject: [PATCH] Use mojang uuid api Use nickac skin render api Update version to v1.2.0 --- README.md | 5 ++- build.gradle.kts | 3 +- src/main/kotlin/JMSCommand.kt | 20 +++++------ src/main/kotlin/JMinecraftSkin.kt | 4 +-- src/main/kotlin/MinecraftPlayer.kt | 2 +- src/main/kotlin/MinecraftSkinService.kt | 22 +++++++----- src/main/kotlin/MinecraftUuidService.kt | 47 ++++++++++++++++++++----- 7 files changed, 68 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 1f30a7d..b161d07 100644 --- a/README.md +++ b/README.md @@ -8,12 +8,11 @@ ``` /jms avatar # 查询玩家头像 /jms body # 查询玩家皮肤模型 - /jms cape # 获取玩家披风文件 /jms head # 查询玩家头模型 /jms skin # 获取玩家皮肤文件 /jms uuid # 查询玩家UUID ``` # API -- 获取皮肤接口 [Crafatar](https://crafatar.com/) -- 获取玩家UUID接口 [TenApi](https://docs.tenapi.cn/mc.html) +- 获取皮肤接口 [nickac](https://nmsr.nickac.dev/) +- 获取玩家UUID接口 [Mojang](https://zh.minecraft.wiki/w/Mojang_API) diff --git a/build.gradle.kts b/build.gradle.kts index 50716ae..d28a13e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,7 +7,7 @@ plugins { } group = "top.jie65535.mirai" -version = "1.1.1" +version = "1.2.0" repositories { maven("https://maven.aliyun.com/repository/public") @@ -15,7 +15,6 @@ repositories { } dependencies { - val ktorVersion = "2.3.8" implementation("io.ktor:ktor-client-core-jvm:$ktorVersion") implementation("io.ktor:ktor-client-okhttp-jvm:$ktorVersion") diff --git a/src/main/kotlin/JMSCommand.kt b/src/main/kotlin/JMSCommand.kt index 55b14df..55974d8 100644 --- a/src/main/kotlin/JMSCommand.kt +++ b/src/main/kotlin/JMSCommand.kt @@ -64,16 +64,16 @@ object JMSCommand : CompositeCommand( } } - @SubCommand("cape") - @Description("获取玩家披风文件") - suspend fun CommandSender.getCape(username: String) { - try { - sendImage(MinecraftPlayer(username).cape) - } catch (e: Throwable) { - JMinecraftSkin.logger.error("获取玩家披风文件失败", e) - e.message?.let { sendMessage(it) } - } - } +// @SubCommand("cape") +// @Description("获取玩家披风文件") +// suspend fun CommandSender.getCape(username: String) { +// try { +// sendImage(MinecraftPlayer(username).cape) +// } catch (e: Throwable) { +// JMinecraftSkin.logger.error("获取玩家披风文件失败", e) +// e.message?.let { sendMessage(it) } +// } +// } private suspend fun CommandSender.sendImage(data: ByteArray) { try { diff --git a/src/main/kotlin/JMinecraftSkin.kt b/src/main/kotlin/JMinecraftSkin.kt index 4949a19..7d936dd 100644 --- a/src/main/kotlin/JMinecraftSkin.kt +++ b/src/main/kotlin/JMinecraftSkin.kt @@ -9,7 +9,7 @@ object JMinecraftSkin : KotlinPlugin( JvmPluginDescription( id = "top.jie65535.mirai-console-jms-plugin", name = "J Minecraft Skin", - version = "1.1.1", + version = "1.2.0", ) { author("jie65535") info("MC皮肤查询插件") @@ -19,7 +19,7 @@ object JMinecraftSkin : KotlinPlugin( override fun onEnable() { JMSPluginData.reload() JMSCommand.register() - logger.info { "Plugin loaded. https://github.com/jie65535/mirai-console-jcf-plugin" } + logger.info { "Plugin loaded. https://github.com/jie65535/mirai-console-jms-plugin" } } override fun onDisable() { diff --git a/src/main/kotlin/MinecraftPlayer.kt b/src/main/kotlin/MinecraftPlayer.kt index 3ec5404..83bb37f 100644 --- a/src/main/kotlin/MinecraftPlayer.kt +++ b/src/main/kotlin/MinecraftPlayer.kt @@ -35,5 +35,5 @@ class MinecraftPlayer(username: String) { /** * 披风文件 */ - val cape get() = MinecraftSkinService.getCapes(uuid) +// val cape get() = MinecraftSkinService.getCapes(uuid) } \ No newline at end of file diff --git a/src/main/kotlin/MinecraftSkinService.kt b/src/main/kotlin/MinecraftSkinService.kt index 27bd2d1..b4d6666 100644 --- a/src/main/kotlin/MinecraftSkinService.kt +++ b/src/main/kotlin/MinecraftSkinService.kt @@ -11,29 +11,33 @@ object MinecraftSkinService { * 获取头像 */ fun getAvatars(uuid: String) - = HttpUtil.get("https://crafatar.com/avatars/$uuid?overlay") +// = HttpUtil.get("https://crafatar.com/avatars/$uuid?overlay") + = HttpUtil.get("https://nmsr.nickac.dev/face/$uuid") /** * 获取玩家头模型渲染图 */ fun getHeadRenders(uuid: String) - = HttpUtil.get("https://crafatar.com/renders/head/$uuid?overlay") +// = HttpUtil.get("https://crafatar.com/renders/head/$uuid?overlay") + = HttpUtil.get("https://nmsr.nickac.dev/head/$uuid") /** * 获取玩家皮肤模型渲染图 */ fun getBodyRenders(uuid: String) - = HttpUtil.get("https://crafatar.com/renders/body/$uuid?overlay") +// = HttpUtil.get("https://crafatar.com/renders/body/$uuid?overlay") + = HttpUtil.get("https://nmsr.nickac.dev/fullbody/$uuid") /** * 获取玩家皮肤源文件 */ fun getSkins(uuid: String) - = HttpUtil.get("https://crafatar.com/skins/$uuid") +// = HttpUtil.get("https://crafatar.com/skins/$uuid") + = HttpUtil.get("https://nmsr.nickac.dev/skin/$uuid") - /** - * 获取玩家皮肤源文件 - */ - fun getCapes(uuid: String) - = HttpUtil.get("https://crafatar.com/capes/$uuid") +// /** +// * 获取玩家皮肤源文件 +// */ +// fun getCapes(uuid: String) +// = HttpUtil.get("https://crafatar.com/capes/$uuid") } diff --git a/src/main/kotlin/MinecraftUuidService.kt b/src/main/kotlin/MinecraftUuidService.kt index 6ad3047..dea77fe 100644 --- a/src/main/kotlin/MinecraftUuidService.kt +++ b/src/main/kotlin/MinecraftUuidService.kt @@ -14,22 +14,53 @@ object MinecraftUuidService { * 根据游戏角色名获取UUID */ fun getUuid(username: String) : String { + if (!checkUsername(username)) { + throw IllegalArgumentException("用户名格式不正确") + } + var uuid = JMSPluginData.idMap[username] if (uuid != null) { return uuid } - val retJson = HttpUtil.get("https://tenapi.cn/v2/mc/?uid=$username").decodeToString() + val retJson = HttpUtil.get("https://api.mojang.com/users/profiles/minecraft/$username").decodeToString() +// val retJson = HttpUtil.get("https://tenapi.cn/v2/mc/?uid=$username").decodeToString() val response = Json.decodeFromString(retJson) - if (response["code"]!!.jsonPrimitive.content == "200") { - val elem = response["data"]!!.jsonObject["id"]!!.jsonPrimitive - if (elem == JsonNull) throw Exception("Player UUID Not Found!") - uuid = elem.content - } else { - throw Exception(response["msg"]!!.jsonPrimitive.content) - } +// if (response["code"]!!.jsonPrimitive.content == "200") { +// val elem = response["data"]!!.jsonObject["id"]!!.jsonPrimitive +// if (elem == JsonNull) throw Exception("Player UUID Not Found!") +// uuid = elem.content +// } else { +// throw Exception(response["msg"]!!.jsonPrimitive.content) +// } + if (response.containsKey("id")) { + uuid = response["id"]!!.jsonPrimitive.content + } else if (response.containsKey("errorMessage")) { + throw Exception(response["errorMessage"]!!.jsonPrimitive.content) + } else { + throw Exception("未知错误") + } JMSPluginData.idMap[username] = uuid return uuid } + + /** + * 检查用户名格式 + * 相当于正则 [0-9a-zA-Z_]{2, 16} + * 直接代码检查懒得正则了 + */ + fun checkUsername(username: String): Boolean { + // 长度校验 + if (username.length < 2 || username.length > 16) { + return false + } else { + // 字符校验 + for (ch in username) { + if (!ch.isLetterOrDigit() && ch != '_') + return false + } + return true + } + } } \ No newline at end of file