MiraiForum

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

    如何获取MessageChain的KIND属性?

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

      MessageChain序列化为JSON字符串时候可以得到一个KIND属性,是用来标记是群("GROUP")、好友("FRIEND")、群私聊会话("TEMP"),我想直接获取这个KIND属性,用来判断消息的类型,如何获取它?
      c1bf86ca-31ca-4625-abfa-f4e4fa645482-image.png

      1 条回复 最后回复 回复 引用 0
      • H
        hatmony 摸鱼 最后由 编辑

        首先你监听消息的时候就知道是来自哪里了

        2 1 条回复 最后回复 回复 引用 0
        • 2
          2446694 @hatmony 最后由 2446694 编辑

          @hatmony 我并不只是想判断KIND属性,我想获取MessageChain的原生的值,因为原生的值不需要自己维护

          1 条回复 最后回复 回复 引用 0
          • H
            hatmony 摸鱼 最后由 编辑

            你获取MessageChain的时候用的是全局监听?不然按作用域监听本身就已经把消息类型分开了

            2 1 条回复 最后回复 回复 引用 0
            • 2
              2446694 @hatmony 最后由 编辑

              @hatmony

              if (event instanceof GroupMessageEvent) {  // 群聊天
                                      GroupMessageEvent prototypeEvent = (GroupMessageEvent) event;
                                      doGroupMessageEvent(prototypeEvent);
                                  } else if (event instanceof GroupMessageSyncEvent) {
                                      GroupMessageSyncEvent prototypeEvent = (GroupMessageSyncEvent) event;
                                      doGroupMessageEvent(prototypeEvent);
              
                                  } else if (event instanceof FriendMessageEvent) {  // 好友聊天
                                      FriendMessageEvent prototypeEvent = (FriendMessageEvent) event;
                                      doFriendMessageEvent(prototypeEvent);
                                  } else if (event instanceof FriendMessageSyncEvent) {
                                      FriendMessageSyncEvent prototypeEvent = (FriendMessageSyncEvent) event;
                                      doFriendMessageEvent(prototypeEvent);
              
                                  } else if (event instanceof GroupTempMessageEvent) {  // 群临时会话
                                      GroupTempMessageEvent prototypeEvent = (GroupTempMessageEvent) event;
                                      doStrangerMessageEvent(prototypeEvent);
                                  } else if (event instanceof GroupTempMessageSyncEvent) {
                                      GroupTempMessageSyncEvent prototypeEvent = (GroupTempMessageSyncEvent) event;
                                      doStrangerMessageEvent(prototypeEvent);
              
                                  } else if (event instanceof StrangerMessageEvent) {  // 陌生人聊天
                                      StrangerMessageEvent prototypeEvent = (StrangerMessageEvent) event;
                                      doStrangerMessageEvent(prototypeEvent);
                                  } else if (event instanceof StrangerMessageSyncEvent) {
                                      StrangerMessageSyncEvent prototypeEvent = (StrangerMessageSyncEvent) event;
                                      doStrangerMessageEvent(prototypeEvent);
                                  } else {
                                      log.warn("未知的消息类型: " + event.getClass().getName());
                                      for (Long superId : QqSessionManager.getSupers()) {
                                          QqSessionManager.getQqSession(superId).getFriend(superId).sendMessage(String.format("未知的消息类型:\n%s\nbotId:%d\nsenderId:%d\nsubjectId:%d\nfromId:%d\ntargetId:%d", event.getClass().getName(), source.getBotId(), source.getSender().getId(), source.getSubject().getId(), source.getFromId(), source.getTargetId()));
                                      }
                                  }
              

              使用 [MessageChain.serializeToJsonString] 将 [MessageChain] 序列化为 JSON [String].
              JSON [String] 包含一个kind属性,我想获取这个kind值,但我不想先将序列化为JSON字符串,然后反序列化为List获取,因为这是非常消耗性能,但又不想自己维护,因为可能出现未知的消息类型

              1 条回复 最后回复 回复 引用 0
              • H
                hatmony 摸鱼 最后由 编辑

                不清楚为什么想通过MessageChain反过来获取对应的event类型?
                event可以通过监听直接过滤出想要的事件类型,不需要拿全局的event进行逐一判断。

                2 1 条回复 最后回复 回复 引用 0
                • 2
                  2446694 @hatmony 最后由 编辑

                  @hatmony kind属性有以下优势:

                  1. 低耦合
                  2. 高可靠
                  3. 免维护
                  H 1 条回复 最后回复 回复 引用 0
                  • H
                    hatmony 摸鱼 @2446694 最后由 编辑

                    @2446694
                    感觉和阁下不在一个频道,我就此打住

                    1 条回复 最后回复 回复 引用 0
                    • cssxsh
                      cssxsh 最后由 编辑

                      java 比较麻烦

                              MessageSource source = event.getMessage().get(MessageSource.Key);
                              MessageSourceAmender amender = new MessageSourceAmender(source);
                              MessageSourceKind kind = amender.getKind();
                      
                      1 条回复 最后回复 回复 引用 1
                      • Him188
                        Him188 最后由 编辑

                        MessageSource 有 getKind, 有可能是 2.15.0-M1 增加, 也有可能是 2.15.0-RC 即将增加

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