From 160d1a11ac3d897eee2ae53c10d28118b0799df7 Mon Sep 17 00:00:00 2001 From: whitechi73 Date: Thu, 18 Jan 2024 09:49:56 +0800 Subject: [PATCH] `Shamrock`: #201 --- .../fuqiuluo/qqinterface/servlet/MsgSvc.kt | 4 ---- .../action/handlers/SendGroupMessage.kt | 7 +++--- .../remote/action/handlers/SendMessage.kt | 23 +++++++++++++++---- .../action/handlers/SendPrivateMessage.kt | 10 +++++--- 4 files changed, 30 insertions(+), 14 deletions(-) diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/MsgSvc.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/MsgSvc.kt index 0722446..0eedeaa 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/MsgSvc.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/MsgSvc.kt @@ -31,10 +31,6 @@ import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine internal object MsgSvc: BaseSvc() { - fun uploadForwardMsg(): Result { - return Result.failure(Exception("Not implemented")) - } - suspend fun prepareTempChatFromGroup( groupId: String, peerId: String diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupMessage.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupMessage.kt index fe15258..6b3e407 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupMessage.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupMessage.kt @@ -9,16 +9,17 @@ internal object SendGroupMessage: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val groupId = session.getString("group_id") val retryCnt = session.getIntOrNull("retry_cnt") + val recallDuration = session.getLongOrNull("recall_duration") return if (session.isString("message")) { val autoEscape = session.getBooleanOrDefault("auto_escape", false) val message = session.getString("message") - SendMessage(MsgConstant.KCHATTYPEGROUP, groupId, message, autoEscape, echo = session.echo, retryCnt = retryCnt ?: 3) + SendMessage(MsgConstant.KCHATTYPEGROUP, groupId, message, autoEscape, echo = session.echo, retryCnt = retryCnt ?: 3, recallDuration = recallDuration) } else if (session.isObject("message")) { val message = session.getObject("message") - SendMessage(MsgConstant.KCHATTYPEGROUP, groupId, listOf( message ).jsonArray, session.echo, retryCnt = retryCnt ?: 3) + SendMessage(MsgConstant.KCHATTYPEGROUP, groupId, listOf( message ).jsonArray, session.echo, retryCnt = retryCnt ?: 3, recallDuration = recallDuration) } else { val message = session.getArray("message") - SendMessage(MsgConstant.KCHATTYPEGROUP, groupId, message, session.echo, retryCnt = retryCnt ?: 3) + SendMessage(MsgConstant.KCHATTYPEGROUP, groupId, message, session.echo, retryCnt = retryCnt ?: 3, recallDuration = recallDuration) } } diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendMessage.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendMessage.kt index b2b81ca..c197162 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendMessage.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendMessage.kt @@ -1,6 +1,10 @@ package moe.fuqiuluo.shamrock.remote.action.handlers import com.tencent.qqnt.kernel.nativeinterface.MsgConstant +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.helper.MessageHelper @@ -46,16 +50,17 @@ internal object SendMessage: IActionHandler() { else -> error("unknown chat type: $chatType") } val retryCnt = session.getIntOrNull("retry_cnt") + val recallDuration = session.getLongOrNull("recall_duration") return if (session.isString("message")) { val autoEscape = session.getBooleanOrDefault("auto_escape", false) val message = session.getString("message") - invoke(chatType, peerId, message, autoEscape, echo = session.echo, fromId = fromId, retryCnt = retryCnt ?: 3) + invoke(chatType, peerId, message, autoEscape, echo = session.echo, fromId = fromId, retryCnt = retryCnt ?: 3, recallDuration = recallDuration) } else if (session.isArray("message")) { val message = session.getArray("message") - invoke(chatType, peerId, message, session.echo, fromId = fromId, retryCnt ?: 3) + invoke(chatType, peerId, message, session.echo, fromId = fromId, retryCnt ?: 3, recallDuration = recallDuration) } else { val message = session.getObject("message") - invoke(chatType, peerId, listOf( message ).jsonArray, session.echo, fromId = fromId, retryCnt ?: 3) + invoke(chatType, peerId, listOf( message ).jsonArray, session.echo, fromId = fromId, retryCnt ?: 3, recallDuration = recallDuration) } } catch (e: ParamsException) { return noParam(e.message!!, session.echo) @@ -72,6 +77,7 @@ internal object SendMessage: IActionHandler() { autoEscape: Boolean, fromId: String = peerId, retryCnt: Int, + recallDuration: Long?, echo: JsonElement = EmptyJsonString ): String { //if (!ContactHelper.checkContactAvailable(chatType, peerId)) { @@ -102,6 +108,7 @@ internal object SendMessage: IActionHandler() { if (pair.first <= 0) { return logic("send message failed", echo = echo) } + recallDuration?.let { autoRecall(pair.second, it) } return ok(MessageResult( msgId = pair.second, time = (pair.first * 0.001).toLong() @@ -110,7 +117,7 @@ internal object SendMessage: IActionHandler() { // 消息段格式消息 suspend operator fun invoke( - chatType: Int, peerId: String, message: JsonArray, echo: JsonElement = EmptyJsonString, fromId: String = peerId, retryCnt: Int + chatType: Int, peerId: String, message: JsonArray, echo: JsonElement = EmptyJsonString, fromId: String = peerId, retryCnt: Int, recallDuration: Long?, ): String { //if (!ContactHelper.checkContactAvailable(chatType, peerId)) { // return logic("contact is not found", echo = echo) @@ -123,12 +130,20 @@ internal object SendMessage: IActionHandler() { if (pair.first <= 0) { return logic("send message failed", echo = echo) } + recallDuration?.let { autoRecall(pair.second, it) } return ok(MessageResult( msgId = pair.second, time = (pair.first * 0.001).toLong() ), echo) } + private fun autoRecall(msgHash: Int, duration: Long) { + GlobalScope.launch(Dispatchers.Default) { + delay(duration) + MsgSvc.recallMsg(msgHash) + } + } + override val requiredParams: Array = arrayOf("message") override fun path(): String = "send_message" diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendPrivateMessage.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendPrivateMessage.kt index 56e3d90..e735f86 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendPrivateMessage.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendPrivateMessage.kt @@ -11,6 +11,7 @@ internal object SendPrivateMessage: IActionHandler() { val groupId = session.getStringOrNull("group_id") val chatType = if (groupId == null) MsgConstant.KCHATTYPEC2C else MsgConstant.KCHATTYPETEMPC2CFROMGROUP val retryCnt = session.getIntOrNull("retry_cnt") + val recallDuration = session.getLongOrNull("recall_duration") return if (session.isString("message")) { val autoEscape = session.getBooleanOrDefault("auto_escape", false) val message = session.getString("message") @@ -21,7 +22,8 @@ internal object SendPrivateMessage: IActionHandler() { autoEscape = autoEscape, echo = session.echo, fromId = groupId ?: userId, - retryCnt = retryCnt ?: 3 + retryCnt = retryCnt ?: 3, + recallDuration = recallDuration ) } else if (session.isArray("message")) { val message = session.getArray("message") @@ -31,7 +33,8 @@ internal object SendPrivateMessage: IActionHandler() { message = message, echo = session.echo, fromId = groupId ?: userId, - retryCnt = retryCnt ?: 3 + retryCnt = retryCnt ?: 3, + recallDuration = recallDuration ) } else { val message = session.getObject("message") @@ -41,7 +44,8 @@ internal object SendPrivateMessage: IActionHandler() { message = listOf( message ).jsonArray, echo = session.echo, fromId = groupId ?: userId, - retryCnt = retryCnt ?: 3 + retryCnt = retryCnt ?: 3, + recallDuration = recallDuration ) } }