mirror of
https://github.com/mamoe/mirai.git
synced 2025-02-23 10:20:14 +08:00
Change the receiver from Bot to BotSession
This commit is contained in:
parent
2621c15519
commit
876599b5b0
@ -4,9 +4,10 @@ package net.mamoe.mirai.event
|
||||
|
||||
import net.mamoe.mirai.Bot
|
||||
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.subscribeInternal
|
||||
import net.mamoe.mirai.network.BotSession
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
/**
|
||||
@ -18,36 +19,38 @@ import kotlin.reflect.KClass
|
||||
|
||||
// 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)
|
||||
|
||||
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)
|
||||
|
||||
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)
|
||||
|
||||
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)
|
||||
|
||||
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)
|
||||
|
||||
|
||||
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)
|
||||
|
||||
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)
|
||||
|
||||
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)
|
||||
|
||||
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)
|
||||
|
||||
// endregion
|
||||
@ -56,48 +59,48 @@ suspend inline fun <reified E : BotEvent> Bot.subscribeWhileNull(noinline listen
|
||||
// region KClass 的扩展方法 (仅内部使用)
|
||||
|
||||
@PublishedApi
|
||||
internal suspend fun <E : BotEvent> KClass<E>.subscribe(bot: Bot, handler: suspend Bot.(E) -> ListeningStatus) =
|
||||
this.subscribeInternal(HandlerWithBot(bot, handler))
|
||||
internal suspend fun <E : BotEvent> KClass<E>.subscribe(bot: Bot, handler: suspend BotSession.(E) -> ListeningStatus) =
|
||||
this.subscribeInternal(HandlerWithSession(bot, handler))
|
||||
|
||||
@PublishedApi
|
||||
internal suspend fun <E : BotEvent> KClass<E>.subscribeAlways(bot: Bot, listener: suspend Bot.(E) -> Unit) =
|
||||
this.subscribeInternal(HandlerWithBot(bot) { listener(it); ListeningStatus.LISTENING })
|
||||
internal suspend fun <E : BotEvent> KClass<E>.subscribeAlways(bot: Bot, listener: suspend BotSession.(E) -> Unit) =
|
||||
this.subscribeInternal(HandlerWithSession(bot) { listener(it); ListeningStatus.LISTENING })
|
||||
|
||||
@PublishedApi
|
||||
internal suspend fun <E : BotEvent> KClass<E>.subscribeOnce(bot: Bot, listener: suspend Bot.(E) -> Unit) =
|
||||
this.subscribeInternal(HandlerWithBot(bot) { listener(it); ListeningStatus.STOPPED })
|
||||
internal suspend fun <E : BotEvent> KClass<E>.subscribeOnce(bot: Bot, listener: suspend BotSession.(E) -> Unit) =
|
||||
this.subscribeInternal(HandlerWithSession(bot) { listener(it); ListeningStatus.STOPPED })
|
||||
|
||||
@PublishedApi
|
||||
internal suspend fun <E : BotEvent, T> KClass<E>.subscribeUntil(bot: Bot, valueIfStop: T, listener: suspend Bot.(E) -> T) =
|
||||
subscribeInternal(HandlerWithBot(bot) { if (listener(it) === valueIfStop) ListeningStatus.STOPPED else ListeningStatus.LISTENING })
|
||||
internal suspend fun <E : BotEvent, T> KClass<E>.subscribeUntil(bot: Bot, valueIfStop: T, listener: suspend BotSession.(E) -> T) =
|
||||
subscribeInternal(HandlerWithSession(bot) { if (listener(it) === valueIfStop) ListeningStatus.STOPPED else ListeningStatus.LISTENING })
|
||||
|
||||
@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)
|
||||
|
||||
@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)
|
||||
|
||||
@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)
|
||||
|
||||
|
||||
@PublishedApi
|
||||
internal suspend fun <E : BotEvent, T> KClass<E>.subscribeWhile(bot: Bot, valueIfContinue: T, listener: suspend Bot.(E) -> T) =
|
||||
subscribeInternal(HandlerWithBot(bot) { if (listener(it) !== valueIfContinue) ListeningStatus.STOPPED else ListeningStatus.LISTENING })
|
||||
internal suspend fun <E : BotEvent, T> KClass<E>.subscribeWhile(bot: Bot, valueIfContinue: T, listener: suspend BotSession.(E) -> T) =
|
||||
subscribeInternal(HandlerWithSession(bot) { if (listener(it) !== valueIfContinue) ListeningStatus.STOPPED else ListeningStatus.LISTENING })
|
||||
|
||||
@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)
|
||||
|
||||
@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)
|
||||
|
||||
@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)
|
||||
|
||||
// endregion
|
@ -8,6 +8,8 @@ import net.mamoe.mirai.event.EventDebugLogger
|
||||
import net.mamoe.mirai.event.ListeningStatus
|
||||
import net.mamoe.mirai.event.Subscribable
|
||||
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.io.logStacktrace
|
||||
import kotlin.coroutines.CoroutineContext
|
||||
@ -108,8 +110,11 @@ internal class Handler<in E : Subscribable>
|
||||
|
||||
@PublishedApi
|
||||
@Suppress("FunctionName")
|
||||
internal suspend inline fun <E : Subscribable> HandlerWithBot(bot: Bot, noinline handler: suspend Bot.(E) -> ListeningStatus): HandlerWithBot<E> {
|
||||
return HandlerWithBot(bot, coroutineContext[Job], coroutineContext, handler)
|
||||
internal suspend inline fun <E : Subscribable> HandlerWithSession(
|
||||
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
|
||||
* 所有的 [BotEvent.bot] `!==` `bot` 的事件都不会被处理
|
||||
*/
|
||||
@PublishedApi
|
||||
internal class HandlerWithBot<E : Subscribable> @PublishedApi internal constructor(
|
||||
internal class HandlerWithSession<E : Subscribable> @PublishedApi internal constructor(
|
||||
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) {
|
||||
|
||||
@ -131,7 +136,7 @@ internal class HandlerWithBot<E : Subscribable> @PublishedApi internal construct
|
||||
if (event !is BotEvent || event.bot !== bot) return ListeningStatus.LISTENING
|
||||
|
||||
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) {
|
||||
e.logStacktrace()
|
||||
//completeExceptionally(e)
|
||||
|
Loading…
Reference in New Issue
Block a user