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

监听器
simbot做为一个bot框架,肯定是要能有发送消息与接收消息的能力。
首先先创建个类,名字随意。
类创建出来了,那么对springboot来说,它并不清楚这个类是干什么的,那么我们就给他加上@Controller注解,这个时候表示这个类是个控制器,同时将这个类加入到了spring容器中。因为我们在springboot里集成了simbot,而simbot又集成了mirai,所以这个时候simbot就可以在spring的容器内找到我们刚才创建的这个类。
既然找到了这个类了,那么就我们就简单写一个监听器。
在这里为了方便进行直观的看到反馈,加入了@Slf4j注解。
此时,我们写了两个监听器
onEvent(GroupMessageEvent event)
onEvent(FriendMessageEvent event)
可以很明显的看出来这两个方法被重载了,它们的参数不同。
GroupMessageEvent 类型叫做群消息事件,参数里写有这个的时候,那么就表示该监听器监听所有群消息。
FriendMessageEvent 类型叫做好友消息事件,同上
这个时候我们还是没有写完,虽然有方法了,而且simbot也可以找到这个类了,但是simbot不知道这俩方法到底是不是给它用的,所以我们还需要让这两个监听器表示为simbot的监听器。
添加了@Listener注解,这个注解就表示这个方法为simbot的监听器,这个时候simbot会去去检查参数事件,当触发了之后,就会执行该事件方法。其他的注解注释上已经写的很明显了,在这里就不解释了。
到了这里,我们就写出来了两个简单的监听器。
这个时候我们可以启动一下项目来观看一下效果。


效果都已经实现了。
持续会话
持续会话是一个比较有意思的功能,它可以在父事件方法中再创建一个子事件方法,在触发子事件方法时,父事件会被阻塞直到子事件释放才会继续向下执行。
那么我们来简单的写一个持续回话事件
要想使用持续会话功能,则需要在监听事件的参数上加上ContinuousSessionContext参数,这样的话就可以使用.waitingFor方法。
waitingFor(ID id,Key<E : Event> event, BlockingClearTargetResumeListener<E, T> listener);
参数id可以理解为创建的子事件的唯一id,如果对代码敏感的看到这个应该就有点不妙的感觉了。
参数event是要监听的事件类型,比如GroupMessageEvent
参数listener是一个接口,需要实现其中的invoke方法,表示子事件激活后执行的方法
在这里,我们先启动项目测试一下效果。

在这里可以看出,我们第一次进行了一次测试@Filter的正则过滤是否成功。
第二次我们进行了可以让正则匹配的消息,并且正式的进入了持续回话事件方法中
因为是第一次进入持续会话,所以sessionContext.getProvider(qqId)方法不可能获得到对象,如果的第二次进入持续会话,那么sessionContext.getProvider(qqId)方法会拿到对象,那么就不会继续往下执行创建出来一个子事件。
第三次可以看到程序确实如我们所想返回了"喝奶茶",紧接可能会执行持续会话创建出一个子事件,然后阻塞当前的父事件。
第四次可以看到为了测试是否已经创建了子事件进行了一次激活子事件动作。
第五次可以看到我们的假设基本都成功了,成功的执行了持续会话中我们所写的方法。
第六次再次测试。
第七次成功回复
第八次测试持续回话的退出
第九次成功退出子事件,回复成功退出父事件。
因为子事件相当于一个新的事件,所以如果在群聊的时候激活持续会话的话,会出现被其余群员的信息所干扰的情况,为了避免出现这种情况 ,需要在子事件中进行判断是否是激活持续回话的本人。
关于退出,并不单单只有provider.push(String);才可以退出,不论是 push、 pushException 还是 cancel, 执行后都视为完成。
持续会话是个很有用的功能,甚至我们可以将它封装起来,当做一个阻塞器使用。