mirai机器人-整合SpringBoot
本文最后更新于 639 天前,其中的信息可能已经有所发展或是发生改变。

mirai文档:https://docs.mirai.mamoe.net/

框架搭建参考项目:zsefvbhuhh/Mirai-SpringBoot-Demo: 简单的Mirai+SpringBoot启动Demo (github.com)

我之前写过一个基于 mirai-console 的 mirai 机器人。

这种插件模式虽然方便,但是如果想要引入一些别的依赖就相对来说比较麻烦。

今天打算写一个基于 mirai-core 的机器人,顺便整合 SpringBoot。

框架搭建

创建 SpringBoot 项目,添加 mirai-core 的 Maven 依赖

<dependency>
    <groupId>net.mamoe</groupId>
    <artifactId>mirai-core-jvm</artifactId>
    <version>2.7.0</version> 
</dependency>

添加实体类 QQBot

@Component
@Slf4j
public class QQBot {
    //自行添加配置文件
    @Value("${bot.username}")
    public Long username;
    @Value("${bot.password}")
    public String password;

    private static Bot bot;

    public static Bot getBot() {
        return bot;
    }

    //设备认证信息文件
    private static final String deviceInfo = "device.json";

    /**
     * 启动BOT
     */
    public void startBot() {
        if (null == username || null == password) {
            System.err.println("*****未配置账号或密码*****");
            log.warn("*****未配置账号或密码*****");
        }

        bot = BotFactory.INSTANCE.newBot(username, password, new BotConfiguration() {
            {
                //保存设备信息到文件deviceInfo.json文件里相当于是个设备认证信息
                fileBasedDeviceInfo(deviceInfo);
                setProtocol(MiraiProtocol.ANDROID_PHONE); // 切换协议
            }
        });
        bot.login();
    }
}

添加 SpringUtil

/**
 * 普通类调用Spring bean对象:
 * 注意:此类需要放到App.java同包或者子包下才能被扫描,否则失效。
 */
@Component
public class SpringUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext = null;


    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (SpringUtil.applicationContext == null) {
            SpringUtil.applicationContext = applicationContext;
        }

    }

    //获取applicationContext
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    //通过name获取 Bean.
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);

    }

    //通过class获取Bean.
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    //通过name,以及Clazz返回指定的Bean
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }
}

修改SpringBoot的启动类

@SpringBootApplication
public class SummerbotApplication {
    public static void main(String[] args) {
        SpringApplication.run(SummerbotApplication.class, args);
        ApplicationContext context = SpringUtil.getApplicationContext();
        QQBot qqBot = context.getBean(QQBot.class);
        qqBot.startBot();
    }
}

到此为止,一个Bot就启动成功了。接下来就是编写监听器监听消息。


事件监听

方法一

@Component
public class MyEventHandlers {
    public void listen() {
        // 创建监听
        Listener listener = GlobalEventChannel.INSTANCE.subscribeAlways(GroupMessageEvent.class, event -> {
            MessageChain chain = event.getMessage(); // 可获取到消息内容等, 详细查阅 `GroupMessageEvent`

            event.getSubject().sendMessage("Hello!"); // 回复消息
        });
        listener.complete(); // 停止监听
    }
}

//写完之后在 QQbot 的 startBot() 中调用这个方法即可

方法二

public class MyEventHandlers extends SimpleListenerHost {

    @Override
    public void handleException(@NotNull CoroutineContext context, @NotNull Throwable exception){
        // 处理事件处理时抛出的异常
    }

    @EventHandler
    public void onMessage(@NotNull MessageEvent event) throws Exception { // 可以抛出任何异常, 将在 handleException 处理
        event.getSubject().sendMessage("received");
        // 无返回值, 表示一直监听事件.
    }

    @NotNull
    @EventHandler
    public ListeningStatus onMessageStatus(@NotNull MessageEvent event) throws Exception { // 可以抛出任何异常, 将在 handleException 处理
        event.getSubject().sendMessage("received");
        return ListeningStatus.LISTENING; // 表示继续监听事件
        // return ListeningStatus.STOPPED; // 表示停止监听事件
    }
}

// 在 QQbot 的 startBot() 方法中注册:
// bot.getEventChannel.registerListenerHost(new MyEventHandlers())

支持的方法类型:

// T 表示任何 Event 类型.
void onEvent(T)
Void onEvent(T)
ListeningStatus onEvent(T) // 禁止返回 null

评论

  1. Josiah
    Macintosh Safari 14.1.1
    2 年前
    2021-10-26 23:44:57

    这评论系统是哪个嘞

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇