mirror of
https://github.com/whitechi73/OpenShamrock.git
synced 2024-08-14 13:12:17 +08:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
ae1e78b267
@ -96,9 +96,21 @@ internal object MessageMaker {
|
||||
"touch" to MessageMaker::createTouchElem,
|
||||
"weather" to MessageMaker::createWeatherElem,
|
||||
"json" to MessageMaker::createJsonElem,
|
||||
//"node" to MessageMaker::createNodeElem,
|
||||
//"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(
|
||||
chatType: Int,
|
||||
msgId: Long,
|
||||
|
@ -74,7 +74,7 @@ internal object MessageHelper {
|
||||
val nonMsg: Boolean = message.isEmpty()
|
||||
return if (!nonMsg) {
|
||||
val service = QRoute.api(IMsgService::class.java)
|
||||
if(callback is MsgSvc.MessageCallback) {
|
||||
if (callback is MsgSvc.MessageCallback) {
|
||||
callback.msgHash = uniseq.first
|
||||
}
|
||||
|
||||
@ -107,7 +107,7 @@ internal object MessageHelper {
|
||||
val nonMsg: Boolean = message.isEmpty()
|
||||
return if (!nonMsg) {
|
||||
val service = QRoute.api(IMsgService::class.java)
|
||||
if(callback is MsgSvc.MessageCallback) {
|
||||
if (callback is MsgSvc.MessageCallback) {
|
||||
callback.msgHash = uniseq.first
|
||||
}
|
||||
|
||||
@ -132,7 +132,7 @@ internal object MessageHelper {
|
||||
val nonMsg: Boolean = message.isEmpty()
|
||||
return if (!nonMsg) {
|
||||
val service = QRoute.api(IMsgService::class.java)
|
||||
if(callback is MsgSvc.MessageCallback) {
|
||||
if (callback is MsgSvc.MessageCallback) {
|
||||
callback.msgHash = uniseq.first
|
||||
}
|
||||
|
||||
@ -156,7 +156,7 @@ internal object MessageHelper {
|
||||
}
|
||||
|
||||
fun obtainMessageTypeByDetailType(detailType: String): Int {
|
||||
return when(detailType) {
|
||||
return when (detailType) {
|
||||
"troop", "group" -> MsgConstant.KCHATTYPEGROUP
|
||||
"private" -> MsgConstant.KCHATTYPEC2C
|
||||
"less" -> MsgConstant.KCHATTYPETEMPC2CFROMUNKNOWN
|
||||
@ -166,7 +166,7 @@ internal object MessageHelper {
|
||||
}
|
||||
|
||||
fun obtainDetailTypeByMsgType(msgType: Int): String {
|
||||
return when(msgType) {
|
||||
return when (msgType) {
|
||||
MsgConstant.KCHATTYPEGROUP -> "group"
|
||||
MsgConstant.KCHATTYPEC2C -> "private"
|
||||
MsgConstant.KCHATTYPEGUILD -> "guild"
|
||||
@ -180,9 +180,9 @@ internal object MessageHelper {
|
||||
var hasActionMsg = false
|
||||
messageList.forEach {
|
||||
val msg = it.jsonObject
|
||||
try {
|
||||
val maker = MessageMaker[msg["type"].asString]
|
||||
if (maker != null) {
|
||||
try {
|
||||
val data = msg["data"].asJsonObjectOrNull ?: EmptyJsonObject
|
||||
maker(chatType, msgId, targetUin, data).onSuccess { msgElem ->
|
||||
msgList.add(msgElem)
|
||||
@ -193,12 +193,13 @@ internal object MessageHelper {
|
||||
hasActionMsg = true
|
||||
}
|
||||
}
|
||||
} else {
|
||||
LogCenter.log("不支持的消息类型: ${msg["type"].asString}", Level.ERROR)
|
||||
}
|
||||
} catch (e: Throwable) {
|
||||
LogCenter.log(e.stackTraceToString(), Level.ERROR)
|
||||
}
|
||||
} else {
|
||||
LogCenter.log("不支持的消息类型: ${msg["type"].asString}", Level.ERROR)
|
||||
return false to arrayListOf()
|
||||
}
|
||||
}
|
||||
return hasActionMsg to msgList
|
||||
}
|
||||
|
@ -34,8 +34,8 @@ internal object ActionManager {
|
||||
GetGroupSystemMsg, GetProhibitedMemberList, GetEssenceMessageList, GetGroupNotice, SendGroupNotice,
|
||||
|
||||
// MSG ACTIONS
|
||||
SendMessage, DeleteMessage, GetMsg, GetForwardMsg, SendGroupForwardMsg, SendGroupMessage, SendPrivateMessage,
|
||||
ClearMsgs, GetHistoryMsg, GetGroupMsgHistory, SendPrivateForwardMsg,
|
||||
SendMessage, DeleteMessage, GetMsg, GetForwardMsg, SendPrivateForwardMessage, SendGroupMessage, SendPrivateMessage,
|
||||
ClearMsgs, GetHistoryMsg, GetGroupMsgHistory, SendGroupForwardMessage,
|
||||
|
||||
// RESOURCE ACTION
|
||||
GetRecord, GetImage, UploadGroupFile, CreateGroupFileFolder, DeleteGroupFolder,
|
||||
|
@ -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"
|
||||
}
|
@ -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"
|
||||
}
|
@ -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"
|
||||
}
|
@ -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"
|
||||
}
|
@ -9,12 +9,12 @@ internal object SendPrivateMessage: IActionHandler() {
|
||||
override suspend fun internalHandle(session: ActionSession): String {
|
||||
val userId = session.getString("user_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")) {
|
||||
val autoEscape = session.getBooleanOrDefault("auto_escape", false)
|
||||
val message = session.getString("message")
|
||||
SendMessage.invoke(
|
||||
chatType = chatTYpe,
|
||||
chatType = chatType,
|
||||
peerId = userId,
|
||||
message = message,
|
||||
autoEscape = autoEscape,
|
||||
@ -24,7 +24,7 @@ internal object SendPrivateMessage: IActionHandler() {
|
||||
} else if (session.isArray("message")) {
|
||||
val message = session.getArray("message")
|
||||
SendMessage(
|
||||
chatType = chatTYpe,
|
||||
chatType = chatType,
|
||||
peerId = userId,
|
||||
message = message,
|
||||
echo = session.echo,
|
||||
@ -33,7 +33,7 @@ internal object SendPrivateMessage: IActionHandler() {
|
||||
} else {
|
||||
val message = session.getObject("message")
|
||||
SendMessage(
|
||||
chatType = chatTYpe,
|
||||
chatType = chatType,
|
||||
peerId = userId,
|
||||
message = listOf( message ).jsonArray,
|
||||
echo = session.echo,
|
||||
|
@ -33,20 +33,22 @@ fun Routing.messageAction() {
|
||||
post {
|
||||
val groupId = fetchPostOrNull("group_id")
|
||||
val messages = fetchPostJsonArray("messages")
|
||||
call.respondText(SendGroupForwardMsg(messages, groupId ?: ""), ContentType.Application.Json)
|
||||
call.respondText(SendForwardMessage(MsgConstant.KCHATTYPEGROUP, groupId ?: "", messages), ContentType.Application.Json)
|
||||
}
|
||||
get {
|
||||
respond(false, Status.InternalHandlerError, "Not support GET method")
|
||||
}
|
||||
}
|
||||
post("/send_group_forward_msg") {
|
||||
|
||||
}
|
||||
|
||||
post("/send_private_forward_msg") {
|
||||
route("/send_private_forward_msg") {
|
||||
post {
|
||||
val userId = fetchPostOrNull("user_id")
|
||||
val messages = fetchPostJsonArray("messages")
|
||||
call.respondText(SendPrivateForwardMsg(messages, userId ?: ""), ContentType.Application.Json)
|
||||
call.respondText(SendForwardMessage(MsgConstant.KCHATTYPEC2C, userId ?: "", messages), ContentType.Application.Json)
|
||||
}
|
||||
get {
|
||||
respond(false, Status.InternalHandlerError, "Not support GET method")
|
||||
}
|
||||
}
|
||||
|
||||
getOrPost("/get_forward_msg") {
|
||||
|
@ -9,6 +9,11 @@ internal data class MessageResult(
|
||||
@SerialName("message_id") val msgId: Int,
|
||||
@SerialName("time") val time: Long
|
||||
)
|
||||
@Serializable
|
||||
internal data class ForwardMessageResult(
|
||||
@SerialName("message_id") val msgId: Int,
|
||||
@SerialName("forward_id") val forwardId: String
|
||||
)
|
||||
|
||||
@Serializable
|
||||
internal data class MessageDetail(
|
||||
|
Loading…
x
Reference in New Issue
Block a user