MiraiForum

    • 注册
    • 登录
    • 搜索
    • 热门
    • 最新
    • 未解决
    • 标签
    • 群组
    • 友情链接

    itbaima-robot-starter —— 支持SpringBoot3开箱即用的Starter依赖

    其他项目发布
    1
    1
    291
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • Ketuer
      Ketuer 最后由 编辑

      本项目为本团队内部使用,经过大量测试现在相对稳定,故开源发布,整合Mirai核心以及fix-protocol-version模块,支持SpringBoot 3只需简单配置即可使用。

      项目地址:https://github.com/itbaima-study/itbaima-robot-starter

      快速上手

      在开始之前,请根据我们的指引完成对机器人相关的配置:https://github.com/itbaima-study/itbaima-robot-starter/wiki 当一切配置无误时,就可以开始体验了。

      使用监听器

      你可以使用注解快速编写监听器,监听即将到来的事件:

      @RobotListener   //添加@RobotListener注解表示这是一个监听器类
      public class MyListener {
      
          @RobotListenerHandler  //监听器类中可以有很多处理器方法,用于处理对应的事件
          public void handleJoin(MemberJoinRequestEvent event) {  //处理方法中需要填写事件类型对应的参数
              //这里处理的是MemberJoinRequestEvent新成员加入事件
          }
      }
      

      有了监听器,我们就可以快速处理事件了。比如我们想要实现在群成员发违禁词的情况下对其进行禁言操作,那么我们可以向下面这样编写:

      @RobotListener
      public class NormalGroupListener extends MessageListener {
      		@RobotListenerHandler
          public void handleMessage(GroupMessageEvent event) {
              String message = event.getMessage().contentToString();
              if(message.contains("傻逼")) {   //检测到违禁词
                  Member sender = event.getSender();  //获取到消息发送者
                  sender.mute(60);  //直接禁言60秒
              }
          }
      }
      

      当然,可能我们的QQ机器人加了很多个群,那么此时我们需要对监听的群进行限制,只处理我们指定群号的事件,比如下面这种情况:

      @RobotListener
      public class NormalGroupListener extends MessageListener {
      		@RobotListenerHandler(contactId = {123456789})  //只监听123456789这个群的消息
          public void handleMessage(GroupMessageEvent event) {
              //注意这种方式仅适用于那些与用户或群这类可以获取ID的事件
          }
      }
      

      有些时候可能会存在很多个监听器,或是很多个相同的事件处理方法,我们可以对其进行排序操作:

      @RobotListener
      public class NormalGroupListener extends MessageListener {
      		@RobotListenerHandler(order = 1) //order数值越小越优先,默认为0
          public void handleMessage(GroupMessageEvent event) {
              //此处理器优先进行
          }
        
          @RobotListenerHandler(order = 5)
          public void handleMessage(GroupMessageEvent event) {  //同样是GroupMessageEvent的事件处理器
              //此处理器后进行
          }
      }
      

      正常情况下,所有的事件处理器都是按照顺序进行的,但是可能有些时候我们为了效率,希望事件处理器并发执行,我们可以直接配置:

      public class NormalGroupListener extends MessageListener {
      		@RobotListenerHandler(order = 1) 
          public void handleMessage(GroupMessageEvent event) {
            	Thread.sleep(3000);  //这里的阻塞不会影响到并发执行的其他事件处理器
          }
        
          @RobotListenerHandler(order = 5, concurrency = true) //开启并发执行,无视顺序直接新开线程处理
          public void handleMessage(GroupMessageEvent event) {
              //此处理器与上面的处理器并发执行,不受影响
          }
      }
      

      有了监听器,我们对于Mirai中一些常见的事件可以很方便地进行处理了。

      使用MessageListener类

      考虑到各位小伙伴可能会在群里做一些常用的操作,比如判断违禁词之类的,我们封装了一个 MessageListener 类用于继承,它提供了大量的预设操作:

      @RobotListener
      public class TestListener extends MessageListener {
      
          public TestListener(){
              //构造时配置(也可以延迟设置)违禁词列表,并设置大小写敏感
              super(List.of("傻逼", "弱智", "脑残"), true);
          }
          
          @RobotListenerHandler
          public void handleMessage(GroupMessageEvent event){
              String s = event.getMessage().contentToString();
              if(this.invalidText(s)) {  //直接使用预设的 invalidText 判断是否出现违禁词
                  System.out.println("检测到违禁词");
              }
          }
      }
      

      除了违禁词检查,还支持撤回消息、快速回复某条消息、快速AT某个成员等,还请各位小伙伴自行阅读源码。

      自动注册的Bean

      在使用Starter后,一些对象会被自动注册为Bean,比如Mirai的机器人对象、IMirai对象等:

      @RobotListener
      public class NormalGroupListener extends MessageListener {
      
          @Resource
          Bot bot;   //可以直接注入
      
          @Resource
          IMirai mirai;  //可以直接注入
      }
      

      我们也提供了一个专用于机器人操作的 Service 类用于处理各种常规操作:

      public interface RobotService {
          MessageReceipt<Friend> sendMessageToFriend(long user, Message message);
          void run(Consumer<Bot> action);
          void runWithFriend(long group, Consumer<Friend> action);
          void runWithGroup(long group, Consumer<Group> action);
          void runWithGroupMembers(long group, Consumer<ContactList<NormalMember>> action);
          void runWithProfile(long user, Consumer<UserProfile> action);
          MessageReceipt<Friend> sendMessageToFriend(long user, String message);
          void deleteFriend(long user);
          Friend getFriend(long user);
          MessageReceipt<Group> sendMessageToGroup(long group, Message message);
          MessageReceipt<Group> sendMessageToGroup(long group, String message);
          void deleteGroup(long group);
          Group getGroup(long group);
          boolean isGroupContainsUser(long group, long user);
      }
      

      它同样包含了大量日常机器人操作的方法,RobotService同样被自动注册为Bean,并且可以随时使用。

      1 条回复 最后回复 回复 引用 0
      • 1 / 1
      • First post
        Last post
      Powered by Mamoe Technologies & NodeBB | 友情链接 | 服务监控 | Contact