版本更新:2.11.1-dev1,更新mirai版本到2.11.1。
https://github.com/lc6a/spring_mirai/releases/tag/2.11.1-dev
lc6a 发布的帖子
-
RE: SpringMirai 集成mirai-console的可自定义可扩展kotlin机器人开发框架/启动器
-
RE: 插件里Spring的AnnotationConfigApplicationContext扫描不到bean
@lc6a 在 插件里Spring的AnnotationConfigApplicationContext扫描不到bean 中说:
@hundun000 你好,我也是使用Spring框架做机器人项目,我比较好奇你打包的jar包具体内容。能否发一份你打包的使用Spring的插件jar包?如果你当前项目不方便公布的话,能否用spring写个hello world的插件,然后打包发我一份?如果论坛不方便发送的话,我QQ1952511149。非常感谢!
我之前打算解决这个问题的,被一些事情耽搁了。你如果能顺便提供源码就更好了,我可能会尝试解决此问题。如果我解决了,我可以跟你分享分享。
-
RE: 插件里Spring的AnnotationConfigApplicationContext扫描不到bean
@hundun000 你好,我也是使用Spring框架做机器人项目,我比较好奇你打包的jar包具体内容。能否发一份你打包的使用Spring的插件jar包?如果你当前项目不方便公布的话,能否用spring写个hello world的插件,然后打包发我一份?如果论坛不方便发送的话,我QQ1952511149。非常感谢!
-
RE: SpringMirai 集成mirai-console的可自定义可扩展kotlin机器人开发框架/启动器
@liujiahua123123 不好意思,写的时候没有过多考虑,确实不妥,目前已经修改。如果还有其他存在问题,可以提ISSUE,我会第一时间处理。
-
RE: SpringMirai 集成mirai-console的可自定义可扩展kotlin机器人开发框架/启动器
刚刚添加了自动接受加好友、加群的功能,并且挂了一个机器人在服务器。
大家可以加我的机器人为好友或者拉我的机器人去你们的群玩耍,账号:2120906525
有什么好玩的插件想要该机器人加载都可以分享,帮忙代挂机器人也是可以的,也欢迎大家交流开发经验。 -
RE: 架构设计:抽离出“纯bot逻辑”?
可以看看我的拙作:
https://mirai.mamoe.net/topic/317/springmirai-集成mirai-console的可自定义可扩展kotlin机器人开发框架-启动器
不过目前结构也存在一些问题,有重构的打算。
如果你也是基于springboot开发,欢迎交流经验!
我认为:- 可以对设计进行分层次抽象,例如分为jvm全局、插件级别、指令级别3层。
- 定义过滤器模块,可以编写一个个过滤器,各过滤器可以设计为独立平等关系,也可设置为层级关系(例如伪代码:过滤器AtMeFilter(true)的前提是过滤器EventFilter(MessageEvent::class)),但过滤器最好不直接跟机器人功能耦合,提供默认绑定关系即可,应该让用户能够运行时动态绑定、解绑过滤器与功能(点名批评自己的框架,使用注解将过滤器和功能静态绑定,无法动态更改)。
- 定义机器人功能模块,仅仅包含机器人逻辑,数据来源由框架提供(参数注入),消息发送也抽象隔离开。
- AOP,面向切面编程能够方便的在机器人逻辑前后添加通用逻辑,例如返回值如何作为消息发送回去。
- 至于同时维护基于core和mirai-console的两个版本,我觉得Him188大佬说得对,直接将mirai-console作为依赖添加到项目即可,项目提供main和plugin两个入口,我的SpringMirai项目就是这样做的。
-
SpringMirai 集成mirai-console的可自定义可扩展kotlin机器人开发框架/启动器
- 类Spring的开发体验
- 控制器、拦截器、类AOP处理器
- 99%的功能可自定义
- 具备mirai-console所有功能
- 包含Web管理端,因此可以视为继mcl、mirai-compose后又一个启动器
放几个截图:
-
RE: 如何获取在mirai-console命令行输入的原始命令
查看源码发现可以用变长参数或者数组来实现变相还原内容:
@Handler fun CommandSender.handle(vararg args: String) { val command = buildString { args.forEach { append(it).append(' ') } }.trimEnd() execSmCommand(command) { runBlocking { sendMessage(it) } } }
-
如何获取在mirai-console命令行输入的原始命令
我有另外一套指令体系,我想注册一个指令来执行那个体系的指令,代码如下:
@Component class SmCommandInvoker: RawCommand( SpringMiraiStartPlugin, primaryName, description = "执行SpringMirai指令" ) { companion object { private const val primaryName = "sm" } override suspend fun CommandSender.onCommand(message: MessageChain) { val command = message.content.substringAfter(primaryName).trimStart() val logger = MiraiLogger.create("sm") logger.info("message: ${message.content}") logger.info("command: $command") execSmCommand(command) { runBlocking { sendMessage(it) } } } }
其中
execSmCommand
定义如下:/** * 执行sm指令 * @param line 一行指令 * @param fn 需要回复消息时的回调 */ fun execSmCommand(line: String, fn: (String) -> Unit)
输出如下:
> /sm 权限 我的权限 2021-06-17 23:54:05 I/stdout: 2021-06-17 23:54:05.925 INFO 12568 --- [atcher-worker-2] sm : message: 权限我的权限 2021-06-17 23:54:05 I/stdout: 2021-06-17 23:54:05 I/stdout: 2021-06-17 23:54:05.925 INFO 12568 --- [atcher-worker-2] sm : command: 权限我的权限 2021-06-17 23:54:05 I/stdout:
很显然,“权限”和“我的权限”之间的空格被去掉了,而在我的指令体系中必须要这个空格,所以导致我的指令无法正确运行,请问如何解决此问题?
-
手动加载的插件不会自动插件数据持久化
我的主函数如下:
fun main(args: Array<String>) { runArgs = args MiraiConsoleTerminalLoader.startAsDaemon() SpringMiraiStartPlugin.load() SpringMiraiStartPlugin.enable() }
插件数据定义如下:
@Component class PermissionDao @Autowired constructor(config: Config): AutoSavePluginData("permission") { val permissions: MutableMap<Long, MutableList<String>> by value() private val logger = LoggerFactory.getLogger(PermissionDao::class.java) init { val root = config.rootUserId initKey(root); if (permissions[root].isNullOrEmpty()) { logger.warn("当前没添加root用户权限,自动添加中") permissions[root]!!.add(PermissionService.root) } } }
虽然数据在内存中没有任何问题,但不会持久化到文件(data目录下甚至没有这个插件的目录)。
是我操作不对还是说需要额外进行处理?如何处理? -
RE: 求助:插件优先级配置
事件监听注册时可以设定优先级,高优先级的监听器可以拦截事件。
但这个优先级一般在代码里面固定了,是否拦截事件也是代码决定的,很少有插件从配置文件决定这两个逻辑。
所以你应该需要修改课表插件的代码。