基于Onebot和onebot-kotlin实现的QQ聊天机器人极简框架。
Author | Accen/クロノス |
---|---|
[email protected] |
本项目依赖onebot-kotlin
本项目使用了preview特性,请确保使用JDK15+(可能会持续到17发布)进行编译和运行,并添加--enable-preview参数。
当前最新版本V2.1-Tempest,整理出第一版Accenbot极简配置框架。
- 支持解析分P的B站视频 feat 0742
- 集成ffmpeg(当前是外挂)
- 整理各个功能的配置(基于Springboot-configuration-processor2.4+)
- 隔离每个功能的工作空间
- 集成onebot-kotlin feat onebot-kotlin-embedded
将FuncSwitch配置在相应的类上,可以自动生成菜单,详见FuncSwitch、FuncSwitchGroup、CmdShower(核心)
/**
* 配置在Cmd上面,标识其对应的功能点
* @author <a href="[email protected]">Accen</a>
*
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FuncSwitch {
/**
* 功能key,默认cmd_类名
* @return
*/
String name() default "";
/**
* 是否要在菜单中展示出来
* @return
*/
boolean showMenu() default false;
/**
* 功能名
* @return
*/
String title();
/**
* 排序
* @return
*/
int order() default 99;
/**
* 格式
* @return
*/
String format() default "";
/**
* 所属分组
* @return
*/
Class<?> groupClass() default Default.class;
}
使用@CmdRegular和@GeneralMessage,可以快速、无侵入、去耦合地实现一个匹配型的功能,详见Demo、GeneralMessage、CmdRegular、 AutowiredParam、AutowiredRegular、CmdRegularManager(核心)
@Component
public class Demo {
@CmdRegular(expression = "^检索(.+)$",enableAutowiredParam = false)
@GeneralMessage
public String search(String key) {
//TODO your code
return "检索结果...";
}
@CmdRegular(name="engine",expression = "^用(.+)引擎检索(\\d+)$")
@GeneralMessage(targetId = "123456")
public String search(Qmessage qmassage
,@AutowiredParam("message") String msg
,@AutowiredParam Date sendTime
,int pid
,@AutowiredRegular(1) String engine) {
//TODO your code
return "检索结果...";
}
}
除了2种描述的极简正则匹配用于最常用的文本匹配回复,框架将符合Onebot标准Event全部采用极简化配置的方式,同样配合@AutowiredParam和@GeneralMessage,实现功能的快速编写。
其核心理念是将方法Method代理,将上报的Event的参数注入到该Method的参数中,执行后,若其符合发送消息的格式,则自动封装成消息发出。实现消息来源与反馈的去耦合。
@AutowiredParam:自动注入Event参数,用于标识该Parameter。例如:你可以使用.
来注入Event这个对象,或者.post_type
来注入Event的post_type参数,或者.sender.nickname
注入nickname参数(当然前提是存在这个参数)。另外,AutowiredParam允许你使用驼峰命名的风格就像.postType
,但是我并不希望你这样做,最好是保持与Onebot协议中描述的一致;此外,AutowiredParam允许你以参数签名的方式来定义第一层的参数,例如@AutowiredParam String postType。
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AutowiredParam {
String value() default "";
}
@CmdMessage、@CmdMeta、@CmdNotice、@CmdRequest:用来定义一个代理(我称之为AccenbotCmdProxy),它们分别匹配Onebot中的四种Event类型。它们可以被标识在Class或者Method上,标识在类上时,executeMethod将起作用,它会将类中的这些方法(默认为execute)注册为AccenbotCmdProxy。而标识在方法上,则为此方法。value参数为该AccenbotCmdProxy的唯一标识,请确保此value为唯一的,否则将抛出CmdRegisterDuplicateException异常,或者使用默认值,框架会为你生成一个唯一的value(但是这很蠢,如果你希望在运行时注销一个AccenbotCmdProxy,建议你显式地为它命名)。
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CmdMessage {
String value() default "";
String[] executeMethod() default {"execute"};
int order() default 999;
MessageType[] messageType() default MessageType._ALL;
MessageSubType[] subType() default MessageSubType._ALL;
}
除了上面四种,@CmdRegular(也就是第2点描述的)也是相同的原理,只是因为常用(现在实现的80%功能都是属于这种类型)所以单列出来了。
AccenbotContext管理着所有的事件上报处理,提供了两个接入点以供扩展。
/**
* AccenbotContex的事件处理器前后预置,{@link AccenbotContext#accept(Map)}
* @author <a href="[email protected]">Accen</a>
* @since 2.2
*/
public interface EventPostProcessor {
default public void beforeEventPost(Map<String, Object> event) {};
default public void afterEventPostSuccess(Map<String, Object> event,AccenbotContext context) {};
default public void afterEventPostFaild(Map<String,Object> event) {};
}
实现此接口,并注册到SpringIoc中。
beforeEventPost将在AccenbotContext在接受到事件上报时执行,你可以对event进行预处理。
afterEventPostSuccess将在AccenbotContext寻找到特定的Context处理事件后执行,你可以对event进行后处理。
afterEventPostFaild将在AccenbotContext未能寻找到Context时执行,你可以对预处理进行回滚等操作。
/**
* cmd执行器前后预置,{@link AccenbotContext#acceptEvent}
* @author <a href="[email protected]">Accen</a>
* @since 2.2
*/
public interface EventCmdPostProcessor {
default public boolean beforeEventCmdPost(AccenbotCmdProxy proxy,Map<String, Object> event) {return true;}
default public Object afterEventCmdPost(AccenbotCmdProxy proxy,Map<String, Object> event,Object invokeResult) {return invokeResult;}
}
实现此接口,并注册到SpringIoc中。
beforeEventCmdPost将在特定的CmdProxy(功能)处理前执行,需要返回一个boolean确定是否继续执行。
afterEventCmdPost将在特定的CmdProxy(功能)处理后执行,可以接受CmdProxy处理的返回值,或者对预处理进行回滚操作。
现已通过接入前后置处理器实现的功能有:依赖与排斥。后续还将重构其他功能。
/**
* 监听accenbotcontext的注册和注销
* @author <a href="[email protected]">Accen</a>
* since 2.2
*/
public interface ContextPostProcessor {
/**
* 注册完一个context后收到此通知
* @param postType
* @param context
*/
default public void afterRegisterContext(PostType postType,AccenbotContext context) {}
//TODO 注销
}
与上类似
GET /cmd/list
可以查看所有框架内处理的功能点
感谢酷Q项目,各位有兴趣可移步酷Q社区- 感谢大佬richardchien的**coolq-http-api**项目,提供了一个第三方公共调用的接口
- 感觉大佬Henryhaohao的**Bilibili_video_download**项目的B站接口调用指导
- 感谢**cqhttp mirai**项目基本保持cqhttp风格,保证了项目的迁移