From 666607b430f1c0ae4ae82ef01754561e15189ca6 Mon Sep 17 00:00:00 2001 From: Eyre_S Date: Wed, 9 Apr 2025 15:46:30 +0800 Subject: [PATCH] add defined[T] for EventEnv - Now OnQuestionMarkReply skips expired event will use this feature - OnUserRandom.RandomSelect capability patch for OnQuestionMarkReply will use this feature --- .../cc/sukazyo/cono/morny/bot/api/EventEnv.scala | 14 ++++++++++++++ .../morny/bot/event/MornyEventListeners.scala | 2 +- .../morny/bot/event/OnQuestionMarkReply.scala | 15 ++++++++------- .../cono/morny/bot/event/OnUserRandom.scala | 3 ++- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/main/scala/cc/sukazyo/cono/morny/bot/api/EventEnv.scala b/src/main/scala/cc/sukazyo/cono/morny/bot/api/EventEnv.scala index 33750c6..9feb720 100644 --- a/src/main/scala/cc/sukazyo/cono/morny/bot/api/EventEnv.scala +++ b/src/main/scala/cc/sukazyo/cono/morny/bot/api/EventEnv.scala @@ -51,6 +51,20 @@ class EventEnv ( case None => ConsumeResult(false) } + // fixme: defined() series is not tested yet + + def defined [T: ClassTag]: Boolean = { + variables get classTag[T].runtimeClass match + case Some(_) => true + case None => false + } + + def defined [T] (t: Class[T]): Boolean = { + variables get t match + case Some(_) => true + case None => false + } + def consume [T: ClassTag] (consumer: T => Unit): ConsumeResult = variables get classTag[T].runtimeClass match case Some(i) => consumer(i.asInstanceOf[T]); ConsumeResult(true) diff --git a/src/main/scala/cc/sukazyo/cono/morny/bot/event/MornyEventListeners.scala b/src/main/scala/cc/sukazyo/cono/morny/bot/event/MornyEventListeners.scala index 0e05d4c..744437f 100644 --- a/src/main/scala/cc/sukazyo/cono/morny/bot/event/MornyEventListeners.scala +++ b/src/main/scala/cc/sukazyo/cono/morny/bot/event/MornyEventListeners.scala @@ -11,10 +11,10 @@ class MornyEventListeners (using manager: EventListenerManager) (using coeur: Mo // KUOHUANHUAN_NEED_SLEEP OnOnAlias(), OnUniMeowTrigger(using coeur.commands), + OnQuestionMarkReply(), $OnUserRandom.RandomSelect, //noinspection NonAsciiCharacters $OnUserRandom.尊嘟假嘟, - OnQuestionMarkReply(), OnUserSlashAction(), OnCallMe(), OnCallMsgSend(), diff --git a/src/main/scala/cc/sukazyo/cono/morny/bot/event/OnQuestionMarkReply.scala b/src/main/scala/cc/sukazyo/cono/morny/bot/event/OnQuestionMarkReply.scala index 177f400..f12d258 100644 --- a/src/main/scala/cc/sukazyo/cono/morny/bot/event/OnQuestionMarkReply.scala +++ b/src/main/scala/cc/sukazyo/cono/morny/bot/event/OnQuestionMarkReply.scala @@ -16,12 +16,7 @@ class OnQuestionMarkReply (using coeur: MornyCoeur) extends EventListener { import event.update // FIXME: not tested yet, due to cannot connect to test bot - if boundary[Boolean] { - event.consume[MornyOnUpdateTimestampOffsetLock.ExpiredEvent.type] { _ => - boundary.break(true) - } - false - } then { + if event.defined[MornyOnUpdateTimestampOffsetLock.ExpiredEvent.type] then { logger.debug("OnQuestionMarkReply: expired event, skipped") return } else { @@ -32,8 +27,12 @@ class OnQuestionMarkReply (using coeur: MornyCoeur) extends EventListener { import cc.sukazyo.cono.morny.util.UseMath.over import cc.sukazyo.cono.morny.util.UseRandom.chance_is - if (1 over 8) chance_is false then return; if !isAllMessageMark(using update.message.text) then return; + // provide a mark to notify the following event + // that the current event is all made of question marks + event.provide(OnQuestionMarkReply.Marked) + + if (1 over 8) chance_is false then return; if (update.message.hasProtectedContent) { // Copy the message @@ -77,4 +76,6 @@ object OnQuestionMarkReply { } } + object Marked + } diff --git a/src/main/scala/cc/sukazyo/cono/morny/bot/event/OnUserRandom.scala b/src/main/scala/cc/sukazyo/cono/morny/bot/event/OnUserRandom.scala index ac05d02..55b5dd0 100644 --- a/src/main/scala/cc/sukazyo/cono/morny/bot/event/OnUserRandom.scala +++ b/src/main/scala/cc/sukazyo/cono/morny/bot/event/OnUserRandom.scala @@ -29,7 +29,8 @@ class OnUserRandom (using coeur: MornyCoeur) { if rand_half then _con1 else _con2 case USER_IF_QUERY(_con) => // for capability with [[OnQuestionMarkReply]] - if OnQuestionMarkReply.isAllMessageMark(using _con) then return; + // fixme: not tested yet + if event.defined[OnQuestionMarkReply.Marked.type] then return; (if rand_half then "不" else "") + _con case _ => null