Shamrock: _get_group_notice

This commit is contained in:
ikechan8370 2023-11-24 01:00:53 +08:00
parent b23620b5ef
commit 45d6421153
6 changed files with 97 additions and 4 deletions

View File

@ -40,11 +40,15 @@ import moe.fuqiuluo.shamrock.helper.Level
import moe.fuqiuluo.shamrock.helper.LogCenter import moe.fuqiuluo.shamrock.helper.LogCenter
import moe.fuqiuluo.shamrock.helper.MessageHelper import moe.fuqiuluo.shamrock.helper.MessageHelper
import moe.fuqiuluo.shamrock.remote.service.data.EssenceMessage 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.EmptyJsonArray
import moe.fuqiuluo.shamrock.tools.GlobalClient import moe.fuqiuluo.shamrock.tools.GlobalClient
import moe.fuqiuluo.shamrock.tools.asInt import moe.fuqiuluo.shamrock.tools.asInt
import moe.fuqiuluo.shamrock.tools.asJsonArrayOrNull import moe.fuqiuluo.shamrock.tools.asJsonArrayOrNull
import moe.fuqiuluo.shamrock.tools.asJsonObject import moe.fuqiuluo.shamrock.tools.asJsonObject
import moe.fuqiuluo.shamrock.tools.asJsonObjectOrNull
import moe.fuqiuluo.shamrock.tools.asLong import moe.fuqiuluo.shamrock.tools.asLong
import moe.fuqiuluo.shamrock.tools.asString import moe.fuqiuluo.shamrock.tools.asString
import moe.fuqiuluo.shamrock.tools.asStringOrNull import moe.fuqiuluo.shamrock.tools.asStringOrNull
@ -751,7 +755,6 @@ internal object GroupSvc: BaseSvc() {
header("Cookie", cookie) header("Cookie", cookie)
} }
val body = Json.decodeFromStream<JsonElement>(response.body()) val body = Json.decodeFromStream<JsonElement>(response.body())
LogCenter.log(body.toString(), Level.WARN)
if (body.jsonObject["retcode"].asInt == 0) { if (body.jsonObject["retcode"].asInt == 0) {
val data = body.jsonObject["data"].asJsonObject val data = body.jsonObject["data"].asJsonObject
val list = data["msg_list"].asJsonArrayOrNull val list = data["msg_list"].asJsonArrayOrNull
@ -780,6 +783,39 @@ internal object GroupSvc: BaseSvc() {
} else { } else {
return Result.failure(Exception(body.jsonObject["retmsg"].asStringOrNull)) return Result.failure(Exception(body.jsonObject["retmsg"].asStringOrNull))
} }
}
@OptIn(ExperimentalSerializationApi::class)
suspend fun getGroupAnnouncements(groupId: Long): Result<List<GroupAnnouncement>>{
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<JsonElement>(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))
}
} }
} }

View File

@ -31,7 +31,7 @@ internal object ActionManager {
// GroupActions // GroupActions
ModifyTroopName, LeaveTroop, KickTroopMember, BanTroopMember, SetGroupWholeBan, SetGroupAdmin, ModifyTroopName, LeaveTroop, KickTroopMember, BanTroopMember, SetGroupWholeBan, SetGroupAdmin,
ModifyTroopMemberName, SetGroupUnique, GetTroopHonor, GroupPoke, SetEssenceMessage, DeleteEssenceMessage, ModifyTroopMemberName, SetGroupUnique, GetTroopHonor, GroupPoke, SetEssenceMessage, DeleteEssenceMessage,
GetGroupSystemMsg, GetProhibitedMemberList, GetEssenceMessageList, GetGroupSystemMsg, GetProhibitedMemberList, GetEssenceMessageList, GetGroupNotice,
// MSG ACTIONS // MSG ACTIONS
SendMessage, DeleteMessage, GetMsg, GetForwardMsg, SendGroupForwardMsg, SendGroupMessage, SendPrivateMessage, SendMessage, DeleteMessage, GetMsg, GetForwardMsg, SendGroupForwardMsg, SendGroupMessage, SendPrivateMessage,

View File

@ -28,6 +28,6 @@ internal object GetEssenceMessageList: IActionHandler() {
} }
override val alias: Array<String> = arrayOf("delete_essence_message") override val alias: Array<String> = arrayOf("get_essence_message_list")
override fun path(): String = "delete_essence_msg" override fun path(): String = "get_essence_msg_list"
} }

View File

@ -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<String> = arrayOf("get_group_notice")
override fun path(): String = "_get_group_notice"
}

View File

@ -128,4 +128,9 @@ fun Routing.troopAction() {
call.respondText(GetGroupSystemMsg(), ContentType.Application.Json) call.respondText(GetGroupSystemMsg(), ContentType.Application.Json)
} }
getOrPost("/_get_group_notice") {
val groupId = fetchOrThrow("group_id").toLong()
call.respondText(GetGroupNotice(groupId), ContentType.Application.Json)
}
} }

View File

@ -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<GroupAnnouncementMessageImage>,
)
@Serializable
internal data class GroupAnnouncementMessageImage (
@SerialName("height") val height: String,
@SerialName("width") val width: String,
@SerialName("id") val id: String,
)