simple-robot / simbot-component-mirai

simple-robot下的mirai组件
https://component-mirai.simbot.forte.love/
GNU Affero General Public License v3.0
20 stars 0 forks source link

怎么记录bot在群里发送的消息的ID,后续bot再发消息的时候引用上一次发的内容 #102

Closed Kvi121 closed 1 year ago

Kvi121 commented 1 year ago

版本号

3.0.0-M5 ### 疑问描述 怎么记录bot在群里发送的消息的ID,后续bot再发消息的时候引用上一次发的内容 现在是通过这种方式发消息 Group group = bot.getGroup(ID.$(m.getKey())); group.sendBlocking("");
ForteScarlet commented 1 year ago

可以参考

    @Listener
    public void listen(GroupMessageEvent event) {
        // 第一个消息
        MessageReceipt receipt = event.getGroup().sendBlocking("hello");
        // 引用回复对象需要使用到mirai的 Message Source,因此需要确保消息回执是mirai的消息回执。
        if (receipt instanceof SimbotMiraiMessageReceipt miraiMessageReceipt) {
            OnlineMessageSource.Outgoing source = miraiMessageReceipt.getReceipt().getSource();
            // 构建引用回复对象
            MiraiQuoteReply quoteReply = new MiraiQuoteReply(source);
            // 第二个消息
            Messages messages = new MessagesBuilder().append(quoteReply).append("hello2").build();
            event.getGroup().sendBlocking(messages);
        }
    }

或直接监听mirai组件的专属事件:

@Listener
public void listen(MiraiGroupMessageEvent event) {
    // 第一个消息
    SimbotMiraiMessageReceipt<Group> receipt = event.getGroup().sendBlocking("hello");
    OnlineMessageSource.Outgoing source = receipt.getReceipt().getSource();
    MiraiQuoteReply quoteReply = new MiraiQuoteReply(source);
    Messages messages = new MessagesBuilder().append(quoteReply).append("hello2").build();
    // 第二个带引用的消息
    event.getGroup().sendBlocking(messages);
}

如果希望序列化ID后引用,可以参考

@Listener
public void listen( GroupMessageEvent event) {
    // 第一个消息
    MessageReceipt receipt = event.getGroup().sendBlocking("hello");
    if (receipt instanceof SingleMessageReceipt singleMessageReceipt) {
        // 如果回执为单消息回执(mirai组件中目前为止所有的消息回执都是'单消息回执'
        ID id = singleMessageReceipt.getId();
        String idStr = id.toString();
        // 保存此ID
        // ...
        // 假设此处又从某处读取来了此ID
        CharSequenceID id1 = Identifies.ID(idStr);
        MiraiQuoteReply quoteReply = new MiraiQuoteReply(id1);
        Messages messages = new MessagesBuilder().append(quoteReply).append("hello2").build();
        // 发送带引用的消息
        event.getGroup().sendBlocking(messages);
    }
}

需要注意的是,序列化ID再读取ID字符串构建 MiraiQuoteReply 的形式不如前两者稳定。

Kvi121 commented 1 year ago

谢谢,解决了 序列化ID再读取ID字符串构建 这种你说的不稳定是会导致消息发不出去吗? 还是会有其他什么问题?

Kvi121 commented 1 year ago

很奇怪,用序列化ID后引用后, 手机端不会显示引用, 并且pc端引用的格式也有点问题 image

ForteScarlet commented 1 year ago

序列化ID再读取ID字符串构建 这种你说的不稳定是会导致消息发不出去吗? 还是会有其他什么问题?

此ID的序列化并非官方自带的序列化方案因此无法保证可用性或者可能存在缺陷,你说的显示格式有问题就算是其中一种问题