From c97f79335a6b6e1b048894aea10770a9bec34114 Mon Sep 17 00:00:00 2001 From: whitechi73 Date: Sun, 28 Jan 2024 23:45:05 +0800 Subject: [PATCH] `Shamrock`: Support `/set_group_comment_face` --- .../protobuf/oidb/cmd0x9082/Oidb0x9082.kt | 14 +++++++++ .../fuqiuluo/qqinterface/servlet/ChatSvc.kt | 19 ++++++++++++ .../action/handlers/SetGroupCommentFace.kt | 30 +++++++++++++++++++ .../shamrock/remote/api/GroupAction.kt | 19 +++++++++--- 4 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 protobuf/src/main/java/moe/whitechi73/protobuf/oidb/cmd0x9082/Oidb0x9082.kt create mode 100644 xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/ChatSvc.kt create mode 100644 xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupCommentFace.kt diff --git a/protobuf/src/main/java/moe/whitechi73/protobuf/oidb/cmd0x9082/Oidb0x9082.kt b/protobuf/src/main/java/moe/whitechi73/protobuf/oidb/cmd0x9082/Oidb0x9082.kt new file mode 100644 index 0000000..c118b30 --- /dev/null +++ b/protobuf/src/main/java/moe/whitechi73/protobuf/oidb/cmd0x9082/Oidb0x9082.kt @@ -0,0 +1,14 @@ +package moe.whitechi73.protobuf.oidb.cmd0x9082 + +import kotlinx.serialization.Serializable +import kotlinx.serialization.protobuf.ProtoNumber + +@Serializable +data class Oidb0x9082( + @ProtoNumber(2) val peer: ULong = ULong.MIN_VALUE, + @ProtoNumber(3) val msgSeq: ULong = ULong.MIN_VALUE, + @ProtoNumber(4) val faceIndex: String = "", + @ProtoNumber(5) val flag: UInt = UInt.MIN_VALUE, + @ProtoNumber(6) val u1: UInt = UInt.MIN_VALUE, + @ProtoNumber(7) val u2: UInt = UInt.MIN_VALUE, +) diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/ChatSvc.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/ChatSvc.kt new file mode 100644 index 0000000..e4f8aae --- /dev/null +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/ChatSvc.kt @@ -0,0 +1,19 @@ +package moe.fuqiuluo.qqinterface.servlet + +import kotlinx.serialization.encodeToByteArray +import kotlinx.serialization.protobuf.ProtoBuf +import moe.whitechi73.protobuf.oidb.cmd0x9082.Oidb0x9082 + +internal object ChatSvc: BaseSvc() { + fun setGroupMessageCommentFace(peer: Long, msgSeq: ULong, faceIndex: String, isSet: Boolean) { + val serviceId = if (isSet) 1 else 2 + sendOidb("OidbSvcTrpcTcp.0x9082_$serviceId", 36994, serviceId, ProtoBuf.encodeToByteArray(Oidb0x9082( + peer = peer.toULong(), + msgSeq = msgSeq, + faceIndex = faceIndex, + flag = 1u, + u1 = 0u, + u2 = 0u + ))) + } +} \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupCommentFace.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupCommentFace.kt new file mode 100644 index 0000000..da9b32c --- /dev/null +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupCommentFace.kt @@ -0,0 +1,30 @@ +package moe.fuqiuluo.shamrock.remote.action.handlers + +import kotlinx.serialization.json.JsonElement +import moe.fuqiuluo.qqinterface.servlet.ChatSvc +import moe.fuqiuluo.qqinterface.servlet.MsgSvc +import moe.fuqiuluo.shamrock.helper.MessageHelper +import moe.fuqiuluo.shamrock.remote.action.ActionSession +import moe.fuqiuluo.shamrock.remote.action.IActionHandler +import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.symbols.OneBotHandler + +@OneBotHandler("set_group_comment_face") +internal object SetGroupCommentFace: IActionHandler() { + override suspend fun internalHandle(session: ActionSession): String { + val groupId = session.getLong("group_id") + val msgId = session.getIntOrNull("msg_id") ?: session.getInt("message_id") + val faceId = session.getInt("face_id") + val isSet = session.getBooleanOrDefault("is_set", true) + return invoke(groupId, msgId, faceId, isSet, session.echo) + } + + operator fun invoke(groupId: Long, msgHash: Int, faceIndex: Int, isSet: Boolean, echo: JsonElement = EmptyJsonString): String { + val mapping = MessageHelper.getMsgMappingByHash(msgHash) + ?: return error("failed to locate message", echo = echo) + ChatSvc.setGroupMessageCommentFace(groupId, mapping.msgSeq.toULong(), faceIndex.toString(), isSet) + return ok("success", echo = echo) + } + + override val requiredParams: Array = arrayOf("group_id", "face_id") +} \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/GroupAction.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/GroupAction.kt index 23fbd7d..38a2cd9 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/GroupAction.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/GroupAction.kt @@ -1,19 +1,30 @@ package moe.fuqiuluo.shamrock.remote.api import io.ktor.http.ContentType -import moe.fuqiuluo.shamrock.helper.LogicException import io.ktor.server.application.call import io.ktor.server.response.respondText import io.ktor.server.routing.Routing -import moe.fuqiuluo.shamrock.remote.action.ActionManager -import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.handlers.* -import moe.fuqiuluo.shamrock.tools.fetch +import moe.fuqiuluo.shamrock.tools.fetchGetOrNull import moe.fuqiuluo.shamrock.tools.fetchOrNull import moe.fuqiuluo.shamrock.tools.fetchOrThrow import moe.fuqiuluo.shamrock.tools.getOrPost fun Routing.troopAction() { + getOrPost("/set_group_comment_face") { + val groupId = fetchOrThrow("group_id").toLong() + val msgId = fetchOrNull("msg_id")?.toIntOrNull() ?: fetchOrThrow("message_id").toInt() + val faceId = fetchOrThrow("face_id").toInt() + val isSet = fetchGetOrNull("is_set") ?: "true" + call.respondText(SetGroupCommentFace(groupId, msgId, faceId, when(isSet) { + "true" -> true + "false" -> false + "1" -> true + "0" -> false + else -> true + }), ContentType.Application.Json) + } + getOrPost("/get_not_joined_group_info") { val groupId = fetchOrThrow("group_id") call.respondText(GetNotJoinedGroupInfo(groupId), ContentType.Application.Json)