simple-robot / simpler-robot

Simple Robot,一个bot风格的Kotlin多平台事件调度框架,异步高效、Java友好!/ A Bot-style Kotlin Multiplatform event scheduling framework, asynchronous and high-performance, java-friendly! 🐱😼😻😸
https://simbot.forte.love
GNU Lesser General Public License v3.0
513 stars 44 forks source link

[SUG] 提供mirai组件下对合并转发消息的支持 #169

Closed KoSChicken closed 3 years ago

KoSChicken commented 3 years ago

version: ``

module: ``

疑问描述

例如我现在想要通过合并转发的方式发送一组图片,有没有办法直接创建一个合并转发类型的消息?

ForteScarlet commented 3 years ago

对于合并转发消息,暂时没有对其适配的抽象接口,目前你可以通过构建原生Mirai的合并转发消息,并通过 MiraiMessageContentBuilder 进行构建。参考示例:

@Beans
public class TestListener {
    /**
     * 只有在mirai组件环境下可以注入获取。
     */
    @Depend
    private MiraiMessageContentBuilderFactory miraiMessageContentBuilderFactory;

    @OnGroup
    // @Filter // ...
    public void test(GroupMsg groupMsg, Sender sender) {

        // 得到builder
        final MiraiMessageContentBuilder builder = miraiMessageContentBuilderFactory.getMessageContentBuilder();

        // net.mamoe.mirai.Bot
        // 得到Mirai的bot实例
        final Bot miraiBot = Bot.findInstance(123456789L);
        if (miraiBot == null) {
            throw new NullPointerException("Bot 123456789");
        }

        // 比如你要发给一个群
        final Group group = miraiBot.getGroupOrFail(1145141919L);

        // 寻找一个发送者,比如某个群员
        final NormalMember senderOnGroup = group.getOrFail(888888888);

        // 构建转发消息
        final ForwardMessageBuilder forwardMessageBuilder = new ForwardMessageBuilder(group);

        // TODO 通过 builder 构建一个 mirai的 ForwardMessage
        // forwardMessageBuilder.add()
        // 比如说你要发送图片,则构建mirai原生的图片对象:

        // 通过file
        final ExternalResource resource1 = ExternalResource.create(new File("..."));

        // 或其他方式
        // ExternalResource.create(...)

        // 通过某个群上传
        final Image image = group.uploadImage(resource1);

        // 添加一个图片
        forwardMessageBuilder.add(senderOnGroup, image);

        // 得到最终的转发消息
        final ForwardMessage forwardMessage = forwardMessageBuilder.build();

        // 得到 mirai 组件的消息正文
        final MiraiMessageContent miraiMessageContent = builder.message(forwardMessage).build();

        // 通过 simbot 发送消息
        sender.sendGroupMsg(123123, miraiMessageContent);

        // 当然,你也可以选择直接通过mirai本身发送:
        // group.sendMessage(forwardMessage);

    }
}

至于是否会提供针对于转发消息的整合api,会考虑在 v2.3.0 更新期间追加,可以关注后续更新日志或当前issue。

KoSChicken commented 3 years ago

非常感谢你的解答