GithubHelp home page GithubHelp logo

erzbir / numeron Goto Github PK

View Code? Open in Web Editor NEW
17.0 2.0 3.0 6.35 MB

基于 Mirai 框架的 QQ 机器人项目, 支持多 bot, 可作脚手架快速开发

Home Page: https://erzbir.com

License: GNU Affero General Public License v3.0

Java 99.81% Kotlin 0.19%
annotations java mirai mirai-bot mirai-core qqbot springboot reflect kotlin reflection

numeron's Introduction

Numeron

介绍:

这是一个使用 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 模块运行主函数即可

所有QQ机器人功能都写在numeron-plugin模块下

脚手架使用:

@Component 注解表示这个类需要注册到容器中 @Listener 注解表示这个类需要被当作 "监听器" 注册到容器中

如果作为脚手架使用, 必须使用 numeron-boot 模块, 使用 StarterController 将项目的启动类作为参数调用 boot() 方法

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

将一个方法标记为监听回调, 监听的时间类型由参数决定

此注解标注的方法由 ListenerRegisterInter 的实现类注册到 bot 框架监听

@Listener
public class Test {

    /**
     * bot 收到群消息则会触发这个方法
     */
    @Handler
    private void test(GroupMessageEvent event) {
        event.getSubject().sendMessage("收到了群消息");
    }
}

@Filter 使用:

@Filter

此处参考了: simple-robot

此注解可以针对: 群 id, 事件发送者 id, bot id 以及消息事件的文本消息来进行规则过滤

此注解可以实现简单的权限, 本项目提供了一个专门的权限过滤注解, 下文介绍

@Listener
public class Test {

    /**
     * bot 收到群消息 "hi" 则会触发这个方法
     */
    @Handler
    @Filter("hi")
    private void test(GroupMessageEvent event) {
        event.getSubject().sendMessage("你好");
    }
}

@Permission 使用:

@Permission

此项目中提供了一个默认的权限实现, 也可以通过 spi 实现 PermissionService 接口实现自定义权限规则 (尚未开发完毕)

@Listener
public class Test {

    /**
     * bot 收到主人发送的群消息 "hi" 则会触发这个方法
     */
    @Handler
    @Filter("hi")
    @Permission(permission = PermissionType.MASTER)
    private void test(GroupMessageEvent event) {
        event.getSubject().sendMessage("主人你好");
    }
}

@Command 生成指令表:

此部分打算抽象一个 format 类负责格式化

@Command

@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

有 @Command 会为这个 menu 生成帮助

@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 框架解耦
  • 功能热加载
  • 插件模式

联系方式:

email:

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.