Skip to content
This repository has been archived by the owner on Dec 7, 2022. It is now read-only.
/ accenbot Public archive

基于Onebot-kotlin实现的QQ群聊天机器人,遵循OneBot标准。极简、高效的框架。

License

Notifications You must be signed in to change notification settings

AcceNoi/accenbot

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

基于Onebotonebot-kotlin实现的QQ聊天机器人极简框架。

License Size OneBot v11

Author Accen/クロノス
Email 1339liu@gmail.com

注意

本项目依赖onebot-kotlin

本项目使用了preview特性,请确保使用JDK15+(可能会持续到17发布)进行编译和运行,并添加--enable-preview参数。

当前最新版本V2.1-Tempest,整理出第一版Accenbot极简配置框架。

V2.0+待填的坑

  • 支持解析分P的B站视频 feat 0742
  • 集成ffmpeg(当前是外挂)
  • 整理各个功能的配置(基于Springboot-configuration-processor2.4+)
  • 隔离每个功能的工作空间
  • 集成onebot-kotlin feat onebot-kotlin-embedded

特性介绍

1. 菜单生成器

将FuncSwitch配置在相应的类上,可以自动生成菜单,详见FuncSwitchFuncSwitchGroupCmdShower(核心)

/**
 * 配置在Cmd上面,标识其对应的功能点
 * @author <a href="1339liu@gmail.com">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;
}

2. 极简正则匹配

使用@CmdRegular和@GeneralMessage,可以快速、无侵入、去耦合地实现一个匹配型的功能,详见DemoGeneralMessageCmdRegular AutowiredParamAutowiredRegularCmdRegularManager(核心)

@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 "检索结果...";
	}
}

3.极简配置框架Accenbot

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

4.Context、Event和EventCmd前后置处理器

AccenbotContext管理着所有的事件上报处理,提供了两个接入点以供扩展。

4.1 EventPostProcessor

/**
 * AccenbotContex的事件处理器前后预置,{@link AccenbotContext#accept(Map)}
 * @author <a href="1339liu@gmail.com">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时执行,你可以对预处理进行回滚等操作。

4.2 EventCmdPostProcessor

/**
 * cmd执行器前后预置,{@link AccenbotContext#acceptEvent}
 * @author <a href="1339liu@gmail.com">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处理的返回值,或者对预处理进行回滚操作。

现已通过接入前后置处理器实现的功能有:依赖与排斥。后续还将重构其他功能。

4.3 ContextPostProcessor

/**
 * 监听accenbotcontext的注册和注销
 * @author <a href="1339liu@gmail.com">Accen</a>
 * since 2.2
 */
public interface ContextPostProcessor {
	/**
	 * 注册完一个context后收到此通知
	 * @param postType
	 * @param context
	 */
	default public void afterRegisterContext(PostType postType,AccenbotContext context) {}
	//TODO 注销
}

与上类似

5.监控

GET /cmd/list

可以查看所有框架内处理的功能点

感谢

About

基于Onebot-kotlin实现的QQ群聊天机器人,遵循OneBot标准。极简、高效的框架。

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages