mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-09 03:20:11 +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 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 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 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: UInt, noinline listener: MessageListener<T>) = content({ sender.id == id }, listener)
|
||||||
suspend inline fun sentBy(id: Long, noinline listener: MessageListener<T>) = sentBy(id.toUInt(), 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
|
@ListenersBuilderDsl
|
||||||
@Suppress("MemberVisibilityCanBePrivate", "unused")
|
@Suppress("MemberVisibilityCanBePrivate", "unused")
|
||||||
inline class ListenerBuilder<out E : Event>(
|
class ListenerBuilder<out E : Event>(
|
||||||
@PublishedApi
|
@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) {
|
suspend inline fun handler(noinline listener: suspend (E) -> ListeningStatus) {
|
||||||
handlerConsumer(Handler(listener))
|
handlerConsumer(Handler(listener))
|
||||||
|
@ -208,6 +208,7 @@ fun MessageChain.toPacket(forGroup: Boolean): ByteReadPacket = buildPacket {
|
|||||||
writeByte(0x02)
|
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()
|
//"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
|
// writeShortLVString(filename)//图片文件名 FR%F`0YOJZQH1FJSLQLJ3F1.jpg
|
||||||
|
require(id.value.length == 37) { "Illegal ImageId: ${id.value}" }
|
||||||
writeShortLVString(id.value.substring(1..24) + ".gif")//图片文件名. 后缀不影响. 但无后缀会导致 PC QQ 无法显示这个图片
|
writeShortLVString(id.value.substring(1..24) + ".gif")//图片文件名. 后缀不影响. 但无后缀会导致 PC QQ 无法显示这个图片
|
||||||
writeHex("03 00 04 00 00 02 A2 04")
|
writeHex("03 00 04 00 00 02 A2 04")
|
||||||
writeShortLVString(id.value)
|
writeShortLVString(id.value)
|
||||||
|
@ -73,14 +73,15 @@ class BotSession(
|
|||||||
* ```
|
* ```
|
||||||
* @sample net.mamoe.mirai.network.protocol.tim.packet.action.uploadImage
|
* @sample net.mamoe.mirai.network.protocol.tim.packet.action.uploadImage
|
||||||
*
|
*
|
||||||
|
* @param checkSequence 是否期待 [ServerPacket.sequenceId] 与 [OutgoingPacket.sequenceId] 相同的包.
|
||||||
* @param P 期待的包
|
* @param P 期待的包
|
||||||
* @param handler 处理期待的包
|
* @param handler 处理期待的包
|
||||||
*
|
*
|
||||||
* @see Bot.withSession 转换接收器 (receiver, 即 `this` 的指向) 为 [BotSession]
|
* @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])
|
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.toSend(this)
|
||||||
it.onExpect(handler)
|
it.onExpect(handler)
|
||||||
})
|
})
|
||||||
@ -91,7 +92,7 @@ class BotSession(
|
|||||||
* 发送一个数据包, 并期待接受一个特定的 [ServerPacket][P].
|
* 发送一个数据包, 并期待接受一个特定的 [ServerPacket][P].
|
||||||
* 您将能从本函数的返回值 [CompletableDeferred] 接收到所期待的 [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)
|
suspend inline fun OutgoingPacket.send() = socket.sendPacket(this)
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,8 @@ import kotlin.reflect.KClass
|
|||||||
class TemporaryPacketHandler<P : ServerPacket, R>(
|
class TemporaryPacketHandler<P : ServerPacket, R>(
|
||||||
private val expectationClass: KClass<P>,
|
private val expectationClass: KClass<P>,
|
||||||
private val deferred: CompletableDeferred<R>,
|
private val deferred: CompletableDeferred<R>,
|
||||||
private val fromSession: BotSession
|
private val fromSession: BotSession,
|
||||||
|
private val checkSequence: Boolean
|
||||||
) {
|
) {
|
||||||
private lateinit var toSend: OutgoingPacket
|
private lateinit var toSend: OutgoingPacket
|
||||||
|
|
||||||
@ -45,7 +46,9 @@ class TemporaryPacketHandler<P : ServerPacket, R>(
|
|||||||
session.socket.sendPacket(toSend)
|
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) {
|
suspend fun doReceive(packet: ServerPacket) {
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
Loading…
Reference in New Issue
Block a user