@rong_xiaoli 签名现在可以用 https://qsign.chahuyun.cn
目前是使用的nginx负载均衡,实现主(sign提供者代理),从(sign提供者东京服务器),备(另外一家sign提供着),自动切换。
Moyuyanli 发布的帖子
-
RE: 目前可用的插件开发调试方案
-
[壶言鉴权]一个能帮助你快速开发Mirai插件的前置插件
HuYanAuthorize 壶言鉴权
仓库地址:github
说明
一个用于针对简化mirai插件开发的前置插件,简化的内容为:
- 自动化添加消息监听
- 针对用户(Friend),群(Group),群成员(GroupMember),群管理(GroupAdmin)都有独立的权限
- 权限是通过分组形式添加,可以继承
- 自动匹配触发内容(直接匹配或正则匹配)
- 权限code也自定义添加
使用
- 添加依赖
在build.gradle中
dependencies { compileOnly("cn.chahuyun:HuYanAuthorize:1.2.0") }
在插件的onEnable方法中启用
java
//添加本插件的注册消息包信息 PermissionServer.INSTANCE.registerMessageEvent(this,"cn.chahuyun.authorize.event");
kotlin
PermissionServer.registerMessageEvent(this, "cn.chahuyun.authorize.event")
在对应的包里面建立一个
class
,然后在类上面添加@EventComponent
注解,表明这个类下面有需要注册的消息事件方法。建立一个方法,只有一个消息参数,无返回值。
//添加消息鉴权注解 @MessageAuthorize(text = "你好") public void reply(MessageEvent event) { event.getSubject().sendMessage("你好呀!"); }
@MessageAuthorize(text = ["你好"]) suspend fun reply(event: MessageEvent) { event.subject.sendMessage("你好啊") }
即可完成最基本的使用!
消息鉴权api
MessageAuthorize
注解的所有可操作属性text 匹配文本
text: Array<String>
用于匹配的文本。
- 在默认模式下,有任何一个
String
字符串,于其中一个相同,即匹配成功。 - 在正则模式下,取第一个匹配。
custom 自定义匹配
custom: KClass<out CustomPattern>
自定义匹配规则。
实现
CustomPattern
接口即可。在匹配方式设置为
CUSTOM
时启用,启用时将忽略text
的配置。messageMatching 消息匹配方式
messageMatching: MessageMatchingEnum
消息的匹配方式,有:
- TEXT 文本匹配
- REGULAR 正则匹配
- CUSTOM 自定义匹配
messageConversion 消息转换方式
messageConversion: MessageConversionEnum
用于在匹配消息的时候,消息转换为
string
的方式。- CONTENT
contentToString()
- MIRAI_CODE
serializeToMiraiCode()
- JSON
serializeToJsonString()
userPermissions 用户权限
userPermissions: Array<String>
需要用户拥有的权限。
自己的权限需要进行注册,注册方式请查看权限注册。
userPermissionsMatching 用户权限匹配方式
userPermissionsMatching: PermissionMatchingEnum
如果需要用户权限有多个,多个权限之间的匹配方式.
- or 或,满足一个即匹配成功
- and 且,都满足才匹配成功
groupPermissions 群权限
groupPermissions: Array<String>
要求的群权限,跟用户同理,只不过要求的是群的权限。
groupPermissionsMatching 群权限匹配方式
groupPermissionsMatching:PermissionMatchingEnum
同上面
userInGroupPermissionsAssociation 用户与群权限的匹配方式
userInGroupPermissionsAssociation: PermissionMatchingEnum
如果某一条指令,即要求用户权限,又要求群权限。
这里可以控制两种权限的合并方式。
同上面用户的匹配方式。
priority 优先级
消息响应优先级,跟mirai的消息注册一样,一般不建议修改。
concurrency 消息的处理方式
消息的处理方式,跟mirai的消息注册一样,一般不建议修改。
权限
权限是本插件的核心,用于对整个消息注册做控制。
采用的是
code
形式,是String
字符串。本插件默认权限:
owner
主人权限,最高权限,类比rootadmin
管理员权限,比root低
不可使用的code:
null
表明无权限
使用方法:
AuthPerm.OWNER AuthPerm.ADMIN AuthPerm.NULL
自定义注册权限
fun registerPermCode(plugin: JvmPlugin, vararg perms: Perm)
注册权限很简单。权限可以一次性注册多个。
java
PermissionServer.INSTANCE.registerPermCode(this,new Perm("test","一个测试的权限")...);
PermissionServer.registerPermCode(this, Perm("test", "一个测试的权限"))
注册成功后,会打印debug日志显示是否注册成功,或者该权限是否被别的插件注册。
然后就可以在
MessageAuthorize
中的权限列表使用了。注意:
- 这里注册用的权限是新建的,仅供于注册用
- 想要使用注册后的权限,请使用下面的工具获取
操作权限
权限的实现分两部分,一部分是权限组(PermGroup),权限组有权限(Perm)和用户(User)。
对于权限组,在依赖插件中如果手动操作了权限组,可以使用
PermGroup
自己的save()
方法保存,或者使用工具操作权限组。操作权限组指令:
指令 含义 案例 案例含义 +perm (权限组名称) [权限code]
创建一个权限组,并添加对应的权限,权限组必填,code选填。 +perm 测试组 admin 添加或修改一个名叫 测试组
的权限组,并为测试组添加权限admmin
。+perm (权限组名称) [%父权限组名称]
继承一个权限组,从父权限组哪里继承权限。指令能添加和修改权限组,并且能共用。 +perm 测试组 %主人 admin 添加或修改一个名叫 测试组
的权限组,继承主人
权限组的所有权限,并添加admin
权限。-perm (权限组名称) [权限code]
删除一个权限或权限组,当不填权限code时,会尝试删除整个权限组。 -perm 测试组 admin 删除权限组 测试组
的权限admin
。=perm [权限组名称]
查询权限组信息,也可以查询单独一个权限组的信息。 =perm 查询所有权限组信息 用户操作指令:
用户分为四类用户,他们有不同的作用域。
全局用户
这个用户是作用于所有位置的一个单qq用户。
指令 含义 案例 案例含义 +global (@user) (权限组名称)
添加这个用户到对应权限组,这里可以at,可以直接填qq。 +global @放空 主人 添加放空到 主人
权限组-global (@user) (权限组名称)
还没写 群成员用户
这个用户作用于指定群的某个一群成员用户。
指令 含义 案例 案例含义 +member (@user) (权限组名称)
添加这个群成员到对应权限组,这里只能at,并且得在群里操作 +member @放空 主人 添加群成员放空到 主人
权限组-member (@user) (权限组名称)
还没写 群管理用户
这个用户是对于一个群的群主和管理员的用户。
指令 含义 案例 案例含义 +admin (权限组名称)
添加这个群的管理员到对应权限组,只能在群里操作 +admin 主人 添加本群管理员到 主人
权限组-admin (权限组名称)
还没写 群用户
这个用户跟上面三个不一样,这个代表的是这个群拥有的权限,而不是这个群里面所有人拥有的权限。
指令 含义 案例 案例含义 +group (权限组名称)
添加这个群到对应权限组,只能在群里操作 +group 主人 添加本群到 主人
权限组-group (权限组名称)
还没写 其他api
还开发一些好用的工具类,供大家使用。
消息事件注册(PermissionServer)
带指令前缀的注册
fun registerMessageEvent(plugin: JvmPlugin, packageName: String, prefix: String)
指令前缀可为
""
。权限操作工具类(PermUtil)
获取一个权限
fun takePerm(code: String): Perm
只能获取已经注册过的权限,未注册的权限会抛错。
PermUtil.takePerm("admin")
获取一个权限组
fun talkPermGroupByName(name: String): PermGroup
获取一个权限组,不存在则新建。
PermUtil.talkPermGroupByName("测试组")
检查这个用户有没有这个权限
fun checkUserHasPerm(user: User, code: String): Boolean
用户的获取请看下面
//获取一个群用户 val group = User.group(group.id) PermUtil.checkUserHasPerm(group, "admin")
将这个用户添加到对应的权限组
fun addUserToPermGroupByName(user: User, name: String): Boolean
PermUtil.addUserToPermGroupByName(group, "测试组")
将这个权限添加到对于的权限组
fun addPermToPermGroupByName(perm: Perm, name: String): Boolea
fun addPermToPermGroupByPermGroup(perm: Perm, permGroup: PermGroup): Boolean
将这个用户从对应的权限组删除
fun delUserFromPermGroupByName(user: User, name: String): Boolean
用户的操作(User)
获取用户
- fun globalUser(userId: Long): User 查询或新建一个全局用户
- fun group(groupId: Long): User 查询或新建一个群用户
- fun groupAdmin(groupId: Long): User 查询或新建一个群管理用户
- fun member(groupId: Long, userId: Long): User 查询或新建一个群成员用户
kotlin
UserUtil.group(390444068) UserUtil.member(390444068, 572490972)
java
UserUtil.INSTANCE.group(390444068L); UserUtil.INSTANCE. member(390444068L,572490972L);
消息工具类(MessageUtil)
这个类比较简单,具体看看源码就明白了,但是好用!
日志工具类(Log)
使用方法:
在插件的
onEnable
方法中:Log.init(this)
即可加载完成。
然后在需要打印日志的地方直接:
Log.info("这是一条日志")
Log.INSTANCE.info("这是%s日志","一个");
对于java,自带格式化。
如果觉得不优雅,可以只引入他的
INSTANCE
。错误工具(ExceptionHandle)
对于消息注册方法,我做了一个错误收集。
fun init( plugin: JvmPlugin, packageName: String, exceptionHandle: ExceptionHandleApi = ExceptionHandle() )
这是一个消息注册的重载方法,只需要传递自己实现的错误接口即可拿到错误。
获取主人
对于依赖于本插件的插件,可以实现共用一个主人,就算是换代,换配置,主人依然可以保存。
主人信息存在于数据库,如果
config
没有设置,会尝试从数据库找之前设置的主人来同步。
如果config
已经设置,会自动通过config
的信息同步到数据。HuYanAuthorize.INSTANCE.getOwner()
HuYanAuthorize.Companion.getINSTANCE(). getOwner();
指令
命令前缀 命令 含义 案例 #hya owner 设置主人 #hya owner 572490972 v 查询当前插件版本 #hya v -
HuYanEconomy 壶言壶言经济 --- 娱乐插件
HuYanEconomy 壶言壶言经济 --- 娱乐插件
这里是壶言经济,一款mirai娱乐插件,设计灵感来自于论坛的经济帖子,心血来潮就创建了这个项目,从22年11月开始,中间慢慢填坑,
陆陆续续的完成了一部分饼,由于大部分饼都没实现,所以没在论坛发布,但是在我群共享。或许有些人在一些群见过本插件的功能,就比如这个签到
现在完成了一些基本功能,仍然有很多bug的存在,但是能用(叉腰)。
开个玩笑,如果遇见bug可以去github提issues。或者有什么好的建议也可以提。
使用
本插件需要前置:
前置插件和插件本体一起放入plugins文件夹后,启动一次mirai,再停止。
进入config/cn.chahuyun.HuYanAuthorize
中配置AuthorizeConfig.yml
:这里的主人,才是真主人。
# 主人 owner: 123456 # 是否开启方法代理 proxySwitch: false # 数据库类型(H2,SQLITE,MYSQL) dataType: H2 # mysql数据库连接地址 mysqlUrl: '127.0.0.1:3306/authorize' # mysql数据库用户名 mysqlUser: root # mysql数据库密码 mysqlPassword: 123456
进入
config/cn.chahuyun.HuYanEconomy
中配置config
:这里的主人暂时不可用。
前置插件和插件本体一起放入plugins文件夹后,启动一次mirai,再停止。
进入config/cn.chahuyun.HuYanEconomy
中配置config
:# 主人 owner: 123456 # 指令触发前缀 prefix: ' ' # 数据库类型(H2,MYSQL,SQLITE) dataType: MYSQL # mysql 连接地址 mysqlUrl: 'localhost:3306/economy' # mysql 用户名 mysqlUser: root # mysql 密码 mysqlPassword: 123456 # 插件单一管理botQQ bot: 123456
请设置主人用于管理本插件!
由于限制,本插件无法实现多bot,只能用于唯一bot,所以请指定botqq。
数据库可以自定义指定,目前只实现了3种数据库。
设置完成后,再次启动mirai即可使用本插件。
功能列表
由于一些功能上的设计缺陷,修复他们需要改动数据库,导致数据库的数据错误,因此需要执行修复指令:
/hye repair
;建议在控制台执行,并且最好是启动后先执行。只需要执行一次就行
目前已知需要修复版本:
- 1.4.3 -> 1.4.4 修复抢劫信息错误
- 1.4.5 -> 1.4.6 修复鱼塘重复问题
经济功能
基于mirai-economy-core经济前置,注册货币为
hy-gold
。目前实现功能有:
- 转账
- 存款
- 取款
- 抢劫
- 红包
签到功能
指令
sign
,签到
,打卡
,关闭签到
,开启签到
;完成签到会生成一张图片签到信息,当图片签到失败后会发送文字签到。
签到图片目前支持背景自定义。只需要将图片放入
data/cn.chahuyun.HuYanEconomy/bottom
即可,每次启动都会读取一次文件夹里面的图片。
data/cn.chahuyun.HuYanEconomy/font
是自定义字体。背景图自动轮询。
签到的刷新是每天的4点,可自定义时间。
随机获得50~500
的金币奖励!
概率不均衡用户功能
指令
个人信息
,info
,money
,经济信息
,我的资金
;可以生成一张当前用户的个人信息。
同时获取一言对于昵称区域,群主是一个独立的渐变色,管理员是一种,群成员又是一种。
部分功能会影响到颜色。银行功能
指令
存款 (额度)
,deposit (额度)
,取款 (额度)
,withdraw (额度)
,银行利率
,富豪榜
;银行功能设计之初支持多银行管理。
但是目前只实现了主银行,也就是全局银行。以后可能会完成之前画的饼。
银行有每周利息,利息随概率变动。
变动规则:
- 70%
1~3
% - 29%
4~7
% - 1%
-3~-1
%(经济危机!!!)
称号功能
指令
我的称号
,购买称号 (称号)
,切换称号 (称号坐标)
,称号商店
;称号默认获取群特殊头衔,没有就获取群活跃头衔,颜色不同。
除此之外的称号,都会有自己特有的颜色,目前只实现了4个称号:
- [大富翁] 金币到达10w自动获得,期限永久,高贵的黄金渐变色!
- [小富翁] 花费1w金币购买
购买称号 小富翁
,期限30天。 - [只是传说] 签到狂人称号,连续签到15天获得,期限15天。
- [邓刚] 钓鱼佬称号,钓鱼榜榜首持有,无期限。
- [17张牌能秒我?] 赌怪称号,目前没有获取方法。
特殊buff:
- 启用签到狂人称号时,签到获得的金币翻倍。
- 启用钓鱼佬称号时,钓鱼cd为3分钟,并且上钩更快!
切换称号 0
是卸下所有称号,回到默认称号。现已开放称号自定义添加功能,目前只有依赖本插件实现。
未来可能会实现通过配置文件自定义添加称号。自定义称号功能已经实现,在
data/cn.chahuyun.HuYanEconomy/title.json
中编辑,插件启动后将自动扫描注册到称号列表中。
目前只有购买一种途径获得,也没办法配置buff。{ // 称号code "templateCode": "template", // 过期时间(天) "validityPeriod": -1, // 称号名称(不是称号) "titleName": "模板", // 价格 0.0 "price": 0, // 是否渐变色 "gradient": false, // 颜色是否影响名称 "impactName": false, // 称号 "title": "[模板]", // 起始颜色,当渐变关闭时,此颜色就是唯一颜色 "sColor": "#00000", // 结束颜色 "eColor": "#ffffff" }
更多请查看TitleTemplateManager
猜签功能
权限code:
lottery
指令
开启 猜签
,关闭 猜签
,猜签 (猜签号码) (猜签金额)
;本功能需要在对应群开启,本功能有高强主动发送消息动作,高风险账号慎用!
签有3类:
- 小签 只需要3个号码 1分钟开启一次 最大金额 1000
- 中签 4个号码 一小时开启一次 最大金额 10000
- 大签 5个号码 一天开启一次 最大金额 1000000
中奖倍率
小签:
- 1:0.7
- 2:6
- 3:160
中签:
- 1:0.5
- 2:2.5
- 3:35
- 4:1250
大签:
- 1:0.3
- 2:1.4
- 3:12
- 4:200
- 5:10000
猜签顺序固定。
钓鱼功能
权限code:
fish
。指令
开启 钓鱼
,关闭 钓鱼
,购买鱼竿
,钓鱼
,抛竿
,升级鱼竿
,钓鱼排行榜
,钓鱼排行
,钓鱼榜
,鱼竿等级
,刷新钓鱼
,鱼塘等级
;本功能需要开启才能使用,本功能具有高刷屏风险,如果没有高管理能力,慎用!
钓鱼需要一把鱼竿,一把500金币,可以升级。
鱼上钩后需要操作!
向左拉|左|1
左操作向右拉|右|2
右操作收线|拉|0
收线操作放线|放|~
放线操作!|!|收|起|提|竿
收竿操作
鱼竿等级决定最小鱼等级保底,最大鱼等级;
鱼塘决定最大鱼等级;在操作的过程中会随机生成操作,你需要做对应的操作(不会提示),
左和右决定品质系数
收和放决定等级系数(同时受鱼竿等级影响)操作对会增加对应系数,失败则减少,放线会重置所有系数。
具体鱼的信息来自于星露谷物语和群友的灵感。
一些特定的系数和等级会固定掉到彩蛋!
设计之初还有自定义鱼塘,目前已经鸽了很久了,
红包功能
在此感谢Travellerrr编写了此功能。
指令
发红包 (额度) (个数) [sj|随机]
,领红包 (红包id)
,收红包 (红包id)
,抢红包
,红包列表
,全局红包列表
,开启 红包
,关闭 红包
;本功能需要在对应群开启。
通过发红包指令
发红包 100 10
可以发一个均分100的10个红包,结尾加上sj
或随机
可以将红包改为随机红包。红包24小时到期,到期没有领的红包自动退回账号。
抢劫功能
权限code:
rob
。在此感谢Travellerrr编写了此功能。
指令
开启 抢劫
,关闭 抢劫
,释放出狱
,抢银行
,抢劫 (@id)
,保释 (@id)
,[管理员指令]平账 (@id)
;本功能需要在对应群开启。
抢劫一个人,概率成功,概率失败。
被抓进监狱后将无法响应大部分指令,需要保释(要钱!!)。
你也可以抢银行!
快快拿起你的阿卡,抢银行吧!!!
道具功能
指令
背包
,backpack
,道具商店
,shops
,购买 (道具) (数量)
,buy (道具) (数量)
,使用 (道具) (数量)
,use (道具) (数量)
;道具系统有bug,并且结构设计的有点问题,目前在考虑重构,敬请期待!
管理员指令
指令 用处 greedisgood (金额)
获取指定金额 Console指令
指令 用处 hye v
查询壶言经济版本 未完成的规划
- 赌博功能
- 抢劫功能
- 红包功能
- 道具功能重构
- 增强功能间互动性
- 教会功能
关联插件
建议和交流
如果在使用本插件的时候预计bug,或是有好的建议,请优先前往github
提issues,
再考虑到我的插件群不是云的茶壶云(390444068)提问。img.pngimg.png -
RE: 没有编程基础
可以考虑直接入手java或者kt,kt的话我这边没有推荐,
java到是有,比较你可以跟着菜鸟一边学,一边跟着我最开始的插件对照
我开发他的时候,也差不多是这样过来的,而且注释也比较全。
另外有不懂的可以来不是云的茶狐云提问也行 -
一个轻巧的hibernate连接模块,用于开发。
Hibernate-plus
名字有点张扬了
hibrnate强化集成,用于以最小的程度连接你的数据库,为你带来最舒服的数据持久化。
封装了常用方法,也保留了Session的获取。内置3种数据库驱动:
H2
MySQL
Sqlit使用
在你的项目中引用
maven:<dependency> <groupId>cn.chahuyun</groupId> <artifactId>hibernate-plus</artifactId> <version>1.0.15</version> <type>module</type> </dependency>
gradle:
implementation("cn.chahuyun:hibernate-plus:1.0.15")
然后创建配置文件
//这里是你的启动类 Configuration configuration = HibernatePlusService.createConfiguration(Test.class); configuration.setDriveType(DriveType.MYSQL); configuration.setAddress("localhost:3306/test"); configuration.setAutoReconnect(true); configuration.setUser("root"); configuration.setPassword("123456"); //configuration.setPackageName("cc.cb.entity");
对于驱动类型DriveType,目前只提供了3种类型
- H2
- MYSQL
- SQLITE
对于java插件的实现:
EconomyConfig config = HuYanEconomy.config; Configuration configuration = HibernatePlusService.createConfiguration(economy.getClass()); configuration.setPackageName("cn.chahuyun.economy.entity"); DriveType dataType = config.getDataType(); configuration.setDriveType(dataType); Path dataFolderPath = economy.getDataFolderPath(); switch (dataType) { case MYSQL: configuration.setAddress(config.getMysqlUrl()); configuration.setUser(config.getMysqlUser()); configuration.setPassword(config.getMysqlPassword()); break; case H2: configuration.setAddress(dataFolderPath.resolve("HuYanEconomy.h2").toString()); break; case SQLITE: configuration.setAddress(dataFolderPath.resolve("HuYanEconomy").toString()); break; } HibernatePlusService.loadingService(configuration);
对于kotlin插件的实现:
val configuration = HibernatePlusService.createConfiguration(plugin::class.java) configuration.classLoader = plugin::class.java.classLoader configuration.packageName = "cn.chahuyun.authorize.entity" configuration.driveType = dataType when (dataType) { MYSQL -> { configuration.address = mysqlUrl configuration.user = mysqlUser configuration.password = mysqlPassword } H2 -> configuration.address = HuYanAuthorize.INSTANCE.dataFolderPath.resolve("authorize.h2.mv.db").toString() SQLITE -> configuration.address = HuYanAuthorize.INSTANCE.dataFolderPath.resolve("authorize.mv.db").toString() } HibernatePlusService.loadingService(configuration)
对于实体映射,可以填写
packageName
,进行指定包扫描,模板将会自动将带有Entity
的实体添加到映射目录中。当然你也可以不填写,那么我将会根据你的
ClassLoader
自动扫描"entry", "entity", "entities", "model", "models", "bean", "beans", "dto"
几个包名下面的实体。给定参数之后就可以通过HibernatePlusService来创建hibernate服务了
HibernatePlusService.loadingService(configuration);
成功后即可使用HibernateFactory来进行数据操作,我这里封装了几个常用的简单操作
List<MyUser> myUsers = HibernateFactory.selectList(MyUser.class); log.info("==========list============="); for (MyUser myUser : myUsers) { log.info(myUser.toString()); } log.info("==========================="); MyUser myUser = new MyUser(); myUser.setName("张"); myUser.setSex(123); Integer id = HibernateFactory.merge(myUser).getId(); log.info("==========one============="); MyUser selectOne = HibernateFactory.selectOne(MyUser.class, id); log.info(selectOne.toString()); log.info("===========================");
更复杂的操作请自行获取
SessionFactory
去创建。SessionFactory session = HibernateFactory.getSession();
自定义使用
你也可以不使用我给你的推荐配置,只需要在resources目录下填写
hibernate.properties
就行,然后通过HibernatePlusService.loadingService(Test.class);
就可以使用自定义配置进行连接