From 45d642115389c1bd33aef014520869721737fb25 Mon Sep 17 00:00:00 2001 From: ikechan8370 Date: Fri, 24 Nov 2023 01:00:53 +0800 Subject: [PATCH] `Shamrock`: _get_group_notice --- .../fuqiuluo/qqinterface/servlet/GroupSvc.kt | 38 ++++++++++++++++++- .../shamrock/remote/action/ActionManager.kt | 2 +- .../action/handlers/GetEssenceMessageList.kt | 4 +- .../remote/action/handlers/GetGroupNotice.kt | 28 ++++++++++++++ .../shamrock/remote/api/GroupAction.kt | 5 +++ .../remote/service/data/GroupAnnouncement.kt | 24 ++++++++++++ 6 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupNotice.kt create mode 100644 xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/data/GroupAnnouncement.kt diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GroupSvc.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GroupSvc.kt index 9654173..ee70e7c 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GroupSvc.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GroupSvc.kt @@ -40,11 +40,15 @@ import moe.fuqiuluo.shamrock.helper.Level import moe.fuqiuluo.shamrock.helper.LogCenter import moe.fuqiuluo.shamrock.helper.MessageHelper import moe.fuqiuluo.shamrock.remote.service.data.EssenceMessage +import moe.fuqiuluo.shamrock.remote.service.data.GroupAnnouncement +import moe.fuqiuluo.shamrock.remote.service.data.GroupAnnouncementMessage +import moe.fuqiuluo.shamrock.remote.service.data.GroupAnnouncementMessageImage import moe.fuqiuluo.shamrock.tools.EmptyJsonArray import moe.fuqiuluo.shamrock.tools.GlobalClient import moe.fuqiuluo.shamrock.tools.asInt import moe.fuqiuluo.shamrock.tools.asJsonArrayOrNull import moe.fuqiuluo.shamrock.tools.asJsonObject +import moe.fuqiuluo.shamrock.tools.asJsonObjectOrNull import moe.fuqiuluo.shamrock.tools.asLong import moe.fuqiuluo.shamrock.tools.asString import moe.fuqiuluo.shamrock.tools.asStringOrNull @@ -751,7 +755,6 @@ internal object GroupSvc: BaseSvc() { header("Cookie", cookie) } val body = Json.decodeFromStream(response.body()) - LogCenter.log(body.toString(), Level.WARN) if (body.jsonObject["retcode"].asInt == 0) { val data = body.jsonObject["data"].asJsonObject val list = data["msg_list"].asJsonArrayOrNull @@ -780,6 +783,39 @@ internal object GroupSvc: BaseSvc() { } else { return Result.failure(Exception(body.jsonObject["retmsg"].asStringOrNull)) } + } + @OptIn(ExperimentalSerializationApi::class) + suspend fun getGroupAnnouncements(groupId: Long): Result>{ + val cookie = TicketSvc.getCookie("qun.qq.com") + val bkn = TicketSvc.getBkn(TicketSvc.getRealSkey(TicketSvc.getUin())) + val url = "https://web.qun.qq.com/cgi-bin/announce/get_t_list?bkn=${bkn}&qid=${groupId}&ft=23&s=-1&n=20" + val response = GlobalClient.get(url) { + header("Cookie", cookie) + } + val body = Json.decodeFromStream(response.body()) + if (body.jsonObject["ec"].asInt == 0) { + val list = body.jsonObject["feeds"].asJsonArrayOrNull + ?: return Result.success(ArrayList()) + return Result.success(list.map { + val obj = it.jsonObject + GroupAnnouncement( + senderId = obj["u"].asLong, + publishTime = obj["pubt"].asLong, + message = GroupAnnouncementMessage( + text = obj["msg"].asJsonObject["text"].asString, + images = obj["msg"].asJsonObject["pics"].asJsonArrayOrNull?.map { + GroupAnnouncementMessageImage( + id = it.jsonObject["id"].asString, + width = it.jsonObject["w"].asString, + height = it.jsonObject["h"].asString, + ) + } ?: ArrayList() + ) + ) + }) + } else { + return Result.failure(Exception(body.jsonObject["em"].asStringOrNull)) + } } } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/ActionManager.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/ActionManager.kt index 66d5687..779774c 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/ActionManager.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/ActionManager.kt @@ -31,7 +31,7 @@ internal object ActionManager { // GroupActions ModifyTroopName, LeaveTroop, KickTroopMember, BanTroopMember, SetGroupWholeBan, SetGroupAdmin, ModifyTroopMemberName, SetGroupUnique, GetTroopHonor, GroupPoke, SetEssenceMessage, DeleteEssenceMessage, - GetGroupSystemMsg, GetProhibitedMemberList, GetEssenceMessageList, + GetGroupSystemMsg, GetProhibitedMemberList, GetEssenceMessageList, GetGroupNotice, // MSG ACTIONS SendMessage, DeleteMessage, GetMsg, GetForwardMsg, SendGroupForwardMsg, SendGroupMessage, SendPrivateMessage, diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetEssenceMessageList.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetEssenceMessageList.kt index d76991a..9e9f2f7 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetEssenceMessageList.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetEssenceMessageList.kt @@ -28,6 +28,6 @@ internal object GetEssenceMessageList: IActionHandler() { } - override val alias: Array = arrayOf("delete_essence_message") - override fun path(): String = "delete_essence_msg" + override val alias: Array = arrayOf("get_essence_message_list") + override fun path(): String = "get_essence_msg_list" } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupNotice.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupNotice.kt new file mode 100644 index 0000000..51f9f0a --- /dev/null +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupNotice.kt @@ -0,0 +1,28 @@ +package moe.fuqiuluo.shamrock.remote.action.handlers + +import com.tencent.qqnt.kernel.nativeinterface.MsgConstant +import kotlinx.serialization.json.JsonElement +import moe.fuqiuluo.qqinterface.servlet.GroupSvc +import moe.fuqiuluo.qqinterface.servlet.MsgSvc +import moe.fuqiuluo.shamrock.remote.action.ActionSession +import moe.fuqiuluo.shamrock.remote.action.IActionHandler +import moe.fuqiuluo.shamrock.tools.EmptyJsonString + +internal object GetGroupNotice: IActionHandler() { + override suspend fun internalHandle(session: ActionSession): String { + val groupId = session.getLong("group_id") + return invoke(groupId, session.echo) + } + + suspend operator fun invoke(groupId: Long, echo: JsonElement = EmptyJsonString): String { + val announcements = GroupSvc.getGroupAnnouncements(groupId) + if (announcements.isSuccess) { + return ok(announcements.getOrNull(), echo) + } + return logic(announcements.exceptionOrNull()?.message ?: "", echo) + + } + + override val alias: Array = arrayOf("get_group_notice") + override fun path(): String = "_get_group_notice" +} \ 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 27e7b63..dcdcacc 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 @@ -128,4 +128,9 @@ fun Routing.troopAction() { call.respondText(GetGroupSystemMsg(), ContentType.Application.Json) } + getOrPost("/_get_group_notice") { + val groupId = fetchOrThrow("group_id").toLong() + call.respondText(GetGroupNotice(groupId), ContentType.Application.Json) + } + } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/data/GroupAnnouncement.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/data/GroupAnnouncement.kt new file mode 100644 index 0000000..17e7602 --- /dev/null +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/data/GroupAnnouncement.kt @@ -0,0 +1,24 @@ +package moe.fuqiuluo.shamrock.remote.service.data + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +internal data class GroupAnnouncement ( + @SerialName("sender_id") val senderId: Long = 0, + @SerialName("publish_time") val publishTime: Long, + @SerialName("message") val message: GroupAnnouncementMessage, +) + +@Serializable +internal data class GroupAnnouncementMessage ( + @SerialName("text") val text: String, + @SerialName("images") val images: List, +) + +@Serializable +internal data class GroupAnnouncementMessageImage ( + @SerialName("height") val height: String, + @SerialName("width") val width: String, + @SerialName("id") val id: String, +) \ No newline at end of file