Shamrock: fix forward msg nesting(x

This commit is contained in:
Simplxs 2023-11-26 22:06:26 +08:00
parent 4a4507dfcd
commit 6b4a429821
No known key found for this signature in database
GPG Key ID: E23537FF14DD6507
10 changed files with 258 additions and 260 deletions

View File

@ -96,9 +96,21 @@ internal object MessageMaker {
"touch" to MessageMaker::createTouchElem, "touch" to MessageMaker::createTouchElem,
"weather" to MessageMaker::createWeatherElem, "weather" to MessageMaker::createWeatherElem,
"json" to MessageMaker::createJsonElem, "json" to MessageMaker::createJsonElem,
//"node" to MessageMaker::createNodeElem,
//"multi_msg" to MessageMaker::createLongMsgStruct, //"multi_msg" to MessageMaker::createLongMsgStruct,
) )
// private suspend fun createNodeElem(
// chatType: Int,
// msgId: Long,
// peerId: String,
// data: JsonObject
// ): Result<MsgElement> {
// data.checkAndThrow("data")
// SendForwardMessage(MsgConstant.KCHATTYPEC2C, TicketSvc.getUin(), data["content"].asJsonArray)
//
// }
private suspend fun createJsonElem( private suspend fun createJsonElem(
chatType: Int, chatType: Int,
msgId: Long, msgId: Long,

View File

@ -74,7 +74,7 @@ internal object MessageHelper {
val nonMsg: Boolean = message.isEmpty() val nonMsg: Boolean = message.isEmpty()
return if (!nonMsg) { return if (!nonMsg) {
val service = QRoute.api(IMsgService::class.java) val service = QRoute.api(IMsgService::class.java)
if(callback is MsgSvc.MessageCallback) { if (callback is MsgSvc.MessageCallback) {
callback.msgHash = uniseq.first callback.msgHash = uniseq.first
} }
@ -107,7 +107,7 @@ internal object MessageHelper {
val nonMsg: Boolean = message.isEmpty() val nonMsg: Boolean = message.isEmpty()
return if (!nonMsg) { return if (!nonMsg) {
val service = QRoute.api(IMsgService::class.java) val service = QRoute.api(IMsgService::class.java)
if(callback is MsgSvc.MessageCallback) { if (callback is MsgSvc.MessageCallback) {
callback.msgHash = uniseq.first callback.msgHash = uniseq.first
} }
@ -132,7 +132,7 @@ internal object MessageHelper {
val nonMsg: Boolean = message.isEmpty() val nonMsg: Boolean = message.isEmpty()
return if (!nonMsg) { return if (!nonMsg) {
val service = QRoute.api(IMsgService::class.java) val service = QRoute.api(IMsgService::class.java)
if(callback is MsgSvc.MessageCallback) { if (callback is MsgSvc.MessageCallback) {
callback.msgHash = uniseq.first callback.msgHash = uniseq.first
} }
@ -156,7 +156,7 @@ internal object MessageHelper {
} }
fun obtainMessageTypeByDetailType(detailType: String): Int { fun obtainMessageTypeByDetailType(detailType: String): Int {
return when(detailType) { return when (detailType) {
"troop", "group" -> MsgConstant.KCHATTYPEGROUP "troop", "group" -> MsgConstant.KCHATTYPEGROUP
"private" -> MsgConstant.KCHATTYPEC2C "private" -> MsgConstant.KCHATTYPEC2C
"less" -> MsgConstant.KCHATTYPETEMPC2CFROMUNKNOWN "less" -> MsgConstant.KCHATTYPETEMPC2CFROMUNKNOWN
@ -166,7 +166,7 @@ internal object MessageHelper {
} }
fun obtainDetailTypeByMsgType(msgType: Int): String { fun obtainDetailTypeByMsgType(msgType: Int): String {
return when(msgType) { return when (msgType) {
MsgConstant.KCHATTYPEGROUP -> "group" MsgConstant.KCHATTYPEGROUP -> "group"
MsgConstant.KCHATTYPEC2C -> "private" MsgConstant.KCHATTYPEC2C -> "private"
MsgConstant.KCHATTYPEGUILD -> "guild" MsgConstant.KCHATTYPEGUILD -> "guild"
@ -180,9 +180,9 @@ internal object MessageHelper {
var hasActionMsg = false var hasActionMsg = false
messageList.forEach { messageList.forEach {
val msg = it.jsonObject val msg = it.jsonObject
try { val maker = MessageMaker[msg["type"].asString]
val maker = MessageMaker[msg["type"].asString] if (maker != null) {
if (maker != null) { try {
val data = msg["data"].asJsonObjectOrNull ?: EmptyJsonObject val data = msg["data"].asJsonObjectOrNull ?: EmptyJsonObject
maker(chatType, msgId, targetUin, data).onSuccess { msgElem -> maker(chatType, msgId, targetUin, data).onSuccess { msgElem ->
msgList.add(msgElem) msgList.add(msgElem)
@ -193,18 +193,19 @@ internal object MessageHelper {
hasActionMsg = true hasActionMsg = true
} }
} }
} else { } catch (e: Throwable) {
LogCenter.log("不支持的消息类型: ${msg["type"].asString}", Level.ERROR) LogCenter.log(e.stackTraceToString(), Level.ERROR)
} }
} catch (e: Throwable) { } else {
LogCenter.log(e.stackTraceToString(), Level.ERROR) LogCenter.log("不支持的消息类型: ${msg["type"].asString}", Level.ERROR)
return false to arrayListOf()
} }
} }
return hasActionMsg to msgList return hasActionMsg to msgList
} }
fun generateMsgIdHash(chatType: Int, msgId: Long): Int { fun generateMsgIdHash(chatType: Int, msgId: Long): Int {
val key = when (chatType) { val key = when (chatType) {
MsgConstant.KCHATTYPEGROUP -> "grp$msgId" MsgConstant.KCHATTYPEGROUP -> "grp$msgId"
MsgConstant.KCHATTYPEC2C -> "c2c$msgId" MsgConstant.KCHATTYPEC2C -> "c2c$msgId"
MsgConstant.KCHATTYPETEMPC2CFROMGROUP -> "tmpgrp$msgId" MsgConstant.KCHATTYPETEMPC2CFROMGROUP -> "tmpgrp$msgId"

View File

@ -34,8 +34,8 @@ internal object ActionManager {
GetGroupSystemMsg, GetProhibitedMemberList, GetEssenceMessageList, GetGroupNotice, SendGroupNotice, GetGroupSystemMsg, GetProhibitedMemberList, GetEssenceMessageList, GetGroupNotice, SendGroupNotice,
// MSG ACTIONS // MSG ACTIONS
SendMessage, DeleteMessage, GetMsg, GetForwardMsg, SendGroupForwardMsg, SendGroupMessage, SendPrivateMessage, SendMessage, DeleteMessage, GetMsg, GetForwardMsg, SendPrivateForwardMessage, SendGroupMessage, SendPrivateMessage,
ClearMsgs, GetHistoryMsg, GetGroupMsgHistory, SendPrivateForwardMsg, ClearMsgs, GetHistoryMsg, GetGroupMsgHistory, SendGroupForwardMessage,
// RESOURCE ACTION // RESOURCE ACTION
GetRecord, GetImage, UploadGroupFile, CreateGroupFileFolder, DeleteGroupFolder, GetRecord, GetImage, UploadGroupFile, CreateGroupFileFolder, DeleteGroupFolder,

View File

@ -0,0 +1,169 @@
package moe.fuqiuluo.shamrock.remote.action.handlers
import com.tencent.qqnt.kernel.nativeinterface.MsgConstant
import com.tencent.qqnt.kernel.nativeinterface.MultiMsgInfo
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.JsonElement
import moe.fuqiuluo.qqinterface.servlet.MsgSvc
import moe.fuqiuluo.qqinterface.servlet.TicketSvc
import moe.fuqiuluo.qqinterface.servlet.msg.convert.toSegments
import moe.fuqiuluo.shamrock.helper.Level
import moe.fuqiuluo.shamrock.helper.LogCenter
import moe.fuqiuluo.shamrock.helper.MessageHelper
import moe.fuqiuluo.shamrock.helper.ParamsException
import moe.fuqiuluo.shamrock.remote.action.ActionSession
import moe.fuqiuluo.shamrock.remote.action.IActionHandler
import moe.fuqiuluo.shamrock.remote.service.data.ForwardMessageResult
import moe.fuqiuluo.shamrock.tools.*
import moe.fuqiuluo.shamrock.xposed.helper.NTServiceFetcher
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
sealed interface ForwardMsgNode {
class MessageIdNode(
val id: Int
) : ForwardMsgNode
open class MessageNode(
val name: String,
val content: JsonElement?
) : ForwardMsgNode
object EmptyNode : MessageNode("", null)
}
internal object SendForwardMessage : IActionHandler() {
override suspend fun internalHandle(session: ActionSession): String {
val detailType = session.getStringOrNull("detail_type") ?: session.getStringOrNull("message_type")
try {
val chatType = detailType?.let {
MessageHelper.obtainMessageTypeByDetailType(it)
} ?: run {
if (session.has("user_id")) {
MsgConstant.KCHATTYPEC2C
} else if (session.has("group_id")) {
MsgConstant.KCHATTYPEGROUP
} else {
return noParam("detail_type/message_type", session.echo)
}
}
val peerId = when (chatType) {
MsgConstant.KCHATTYPEGROUP -> session.getStringOrNull("group_id") ?: return noParam(
"group_id",
session.echo
)
MsgConstant.KCHATTYPEC2C -> session.getStringOrNull("user_id") ?: return noParam(
"user_id",
session.echo
)
else -> error("unknown chat type: $chatType")
}
if (session.isArray("messages")) {
val messages = session.getArray("messages")
invoke(chatType, peerId, messages, echo = session.echo)
}
return logic("未知格式合并转发消息", session.echo)
} catch (e: ParamsException) {
return noParam(e.message!!, session.echo)
} catch (e: Throwable) {
return logic(e.message ?: e.toString(), session.echo)
}
}
suspend operator fun invoke(
chatType: Int,
peerId: String,
message: JsonArray,
echo: JsonElement = EmptyJsonString
): String {
kotlin.runCatching {
val kernelService = NTServiceFetcher.kernelService
val sessionService = kernelService.wrapperSession
val msgService = sessionService.msgService
val selfUin = TicketSvc.getUin()
val msgs = message.map {
if (it.asJsonObject["type"].asStringOrNull != "node") return@map ForwardMsgNode.EmptyNode // 过滤非node类型消息段
it.asJsonObject["data"].asJsonObject.let { data ->
if (data.containsKey("content")) {
data["content"].asJsonArray.forEach { msg ->
if (msg.asJsonObject["type"].asStringOrNull == "node") {
LogCenter.log("合并转发消息不支持嵌套", Level.ERROR)
return@map ForwardMsgNode.EmptyNode
}
}
ForwardMsgNode.MessageNode(
name = data["name"].asStringOrNull ?: "",
content = data["content"]
)
}
else ForwardMsgNode.MessageIdNode(data["id"].asInt)
}
}.map {
if (it is ForwardMsgNode.MessageIdNode) {
val recordResult = MsgSvc.getMsg(it.id)
if (!recordResult.isFailure) {
ForwardMsgNode.EmptyNode
} else {
val record = recordResult.getOrThrow()
ForwardMsgNode.MessageNode(
name = record.sendMemberName
.ifBlank { record.sendNickName }
.ifBlank { record.sendRemarkName }
.ifBlank { record.peerName },
content = record.toSegments().map { segment ->
segment.toJson()
}.json
)
}
} else {
it as ForwardMsgNode.MessageNode
}
}.filter {
it.content != null
}
val multiNodes = msgs.map { node ->
suspendCoroutine {
GlobalScope.launch {
var msgId: Long = 0
msgId = MessageHelper.sendMessageWithMsgId(MsgConstant.KCHATTYPEC2C, selfUin, node.content!!.let { msg ->
if (msg is JsonArray) msg else MessageHelper.decodeCQCode(msg.asString)
},
{ code, why ->
if (code != 0) {
error("合并转发消息节点消息发送失败:$code($why)")
}
it.resume(node.name to msgId)
}).first
}
}
}
val from = MessageHelper.generateContact(MsgConstant.KCHATTYPEC2C, selfUin)
val to = MessageHelper.generateContact(chatType, peerId)
val uniseq = MessageHelper.generateMsgId(chatType)
msgService.multiForwardMsg(ArrayList<MultiMsgInfo>().apply {
multiNodes.forEach { add(MultiMsgInfo(it.second, it.first)) }
}.also { it.reverse() }, from, to, MsgSvc.MessageCallback(peerId, uniseq.first))
return ok(
ForwardMessageResult(
msgId = uniseq.first,
forwardId = ""
), echo = echo)
}.onFailure {
return error("error: $it", echo)
}
return logic("合并转发消息失败(unknown error)", echo)
}
override val requiredParams: Array<String> = arrayOf("message")
override fun path(): String = "send_forward_msg"
}

View File

@ -1,233 +0,0 @@
@file:OptIn(DelicateCoroutinesApi::class)
package moe.fuqiuluo.shamrock.remote.action.handlers
import com.tencent.qqnt.kernel.nativeinterface.MsgConstant
import com.tencent.qqnt.kernel.nativeinterface.MultiMsgInfo
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.JsonElement
import moe.fuqiuluo.qqinterface.servlet.MsgSvc
import moe.fuqiuluo.shamrock.remote.action.ActionSession
import moe.fuqiuluo.shamrock.remote.action.IActionHandler
import moe.fuqiuluo.qqinterface.servlet.TicketSvc
import moe.fuqiuluo.qqinterface.servlet.msg.convert.toSegments
import moe.fuqiuluo.shamrock.helper.Level
import moe.fuqiuluo.shamrock.helper.LogCenter
import moe.fuqiuluo.shamrock.helper.MessageHelper
import moe.fuqiuluo.shamrock.tools.EmptyJsonObject
import moe.fuqiuluo.shamrock.tools.EmptyJsonString
import moe.fuqiuluo.shamrock.tools.asInt
import moe.fuqiuluo.shamrock.tools.asJsonObject
import moe.fuqiuluo.shamrock.tools.asString
import moe.fuqiuluo.shamrock.tools.asStringOrNull
import moe.fuqiuluo.shamrock.tools.json
import moe.fuqiuluo.shamrock.xposed.helper.NTServiceFetcher
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
/**
* 合并转发消息节点数据类
*/
sealed interface ForwardMsgNode {
class MessageIdNode(
val id: Int
): ForwardMsgNode
open class MessageNode(
val name: String,
val content: JsonElement?
): ForwardMsgNode
object EmptyNode: MessageNode("", null)
}
/**
* 私聊合并转发
*/
internal object SendPrivateForwardMsg: IActionHandler() {
override suspend fun internalHandle(session: ActionSession): String {
val groupId = session.getString("user_id")
if (session.isArray("messages")) {
val messages = session.getArray("messages")
return invoke(messages, groupId, session.echo)
}
return logic("未知格式合并转发消息", session.echo)
}
suspend operator fun invoke(
message: JsonArray,
userId: String,
echo: JsonElement = EmptyJsonString
): String {
kotlin.runCatching {
val kernelService = NTServiceFetcher.kernelService
val sessionService = kernelService.wrapperSession
val msgService = sessionService.msgService
val selfUin = TicketSvc.getUin()
val msgs = message.map {
if (it.asJsonObject["type"].asStringOrNull != "node") return@map ForwardMsgNode.EmptyNode // 过滤非node类型消息段
it.asJsonObject["data"].asJsonObject.let { data ->
if (data.containsKey("content"))
ForwardMsgNode.MessageNode(
name = data["name"].asStringOrNull ?: "",
content = data["content"]
)
else ForwardMsgNode.MessageIdNode(data["id"].asInt)
}
}.map {
if (it is ForwardMsgNode.MessageIdNode) {
val recordResult = MsgSvc.getMsg(it.id)
if (recordResult.isFailure) {
ForwardMsgNode.EmptyNode
} else {
val record = recordResult.getOrThrow()
ForwardMsgNode.MessageNode(
name = record.sendMemberName
.ifBlank { record.sendNickName }
.ifBlank { record.sendRemarkName }
.ifBlank { record.peerName },
content = record.toSegments().map { segment ->
segment.toJson()
}.json
)
}
} else {
it as ForwardMsgNode.MessageNode
}
}.filter {
it.content != null
}
val multiNodes = msgs.map { node ->
suspendCoroutine {
GlobalScope.launch {
var msgId: Long = 0
msgId = MessageHelper.sendMessageWithMsgId(MsgConstant.KCHATTYPEC2C, selfUin, node.content!!.let { msg ->
if (msg is JsonArray) msg else MessageHelper.decodeCQCode(msg.asString)
}, { code, why ->
if (code != 0) {
LogCenter.log("合并转发消息节点消息发送失败:$code($why)", Level.WARN)
}
it.resume(node.name to msgId)
}).first
}
}
}
val from = MessageHelper.generateContact(MsgConstant.KCHATTYPEC2C, selfUin)
val to = MessageHelper.generateContact(MsgConstant.KCHATTYPEC2C, userId)
msgService.multiForwardMsg(ArrayList<MultiMsgInfo>().apply {
multiNodes.forEach { add(MultiMsgInfo(it.second, it.first)) }
}.also { it.reverse() }, from, to) { code, why ->
if (code != 0)
LogCenter.log("合并转发消息:$code($why)", Level.WARN)
}
return ok(data = EmptyJsonObject, echo = echo)
}.onFailure {
return error("error: $it", echo)
}
return logic("合并转发消息失败(unknown error)", echo)
}
override val requiredParams: Array<String> = arrayOf("user_id")
override fun path(): String = "send_private_forward_msg"
}
/**
* 群聊合并转发
*/
internal object SendGroupForwardMsg: IActionHandler() {
override suspend fun internalHandle(session: ActionSession): String {
val groupId = session.getString("group_id")
if (session.isArray("messages")) {
val messages = session.getArray("messages")
return invoke(messages, groupId, session.echo)
}
return logic("未知格式合并转发消息", session.echo)
}
suspend operator fun invoke(
message: JsonArray,
groupId: String,
echo: JsonElement = EmptyJsonString
): String {
kotlin.runCatching {
val kernelService = NTServiceFetcher.kernelService
val sessionService = kernelService.wrapperSession
val msgService = sessionService.msgService
val selfUin = TicketSvc.getUin()
val msgs = message.map {
if (it.asJsonObject["type"].asStringOrNull != "node") return@map ForwardMsgNode.EmptyNode // 过滤非node类型消息段
it.asJsonObject["data"].asJsonObject.let { data ->
if (data.containsKey("content"))
ForwardMsgNode.MessageNode(
name = data["name"].asStringOrNull ?: "",
content = data["content"]
)
else ForwardMsgNode.MessageIdNode(data["id"].asInt)
}
}.map {
if (it is ForwardMsgNode.MessageIdNode) {
val recordResult = MsgSvc.getMsg(it.id)
if (recordResult.isFailure) {
ForwardMsgNode.EmptyNode
} else {
val record = recordResult.getOrThrow()
ForwardMsgNode.MessageNode(
name = record.sendMemberName
.ifBlank { record.sendNickName }
.ifBlank { record.sendRemarkName }
.ifBlank { record.peerName },
content = record.toSegments().map { segment ->
segment.toJson()
}.json
)
}
} else {
it as ForwardMsgNode.MessageNode
}
}.filter {
it.content != null
}
val multiNodes = msgs.map { node ->
suspendCoroutine {
GlobalScope.launch {
var msgId: Long = 0
msgId = MessageHelper.sendMessageWithMsgId(MsgConstant.KCHATTYPEC2C, selfUin, node.content!!.let { msg ->
if (msg is JsonArray) msg else MessageHelper.decodeCQCode(msg.asString)
}, { code, why ->
if (code != 0) {
LogCenter.log("合并转发消息节点消息发送失败:$code($why)", Level.WARN)
}
it.resume(node.name to msgId)
}).first
}
}
}
val from = MessageHelper.generateContact(MsgConstant.KCHATTYPEC2C, selfUin)
val to = MessageHelper.generateContact(MsgConstant.KCHATTYPEGROUP, groupId)
msgService.multiForwardMsg(ArrayList<MultiMsgInfo>().apply {
multiNodes.forEach { add(MultiMsgInfo(it.second, it.first)) }
}.also { it.reverse() }, from, to) { code, why ->
if (code != 0)
LogCenter.log("合并转发消息:$code($why)", Level.WARN)
}
return ok(data = EmptyJsonObject, echo = echo)
}.onFailure {
return error("error: $it", echo)
}
return logic("合并转发消息失败(unknown error)", echo)
}
override val requiredParams: Array<String> = arrayOf("group_id")
override fun path(): String = "send_group_forward_msg"
}

View File

@ -0,0 +1,21 @@
package moe.fuqiuluo.shamrock.remote.action.handlers;
import com.tencent.qqnt.kernel.nativeinterface.MsgConstant
import moe.fuqiuluo.shamrock.remote.action.ActionSession
import moe.fuqiuluo.shamrock.remote.action.IActionHandler
internal object SendGroupForwardMessage: IActionHandler() {
override suspend fun internalHandle(session: ActionSession): String {
val groupId = session.getString("group_id")
return if (session.isArray("messages")) {
val messages = session.getArray("messages")
SendForwardMessage(MsgConstant.KCHATTYPEGROUP, groupId, messages, session.echo)
} else {
logic("未知格式合并转发消息", session.echo)
}
}
override val requiredParams: Array<String> = arrayOf("messages", "group_id")
override fun path(): String = "send_group_forward_msg"
}

View File

@ -0,0 +1,21 @@
package moe.fuqiuluo.shamrock.remote.action.handlers;
import com.tencent.qqnt.kernel.nativeinterface.MsgConstant
import moe.fuqiuluo.shamrock.remote.action.ActionSession
import moe.fuqiuluo.shamrock.remote.action.IActionHandler
internal object SendPrivateForwardMessage : IActionHandler() {
override suspend fun internalHandle(session: ActionSession): String {
val userId = session.getString("user_id")
return if (session.isArray("messages")) {
val messages = session.getArray("messages")
SendForwardMessage(MsgConstant.KCHATTYPEC2C, userId, messages, session.echo)
} else {
logic("未知格式合并转发消息", session.echo)
}
}
override val requiredParams: Array<String> = arrayOf("messages", "user_id")
override fun path(): String = "send_private_forward_msg"
}

View File

@ -9,12 +9,12 @@ internal object SendPrivateMessage: IActionHandler() {
override suspend fun internalHandle(session: ActionSession): String { override suspend fun internalHandle(session: ActionSession): String {
val userId = session.getString("user_id") val userId = session.getString("user_id")
val groupId = session.getStringOrNull("group_id") val groupId = session.getStringOrNull("group_id")
val chatTYpe = if (groupId == null) MsgConstant.KCHATTYPEC2C else MsgConstant.KCHATTYPETEMPC2CFROMGROUP val chatType = if (groupId == null) MsgConstant.KCHATTYPEC2C else MsgConstant.KCHATTYPETEMPC2CFROMGROUP
return if (session.isString("message")) { return if (session.isString("message")) {
val autoEscape = session.getBooleanOrDefault("auto_escape", false) val autoEscape = session.getBooleanOrDefault("auto_escape", false)
val message = session.getString("message") val message = session.getString("message")
SendMessage.invoke( SendMessage.invoke(
chatType = chatTYpe, chatType = chatType,
peerId = userId, peerId = userId,
message = message, message = message,
autoEscape = autoEscape, autoEscape = autoEscape,
@ -24,7 +24,7 @@ internal object SendPrivateMessage: IActionHandler() {
} else if (session.isArray("message")) { } else if (session.isArray("message")) {
val message = session.getArray("message") val message = session.getArray("message")
SendMessage( SendMessage(
chatType = chatTYpe, chatType = chatType,
peerId = userId, peerId = userId,
message = message, message = message,
echo = session.echo, echo = session.echo,
@ -33,7 +33,7 @@ internal object SendPrivateMessage: IActionHandler() {
} else { } else {
val message = session.getObject("message") val message = session.getObject("message")
SendMessage( SendMessage(
chatType = chatTYpe, chatType = chatType,
peerId = userId, peerId = userId,
message = listOf( message ).jsonArray, message = listOf( message ).jsonArray,
echo = session.echo, echo = session.echo,

View File

@ -33,20 +33,22 @@ fun Routing.messageAction() {
post { post {
val groupId = fetchPostOrNull("group_id") val groupId = fetchPostOrNull("group_id")
val messages = fetchPostJsonArray("messages") val messages = fetchPostJsonArray("messages")
call.respondText(SendGroupForwardMsg(messages, groupId ?: ""), ContentType.Application.Json) call.respondText(SendForwardMessage(MsgConstant.KCHATTYPEGROUP, groupId ?: "", messages), ContentType.Application.Json)
} }
get { get {
respond(false, Status.InternalHandlerError, "Not support GET method") respond(false, Status.InternalHandlerError, "Not support GET method")
} }
} }
post("/send_group_forward_msg") {
} route("/send_private_forward_msg") {
post {
post("/send_private_forward_msg") { val userId = fetchPostOrNull("user_id")
val userId = fetchPostOrNull("user_id") val messages = fetchPostJsonArray("messages")
val messages = fetchPostJsonArray("messages") call.respondText(SendForwardMessage(MsgConstant.KCHATTYPEC2C, userId ?: "", messages), ContentType.Application.Json)
call.respondText(SendPrivateForwardMsg(messages, userId ?: ""), ContentType.Application.Json) }
get {
respond(false, Status.InternalHandlerError, "Not support GET method")
}
} }
getOrPost("/get_forward_msg") { getOrPost("/get_forward_msg") {

View File

@ -9,6 +9,11 @@ internal data class MessageResult(
@SerialName("message_id") val msgId: Int, @SerialName("message_id") val msgId: Int,
@SerialName("time") val time: Long @SerialName("time") val time: Long
) )
@Serializable
internal data class ForwardMessageResult(
@SerialName("message_id") val msgId: Int,
@SerialName("forward_id") val forwardId: String
)
@Serializable @Serializable
internal data class MessageDetail( internal data class MessageDetail(