Skip to content

Commit 77c8d7b

Browse files
authoredSep 8, 2022
合并拉取请求 #447
为 `SimpleListenerBuilder` 提供部分匹配扩展
2 parents 817f450 + 8f95fb7 commit 77c8d7b

File tree

1 file changed

+69
-4
lines changed

1 file changed

+69
-4
lines changed
 

‎simbot-cores/simbot-core/src/main/kotlin/love/forte/simbot/core/event/SimpleListenerBuilder.kt

+69-4
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,10 @@
1717

1818
package love.forte.simbot.core.event
1919

20-
import love.forte.simbot.Api4J
21-
import love.forte.simbot.ExperimentalSimbotApi
22-
import love.forte.simbot.PriorityConstant
23-
import love.forte.simbot.SimbotIllegalStateException
20+
import love.forte.simbot.*
2421
import love.forte.simbot.event.*
22+
import love.forte.simbot.message.At
23+
import love.forte.simbot.message.Message
2524
import love.forte.simbot.utils.randomIdStr
2625
import love.forte.simbot.utils.runWithInterruptible
2726
import org.slf4j.Logger
@@ -401,3 +400,69 @@ public inline fun <E : Event> buildSimpleListener(
401400
public inline fun <reified E : Event> buildSimpleListener(block: SimpleListenerBuilder<E>.() -> Unit): EventListener {
402401
return buildSimpleListener(E::class.getKey(), block)
403402
}
403+
404+
// extra
405+
406+
/**
407+
* 对一个消息事件 [E] 的 [文本内容][love.forte.simbot.message.MessageContent.plainText] 进行匹配。
408+
*
409+
* ```kotlin
410+
* buildSimpleListener(FooMessageEvent) {
411+
* matchText { event: FooMessageEvent -> // this: EventListenerProcessingContext
412+
* // ...
413+
*
414+
* "MATCH-TEXT" // 需要被匹配的文本
415+
* }
416+
* }
417+
* ```
418+
*
419+
*/
420+
public inline fun <E : MessageEvent> SimpleListenerBuilder<E>.matchText(crossinline textProvider: suspend EventListenerProcessingContext.(E) -> String) {
421+
match { event ->
422+
event.messageContent.plainText == textProvider(event)
423+
}
424+
}
425+
426+
427+
/**
428+
* 对一个消息事件 [E] 的 [消息元素][love.forte.simbot.message.MessageContent.messages] 中指定的类型进行校验。
429+
*
430+
* ```kotlin
431+
* buildSimpleListener(FooMessageEvent) {
432+
* matchMessage(At, require = false) { event: FooMessageEvent, at: At, index: Int -> // this: EventListenerProcessingContext
433+
* // ...
434+
*
435+
* at.target.literal != "123"
436+
* }
437+
* }
438+
* ```
439+
*
440+
*/
441+
public inline fun <E : MessageEvent, reified M : Message.Element<M>> SimpleListenerBuilder<E>.matchMessage(
442+
messageKey: Message.Key<M>,
443+
require: Boolean = true,
444+
crossinline matcher: suspend EventListenerProcessingContext.(E, M, index: Int) -> Boolean,
445+
) {
446+
match { event ->
447+
var index = -1
448+
event.messageContent.messages.forEach { m ->
449+
messageKey.safeCast(m)?.also { targetMsg ->
450+
index += 1
451+
if (!matcher(event, targetMsg, index)) {
452+
return@match false
453+
}
454+
}
455+
}
456+
457+
!require || index >= 0
458+
}
459+
}
460+
461+
public fun a() {
462+
buildSimpleListener(MessageEvent) {
463+
matchMessage(At) { e, m, i ->
464+
m.target.literal != "123"
465+
true
466+
}
467+
}
468+
}

0 commit comments

Comments
 (0)
Please sign in to comment.