diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/MessageSubscribers.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/MessageSubscribers.kt index 445c0358a..61e93a245 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/MessageSubscribers.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/MessageSubscribers.kt @@ -173,7 +173,9 @@ class MessageSubscribersBuilder>( ) { suspend inline fun case(equals: String, trim: Boolean = true, noinline listener: MessageListener) = content({ equals == if (trim) it.trim() else it }, listener) suspend inline fun contains(value: String, noinline listener: MessageListener) = content({ value in it }, listener) - suspend inline fun startsWith(start: String, noinline listener: MessageListener) = content({ it.startsWith(start) }, listener) + suspend inline fun startsWith(prefix: String, removePrefix: Boolean = false, noinline listener: MessageListener) = + content({ it.startsWith(prefix) }) { if (removePrefix) listener.invoke(this, this.message.stringValue.substringAfter(prefix)) else listener(this) } + suspend inline fun endsWith(start: String, noinline listener: MessageListener) = content({ it.endsWith(start) }, listener) suspend inline fun sentBy(id: UInt, noinline listener: MessageListener) = content({ sender.id == id }, listener) suspend inline fun sentBy(id: Long, noinline listener: MessageListener) = sentBy(id.toUInt(), listener) diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Subscribers.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Subscribers.kt index d856ffefb..14892793f 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Subscribers.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Subscribers.kt @@ -121,9 +121,9 @@ suspend inline fun subscribeAll(noinline listeners: suspend */ @ListenersBuilderDsl @Suppress("MemberVisibilityCanBePrivate", "unused") -inline class ListenerBuilder( +class ListenerBuilder( @PublishedApi - internal inline val handlerConsumer: suspend (Listener) -> Unit + internal val handlerConsumer: suspend (Listener) -> Unit ) { suspend inline fun handler(noinline listener: suspend (E) -> ListeningStatus) { handlerConsumer(Handler(listener)) diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/internal/MessageDataInternal.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/internal/MessageDataInternal.kt index 133d17c18..0c121a8f0 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/internal/MessageDataInternal.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/internal/MessageDataInternal.kt @@ -208,6 +208,7 @@ fun MessageChain.toPacket(forGroup: Boolean): ByteReadPacket = buildPacket { writeByte(0x02) //"46 52 25 46 60 30 59 4F 4A 5A 51 48 31 46 4A 53 4C 51 4C 4A 33 46 31 2E 6A 70 67".hexToBytes().stringOfWitch() // writeShortLVString(filename)//图片文件名 FR%F`0YOJZQH1FJSLQLJ3F1.jpg + require(id.value.length == 37) { "Illegal ImageId: ${id.value}" } writeShortLVString(id.value.substring(1..24) + ".gif")//图片文件名. 后缀不影响. 但无后缀会导致 PC QQ 无法显示这个图片 writeHex("03 00 04 00 00 02 A2 04") writeShortLVString(id.value) diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/BotSession.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/BotSession.kt index 6d9461902..350f6ba9c 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/BotSession.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/BotSession.kt @@ -73,14 +73,15 @@ class BotSession( * ``` * @sample net.mamoe.mirai.network.protocol.tim.packet.action.uploadImage * + * @param checkSequence 是否期待 [ServerPacket.sequenceId] 与 [OutgoingPacket.sequenceId] 相同的包. * @param P 期待的包 * @param handler 处理期待的包 * * @see Bot.withSession 转换接收器 (receiver, 即 `this` 的指向) 为 [BotSession] */ - suspend inline fun OutgoingPacket.sendAndExpect(noinline handler: suspend (P) -> R): CompletableDeferred { + suspend inline fun OutgoingPacket.sendAndExpect(checkSequence: Boolean = true, noinline handler: suspend (P) -> R): CompletableDeferred { val deferred: CompletableDeferred = CompletableDeferred(coroutineContext[Job]) - bot.network.addHandler(TemporaryPacketHandler(P::class, deferred, this@BotSession).also { + bot.network.addHandler(TemporaryPacketHandler(P::class, deferred, this@BotSession, checkSequence).also { it.toSend(this) it.onExpect(handler) }) @@ -91,7 +92,7 @@ class BotSession( * 发送一个数据包, 并期待接受一个特定的 [ServerPacket][P]. * 您将能从本函数的返回值 [CompletableDeferred] 接收到所期待的 [P] */ - suspend inline fun OutgoingPacket.sendAndExpect(): CompletableDeferred

= sendAndExpect { it } + suspend inline fun OutgoingPacket.sendAndExpect(checkSequence: Boolean = true): CompletableDeferred

= sendAndExpect(checkSequence) { it } suspend inline fun OutgoingPacket.send() = socket.sendPacket(this) } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/protocol/tim/handler/TemporaryPacketHandler.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/protocol/tim/handler/TemporaryPacketHandler.kt index 3b0376706..b023ee2ee 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/protocol/tim/handler/TemporaryPacketHandler.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/protocol/tim/handler/TemporaryPacketHandler.kt @@ -22,7 +22,8 @@ import kotlin.reflect.KClass class TemporaryPacketHandler

( private val expectationClass: KClass

, private val deferred: CompletableDeferred, - private val fromSession: BotSession + private val fromSession: BotSession, + private val checkSequence: Boolean ) { private lateinit var toSend: OutgoingPacket @@ -45,7 +46,9 @@ class TemporaryPacketHandler

( session.socket.sendPacket(toSend) } - suspend fun filter(session: BotSession, packet: ServerPacket): Boolean = expectationClass.isInstance(packet) && session === this.fromSession + @ExperimentalUnsignedTypes + fun filter(session: BotSession, packet: ServerPacket): Boolean = + expectationClass.isInstance(packet) && session === this.fromSession && if (checkSequence) packet.sequenceId == toSend.sequenceId else true suspend fun doReceive(packet: ServerPacket) { @Suppress("UNCHECKED_CAST")