mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-07 01:20:12 +08:00
More clear subject declaretion
This commit is contained in:
parent
c63f54bc8c
commit
eb02449431
@ -173,7 +173,9 @@ class MessageSubscribersBuilder<T : SenderAndMessage<*>>(
|
||||
) {
|
||||
suspend inline fun case(equals: String, trim: Boolean = true, noinline listener: MessageListener<T>) = content({ equals == if (trim) it.trim() else it }, listener)
|
||||
suspend inline fun contains(value: String, noinline listener: MessageListener<T>) = content({ value in it }, listener)
|
||||
suspend inline fun startsWith(start: String, noinline listener: MessageListener<T>) = content({ it.startsWith(start) }, listener)
|
||||
suspend inline fun startsWith(prefix: String, removePrefix: Boolean = false, noinline listener: MessageListener<T>) =
|
||||
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<T>) = content({ it.endsWith(start) }, listener)
|
||||
suspend inline fun sentBy(id: UInt, noinline listener: MessageListener<T>) = content({ sender.id == id }, listener)
|
||||
suspend inline fun sentBy(id: Long, noinline listener: MessageListener<T>) = sentBy(id.toUInt(), listener)
|
||||
|
@ -121,9 +121,9 @@ suspend inline fun <reified E : Event> subscribeAll(noinline listeners: suspend
|
||||
*/
|
||||
@ListenersBuilderDsl
|
||||
@Suppress("MemberVisibilityCanBePrivate", "unused")
|
||||
inline class ListenerBuilder<out E : Event>(
|
||||
class ListenerBuilder<out E : Event>(
|
||||
@PublishedApi
|
||||
internal inline val handlerConsumer: suspend (Listener<E>) -> Unit
|
||||
internal val handlerConsumer: suspend (Listener<E>) -> Unit
|
||||
) {
|
||||
suspend inline fun handler(noinline listener: suspend (E) -> ListeningStatus) {
|
||||
handlerConsumer(Handler(listener))
|
||||
|
@ -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)
|
||||
|
@ -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 <reified P : ServerPacket, R> OutgoingPacket.sendAndExpect(noinline handler: suspend (P) -> R): CompletableDeferred<R> {
|
||||
suspend inline fun <reified P : ServerPacket, R> OutgoingPacket.sendAndExpect(checkSequence: Boolean = true, noinline handler: suspend (P) -> R): CompletableDeferred<R> {
|
||||
val deferred: CompletableDeferred<R> = 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 <reified P : ServerPacket> OutgoingPacket.sendAndExpect(): CompletableDeferred<P> = sendAndExpect<P, P> { it }
|
||||
suspend inline fun <reified P : ServerPacket> OutgoingPacket.sendAndExpect(checkSequence: Boolean = true): CompletableDeferred<P> = sendAndExpect<P, P>(checkSequence) { it }
|
||||
|
||||
suspend inline fun OutgoingPacket.send() = socket.sendPacket(this)
|
||||
}
|
||||
|
@ -22,7 +22,8 @@ import kotlin.reflect.KClass
|
||||
class TemporaryPacketHandler<P : ServerPacket, R>(
|
||||
private val expectationClass: KClass<P>,
|
||||
private val deferred: CompletableDeferred<R>,
|
||||
private val fromSession: BotSession
|
||||
private val fromSession: BotSession,
|
||||
private val checkSequence: Boolean
|
||||
) {
|
||||
private lateinit var toSend: OutgoingPacket
|
||||
|
||||
@ -45,7 +46,9 @@ class TemporaryPacketHandler<P : ServerPacket, R>(
|
||||
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")
|
||||
|
Loading…
Reference in New Issue
Block a user