Spring boot 2.7.2 整合Simbot3.0.0.preview.20.0+mirai组件用Java开发群聊机器人
前言
Simbot3.0与Mirai皆为开源框架,为了更好的学习与开发在此记录。
ForteScarlet/simpler-robot: Simple Robot是一个通用bot开发框架,以同一种灵活的标准来编写不同平台的bot应用。simpler-robot是用于区别于旧版本仓库 simple-robot 的新版本命名。 (github.com)
mamoe/mirai: 高效率 QQ 机器人支持库 (github.com)

最近重构了一下代码,发现simbot3最新版已经到3.0.0.preview.20.0了,所以在这里记录一下本人遇到的一些新问题与解决思路。
首先修改pom文件
这里我们使用springboot 2.7.2版本进行开发。
接下来在启动类上开启simbot@EnableSimbot,与之前版本一致。
接下来在resources文件夹下创建simbot-bots文件夹,接下来在其中写入我们的机器人配置
机器人配置与之前版本相对多了一些配置,有兴趣的可以去官网查看,这里就还用之前的配置不变。
接下来我们有一个这样的需求,我们需要去做一个群消息的记录,要求支持文字与图片,同时在多个群的情况下支持记录的开启与关闭
定时器
首先想在多群情况下对单个群进行的消息记录实现开启与关闭,那么我们就需要对群进行标记,那么在这里我们使用数据库mysql进行记录。
首先建立表group
使用mybatis-plus自动生成service层与mapper,这里就不详细讲了。
接下来在项目中创建timer文件夹,并创建定时类SaticScheduleTask

并将定时类加入到spring容器内
同时引入groupService
创建定时方法
这里我们规定每天凌晨1点执行这个方法,加载所有机器人所加入的所有群信息,并默认将所有群设为非激活状态。
如果想修改时间的话,修改@Scheduled(cron = "0 0 1 * * ? ")里面的cron参数就好,参考cron语法。
之后想增加多少个定时方法,就在SaticScheduleTask类里添加方法,并在方法上标注@Scheduled注解即可。
如果定时方法不起效的话,请检查springboot启动是否存在@EnableScheduling注解。
监听器
群消息我们已经存入并标记了,那么接下来就需要进行对相对应的群进行消息记录了。
首先创建监听类BotListenerController
然后在创建一个groupUserInfoService类,防止最后这个监听类写到后面方法太长不方便查看。
然后创建GroupUserInfoServiceImpl类并继承groupUserInfoService类。
这里加入了事务,是为了防止后面在类里面写长方法时出现异常回滚,而不会出现其他问题。
在这里我们需要记录群所有消息,那么还是需要创建一张表。
然后在GroupUserInfoServiceImpl类里加入两个方法。
回到BotListenerController类里,将GroupUserInfoService引入进来。
接下来我们在BotListenerController类开始编辑我们的第一个监听方法。
这样,我们就实现了一个群消息监听。
但是你会发现这样只会监听所有的群消息,而不能进行调整群记录的开关。
当然,你会发现我已经在GroupUserInfoServiceImpl类里写好了isGroupActivate方法,通过这个方法,可以在GroupInfoLog类里进行判断,这样也可以实现调整群记录的开关。
但是在我自己开发过程中,如果我需要频繁的调用isGroupActivate这个方法,然后再去判断的话,感觉好麻烦,可不可以在一开始就过滤掉这种没激活的群。
于是我发现了新版本中的一个好东西。
@Filters
创建filter包并在其中创建IsGroupActivateFilterFactory类

然后在BotListenerController类中添加
@Filters(value = {
@Filter(by = IsGroupActivateFilterFactory.class)
})
这样的话,每次触发该监听方法时,会通过IsGroupActivateFilterFactory类进行判断,如果群为激活,那么才会触发该方法。
多个监听方法的情况下,哪个需要激活群执行的话,就加这个过滤就好。
当然,如果是多个Filter也是可以的。
具体请以simbot3源码为准。