基于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%功能都是属于这种类型)所以单列出来了。