Commit 876599b5 authored by Him188's avatar Him188

Change the receiver from Bot to BotSession

parent 2621c155
...@@ -4,9 +4,10 @@ package net.mamoe.mirai.event ...@@ -4,9 +4,10 @@ package net.mamoe.mirai.event
import net.mamoe.mirai.Bot import net.mamoe.mirai.Bot
import net.mamoe.mirai.event.events.BotEvent import net.mamoe.mirai.event.events.BotEvent
import net.mamoe.mirai.event.internal.HandlerWithBot import net.mamoe.mirai.event.internal.HandlerWithSession
import net.mamoe.mirai.event.internal.Listener import net.mamoe.mirai.event.internal.Listener
import net.mamoe.mirai.event.internal.subscribeInternal import net.mamoe.mirai.event.internal.subscribeInternal
import net.mamoe.mirai.network.BotSession
import kotlin.reflect.KClass import kotlin.reflect.KClass
/** /**
...@@ -18,36 +19,38 @@ import kotlin.reflect.KClass ...@@ -18,36 +19,38 @@ import kotlin.reflect.KClass
// region 顶层方法 // region 顶层方法
suspend inline fun <reified E : BotEvent> Bot.subscribe(noinline handler: suspend Bot.(E) -> ListeningStatus): Listener<E> = E::class.subscribe(this, handler) suspend inline fun <reified E : BotEvent> Bot.subscribe(noinline handler: suspend BotSession.(E) -> ListeningStatus): Listener<E> =
E::class.subscribe(this, handler)
suspend inline fun <reified E : BotEvent> Bot.subscribeAlways(noinline listener: suspend Bot.(E) -> Unit): Listener<E> = suspend inline fun <reified E : BotEvent> Bot.subscribeAlways(noinline listener: suspend BotSession.(E) -> Unit): Listener<E> =
E::class.subscribeAlways(this, listener) E::class.subscribeAlways(this, listener)
suspend inline fun <reified E : BotEvent> Bot.subscribeOnce(noinline listener: suspend Bot.(E) -> Unit): Listener<E> = E::class.subscribeOnce(this, listener) suspend inline fun <reified E : BotEvent> Bot.subscribeOnce(noinline listener: suspend BotSession.(E) -> Unit): Listener<E> =
E::class.subscribeOnce(this, listener)
suspend inline fun <reified E : BotEvent, T> Bot.subscribeUntil(valueIfStop: T, noinline listener: suspend Bot.(E) -> T): Listener<E> = suspend inline fun <reified E : BotEvent, T> Bot.subscribeUntil(valueIfStop: T, noinline listener: suspend BotSession.(E) -> T): Listener<E> =
E::class.subscribeUntil(this, valueIfStop, listener) E::class.subscribeUntil(this, valueIfStop, listener)
suspend inline fun <reified E : BotEvent> Bot.subscribeUntilFalse(noinline listener: suspend Bot.(E) -> Boolean): Listener<E> = suspend inline fun <reified E : BotEvent> Bot.subscribeUntilFalse(noinline listener: suspend BotSession.(E) -> Boolean): Listener<E> =
E::class.subscribeUntilFalse(this, listener) E::class.subscribeUntilFalse(this, listener)
suspend inline fun <reified E : BotEvent> Bot.subscribeUntilTrue(noinline listener: suspend Bot.(E) -> Boolean): Listener<E> = suspend inline fun <reified E : BotEvent> Bot.subscribeUntilTrue(noinline listener: suspend BotSession.(E) -> Boolean): Listener<E> =
E::class.subscribeUntilTrue(this, listener) E::class.subscribeUntilTrue(this, listener)
suspend inline fun <reified E : BotEvent> Bot.subscribeUntilNull(noinline listener: suspend Bot.(E) -> Any?): Listener<E> = suspend inline fun <reified E : BotEvent> Bot.subscribeUntilNull(noinline listener: suspend BotSession.(E) -> Any?): Listener<E> =
E::class.subscribeUntilNull(this, listener) E::class.subscribeUntilNull(this, listener)
suspend inline fun <reified E : BotEvent, T> Bot.subscribeWhile(valueIfContinue: T, noinline listener: suspend Bot.(E) -> T): Listener<E> = suspend inline fun <reified E : BotEvent, T> Bot.subscribeWhile(valueIfContinue: T, noinline listener: suspend BotSession.(E) -> T): Listener<E> =
E::class.subscribeWhile(this, valueIfContinue, listener) E::class.subscribeWhile(this, valueIfContinue, listener)
suspend inline fun <reified E : BotEvent> Bot.subscribeWhileFalse(noinline listener: suspend Bot.(E) -> Boolean): Listener<E> = suspend inline fun <reified E : BotEvent> Bot.subscribeWhileFalse(noinline listener: suspend BotSession.(E) -> Boolean): Listener<E> =
E::class.subscribeWhileFalse(this, listener) E::class.subscribeWhileFalse(this, listener)
suspend inline fun <reified E : BotEvent> Bot.subscribeWhileTrue(noinline listener: suspend Bot.(E) -> Boolean): Listener<E> = suspend inline fun <reified E : BotEvent> Bot.subscribeWhileTrue(noinline listener: suspend BotSession.(E) -> Boolean): Listener<E> =
E::class.subscribeWhileTrue(this, listener) E::class.subscribeWhileTrue(this, listener)
suspend inline fun <reified E : BotEvent> Bot.subscribeWhileNull(noinline listener: suspend Bot.(E) -> Any?): Listener<E> = suspend inline fun <reified E : BotEvent> Bot.subscribeWhileNull(noinline listener: suspend BotSession.(E) -> Any?): Listener<E> =
E::class.subscribeWhileNull(this, listener) E::class.subscribeWhileNull(this, listener)
// endregion // endregion
...@@ -56,48 +59,48 @@ suspend inline fun <reified E : BotEvent> Bot.subscribeWhileNull(noinline listen ...@@ -56,48 +59,48 @@ suspend inline fun <reified E : BotEvent> Bot.subscribeWhileNull(noinline listen
// region KClass 的扩展方法 (仅内部使用) // region KClass 的扩展方法 (仅内部使用)
@PublishedApi @PublishedApi
internal suspend fun <E : BotEvent> KClass<E>.subscribe(bot: Bot, handler: suspend Bot.(E) -> ListeningStatus) = internal suspend fun <E : BotEvent> KClass<E>.subscribe(bot: Bot, handler: suspend BotSession.(E) -> ListeningStatus) =
this.subscribeInternal(HandlerWithBot(bot, handler)) this.subscribeInternal(HandlerWithSession(bot, handler))
@PublishedApi @PublishedApi
internal suspend fun <E : BotEvent> KClass<E>.subscribeAlways(bot: Bot, listener: suspend Bot.(E) -> Unit) = internal suspend fun <E : BotEvent> KClass<E>.subscribeAlways(bot: Bot, listener: suspend BotSession.(E) -> Unit) =
this.subscribeInternal(HandlerWithBot(bot) { listener(it); ListeningStatus.LISTENING }) this.subscribeInternal(HandlerWithSession(bot) { listener(it); ListeningStatus.LISTENING })
@PublishedApi @PublishedApi
internal suspend fun <E : BotEvent> KClass<E>.subscribeOnce(bot: Bot, listener: suspend Bot.(E) -> Unit) = internal suspend fun <E : BotEvent> KClass<E>.subscribeOnce(bot: Bot, listener: suspend BotSession.(E) -> Unit) =
this.subscribeInternal(HandlerWithBot(bot) { listener(it); ListeningStatus.STOPPED }) this.subscribeInternal(HandlerWithSession(bot) { listener(it); ListeningStatus.STOPPED })
@PublishedApi @PublishedApi
internal suspend fun <E : BotEvent, T> KClass<E>.subscribeUntil(bot: Bot, valueIfStop: T, listener: suspend Bot.(E) -> T) = internal suspend fun <E : BotEvent, T> KClass<E>.subscribeUntil(bot: Bot, valueIfStop: T, listener: suspend BotSession.(E) -> T) =
subscribeInternal(HandlerWithBot(bot) { if (listener(it) === valueIfStop) ListeningStatus.STOPPED else ListeningStatus.LISTENING }) subscribeInternal(HandlerWithSession(bot) { if (listener(it) === valueIfStop) ListeningStatus.STOPPED else ListeningStatus.LISTENING })
@PublishedApi @PublishedApi
internal suspend inline fun <E : BotEvent> KClass<E>.subscribeUntilFalse(bot: Bot, noinline listener: suspend Bot.(E) -> Boolean) = internal suspend inline fun <E : BotEvent> KClass<E>.subscribeUntilFalse(bot: Bot, noinline listener: suspend BotSession.(E) -> Boolean) =
subscribeUntil(bot, false, listener) subscribeUntil(bot, false, listener)
@PublishedApi @PublishedApi
internal suspend inline fun <E : BotEvent> KClass<E>.subscribeUntilTrue(bot: Bot, noinline listener: suspend Bot.(E) -> Boolean) = internal suspend inline fun <E : BotEvent> KClass<E>.subscribeUntilTrue(bot: Bot, noinline listener: suspend BotSession.(E) -> Boolean) =
subscribeUntil(bot, true, listener) subscribeUntil(bot, true, listener)
@PublishedApi @PublishedApi
internal suspend inline fun <E : BotEvent> KClass<E>.subscribeUntilNull(bot: Bot, noinline listener: suspend Bot.(E) -> Any?) = internal suspend inline fun <E : BotEvent> KClass<E>.subscribeUntilNull(bot: Bot, noinline listener: suspend BotSession.(E) -> Any?) =
subscribeUntil(bot, null, listener) subscribeUntil(bot, null, listener)
@PublishedApi @PublishedApi
internal suspend fun <E : BotEvent, T> KClass<E>.subscribeWhile(bot: Bot, valueIfContinue: T, listener: suspend Bot.(E) -> T) = internal suspend fun <E : BotEvent, T> KClass<E>.subscribeWhile(bot: Bot, valueIfContinue: T, listener: suspend BotSession.(E) -> T) =
subscribeInternal(HandlerWithBot(bot) { if (listener(it) !== valueIfContinue) ListeningStatus.STOPPED else ListeningStatus.LISTENING }) subscribeInternal(HandlerWithSession(bot) { if (listener(it) !== valueIfContinue) ListeningStatus.STOPPED else ListeningStatus.LISTENING })
@PublishedApi @PublishedApi
internal suspend inline fun <E : BotEvent> KClass<E>.subscribeWhileFalse(bot: Bot, noinline listener: suspend Bot.(E) -> Boolean) = internal suspend inline fun <E : BotEvent> KClass<E>.subscribeWhileFalse(bot: Bot, noinline listener: suspend BotSession.(E) -> Boolean) =
subscribeWhile(bot, false, listener) subscribeWhile(bot, false, listener)
@PublishedApi @PublishedApi
internal suspend inline fun <E : BotEvent> KClass<E>.subscribeWhileTrue(bot: Bot, noinline listener: suspend Bot.(E) -> Boolean) = internal suspend inline fun <E : BotEvent> KClass<E>.subscribeWhileTrue(bot: Bot, noinline listener: suspend BotSession.(E) -> Boolean) =
subscribeWhile(bot, true, listener) subscribeWhile(bot, true, listener)
@PublishedApi @PublishedApi
internal suspend inline fun <E : BotEvent> KClass<E>.subscribeWhileNull(bot: Bot, noinline listener: suspend Bot.(E) -> Any?) = internal suspend inline fun <E : BotEvent> KClass<E>.subscribeWhileNull(bot: Bot, noinline listener: suspend BotSession.(E) -> Any?) =
subscribeWhile(bot, null, listener) subscribeWhile(bot, null, listener)
// endregion // endregion
\ No newline at end of file
...@@ -8,6 +8,8 @@ import net.mamoe.mirai.event.EventDebugLogger ...@@ -8,6 +8,8 @@ import net.mamoe.mirai.event.EventDebugLogger
import net.mamoe.mirai.event.ListeningStatus import net.mamoe.mirai.event.ListeningStatus
import net.mamoe.mirai.event.Subscribable import net.mamoe.mirai.event.Subscribable
import net.mamoe.mirai.event.events.BotEvent import net.mamoe.mirai.event.events.BotEvent
import net.mamoe.mirai.network.BotSession
import net.mamoe.mirai.network.session
import net.mamoe.mirai.utils.internal.inlinedRemoveIf import net.mamoe.mirai.utils.internal.inlinedRemoveIf
import net.mamoe.mirai.utils.io.logStacktrace import net.mamoe.mirai.utils.io.logStacktrace
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
...@@ -108,8 +110,11 @@ internal class Handler<in E : Subscribable> ...@@ -108,8 +110,11 @@ internal class Handler<in E : Subscribable>
@PublishedApi @PublishedApi
@Suppress("FunctionName") @Suppress("FunctionName")
internal suspend inline fun <E : Subscribable> HandlerWithBot(bot: Bot, noinline handler: suspend Bot.(E) -> ListeningStatus): HandlerWithBot<E> { internal suspend inline fun <E : Subscribable> HandlerWithSession(
return HandlerWithBot(bot, coroutineContext[Job], coroutineContext, handler) bot: Bot,
noinline handler: suspend BotSession.(E) -> ListeningStatus
): HandlerWithSession<E> {
return HandlerWithSession(bot, coroutineContext[Job], coroutineContext, handler)
} }
/** /**
...@@ -118,9 +123,9 @@ internal suspend inline fun <E : Subscribable> HandlerWithBot(bot: Bot, noinline ...@@ -118,9 +123,9 @@ internal suspend inline fun <E : Subscribable> HandlerWithBot(bot: Bot, noinline
* 所有的 [BotEvent.bot] `!==` `bot` 的事件都不会被处理 * 所有的 [BotEvent.bot] `!==` `bot` 的事件都不会被处理
*/ */
@PublishedApi @PublishedApi
internal class HandlerWithBot<E : Subscribable> @PublishedApi internal constructor( internal class HandlerWithSession<E : Subscribable> @PublishedApi internal constructor(
val bot: Bot, val bot: Bot,
parentJob: Job?, private val context: CoroutineContext, @JvmField val handler: suspend Bot.(E) -> ListeningStatus parentJob: Job?, private val context: CoroutineContext, @JvmField val handler: suspend BotSession.(E) -> ListeningStatus
) : ) :
Listener<E>(), CompletableJob by Job(parentJob) { Listener<E>(), CompletableJob by Job(parentJob) {
...@@ -131,7 +136,7 @@ internal class HandlerWithBot<E : Subscribable> @PublishedApi internal construct ...@@ -131,7 +136,7 @@ internal class HandlerWithBot<E : Subscribable> @PublishedApi internal construct
if (event !is BotEvent || event.bot !== bot) return ListeningStatus.LISTENING if (event !is BotEvent || event.bot !== bot) return ListeningStatus.LISTENING
return try { return try {
withContext(context) { bot.handler(event) }.also { if (it == ListeningStatus.STOPPED) complete() } withContext(context) { bot.session.handler(event) }.also { if (it == ListeningStatus.STOPPED) complete() }
} catch (e: Throwable) { } catch (e: Throwable) {
e.logStacktrace() e.logStacktrace()
//completeExceptionally(e) //completeExceptionally(e)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment