MiraiForum

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

    如何获取MessageChain的KIND属性?

    开发交流
    4
    10
    666
    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.
    • 2
      2446694 last edited by

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

      1 Reply Last reply Reply Quote 0
      • H
        hatmony 摸鱼 last edited by

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

        2 1 Reply Last reply Reply Quote 0
        • 2
          2446694 @hatmony last edited by 2446694

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

          1 Reply Last reply Reply Quote 0
          • H
            hatmony 摸鱼 last edited by

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

            2 1 Reply Last reply Reply Quote 0
            • 2
              2446694 @hatmony last edited by

              @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 Reply Last reply Reply Quote 0
              • H
                hatmony 摸鱼 last edited by

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

                2 1 Reply Last reply Reply Quote 0
                • 2
                  2446694 @hatmony last edited by

                  @hatmony kind属性有以下优势:

                  1. 低耦合
                  2. 高可靠
                  3. 免维护
                  H 1 Reply Last reply Reply Quote 0
                  • H
                    hatmony 摸鱼 @2446694 last edited by

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

                    1 Reply Last reply Reply Quote 0
                    • cssxsh
                      cssxsh last edited by

                      java 比较麻烦

                              MessageSource source = event.getMessage().get(MessageSource.Key);
                              MessageSourceAmender amender = new MessageSourceAmender(source);
                              MessageSourceKind kind = amender.getKind();
                      
                      1 Reply Last reply Reply Quote 1
                      • Him188
                        Him188 last edited by

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

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