More clear subject declaretion

This commit is contained in:
Him188 2019-10-27 18:28:54 +08:00
parent c63f54bc8c
commit eb02449431
5 changed files with 15 additions and 8 deletions

View File

@ -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)

View File

@ -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))

View File

@ -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)

View File

@ -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)
}

View File

@ -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")