17
17
18
18
package love.forte.simbot.core.event
19
19
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.*
24
21
import love.forte.simbot.event.*
22
+ import love.forte.simbot.message.At
23
+ import love.forte.simbot.message.Message
25
24
import love.forte.simbot.utils.randomIdStr
26
25
import love.forte.simbot.utils.runWithInterruptible
27
26
import org.slf4j.Logger
@@ -401,3 +400,69 @@ public inline fun <E : Event> buildSimpleListener(
401
400
public inline fun <reified E : Event > buildSimpleListener (block : SimpleListenerBuilder <E >.() -> Unit ): EventListener {
402
401
return buildSimpleListener(E ::class .getKey(), block)
403
402
}
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