From 7bfb9b7b6147bc4c582d192014bd289f87934128 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E6=B1=A0?= <98259561+whitechi73@users.noreply.github.com> Date: Sat, 3 Feb 2024 06:21:34 +0800 Subject: [PATCH] `Shamrock`: support `/set_guild_member_role` --- .../nativeinterface/IKernelGuildService.java | 1 + .../fuqiuluo/qqinterface/servlet/GProSvc.kt | 12 ++++++ .../action/handlers/SetGuildMemberRole.kt | 42 +++++++++++++++++++ .../shamrock/remote/api/GuildAction.kt | 20 +++++++++ 4 files changed, 75 insertions(+) create mode 100644 xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGuildMemberRole.kt diff --git a/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IKernelGuildService.java b/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IKernelGuildService.java index 5e6012e..3fbc69e 100644 --- a/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IKernelGuildService.java +++ b/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IKernelGuildService.java @@ -68,5 +68,6 @@ public interface IKernelGuildService { void deleteRole(long guild, long role, IGProResultCallback cb); + void setMemberRoles(long guild, long u1, long u2, long tinyId, ArrayList addRoles, ArrayList removeRoles, IGProResultCallback cb); } diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GProSvc.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GProSvc.kt index 99a15be..51d4554 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GProSvc.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GProSvc.kt @@ -305,4 +305,16 @@ internal object GProSvc: BaseSvc() { } } } + + fun setMemberRole(guildId: ULong, tinyId: ULong, roleId: ULong, isSet: Boolean) { + val kernelGProService = NTServiceFetcher.kernelService.wrapperSession.guildService + val addList = arrayListOf() + val rmList = arrayListOf() + (if (isSet) addList else rmList).add(roleId.toLong()) + kernelGProService.setMemberRoles(guildId.toLong(), 0, 0, tinyId.toLong(), addList, rmList) { code, msg, result -> + if (code != 0) { + LogCenter.log("setMemberRole failed: $code($msg) => $result", Level.WARN) + } + } + } } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGuildMemberRole.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGuildMemberRole.kt new file mode 100644 index 0000000..0e55a7c --- /dev/null +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGuildMemberRole.kt @@ -0,0 +1,42 @@ +package moe.fuqiuluo.shamrock.remote.action.handlers + +import kotlinx.serialization.json.JsonElement +import moe.fuqiuluo.qqinterface.servlet.GProSvc +import moe.fuqiuluo.shamrock.remote.action.ActionSession +import moe.fuqiuluo.shamrock.remote.action.IActionHandler +import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.shamrock.tools.asString +import moe.fuqiuluo.symbols.OneBotHandler + +@OneBotHandler("set_guild_member_role") +internal object SetGuildMemberRole: IActionHandler() { + override suspend fun internalHandle(session: ActionSession): String { + val guildId = session.getString("guild_id").toULong() + val role = session.getString("role_id").toULong() + val set = session.getBooleanOrDefault("set", false) + return if (session.has("user_id")) { + val userId = session.getString("user_id").toULong() + invoke(guildId, userId, role, set, echo = session.echo) + } else if (session.isArray("users")) { + invoke(guildId, session.getArray("users").map { + it.asString.toULong() + }, role, set, echo = session.echo) + } else { + logic("missing user_id or users", echo = session.echo) + } + } + + operator fun invoke(guildId: ULong, users: List, roleId: ULong, set: Boolean, echo: JsonElement = EmptyJsonString): String { + users.forEach { + GProSvc.setMemberRole(guildId, it, roleId, set) + } + return ok("success", echo = echo) + } + + operator fun invoke(guildId: ULong, user: ULong, roleId: ULong, set: Boolean, echo: JsonElement = EmptyJsonString): String { + GProSvc.setMemberRole(guildId, user, roleId, set) + return ok("success", echo = echo) + } + + override val requiredParams: Array = arrayOf("guild_id", "role_id") +} \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/GuildAction.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/GuildAction.kt index a3504a3..c49c201 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/GuildAction.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/GuildAction.kt @@ -19,12 +19,14 @@ import moe.fuqiuluo.shamrock.remote.action.handlers.GetGuildRoles import moe.fuqiuluo.shamrock.remote.action.handlers.GetGuildServiceProfile import moe.fuqiuluo.shamrock.remote.action.handlers.SendGuildMessage import moe.fuqiuluo.shamrock.remote.action.handlers.SendMessage +import moe.fuqiuluo.shamrock.remote.action.handlers.SetGuildMemberRole import moe.fuqiuluo.shamrock.tools.fetchGetOrNull import moe.fuqiuluo.shamrock.tools.fetchGetOrThrow import moe.fuqiuluo.shamrock.tools.fetchOrNull import moe.fuqiuluo.shamrock.tools.fetchOrThrow import moe.fuqiuluo.shamrock.tools.fetchPostJsonArray import moe.fuqiuluo.shamrock.tools.fetchPostJsonObject +import moe.fuqiuluo.shamrock.tools.fetchPostJsonString import moe.fuqiuluo.shamrock.tools.fetchPostOrNull import moe.fuqiuluo.shamrock.tools.fetchPostOrThrow import moe.fuqiuluo.shamrock.tools.getOrPost @@ -130,4 +132,22 @@ fun Routing.guildAction() { val roleId = fetchOrThrow("role_id").toULong() call.respondText(DeleteGuildRole(guildId, roleId), ContentType.Application.Json) } + + getOrPost("/set_guild_member_role") { + val guildId = fetchOrThrow("guild_id").toULong() + val roleId = fetchOrThrow("role_id").toULong() + val set = fetchOrNull("set")?.toBoolean() ?: false + val userId = fetchOrNull("user_id")?.toULong() + val users = fetchOrNull("users")?.split(",")?.map { it.toULong() } + call.respondText( + if (userId != null) { + SetGuildMemberRole(guildId, userId, roleId, set) + } else if (users != null) { + SetGuildMemberRole(guildId, users, roleId, set) + } else { + throw IllegalArgumentException("missing user_id or users") + }, + ContentType.Application.Json + ) + } } \ No newline at end of file