https://github.com/erzbir/numeron
基于 Mirai 框架的 QQ 机器人项目, 支持多 bot, 可作脚手架快速开发
https://github.com/erzbir/numeron
annotations java kotlin mirai mirai-bot mirai-core qqbot reflect reflection springboot
Last synced: 4 months ago
JSON representation
基于 Mirai 框架的 QQ 机器人项目, 支持多 bot, 可作脚手架快速开发
- Host: GitHub
- URL: https://github.com/erzbir/numeron
- Owner: Erzbir
- License: agpl-3.0
- Created: 2022-11-17T19:28:19.000Z (almost 3 years ago)
- Default Branch: master
- Last Pushed: 2024-11-24T05:54:26.000Z (11 months ago)
- Last Synced: 2025-06-05T06:49:42.479Z (4 months ago)
- Topics: annotations, java, kotlin, mirai, mirai-bot, mirai-core, qqbot, reflect, reflection, springboot
- Language: Java
- Homepage: https://erzbir.com
- Size: 6.13 MB
- Stars: 18
- Watchers: 2
- Forks: 3
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Numeron
- [Numeron](#numeron)
- [介绍:](#介绍)
- [模块:](#模块)
- [实现的功能:](#plugin-模块实现的功能)
- [说明:](#说明)
- [只使用 bot 功能:](#只使用-bot-功能)
- [脚手架使用](#脚手架使用)
- [@Handler 使用:](#handler使用)
- [@Filter 使用:](#filter-使用)
- [@Permission 使用](#permission-使用)
- [用@Command生成指令表:](#command-生成指令表)
- [用@Menu生成图片菜单:](#menu-生成图片菜单)
- [开发计划:](#开发计划)
- [联系方式:](#联系方式)## 介绍:
这是一个使用 mirai-core 开发的 qqBot, 添加了注解风格编程
这个项目目前打算做成通用 bot 框架, 与具体的 bot 协议框架解耦
有很多没有写进文档, 很多类也没有注释, 待补充......
### 模块:
- core: 脚手架(消息过滤和监听注册实现)
- api: 监听注册等 api
- mirai-bot: mirai 的实现 (计划做成适配器)
- boot: 定义程序的启动
- menu: 图片菜单生成
- plugin: 实现的 bot 功能 (实际上应该作为此项目的一个子模块)
- console: 控制台(待开发)和插件加载
- utils: 一些通用工具因为打算与具体的 bot 框架分离, 结构可能会出现较大变化
## plugin 模块实现的功能:
- 消息回复
- @禁言, qq号禁言
- 全体禁言
- 黑名单检测
- 违禁词检测
- 精准问答
- 防撤回
- 入群欢迎/退群反馈
- 代码和命令执行, 支持JavaScript/Python/Shell
- 群签到功能
- 发送/help获取自动生成的命令表(在方法上加上 `@Command` 注解生成)
- 对接openai
- 聊天
- 补全
- 问答
- 绘画
- 游戏王查卡
- rss订阅
- 生成图片菜单目录## 说明:
### 只使用 bot 功能:
此部分由 mirai-core 提供底层实现
第一次使用会使用控制台输入配置, 登陆后则会自动登陆, 提供多 bot 支持
在 [mirai-bot](mirai-bot) 模块运行主函数即可
所有QQ机器人功能都写在[numeron-plugin](numeron-plugin)模块下
### 脚手架使用:
[@Component](numeron-api/src/main/java/com/erzbir/numeron/annotation/Component.java) 注解表示这个类需要注册到容器中
[@Listener](numeron-api/src/main/java/com/erzbir/numeron/annotation/Listener.java) 注解表示这个类需要被当作 "监听器"
注册到容器中如果作为脚手架使用, 必须使用 [numeron-boot](numeron-boot) 模块, 使用 `StarterController`
将项目的启动类作为参数调用 `boot()` 方法```java
public class NumeronBotApplication {public static void main(String[] args) {
StarterController starterController = new StarterController();
starterController.boot(NumeronBotApplication.class, NumeronBotApplication.class.getClassLoader()); // 调用 boot 方法初始化
BotServiceImpl.INSTANCE.loginAll();
}
}
```#### @Handler使用:
[@Handler](numeron-api/src/main/java/com/erzbir/numeron/annotation/Handler.java)
> 将一个方法标记为监听回调, 监听的时间类型由参数决定
此注解标注的方法由
[ListenerRegisterInter](numeron-api/src/main/java/com/erzbir/numeron/api/listener/ListenerRegisterInter.java)
的实现类注册到 bot 框架监听```java
@Listener
public class Test {/**
* bot 收到群消息则会触发这个方法
*/
@Handler
private void test(GroupMessageEvent event) {
event.getSubject().sendMessage("收到了群消息");
}
}
```#### @Filter 使用:
[@Filter](numeron-api/src/main/java/com/erzbir/numeron/annotation/Filter.java)
此处参考了: [simple-robot](https://github.com/simple-robot/simpler-robot)
此注解可以针对: 群 id, 事件发送者 id, bot id 以及消息事件的文本消息来进行规则过滤
此注解可以实现简单的权限, 本项目提供了一个专门的权限过滤注解, 下文介绍
```java
@Listener
public class Test {/**
* bot 收到群消息 "hi" 则会触发这个方法
*/
@Handler
@Filter("hi")
private void test(GroupMessageEvent event) {
event.getSubject().sendMessage("你好");
}
}
```#### @Permission 使用:
[@Permission](numeron-api/src/main/java/com/erzbir/numeron/annotation/Permission.java)
此项目中提供了一个默认的权限实现, 也可以通过 spi
实现 [PermissionService](numeron-api/src/main/java/com/erzbir/numeron/api/permission/PermissionService.java)
接口实现自定义权限规则 (尚未开发完毕)```java
@Listener
public class Test {/**
* bot 收到主人发送的群消息 "hi" 则会触发这个方法
*/
@Handler
@Filter("hi")
@Permission(permission = PermissionType.MASTER)
private void test(GroupMessageEvent event) {
event.getSubject().sendMessage("主人你好");
}
}
```#### @Command 生成指令表:
此部分打算抽象一个 format 类负责格式化
[@Command](numeron-api/src/main/java/com/erzbir/numeron/annotation/Command.java)
```java
@Listener
class Test {
@Command(
name = "自动回复",
dec = "添加关键词回复",
help = "/learn ques answer"
)
@Handler
@Filter(value = "^/learn\\s+?.*?\\s+?.*", matchType = MatchType.REGEX_MATCHES)
private void learn(MessageEvent e) {
String[] split = e.getMessage().contentToString().split("\\s+");
if (split.length < 3) {
return;
}
AutoReplyData.INSTANCE.add(split[1], split[2], e.getSender().getId());
e.getSubject().sendMessage("学会了");
}@Command(
name = "自动回复",
dec = "删除关键词回复",
help = "/forget ques"
)
@Handler
@Filter(value = "^/forget\\s+\\S+", matchType = MatchType.REGEX_MATCHES)
private void forget(MessageEvent e) {
String s = e.getMessage().contentToString().replaceAll("\\s+", "");
if (s.isEmpty()) {
return;
}
AutoReplyData.INSTANCE.remove(s);
e.getSubject().sendMessage("忘掉了");
}
}
```### @Menu 生成图片菜单:
此部分打算抽象一个 format 类负责格式化
[@Menu](numeron-menu/src/main/java/com/erzbir/numeron/menu/Menu.java)
> 有 @Command 会为这个 menu 生成帮助
```java
@Listener
@Menu(name = "学习对话")
class Test {
@Command(
name = "自动回复",
dec = "添加关键词回复",
help = "/learn ques answer"
)
@Handler
@Filter(value = "^/learn\\s+?.*?\\s+?.*", matchType = MatchType.REGEX_MATCHES)
private void learn(MessageEvent e) {
String[] split = e.getMessage().contentToString().split("\\s+");
if (split.length < 3) {
return;
}
AutoReplyData.INSTANCE.add(split[1], split[2], e.getSender().getId());
e.getSubject().sendMessage("学会了");
}@Command(
name = "自动回复",
dec = "删除关键词回复",
help = "/forget ques"
)
@Handler
@Filter(value = "^/forget\\s+\\S+", matchType = MatchType.REGEX_MATCHES)
private void forget(MessageEvent e) {
String s = e.getMessage().contentToString().replaceAll("\\s+", "");
if (s.isEmpty()) {
return;
}
AutoReplyData.INSTANCE.remove(s);
e.getSubject().sendMessage("忘掉了");
}
}
```## 开发计划:
- [ ] 群管理功能
- [ ] console控制台
- [ ] 与 bot 框架解耦
- [x] 功能热加载
- [x] 插件模式## 联系方式:
email:
- erzbir@mail.com