本文最后更新于 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
这评论系统是哪个嘞