MiraiForum

    • 注册
    • 登录
    • 搜索
    • 热门
    • 最新
    • 未解决
    • 标签
    • 群组
    • 友情链接

    过滤时间和自定义事件

    开发交流
    2
    3
    276
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 家
      家里啊黄 最后由 家里啊黄 编辑

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

      舔狗___ 1 条回复 最后回复 回复 引用 0
      • 舔狗___
        舔狗___ @家里啊黄 最后由 舔狗___ 编辑

        @家里啊黄

                /**
                 * 正常来说 监听一个事件(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 条回复 最后回复 回复 引用 0
        • 家
          家里啊黄 @舔狗___ 最后由 编辑

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

          1 条回复 最后回复 回复 引用 0
          • 1 / 1
          • First post
            Last post
          Powered by Mamoe Technologies & NodeBB | 友情链接 | 服务监控 | Contact