From 560c46ede4d63c9bba38a52f26c92fd994fb174b Mon Sep 17 00:00:00 2001 From: Him188 Date: Mon, 6 Apr 2020 20:33:26 +0800 Subject: [PATCH] Unified message logs --- .../mirai/qqandroid/contact/GroupImpl.kt | 16 ++++++++- .../mirai/qqandroid/contact/MemberImpl.kt | 36 +++++-------------- .../mamoe/mirai/qqandroid/contact/QQImpl.kt | 27 ++------------ .../network/QQAndroidBotNetworkHandler.kt | 20 ++++++++--- 4 files changed, 42 insertions(+), 57 deletions(-) diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/GroupImpl.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/GroupImpl.kt index 63746f128..6552df793 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/GroupImpl.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/GroupImpl.kt @@ -279,6 +279,14 @@ internal class GroupImpl( override suspend fun sendMessage(message: Message): MessageReceipt { check(!isBotMuted) { throw BotIsBeingMutedException(this) } + return sendMessageImpl(message).also { + logMessageSent(message) + } + } + + @OptIn(MiraiExperimentalAPI::class) + private suspend fun sendMessageImpl(message: Message): MessageReceipt { + val msg: MessageChain if (message !is LongMessage) { @@ -322,7 +330,13 @@ internal class GroupImpl( if (response is MessageSvc.PbSendMsg.Response.Failed) { when (response.resultType) { 120 -> error("bot is being muted.") - 34 -> error("internal error: send message failed, illegal arguments: $response") + 34 -> { + kotlin.runCatching { // allow retry once + return bot.lowLevelSendLongGroupMessage(id, msg) + }.getOrElse { + throw IllegalStateException("internal error: send message failed(34)", it) + } + } else -> error("send message failed: $response") } } diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/MemberImpl.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/MemberImpl.kt index 43839f627..5f94f3b4d 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/MemberImpl.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/MemberImpl.kt @@ -19,19 +19,15 @@ import net.mamoe.mirai.data.MemberInfo import net.mamoe.mirai.data.PreviousNameList import net.mamoe.mirai.data.Profile import net.mamoe.mirai.event.broadcast -import net.mamoe.mirai.event.events.* +import net.mamoe.mirai.event.events.MemberCardChangeEvent +import net.mamoe.mirai.event.events.MemberLeaveEvent +import net.mamoe.mirai.event.events.MemberSpecialTitleChangeEvent import net.mamoe.mirai.message.MessageReceipt import net.mamoe.mirai.message.data.Message import net.mamoe.mirai.message.data.OfflineFriendImage -import net.mamoe.mirai.message.data.QuoteReply -import net.mamoe.mirai.message.data.asMessageChain import net.mamoe.mirai.qqandroid.QQAndroidBot -import net.mamoe.mirai.qqandroid.message.MessageSourceToFriendImpl -import net.mamoe.mirai.qqandroid.message.ensureSequenceIdAvailable -import net.mamoe.mirai.qqandroid.message.firstIsInstanceOrNull import net.mamoe.mirai.qqandroid.network.protocol.data.jce.StTroopMemberInfo import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.TroopManagement -import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive.MessageSvc import net.mamoe.mirai.utils.* import kotlin.coroutines.CoroutineContext import kotlin.jvm.JvmSynthetic @@ -59,27 +55,13 @@ internal class MemberImpl constructor( @MiraiExperimentalAPI override suspend fun queryRemark(): FriendNameRemark = qq.queryRemark() + @OptIn(MiraiInternalAPI::class) @JvmSynthetic - @Suppress("DuplicatedCode") + @Suppress("DuplicatedCode", "UNCHECKED_CAST") override suspend fun sendMessage(message: Message): MessageReceipt { - val event = MessageSendEvent.FriendMessageSendEvent(this, message.asMessageChain()).broadcast() - if (event.isCancelled) { - throw EventCancelledException("cancelled by FriendMessageSendEvent") - } - lateinit var source: MessageSourceToFriendImpl - event.message.firstIsInstanceOrNull()?.source?.ensureSequenceIdAvailable() - bot.network.run { - check( - MessageSvc.PbSendMsg.createToFriend( - bot.client, - this@MemberImpl, - event.message - ) { - source = it - }.sendAndExpect() is MessageSvc.PbSendMsg.Response.SUCCESS - ) { "send message failed" } - } - return MessageReceipt(source, this, null) + return sendMessageImpl(message).also { + logMessageSent(message) + } as MessageReceipt } @JvmSynthetic @@ -162,7 +144,7 @@ internal class MemberImpl constructor( net.mamoe.mirai.event.events.MemberMuteEvent(this@MemberImpl, durationSeconds, null).broadcast() } - private fun checkBotPermissionHigherThanThis(){ + private fun checkBotPermissionHigherThanThis() { check(group.botPermission > this.permission) { throw PermissionDeniedException( "`kick` operation requires bot to have a higher permission than the target member, " + diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/QQImpl.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/QQImpl.kt index 17978552a..166005a13 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/QQImpl.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/contact/QQImpl.kt @@ -26,20 +26,13 @@ import net.mamoe.mirai.event.broadcast import net.mamoe.mirai.event.events.BeforeImageUploadEvent import net.mamoe.mirai.event.events.EventCancelledException import net.mamoe.mirai.event.events.ImageUploadEvent -import net.mamoe.mirai.event.events.MessageSendEvent import net.mamoe.mirai.message.MessageReceipt import net.mamoe.mirai.message.data.Message import net.mamoe.mirai.message.data.OfflineFriendImage -import net.mamoe.mirai.message.data.QuoteReply -import net.mamoe.mirai.message.data.asMessageChain import net.mamoe.mirai.qqandroid.QQAndroidBot -import net.mamoe.mirai.qqandroid.message.MessageSourceToFriendImpl -import net.mamoe.mirai.qqandroid.message.ensureSequenceIdAvailable -import net.mamoe.mirai.qqandroid.message.firstIsInstanceOrNull import net.mamoe.mirai.qqandroid.network.highway.postImage import net.mamoe.mirai.qqandroid.network.protocol.data.proto.Cmd0x352 import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.image.LongConn -import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive.MessageSvc import net.mamoe.mirai.qqandroid.utils.MiraiPlatformUtils import net.mamoe.mirai.qqandroid.utils.toUHexString import net.mamoe.mirai.utils.* @@ -80,25 +73,9 @@ internal class QQImpl( @JvmSynthetic @Suppress("DuplicatedCode") override suspend fun sendMessage(message: Message): MessageReceipt { - val event = MessageSendEvent.FriendMessageSendEvent(this, message.asMessageChain()).broadcast() - if (event.isCancelled) { - throw EventCancelledException("cancelled by FriendMessageSendEvent") + return sendMessageImpl(message).also { + logMessageSent(message) } - event.message.firstIsInstanceOrNull()?.source?.ensureSequenceIdAvailable() - lateinit var source: MessageSourceToFriendImpl - bot.network.run { - check( - MessageSvc.PbSendMsg.createToFriend( - bot.client, - this@QQImpl, - event.message - ) { - source = it - } - .sendAndExpect() is MessageSvc.PbSendMsg.Response.SUCCESS - ) { "send message failed" } - } - return MessageReceipt(source, this, null) } @JvmSynthetic diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt index f628fbe87..eca9b4121 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt @@ -21,6 +21,8 @@ import kotlinx.io.core.use import net.mamoe.mirai.event.* import net.mamoe.mirai.event.events.BotOfflineEvent import net.mamoe.mirai.event.events.BotOnlineEvent +import net.mamoe.mirai.message.FriendMessage +import net.mamoe.mirai.message.GroupMessage import net.mamoe.mirai.network.BotNetworkHandler import net.mamoe.mirai.network.WrongPasswordException import net.mamoe.mirai.qqandroid.QQAndroidBot @@ -445,11 +447,21 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler ) { // highest priority: pass to listeners (attached by sendAndExpect). if (packet != null && (bot.logger.isEnabled || logger.isEnabled)) { - val logMessage = "Received: ${packet.toString().replace("\n", """\n""").replace("\r", "")}" + fun String.singleLine(): String { + return this.replace("\n", """\n""").replace("\r", "") + } - if (packet is Event) { - bot.logger.verbose(logMessage) - } else logger.verbose(logMessage) + when (packet) { + is GroupMessage -> bot.logger.verbose( + "[${packet.group.name}(${packet.group.id})] ${packet.senderName}(${packet.sender.id}) -> ${packet.message.toString() + .singleLine()}" + ) + is FriendMessage -> bot.logger.verbose( + "${packet.sender.nick}(${packet.sender.id}) -> ${packet.message.toString().singleLine()}" + ) + is Event -> bot.logger.verbose("Event: ${packet.toString().singleLine()}") + else -> logger.verbose("Event: ${packet.toString().singleLine()}") + } } packetListeners.forEach { listener ->