MiraiForum

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

    获取回复消息(QuoteReplay)指向原文的实现思路

    技术交流板块
    1
    1
    52
    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.
    • MrXiaoM
      MrXiaoM 童心未泯 last edited by

      总所周知,腾讯服务器给你返回的 QuoteReply 的源消息并不是富文本消息,也就是说,图片会“退化”为[图片]等等。如果我们想做回复消息搜图之类的功能,这给我们带来了比较多的麻烦。

      但是,我们可以取到源消息的 MessageSource,只要你本地存了聊天记录,就能够通过 MessageSource 获取相应消息。按照这个思路,我们只要跟QQ客户端一样,把消息存到本地,需要时获取即可。

      具体实现

      本帖中将使用 Mirai Hibernate Plugin 插件储存聊天记录,演示获取回复消息原文的方法。

      引用依赖

      // build.gradle(.kts)
      
      repositories {
          mavenCentral()
      }
      
      dependencies {
          compileOnly("xyz.cssxsh.mirai:mirai-hibernate-plugin:依赖版本")
      }
      
      // hibernate 6 和 HikariCP 5 需要 jdk11
      mirai {
          jvmTarget = JavaVersion.VERSION_11
      }
      
      //author("MrXiaoM")
      // 在主类插件信息处声明插件依赖关系
      dependsOn("xyz.cssxsh.mirai.plugin.mirai-hibernate-plugin", false)
      

      Kotlin

      val QuoteReply.originalMessageFromLocal: MessageChain
          get() = MiraiHibernateRecorder[source].firstOrNull()?.toMessageChain() ?: source.originalMessage
      
      // 使用示例
      @EventHandler
      fun GroupMessageEvent.listen() {
          // 检测回复消息
          message[QuoteReply.Key]?.run { 
              val original = originalMessageFromLocal
              // do sth.
          }
      }
      

      Java

          public static MessageChain getOriginalMessageFromLocal(QuoteReply quote) {
              Optional<MessageRecord> record = MiraiHibernateRecorder.INSTANCE.get(quote.getSource()).stream().findFirst();
              return record.map(MessageRecord::toMessageChain).orElseGet(() -> quote.getSource().getOriginalMessage());
          }
          // 使用示例
          @EventHandler
          public void onGroupMessage(GroupMessageEvent event) {
              // 检测回复消息
              QuoteReply quote = event.getMessage().get(QuoteReply.Key);
              if (quote != null) {
                  MessageChain original = getOriginalMessageFromLocal(quote);
                  // do sth.
              }
          }
      
      1 Reply Last reply Reply Quote 0
      • 1 / 1
      • First post
        Last post
      Powered by Mamoe Technologies & NodeBB | 友情链接 | 服务监控 | Contact