MiraiForum

    • Register
    • Login
    • Search
    • Popular
    • Recent
    • Unsolved
    • Tags
    • Groups
    • 友情链接

    过滤时间和自定义事件

    开发交流
    2
    3
    287
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • 家
      家里啊黄 last edited by 家里啊黄

      这些过滤啥的看了好久,怎么具体的监听自定义事件,可以控制他们的暂停和继续,有没有大佬给出来例子
      0d29dc0c-3484-4d3a-871f-078a87a02730-image.png
      c70ea532-2393-49a5-a94c-cfe3626cc527-image.png
      ecda4d59-28fd-4687-9fcf-39db0618863a-image.png

      舔狗___ 1 Reply Last reply Reply Quote 0
      • 舔狗___
        舔狗___ @家里啊黄 last edited by 舔狗___

        @家里啊黄

                /**
                 * 正常来说 监听一个事件(Event) 比如群消息事件(GroupMessageEvent) 监听的时间必须继承Event接口
                 * 写法如下
                 */
                val listener: Listener<GroupMessageEvent>  = GlobalEventChannel.subscribeAlways<GroupMessageEvent> {
                    TODO("doSomething")
                }
                /**
                 * 取消监听
                 */
                listener.cancel()
        
        
                /**
                 * 或者以subscribe()方法进行监听
                 * 返回 ListeningStatus.LISTENING 代表继续监听
                 * 返回 ListeningStatus.STOPPED 代表结束监听
                 */
                GlobalEventChannel.subscribe<GroupMessageEvent> {
                    if (message.isNotEmpty()) {
                        // TODO("doSomething")
                        ListeningStatus.LISTENING
                    } else {
                        ListeningStatus.STOPPED
                    }
                }
        
                /**
                 * 只监听一次事件
                 */
                GlobalEventChannel.subscribeOnce<GroupMessageEvent> {
                    TODO("doSomething")
                }
        
        
                /**
                 * 如果是自定义事件 可以通过下面的写法进行广播
                 */
                class CustomBroadcastEvent(val broadcastMessage: String): AbstractEvent(), BroadcastControllable
        
                // 先创建自定义事件的监听器
                GlobalEventChannel.subscribeAlways<CustomBroadcastEvent> {
                    // 打印
                    println(broadcastMessage)
                }
        
                // new 一个自定义事件 然后进行广播
                suspend {
                    CustomBroadcastEvent("hello").broadcast()
                }
        
                /**
                 * 通过过滤监听某些符合条件的事件
                 */
                GlobalEventChannel
                    // 指定要过滤的事件为 群消息事件
                    .filterIsInstance<GroupMessageEvent>()
                    // 具体过滤策略
                    .filter {
                        // 例如 只监听某个群里某个人的消息
                        it.group.id == 987654321L && it.sender.id == 123456789L
                    }
                    .filter {
                        // 过滤时间 也可以用 && 写在上面
                        // 只监听中午12点后的消息
                        Calendar.getInstance().apply {
                            timeInMillis = (it.time * 1000).toLong()
                        }.get(Calendar.HOUR_OF_DAY) >= 12
                    }
                    // 下面订阅监听的操作同上
                    .subscribeAlways<GroupMessageEvent> {
                        TODO("doSomething")
                    }
        

        大概就是这样吧 另外没有暂停监听 如果不想要监听了就直接取消监听 需要的时候在创建就好了 或者 搞个布尔值来控制 True监听 false不监听

        家 1 Reply Last reply Reply Quote 0
        • 家
          家里啊黄 @舔狗___ last edited by

          @舔狗___ 我研究研究,多谢指点

          1 Reply Last reply Reply Quote 0
          • 1 / 1
          • First post
            Last post
          Powered by Mamoe Technologies & NodeBB | 友情链接 | 服务监控 | Contact