Compare commits

..

22 Commits

Author SHA1 Message Date
源文雨
85f5fb2d87 🔖 v1.5.2 2022-11-09 15:15:22 +08:00
源文雨
8674c14754 🔖 v1.5.2 2022-11-09 14:54:52 +08:00
DreamZero
6c2fc1b4c2 恢复注册方式 (#491) 2022-11-09 13:29:07 +08:00
源文雨
5d94980e7c 优化设精 2022-11-07 12:26:13 +08:00
源文雨
9bed71a99f feat: job drop limit due to 事件环 2022-11-07 11:04:09 +08:00
方柳煜
6faa2b65e2 添加设精功能 (#488) 2022-11-06 10:42:04 +08:00
lianhong2758
98812b103e 第三次提交兽语加密 (#486) 2022-11-05 22:15:34 +08:00
himawari
deb655de36 Feature huggingface (#478) 2022-11-05 17:32:31 +08:00
方柳煜
8d1c18cb4a Update command.go (#487) 2022-11-05 11:10:36 +08:00
DreamZero
88824126f7 add: 添加Brief (#482)
* add brief

* fix: README中插件位置
2022-11-04 12:12:47 +08:00
喵酱
68a9ecf995 修改了两处错误的文案 (#481) 2022-11-03 22:26:43 +08:00
方柳煜
57404b2dcd 优化签到插件,qqwife插件添加礼物系统 (#480) 2022-11-03 16:38:48 +08:00
源文雨
29705c63c9 doc: 添加项目趋势图 2022-11-02 13:19:57 +08:00
源文雨
5a854d9715 options add brief & banner 2022-11-01 11:30:05 +08:00
源文雨
eb1cbeae3f 🎨 优化事件环 2022-10-30 00:07:17 +08:00
weigui404
b6246cfee6 Update README.md (#479)
2022-10-30 00:03:32 +08:00
源文雨
0619000f9a 🎨 优化事件环 2022-10-29 20:16:02 +08:00
源文雨
01361781c8 🎨 增加最大处理时间 2022-10-29 11:25:50 +08:00
源文雨
3c03a308b3 fix #421: 增加全局响应延迟与处理不及消息的丢弃 2022-10-28 17:41:28 +08:00
源文雨
7895e48420 update zb: 事件环 2022-10-28 16:18:03 +08:00
源文雨
ba15713b99 update zb: 事件环 2022-10-28 15:27:29 +08:00
源文雨
bd98fa3aed update zb: 事件环 2022-10-28 14:44:32 +08:00
98 changed files with 1329 additions and 396 deletions

181
README.md
View File

@@ -27,6 +27,8 @@
| [yyuueexxiinngg/cqhttp-mirai](https://github.com/yyuueexxiinngg/cqhttp-mirai) | [Mirai](https://github.com/mamoe/mirai) | yyuueexxiinngg |
| [takayama-lily/onebot](https://github.com/takayama-lily/onebot) | [OICQ](https://github.com/takayama-lily/oicq) | takayama |
[![Star Trend](https://api.star-history.com/svg?repos=FloatTech/ZeroBot-Plugin&type=Timeline)](https://seladb.github.io/StarTrack-js/#/preload?r=FloatTech,ZeroBot-Plugin)
</div>
> 如果您不知道什么是 [OneBot](https://github.com/howmanybots/onebot) 或不希望运行多个程序,还可以直接前往 [gocqzbp](https://github.com/FloatTech/gocqzbp) 的 [Release](https://github.com/FloatTech/gocqzbp/releases) 页面下载单一可执行文件或前往 [Packages](https://github.com/FloatTech/gocqzbp/pkgs/container/gocqzbp) 页面使用`docker`,运行后按提示登录即可。
@@ -36,16 +38,19 @@
## 命令行参数
> `[]`代表是可选参数
```bash
zerobot [-c config.json] [-h] [-s config.json] [-t token] [-u url] [-n nickname] [-p prefix] [-d|w] [qq1 qq2 qq3 ...] [&]
zerobot [-h] [-n nickname] [-t token] [-u url] [-p prefix] [-d|w] [-c|s config.json] [-l latency] [-r ringlen] [-x max process time] [qq1 qq2 qq3 ...] [&]
```
- **-c config.json**: 从`config.json`加载`bot`配置
- **-h**: 显示帮助
- **-s config.json**: 保存现在`bot`配置到`config.json`
- **-n nickname**: 设置默认昵称,默认为`椛椛`
- **-t token**: 设置`AccessToken`,默认为空
- **-u url**: 设置`Url`,默认为`ws://127.0.0.1:6700`
- **-n nickname**: 设置默认昵称,默认为`椛椛`
- **-p prefix**: 设置命令前缀,默认为`/`
- **-d|w**: 开启 debug | warning 级别及以上日志输出
- **-c config.json**: 从`config.json`加载`bot`配置
- **-s config.json**: 保存现在`bot`配置到`config.json`
- **-l latency**: 全局处理延时 (ms)
- **-r ringlen**: 接收消息环缓冲区大小
- **-x max process time**: 最大处理时间 (min)
- **qqs**: superusers 的 qq 号
- **&**: 驻留在后台,必须放在最后,仅`Linux`下有效
@@ -61,7 +66,10 @@ zerobot [-c config.json] [-h] [-s config.json] [-t token] [-u url] [-n nickname]
"アトリ"
],
"command_prefix": "/",
"super_users": []
"super_users": [],
"ring_len": 4096,
"latency": 233000000,
"max_process_time": 240000000000
},
"ws": [
{
@@ -220,6 +228,12 @@ zerobot [-c config.json] [-h] [-s config.json] [-t token] [-u url] [-n nickname]
- [x] [开启 | 关闭]gist加群自动审批
- [x] 对信息回复:[设置 | 取消]精华
- [x] 取消精华 [信息ID]
- [x] /精华列表
- [ ] 同意好友请求
- [ ] 撤回[@xxx] [xxx]
@@ -360,6 +374,10 @@ print("run[CQ:image,file="+j["img"]+"]")
- [x] 设置ai绘图配置 [server] [token]
- [x] 设置ai绘图撤回时间90s
- [x] 查看ai绘图配置
例: 设置ai绘图配置 http://91.216.169.75:5010 abc
参考服务器 http://91.217.139.190:5010, http://91.216.169.75:5010, http://185.80.202.180:5010
@@ -623,32 +641,6 @@ print("run[CQ:image,file="+j["img"]+"]")
- [x] @Bot throw xxx (投递内容xxx,支持图片文字,投递内容需要大于10个字符或者带有图片)
</details>
<details>
<summary>一群一天一夫一妻制群老婆</summary>
`import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/qqwife"`
- 引入好感度系统,好感度越高,自由恋爱成功率越高
- [x] 设置CD为xx小时
- [x] 允许/禁止自由恋爱
- [x] 允许/禁止牛头人
- [x] 娶群友
- [x] (娶|嫁)[@对方QQ]
- [x] 当[对方Q号|@对方QQ]的小三
- [x] 做媒 @攻方QQ @受方QQ
- [x] 群老婆列表
- [x] 重置花名册
</details>
<details>
<summary>合成emoji</summary>
@@ -830,6 +822,16 @@ print("run[CQ:image,file="+j["img"]+"]")
- [x] 更新[屌|弔|吊]图
</details>
<details>
<summary>兽语加密(嗷呜~)</summary>
`import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/jiami"`
- [x] 兽语加密xxx
- [x] 兽语解密xxx
</details>
<details>
<summary>小鸡词典</summary>
@@ -878,6 +880,14 @@ print("run[CQ:image,file="+j["img"]+"]")
来份萝莉
```
</details>
<details>
<summary>MagicPrompt-Stable-Diffusion吟唱提示</summary>
`import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/magicprompt"`
- [x] 吟唱提示[xxxx]
</details>
<details>
<summary>简易midi音乐制作</summary>
@@ -1034,6 +1044,43 @@ print("run[CQ:image,file="+j["img"]+"]")
- [x] 解签
</details>
<details>
<summary>一群一天一夫一妻制群老婆</summary>
`import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/qqwife"`
- 引入好感度系统,好感度越高,自由恋爱成功率越高
- [x] 设置CD为xx小时
- [x] [允许|禁止]自由恋爱
- [x] [允许|禁止]牛头人
- [x] 娶群友
- [x] [娶|嫁][@对方QQ]
- [x] 当[对方Q号|@对方QQ]的小三
- [x] 做媒 @攻方QQ @受方QQ
- [x] 买礼物给[对方Q号|@对方QQ]
- [x] 群老婆列表
- [x] 重置花名册
</details>
<details>
<summary>Real-CUGAN清晰术</summary>
`import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/realcugan"`
- [x] 清晰术(双重吟唱|三重吟唱|四重吟唱)(强力术式|中等术式|弱术式|不变式|原式)[图片]
</details>
<details>
<summary>投胎</summary>
@@ -1084,6 +1131,11 @@ print("run[CQ:image,file="+j["img"]+"]")
- [x] 签到
- [x] 获得签到背景[@xxx] | 获得签到背景
- [x] 查看等级排名
- 注:跨群排行
- [x] 查看我的钱包
- [x] 查看钱包排名
- 注:本群排行,若群人数太多不建议使用该功能!!!
</details>
<details>
@@ -1126,6 +1178,14 @@ print("run[CQ:image,file="+j["img"]+"]")
- [x] 解塔罗牌[牌名]
- [x] [塔罗|大阿卡纳|小阿卡纳|混合]牌阵[圣三角|时间之流|四要素|五牌阵|吉普赛十字|马蹄|六芒星]
</details>
<details>
<summary>舔狗日记</summary>
`import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/tiangou"`
- [x] 舔狗日记
</details>
<details>
<summary>搜番</summary>
@@ -1134,20 +1194,6 @@ print("run[CQ:image,file="+j["img"]+"]")
- [x] 搜番 | 搜索番剧[图片]
</details>
<details>
<summary>猜单词</summary>
`import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/wordle"`
- [x] 个人猜单词
- [x] 团队猜单词
- [x] 团队六阶猜单词
- [x] 团队七阶猜单词
</details>
<details>
<summary>翻译</summary>
@@ -1156,6 +1202,14 @@ print("run[CQ:image,file="+j["img"]+"]")
- [x] >TL 你好
</details>
<details>
<summary>vits猫雷</summary>
`import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/vitsnyaru"`
- [x] 让猫雷说[xxxx]
</details>
<details>
<summary>vtb语录</summary>
@@ -1176,6 +1230,20 @@ print("run[CQ:image,file="+j["img"]+"]")
- [x] 来份网易云热评
</details>
<details>
<summary>天气/拼音查询-名言</summary>
`import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/wenben"`
- [x] xx天气
- [x] xx拼音
- [x] 每日情话/一言/鸡汤
- [x] 绕口令
</details>
<details>
<summary>百度文心AI</summary>
@@ -1236,14 +1304,6 @@ print("run[CQ:image,file="+j["img"]+"]")
- [x] 更新gal
</details>
<details>
<summary>舔狗日记</summary>
`import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/tiangou"`
- [x] 舔狗日记
</details>
<details>
<summary>聊天热词</summary>
@@ -1252,6 +1312,20 @@ print("run[CQ:image,file="+j["img"]+"]")
- [x] 热词 [群号] [消息数目]|热词 123456 1000
</details>
<details>
<summary>猜单词</summary>
`import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/wordle"`
- [x] 个人猜单词
- [x] 团队猜单词
- [x] 团队六阶猜单词
- [x] 团队七阶猜单词
</details>
<details>
<summary>鬼东西</summary>
@@ -1287,6 +1361,7 @@ print("run[CQ:image,file="+j["img"]+"]")
- [x] 设置回复模式[青云客 | 小爱]
</details>
## 三种使用方法,推荐第一种
### 1. 使用稳定版/测试版 (推荐)

12
go.mod
View File

@@ -5,13 +5,14 @@ go 1.19
require (
github.com/Baidu-AIP/golang-sdk v1.1.1
github.com/Coloured-glaze/gg v1.3.4
github.com/FloatTech/AnimeAPI v1.5.2-0.20221028033300-a9293e7eecb8
github.com/FloatTech/floatbox v0.0.0-20221028033104-a243fca6f2a3
github.com/FloatTech/AnimeAPI v1.5.2-0.20221105044443-0c9004b2f051
github.com/FloatTech/floatbox v0.0.0-20221029160423-446812ec82d9
github.com/FloatTech/sqlite v0.5.0
github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b
github.com/FloatTech/zbpctrl v1.5.2-0.20221011153929-4834c6911511
github.com/FloatTech/zbputils v1.5.1-0.20221028033223-1fdfaf978116
github.com/FloatTech/zbpctrl v1.5.2
github.com/FloatTech/zbputils v1.5.1-0.20221107030239-f8dd8b9a6e24
github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c
github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc
github.com/antchfx/htmlquery v1.2.5
github.com/corona10/goimagehash v1.1.0
github.com/fumiama/ahsai v0.1.0
@@ -32,13 +33,12 @@ require (
github.com/sirupsen/logrus v1.9.0
github.com/tidwall/gjson v1.14.3
github.com/wcharczuk/go-chart/v2 v2.1.0
github.com/wdvxdr1123/ZeroBot v1.5.2-0.20221011153413-16c9a77ce4f0
github.com/wdvxdr1123/ZeroBot v1.6.3
gitlab.com/gomidi/midi/v2 v2.0.25
golang.org/x/image v0.0.0-20220902085622-e7cb96979f69
)
require (
github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc // indirect
github.com/antchfx/xpath v1.2.1 // indirect
github.com/disintegration/imaging v1.6.2 // indirect
github.com/ericpauley/go-quantize v0.0.0-20200331213906-ae555eb2afa4 // indirect

20
go.sum
View File

@@ -4,18 +4,18 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym
github.com/Coloured-glaze/gg v1.3.4 h1:l31zIF/HaVwkzjrj+A56RGQoSKyKuR1IWtIrqXGFStI=
github.com/Coloured-glaze/gg v1.3.4/go.mod h1:Ih5NLNNDHOy3RJbB0EPqGTreIzq/H02TGThIagh8HJg=
github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
github.com/FloatTech/AnimeAPI v1.5.2-0.20221028033300-a9293e7eecb8 h1:W+Gb+NGv6RJZI4BSJHHADzYC9YeDfftFGphP8aMUvbg=
github.com/FloatTech/AnimeAPI v1.5.2-0.20221028033300-a9293e7eecb8/go.mod h1:2RjLcJ67OxRebKTrxBKy4P/8wPdcVhci8a/HALVUAQQ=
github.com/FloatTech/floatbox v0.0.0-20221028033104-a243fca6f2a3 h1:yiq5kEr51FTfz7xxDY+xjbcdgDWyvZ6U93cf1xSsGs4=
github.com/FloatTech/floatbox v0.0.0-20221028033104-a243fca6f2a3/go.mod h1:GVbLqexg8XJGuZs2zBZHO7jswCAPkZ9M/IKBYD0I/L0=
github.com/FloatTech/AnimeAPI v1.5.2-0.20221105044443-0c9004b2f051 h1:NEW8HzBNybMXAV0NrDpMF31n/e9BFGvNiGkDPGSkouc=
github.com/FloatTech/AnimeAPI v1.5.2-0.20221105044443-0c9004b2f051/go.mod h1:Z+Q4kIPNo/OX4RWw6WGQOQcaNsbkv/wPmPDw8p4aQIY=
github.com/FloatTech/floatbox v0.0.0-20221029160423-446812ec82d9 h1:HYJ7lwaqaOKmbYooPUMWxMhXRTp+JItoyeqa320ARD4=
github.com/FloatTech/floatbox v0.0.0-20221029160423-446812ec82d9/go.mod h1:w+ND28mRaJvxUJ6pRXS6i4cLzutpXsWyroutCzBdL78=
github.com/FloatTech/sqlite v0.5.0 h1:U7J5Omc534PqmH6csfu+ypCo3DS8L91l5lTsxUu3b/U=
github.com/FloatTech/sqlite v0.5.0/go.mod h1:i33d92OtR8jcp5fBUvQtospf27+MkfUxnGwnZ95E/dA=
github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b h1:tvciXWq2nuvTbFeJGLDNIdRX3BI546D3O7k7vrVueZw=
github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs=
github.com/FloatTech/zbpctrl v1.5.2-0.20221011153929-4834c6911511 h1:i2+JjTRR7gW8n1KivMKj3NEsCEEllYp8jneeOyg1Lz0=
github.com/FloatTech/zbpctrl v1.5.2-0.20221011153929-4834c6911511/go.mod h1:TC5RkmSwKJvkDV+7vlTpcY+rnviB5gBq6JNOKnfZXHc=
github.com/FloatTech/zbputils v1.5.1-0.20221028033223-1fdfaf978116 h1:ZHAMbLbSkirxV3/Z7FKaiF9TiMRCavCYsIbYDIYbSGc=
github.com/FloatTech/zbputils v1.5.1-0.20221028033223-1fdfaf978116/go.mod h1:nxTBx0YX8Ewq8oef2em4aJ5RH/5ZiG4PizK8v/csm7w=
github.com/FloatTech/zbpctrl v1.5.2 h1:5ap0t2KgROpfTVHqMd9vHKXLeLmRFGI3ZrTPASgFP6s=
github.com/FloatTech/zbpctrl v1.5.2/go.mod h1:BVPivMDJCBImPSdwgizb6sqb7rcDaRE65ZjfgthoC7g=
github.com/FloatTech/zbputils v1.5.1-0.20221107030239-f8dd8b9a6e24 h1:6d9o83ZFI3LSPf4isDUmShiaU9CXqqggFwKFuof2Ghs=
github.com/FloatTech/zbputils v1.5.1-0.20221107030239-f8dd8b9a6e24/go.mod h1:KDPJDu4KHeB4Gdyt8sqR5+QnIsIDW6XXsFfT1kD7okw=
github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c h1:cNPOdTNiVwxLpROLjXCgbIPvdkE+BwvxDvgmdYmWx6Q=
github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c/go.mod h1:KqZzu7slNKROh3TSYEH/IUMG6f4M+1qubZ5e52QypsE=
@@ -193,8 +193,8 @@ github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//
github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ=
github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I=
github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA=
github.com/wdvxdr1123/ZeroBot v1.5.2-0.20221011153413-16c9a77ce4f0 h1:IKWX0c7b3URoFDt5ezD6wa0AZIQ0EY0GbPVhYfuzXug=
github.com/wdvxdr1123/ZeroBot v1.5.2-0.20221011153413-16c9a77ce4f0/go.mod h1:shG/ruauisKaVcov4amrFJtkeDl7nl+Q00IXB2PqFsc=
github.com/wdvxdr1123/ZeroBot v1.6.3 h1:Xf+rM8fR9Etc7ydcGHuqCk0ulAAn7Oa7nD9Zy/qZ6Pk=
github.com/wdvxdr1123/ZeroBot v1.6.3/go.mod h1:shG/ruauisKaVcov4amrFJtkeDl7nl+Q00IXB2PqFsc=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=

View File

@@ -9,7 +9,7 @@ import (
var (
// Banner ...
Banner = "* OneBot + ZeroBot + Golang\n" +
"* Version 1.5.2-beta2 - 2022-10-28 12:49:51 +0800 CST\n" +
"* Version 1.5.2 - 2022-11-09 15:15:01 +0800 CST\n" +
"* Copyright © 2020 - 2022 FloatTech. All Rights Reserved.\n" +
"* Project: https://github.com/FloatTech/ZeroBot-Plugin"
reg = registry.NewRegReader("reilia.fumiama.top:32664", "fumiama")

21
main.go
View File

@@ -95,10 +95,12 @@ import (
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/image_finder" // 关键字搜图
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/inject" // 注入指令
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/jandan" // 煎蛋网无聊图
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/jiami" // 兽语加密
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/jikipedia" // 小鸡词典
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/jptingroom" // 日语听力学习材料
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/juejuezi" // 绝绝子生成器
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/lolicon" // lolicon 随机图片
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/magicprompt" // magicprompt吟唱提示
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/midicreate" // 简易midi音乐制作
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/moegoe" // 日韩 VITS 模型拟声
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/moyu" // 摸鱼
@@ -112,6 +114,7 @@ import (
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/nsfw" // nsfw图片识别
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/omikuji" // 浅草寺求签
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/qqwife" // 一群一天一夫一妻制群老婆
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/realcugan" // realcugan清晰术
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/reborn" // 投胎
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/runcode" // 在线运行代码
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/saucenao" // 以图搜图
@@ -124,8 +127,10 @@ import (
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/tiangou" // 舔狗日记
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/tracemoe" // 搜番
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/translation" // 翻译
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/vitsnyaru" // vits猫雷
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/vtb_quotation" // vtb语录
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/wangyiyun" // 网易云音乐热评
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/wenben" // 文本指令大全
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/wenxinAI" // 百度文心AI画图
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/word_count" // 聊天热词
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/wordle" // 猜单词
@@ -199,6 +204,9 @@ func init() {
prefix := flag.String("p", "/", "Set command prefix.")
runcfg := flag.String("c", "", "Run from config file.")
save := flag.String("s", "", "Save default config to file and exit.")
late := flag.Uint("l", 233, "Response latency (ms).")
rsz := flag.Uint("r", 4096, "Receiving buffer ring size.")
maxpt := flag.Uint("x", 4, "Max process time (min).")
flag.Parse()
@@ -248,10 +256,13 @@ func init() {
config.W = []*driver.WSClient{driver.NewWebSocketClient(*url, *token)}
config.Z = zero.Config{
NickName: append([]string{*adana}, "ATRI", "atri", "亚托莉", "アトリ"),
CommandPrefix: *prefix,
SuperUsers: sus,
Driver: []zero.Driver{config.W[0]},
NickName: append([]string{*adana}, "ATRI", "atri", "亚托莉", "アトリ"),
CommandPrefix: *prefix,
SuperUsers: sus,
RingLen: *rsz,
Latency: time.Duration(*late) * time.Millisecond,
MaxProcessTime: time.Duration(*maxpt) * time.Minute,
Driver: []zero.Driver{config.W[0]},
}
if *save != "" {
@@ -280,5 +291,5 @@ func main() {
Handle(func(ctx *zero.Ctx) {
ctx.SendChain(message.Text(kanban.Kanban()))
})
zero.RunAndBlock(config.Z, process.GlobalInitMutex.Unlock)
zero.RunAndBlock(&config.Z, process.GlobalInitMutex.Unlock)
}

View File

@@ -29,7 +29,8 @@ var (
func init() {
engine := control.Register("ahsai", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "ahsai tts\n- 使[伊織弓鶴|紲星あかり|結月ゆかり|京町セイカ|東北きりたん|東北イタコ|ついなちゃん標準語|ついなちゃん関西弁|音街ウナ|琴葉茜|吉田くん|民安ともえ|桜乃そら|月読アイ|琴葉葵|東北ずん子|月読ショウタ|水奈瀬コウ]说(日语)\n",
Brief: "フリーテキスト音声合成",
Help: "- 使[伊織弓鶴|紲星あかり|結月ゆかり|京町セイカ|東北きりたん|東北イタコ|ついなちゃん標準語|ついなちゃん関西弁|音街ウナ|琴葉茜|吉田くん|民安ともえ|桜乃そら|月読アイ|琴葉葵|東北ずん子|月読ショウタ|水奈瀬コウ]说(日语)\n",
PrivateDataFolder: "ahsai",
})
cachePath := engine.DataFolder() + "cache/"

View File

@@ -22,8 +22,8 @@ import (
func init() { // 插件主体
engine := control.Register("aifalse", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "AIfalse\n" +
"- 查询计算机当前活跃度: [检查身体 | 自检 | 启动自检 | 系统状态]\n" +
Brief: "自检, 全局限速",
Help: "- 查询计算机当前活跃度: [检查身体 | 自检 | 启动自检 | 系统状态]\n" +
"- 设置默认限速为每 m [分钟 | 秒] n 次触发",
})
c, ok := control.Lookup("aifalse")

View File

@@ -152,7 +152,7 @@ func newttsmode() *ttsmode {
tts := &ttsmode{}
tts.Lock()
defer tts.Unlock()
m, ok := control.Lookup(ttsServiceName)
m, ok := control.Lookup("tts")
tts.mode = make(map[int64]int64, 2*len(soundList))
tts.mode[-2905] = 1
if ok {
@@ -229,7 +229,7 @@ func (tts *ttsmode) setDefaultSoundMode(name string) error {
}
tts.Lock()
defer tts.Unlock()
m, ok := control.Lookup(ttsServiceName)
m, ok := control.Lookup("tts")
if !ok {
return errors.New("[tts] service not found")
}

View File

@@ -17,28 +17,23 @@ import (
"github.com/wdvxdr1123/ZeroBot/message"
)
const (
replyServiceName = "aireply"
ttsServiceName = "tts"
)
var replyModes = [...]string{"青云客", "小爱"}
func init() { // 插件主体
enOftts := control.Register(ttsServiceName, &ctrl.Options[*zero.Ctx]{
enOftts := control.Register("tts", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: true,
Help: "语音回复(大家一起来炼丹)\n" +
"- @Bot 任意文本(任意一句话回复)\n" +
Brief: "人工智能语音回复",
Help: "- @Bot 任意文本(任意一句话回复)\n" +
"- 设置语音模式[原神人物]\n" +
"- 设置默认语音模式[原神人物]\n" +
"- 恢复成默认语音模式\n" +
"当前适用的原神人物含有以下:\n" + list(soundList[:], 5),
})
tts := newttsmode()
enOfreply := control.Register(replyServiceName, &ctrl.Options[*zero.Ctx]{
enOfreply := control.Register("aireply", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "人工智能回复\n" +
"- @Bot 任意文本(任意一句话回复)\n- 设置回复模式[青云客|小爱]",
Brief: "人工智能回复",
Help: "- @Bot 任意文本(任意一句话回复)\n- 设置回复模式[青云客|小爱]",
})
/*************************************************************
*******************************AIreply************************

View File

@@ -51,39 +51,41 @@ func (r *result) String() string {
func init() { // 插件主体
engine := control.Register("aipaint", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "ai绘图\n" +
"- [ ai绘图 | 生成色图 | 生成涩图 | ai画图 ] xxx\n" +
Brief: "ai绘图",
Help: "- [ ai绘图 | 生成色图 | 生成涩图 | ai画图 ] xxx\n" +
"- [ ai高级绘图 | 高级生成色图 | 高级生成涩图 | ai高级画图 ] [prompt]\n" +
"- [ 以图绘图 | 以图生图 | 以图画图 ] xxx [图片]|@xxx|[qq号]\n" +
"- 设置ai绘图配置 [server] [token]\n" +
"- 设置ai绘图撤回时间90s\n" +
"- 查看ai绘图配置\n" +
"例: 设置ai绘图配置 http://91.217.139.190:5010 abc\n" +
"参考服务器 http://91.217.139.190:5010, http://91.216.169.75:5010, http://185.80.202.180:5010\n" +
"通过 http://91.217.139.190:5010/token 获取token\n" +
"[prompt]参数如下\n" +
"tags:tag词条\nntags:ntag词条\nshape:[Portrait|Landscape|Square]\nscale:[6:20]\nseed:种子\n" +
"参数与参数内容用:连接,每个参数之间用回车或者&分割",
"参数与参数内容用:连接,每个参数之间用回车分割",
PrivateDataFolder: "aipaint",
})
datapath = file.BOTPATH + "/" + engine.DataFolder()
engine.OnPrefixGroup([]string{`ai绘图`, `生成色图`, `生成涩图`, `ai画图`}).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
server, token, err := cfg.load()
err := cfg.load()
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Text("少女祈祷中..."))
args := ctx.State["args"].(string)
data, err := web.GetData(server + fmt.Sprintf(aipaintTxt2ImgURL, token, url.QueryEscape(strings.TrimSpace(strings.ReplaceAll(args, " ", "%20")))))
data, err := web.GetData(cfg.BaseURL + fmt.Sprintf(aipaintTxt2ImgURL, cfg.Token, url.QueryEscape(strings.TrimSpace(strings.ReplaceAll(args, " ", "%20")))))
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
sendAiImg(ctx, data)
sendAiImg(ctx, data, cfg.Interval)
})
engine.OnRegex(`^(以图绘图|以图生图|以图画图)[\s\S]*?(\[CQ:(image\,file=([0-9a-zA-Z]{32}).*|at.+?(\d{5,11}))\].*|(\d+))$`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
server, token, err := cfg.load()
err := cfg.load()
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
@@ -101,7 +103,7 @@ func init() { // 插件主体
return
}
ctx.SendChain(message.Text("少女祈祷中..."))
postURL := server + fmt.Sprintf(aipaintImg2ImgURL, token, url.QueryEscape(strings.TrimSpace(strings.ReplaceAll(args, " ", "%20"))))
postURL := cfg.BaseURL + fmt.Sprintf(aipaintImg2ImgURL, cfg.Token, url.QueryEscape(strings.TrimSpace(strings.ReplaceAll(args, " ", "%20"))))
f, err := os.Open(c.headimgsdir[0])
if err != nil {
@@ -136,11 +138,11 @@ func init() { // 插件主体
ctx.SendChain(message.Text("ERROR: ", err))
return
}
sendAiImg(ctx, data)
sendAiImg(ctx, data, cfg.Interval)
})
engine.OnPrefixGroup([]string{`ai高级绘图`, `高级生成色图`, `高级生成涩图`, `ai高级画图`}).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
server, token, err := cfg.load()
err := cfg.load()
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
@@ -156,13 +158,13 @@ func init() { // 插件主体
if len(value) > 1 {
if value[0] == "R18" && value[1] == "1" {
value[1] = "0"
ctx.SendChain(message.Text("不准涩涩!已将R18设置为0"))
ctx.SendChain(message.Text("不准涩涩! 已将R18设置为0. "))
}
tags[value[0]] = strings.Join(value[1:], ":")
}
}
ctx.SendChain(message.Text("少女祈祷中..."))
apiurl := "/got_image?token=" + token
apiurl := "/got_image?token=" + cfg.Token
if _, ok := tags["tags"]; ok {
apiurl += "&tags=" + url.QueryEscape(strings.ReplaceAll(strings.TrimSpace(tags["tags"]), " ", "%20"))
}
@@ -181,26 +183,63 @@ func init() { // 插件主体
if _, ok := tags["seed"]; ok {
apiurl += "&seed=" + url.QueryEscape(strings.TrimSpace(tags["seed"]))
}
data, err := web.GetData(server + apiurl)
data, err := web.GetData(cfg.BaseURL + apiurl)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
sendAiImg(ctx, data)
sendAiImg(ctx, data, cfg.Interval)
})
engine.OnRegex(`^设置ai绘图配置\s(.*[^\s$])\s(.+)$`, zero.SuperUserPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
regexMatched := ctx.State["regex_matched"].([]string)
err := cfg.save(regexMatched[1], regexMatched[2])
err := cfg.load()
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Text("成功设置server为", regexMatched[1], ", token为", regexMatched[2]))
err = cfg.update(regexMatched[1], regexMatched[2], cfg.Interval)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
text := fmt.Sprintf("成功设置\nbase_url: %v\ntoken: %v\ninterval: %v\n", cfg.BaseURL, cfg.Token, cfg.Interval)
ctx.SendChain(message.Text(text))
})
engine.OnRegex(`^设置ai绘图撤回时间(\d{1,3})s$`, zero.SuperUserPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
regexMatched := ctx.State["regex_matched"].([]string)
interval, err := strconv.Atoi(regexMatched[1])
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
err = cfg.load()
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
err = cfg.update(cfg.BaseURL, cfg.Token, interval)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
text := fmt.Sprintf("成功设置\nbase_url: %v\ntoken: %v\ninterval: %v\n", cfg.BaseURL, cfg.Token, cfg.Interval)
ctx.SendChain(message.Text(text))
})
engine.OnFullMatch(`查看ai绘图配置`, zero.SuperUserPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
err := cfg.load()
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
text := fmt.Sprintf("base_url: %v\ntoken: %v\ninterval: %v\n", cfg.BaseURL, cfg.Token, cfg.Interval)
ctx.SendChain(message.Text(text))
})
}
func sendAiImg(ctx *zero.Ctx, data []byte) {
func sendAiImg(ctx *zero.Ctx, data []byte, interval int) {
var loadData string
if predictRe.MatchString(binary.BytesToString(data)) {
loadData = predictRe.FindStringSubmatch(binary.BytesToString(data))[0]
@@ -223,11 +262,10 @@ func sendAiImg(ctx *zero.Ctx, data []byte) {
m = append(m, ctxext.FakeSenderForwardNode(ctx, message.Text(r.String())))
if mid := ctx.Send(m); mid.ID() == 0 {
ctx.SendChain(message.Text("ERROR: 可能被风控或下载图片用时过长,请耐心等待"))
} else {
} else if interval > 0 {
go func(i message.MessageID) {
time.Sleep(90 * time.Second)
time.Sleep(time.Duration(interval) * time.Second)
ctx.DeleteMessage(i)
}(mid)
}
}

View File

@@ -10,9 +10,10 @@ import (
// 配置结构体
type serverConfig struct {
BaseURL string `json:"base_url"`
Token string `json:"token"`
file string
BaseURL string `json:"base_url"`
Token string `json:"token"`
Interval int `json:"interval"`
file string
}
func newServerConfig(file string) *serverConfig {
@@ -21,9 +22,14 @@ func newServerConfig(file string) *serverConfig {
}
}
func (cfg *serverConfig) save(baseURL, token string) (err error) {
cfg.BaseURL = baseURL
cfg.Token = token
func (cfg *serverConfig) update(baseURL, token string, interval int) (err error) {
if baseURL != "" {
cfg.BaseURL = baseURL
}
if token != "" {
cfg.Token = token
}
cfg.Interval = interval
reader, err := os.Create(cfg.file)
if err != nil {
return err
@@ -32,10 +38,8 @@ func (cfg *serverConfig) save(baseURL, token string) (err error) {
return json.NewEncoder(reader).Encode(cfg)
}
func (cfg *serverConfig) load() (aipaintServer, token string, err error) {
if cfg.BaseURL != "" && cfg.Token != "" {
aipaintServer = cfg.BaseURL
token = cfg.Token
func (cfg *serverConfig) load() (err error) {
if cfg.BaseURL != "" && cfg.Token != "" && cfg.Interval != 0 {
return
}
if file.IsNotExist(cfg.file) {
@@ -48,7 +52,5 @@ func (cfg *serverConfig) load() (aipaintServer, token string, err error) {
}
defer reader.Close()
err = json.NewDecoder(reader).Decode(cfg)
aipaintServer = cfg.BaseURL
token = cfg.Token
return
}

View File

@@ -19,8 +19,8 @@ const (
func init() { // 插件主体
control.Register("aiwife", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "AIWife\n" +
"- waifu | 随机waifu",
Brief: "ai随机生成老婆",
Help: "- waifu | 随机waifu",
}).ApplySingle(ctxext.DefaultSingle).OnFullMatchGroup([]string{"waifu", "随机waifu"}).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
miku := rand.Intn(100000) + 1

View File

@@ -17,9 +17,9 @@ const (
func init() { // 插件主体
engine := control.Register("alipayvoice", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "支付宝到账语音\n" +
"- 支付宝到账 1",
DisableOnDefault: false,
Brief: "支付宝到账语音",
Help: "- 支付宝到账 1",
PrivateDataFolder: "alipayvoice",
})

View File

@@ -40,7 +40,8 @@ func onDel(uid int64, _ struct{}) {
func init() {
engine := control.Register("antiabuse", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "违禁词检测\n- /[添加|删除|查看]违禁词",
Brief: "违禁词检测",
Help: "- /[添加|删除|查看]违禁词",
PrivateDataFolder: "anti_abuse",
})

View File

@@ -17,16 +17,12 @@ import (
"github.com/FloatTech/zbputils/control"
)
const (
// 服务名
servicename = "atri"
// ATRI 表情的 codechina 镜像
res = "https://gitcode.net/u011570312/zbpdata/-/raw/main/Atri/"
)
const res = "https://gitcode.net/u011570312/zbpdata/-/raw/main/Atri/"
func init() { // 插件主体
engine := control.Register(servicename, &ctrl.Options[*zero.Ctx]{
engine := control.Register("atri", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "atri人格文本回复",
Help: "本插件基于 ATRI ,为 Golang 移植版\n" +
"- ATRI醒醒\n- ATRI睡吧\n- 萝卜子\n- 喜欢 | 爱你 | 爱 | suki | daisuki | すき | 好き | 贴贴 | 老婆 | 亲一个 | mua\n" +
"- 草你妈 | 操你妈 | 脑瘫 | 废柴 | fw | 废物 | 战斗 | 爬 | 爪巴 | sb | SB | 傻B\n- 早安 | 早哇 | 早上好 | ohayo | 哦哈哟 | お早う | 早好 | 早 | 早早早\n" +

View File

@@ -14,8 +14,8 @@ import (
func init() {
en := control.Register("base16384", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "base16384加解密\n" +
"- 加密xxx\n- 解密xxx\n- 用yyy加密xxx\n- 用yyy解密xxx",
Brief: "base16384加解密",
Help: "- 加密xxx\n- 解密xxx\n- 用yyy加密xxx\n- 用yyy解密xxx",
})
en.OnRegex(`^加密\s*(.+)$`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {

View File

@@ -15,8 +15,8 @@ import (
func init() {
control.Register("baidu", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "baidu\n" +
"- 百度下[xxx]",
Brief: "不会百度吗",
Help: "- 百度下[xxx]",
}).OnPrefix("百度下").SetBlock(true).Limit(ctxext.LimitByGroup).
Handle(func(ctx *zero.Ctx) {
txt := ctx.State["args"].(string)

View File

@@ -4,6 +4,9 @@ package baiduaudit
import (
"encoding/json"
"fmt"
"os"
"strconv"
"github.com/Baidu-AIP/golang-sdk/aip/censor"
"github.com/FloatTech/floatbox/binary"
"github.com/FloatTech/floatbox/file"
@@ -12,8 +15,6 @@ import (
"github.com/FloatTech/zbputils/img/text"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
"os"
"strconv"
)
// 服务网址:https://console.bce.baidu.com/ai/?_=1665977657185#/ai/antiporn/overview/index
@@ -99,6 +100,7 @@ var (
func init() {
engine := control.Register("baiduaudit", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "百度内容审核",
Help: "##该功能来自百度内容审核需购买相关服务并创建app##\n" +
"- 获取BDAKey\n" +
"- 配置BDAKey [API key] [Secret Key]\n" +

View File

@@ -14,8 +14,8 @@ import (
func init() {
en := control.Register("base64gua", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "base64gua加解密\n" +
"- 六十四卦加密xxx\n- 六十四卦解密xxx\n- 六十四卦用yyy加密xxx\n- 六十四卦用yyy解密xxx",
Brief: "六十四卦加解密",
Help: "- 六十四卦加密xxx\n- 六十四卦解密xxx\n- 六十四卦用yyy加密xxx\n- 六十四卦用yyy解密xxx",
})
en.OnRegex(`^六十四卦加密\s*(.+)$`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {

View File

@@ -14,8 +14,8 @@ import (
func init() {
en := control.Register("baseamasiro", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "base天城文加解密\n" +
"- 天城文加密xxx\n- 天城文解密xxx\n- 天城文用yyy加密xxx\n- 天城文用yyy解密xxx",
Brief: "天城文加解密",
Help: "- 天城文加密xxx\n- 天城文解密xxx\n- 天城文用yyy加密xxx\n- 天城文用yyy解密xxx",
})
en.OnRegex(`^天城文加密\s*(.+)$`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {

View File

@@ -48,13 +48,14 @@ var (
func init() {
engine := control.Register("bilibili", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "bilibili (412就是拦截的意思,建议私聊把cookie设全)\n" +
"- >vup info [xxx]\n" +
Brief: "b站查成分查弹幕",
Help: "- >vup info [xxx]\n" +
"- >user info [xxx]\n" +
"- 查成分 [xxx]\n" +
"- 查弹幕 [xxx]\n" +
"- 设置b站cookie b_ut=7;buvid3=0;i-wanna-go-back=-1;innersign=0;\n" +
"- 更新vup",
"- 更新vup" +
"Tips: (412就是拦截的意思,建议私聊把cookie设全)\n",
PublicDataFolder: "Bilibili",
})
cachePath := engine.DataFolder() + "cache/"

View File

@@ -29,8 +29,8 @@ var (
func init() {
en := control.Register("bilibiliparse", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "b站动态、专栏、视频、直播解析\n" +
"- t.bilibili.com/642277677329285174 | bilibili.com/read/cv17134450 | bilibili.com/video/BV13B4y1x7pS | live.bilibili.com/22603245 ",
Brief: "b站链接解析",
Help: "例:- t.bilibili.com/642277677329285174\n- bilibili.com/read/cv17134450\n- bilibili.com/video/BV13B4y1x7pS\n- live.bilibili.com/22603245 ",
})
en.OnRegex(`((b23|acg).tv|bili2233.cn)/[0-9a-zA-Z]+`).SetBlock(true).Limit(limit.LimitByGroup).
Handle(func(ctx *zero.Ctx) {

View File

@@ -22,10 +22,9 @@ import (
)
const (
ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
referer = "https://www.bilibili.com/"
infoURL = "https://api.bilibili.com/x/space/acc/info?mid=%v"
serviceName = "bilibilipush"
ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
referer = "https://www.bilibili.com/"
infoURL = "https://api.bilibili.com/x/space/acc/info?mid=%v"
)
// bdb bilibili推送数据库
@@ -38,16 +37,18 @@ var (
)
func init() {
en := control.Register(serviceName, &ctrl.Options[*zero.Ctx]{
en := control.Register("bilibilipush", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "bilibilipush,需要配合job一起使用\n" +
"- 添加b站订阅[uid|name]\n" +
Brief: "b站推送",
Help: "- 添加b站订阅[uid|name]\n" +
"- 取消b站订阅[uid|name]\n" +
"- 取消b站动态订阅[uid|name]\n" +
"- 取消b站直播订阅[uid|name]\n" +
"- b站推送列表\n" +
"- 拉取b站推送 (使用job执行定时任务------记录在\"@every 10s\"触发的指令)",
PrivateDataFolder: serviceName,
"Tips: 需要配合job一起使用, 全局只需要设置一个, 无视响应状态推送, 下为例子\n" +
"记录在\"@every 5m\"触发的指令)\n" +
"拉取b站推送",
PrivateDataFolder: "bilibilipush",
})
// 加载bilibili推送数据库
@@ -274,7 +275,7 @@ func sendDynamic(ctx *zero.Ctx) error {
ct := cardList[i].Get("desc.timestamp").Int()
if ct > t && ct > time.Now().Unix()-600 {
lastTime[buid] = ct
m, ok := control.Lookup(serviceName)
m, ok := control.Lookup("bilibilipush")
if ok {
groupList := bdb.getAllGroupByBuidAndDynamic(buid)
dc, err := bz.LoadDynamicDetail(cardList[i].Raw)
@@ -323,7 +324,7 @@ func sendLive(ctx *zero.Ctx) error {
oldStatus := liveStatus[key.Int()]
if newStatus != oldStatus && newStatus == 1 {
liveStatus[key.Int()] = newStatus
m, ok := control.Lookup(serviceName)
m, ok := control.Lookup("bilibilipush")
if ok {
groupList := bdb.getAllGroupByBuidAndLive(key.Int())
roomID := value.Get("short_id").Int()

View File

@@ -18,7 +18,8 @@ import (
func init() {
engine := control.Register("bookreview", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "哀伤雪刃推书记录\n- 书评[xxx]\n- 随机书评",
Brief: "哀伤雪刃推书书评",
Help: "- 书评[xxx]\n- 随机书评",
PublicDataFolder: "BookReview",
})

View File

@@ -18,7 +18,8 @@ var sm syncx.Map[int64, string]
func init() {
engine := control.Register("breakrepeat", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "打断复读\n- 打断" + strconv.Itoa(throttle) + "次以上复读\n",
Brief: "打断复读",
Help: "- 打断" + strconv.Itoa(throttle) + "次以上复读\n",
})
engine.On("message/group", zero.OnlyGroup, func(ctx *zero.Ctx) bool {
return !zero.HasPicture(ctx)

View File

@@ -32,8 +32,8 @@ var (
func init() {
engine := control.Register("cangtoushi", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "藏头诗\n" +
"- 藏头诗[xxx]\n- 藏尾诗[xxx]",
Brief: "藏头诗, 藏尾诗",
Help: "- 藏头诗[xxx]\n- 藏尾诗[xxx]",
})
engine.OnRegex(`藏头诗\s?([一-龥]{3,10})$`).SetBlock(true).Handle(func(ctx *zero.Ctx) {
kw := ctx.State["regex_matched"].([]string)[1]

View File

@@ -17,6 +17,7 @@ var (
poke = rate.NewManager[int64](time.Minute*5, 8) // 戳一戳
engine = control.Register("chat", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "基础反应, 群空调",
Help: "chat\n- [BOT名字]\n- [戳一戳BOT]\n- 空调开\n- 空调关\n- 群温度\n- 设置温度[正整数]",
})
)

View File

@@ -15,9 +15,9 @@ import (
func init() {
engine := control.Register("choose", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "choose\n" +
"- 选择可口可乐还是百事可乐\n" +
"- 选择肯德基还是麦当劳还是必胜客",
Brief: "选择困难症帮手",
Help: "例: 选择可口可乐还是百事可乐\n" +
"选择肯德基还是麦当劳还是必胜客",
})
engine.OnPrefix("选择").SetBlock(true).Handle(handle)
}

View File

@@ -16,7 +16,8 @@ import (
func init() {
en := control.Register("chouxianghua", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "抽象话\n- 抽象翻译xxx",
Brief: "翻译为抽象话",
Help: "- 抽象翻译xxx",
PublicDataFolder: "ChouXiangHua",
})

View File

@@ -14,7 +14,8 @@ func init() {
// 初始化engine
engine := control.Register("chrev", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "字符翻转\n- 翻转 I love you",
Brief: "英文字符翻转",
Help: "例: 翻转 I love you",
})
// 处理字符翻转指令
engine.OnRegex(`^翻转\s*([A-Za-z\s]*)$`).SetBlock(true).

View File

@@ -25,7 +25,8 @@ var (
func init() {
control.Register("coser", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "三次元小姐姐\n- coser",
Brief: "三次元coser",
Help: "- coser",
}).ApplySingle(ctxext.DefaultSingle).OnFullMatch("coser").SetBlock(true).Limit(ctxext.LimitByGroup).
Handle(func(ctx *zero.Ctx) {
ctx.SendChain(message.Text("少女祈祷中......"))

View File

@@ -18,7 +18,8 @@ import (
func init() {
engine := control.Register("cpstory", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "cp短打\n- 组cp[@xxx][@xxx]\n- 磕cp大老师 雪乃",
Brief: "cp短打", // 这里也许有更好的名字
Help: "- 组cp[@xxx][@xxx]\n- 磕cp大老师 雪乃",
PublicDataFolder: "CpStory",
})

View File

@@ -23,7 +23,8 @@ const (
func init() {
engine := control.Register("curse", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: true,
Help: "骂人(求骂,自卫)\n- 骂我\n- 大力骂我",
Brief: "骂人反击",
Help: "- 骂我\n- 大力骂我",
PublicDataFolder: "Curse",
})

View File

@@ -18,9 +18,9 @@ import (
func init() { // 插件主体
engine := control.Register("danbooru", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "二次元图片标签识别\n" +
"- 鉴赏图片[图片]",
DisableOnDefault: false,
Brief: "二次元图片标签识别",
Help: "- 鉴赏图片[图片]",
PrivateDataFolder: "danbooru",
})

View File

@@ -14,8 +14,8 @@ import (
var engine = control.Register("diana", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "嘉然\n" +
"- 小作文\n" +
Brief: "嘉然相关", // 也许使用常用功能当Brief更好
Help: "- 小作文\n" +
"- 发大病\n" +
"- 教你一篇小作文[作文]",
PublicDataFolder: "Diana",

View File

@@ -35,7 +35,8 @@ var seaLocker sync.RWMutex
func init() {
en := control.Register("driftbottle", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "简单的漂流瓶\n" + "- @bot pick" + "- @bot throw xxx (xxx为投递内容)",
Brief: "漂流瓶",
Help: "- @bot pick" + "- @bot throw xxx (xxx为投递内容)",
PrivateDataFolder: "driftbottle",
})
seaSide.DBPath = en.DataFolder() + "sea.db"

View File

@@ -19,8 +19,8 @@ const bed = "https://www.gstatic.com/android/keyboard/emojikitchen/%d/u%x/u%x_u%
func init() {
control.Register("emojimix", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "合成emoji\n" +
"- [emoji][emoji]",
Brief: "合成emoji",
Help: "- [emoji][emoji]",
}).OnMessage(match).SetBlock(true).Limit(ctxext.LimitByUser).
Handle(func(ctx *zero.Ctx) {
r := ctx.State["emojimix"].([]rune)

View File

@@ -13,10 +13,7 @@ import (
"github.com/FloatTech/zbputils/ctxext"
)
const (
servicename = "epidemic"
txurl = "https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/list?modules=statisGradeCityDetail,diseaseh5Shelf"
)
const txurl = "https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/list?modules=statisGradeCityDetail,diseaseh5Shelf"
// result 疫情查询结果
type result struct {
@@ -50,10 +47,10 @@ type area struct {
}
func init() {
engine := control.Register(servicename, &ctrl.Options[*zero.Ctx]{
engine := control.Register("epidemic", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "城市疫情查询\n" +
"- xxx疫情\n",
Brief: "城市疫情查询",
Help: "- xxx疫情\n",
})
engine.OnSuffix("疫情").SetBlock(true).Limit(ctxext.LimitByUser).
Handle(func(ctx *zero.Ctx) {

View File

@@ -17,10 +17,10 @@ import (
func init() {
engine := control.Register("event", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "好友申请以及群聊邀请事件处理,默认发送给主人列表第一位\n" +
"- [开启|关闭]自动同意[申请|邀请|主人]\n" +
Brief: "好友申请群聊邀请事件处理",
Help: "- [开启|关闭]自动同意[申请|邀请|主人]\n" +
"- [同意|拒绝][申请|邀请][flag]\n" +
"flag跟随事件一起发送, 默认同意主人的事件",
"Tips: 信息默认发送给主人列表第一位, 默认同意所有主人的事件, flag跟随事件一起发送",
})
engine.On("request/group/invite").SetBlock(false).
Handle(func(ctx *zero.Ctx) {

View File

@@ -14,7 +14,8 @@ import (
func init() {
control.Register("font", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "渲染任意文字到图片\n- (用[终末体|终末变体|紫罗兰体|樱酥体|Consolas体|苹方体])渲染文字xxx",
Brief: "渲染任意文字到图片",
Help: "- (用[字体])渲染文字xxx\n可选字体: [终末体|终末变体|紫罗兰体|樱酥体|Consolas体|苹方体]",
}).OnRegex(`^(用.+)?渲染文字([\s\S]+)$`).SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
fnt := ctx.State["regex_matched"].([]string)[1]
txt := ctx.State["regex_matched"].([]string)[2]

View File

@@ -51,8 +51,8 @@ func init() {
// 插件主体
en := control.Register("fortune", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "每日运势: \n" +
"- 运势 | 抽签\n" +
Brief: "每日运势",
Help: "- 运势 | 抽签\n" +
"- 设置底图[车万 | DC4 | 爱因斯坦 | 星空列车 | 樱云之恋 | 富婆妹 | 李清歌 | 公主连结 | 原神 | 明日方舟 | 碧蓝航线 | 碧蓝幻想 | 战双 | 阴阳师 | 赛马娘 | 东方归言录 | 奇异恩典 | 夏日口袋 | ASoul]",
PublicDataFolder: "Fortune",
})

View File

@@ -26,8 +26,8 @@ var db = &sql.Sqlite{}
func init() {
en := control.Register("funny", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "讲个笑话\n" +
"- 讲个笑话[@xxx|qq号|人名] | 夸夸[@xxx|qq号|人名] ",
Brief: "讲个笑话",
Help: "- 讲个笑话[@xxx|qq号|人名] | 夸夸[@xxx|qq号|人名] ",
PublicDataFolder: "Funny",
})

View File

@@ -37,7 +37,8 @@ var (
func init() {
engine := control.Register("genshin", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "原神抽卡\n- 原神十连\n- 切换原神卡池",
Brief: "原神模拟抽卡",
Help: "- 原神十连\n- 切换原神卡池",
PublicDataFolder: "Genshin",
}).ApplySingle(ctxext.DefaultSingle)

View File

@@ -128,7 +128,8 @@ func init() { // 插件主体
}
en := control.Register("gif", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "GIF制图命令后艾特群友/QQ号/一张图方可触发命令\n其中XXX可以为任何文字可以不写\n对机器人操作请先艾特机器人再执行命令\n" +
Brief: "制图",
Help: "下为制图命令: " +
"- 搓|-冲|-摸|-拍|-丢|-吃|-敲|-啃|-蹭|-爬|-撕|-灰度|-上翻|-下翻\n" +
"- 左翻|-右翻|-反色|-浮雕|- 打码|- 负片|- 旋转|- 变形|- 亲\n" +
"- 结婚申请|结婚登记|- 阿尼亚喜欢XXX|- 像只|- 我永远喜欢XXX\n" +
@@ -141,7 +142,10 @@ func init() { // 插件主体
"- 抬棺|- 远离|- 我老婆|- 小天使XXX|- 你的XXX|- 不要看\n" +
"- 玩一下XXX|- 给我变|- 揍|- 吞|- 膜拜|- 诶嘿|- 2蹭|- 你犯法了\n" +
"- 砰|- 注意力涣散|- 蒙蔽|- 踩|- 好玩|- 2转|- 踢球|- 2舔|\n" +
"- 可莉吃|- 胡桃啃|- 怀|- 一直支持动图",
"- 可莉吃|- 胡桃啃|- 怀|- 一直(支持动图)\n" +
"例: 制图命令XXX[@用户|QQ号|图片]" +
"Tips: XXX可以为限制长度的任何文字\n" +
"对Bot使用为 @Bot制图命令[XXX]@Bot",
PrivateDataFolder: "gif",
}).ApplySingle(ctxext.DefaultSingle)
datapath = file.BOTPATH + "/" + en.DataFolder()

View File

@@ -20,8 +20,8 @@ import (
func init() { // 插件主体
control.Register("github", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "GitHub仓库搜索\n" +
"- >github [xxx]\n" +
Brief: "GitHub仓库搜索",
Help: "- >github [xxx]\n" +
"- >github -p [xxx]",
}).OnRegex(`^>github\s(-.{1,10}? )?(.*)$`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {

View File

@@ -32,8 +32,6 @@ import (
"github.com/FloatTech/zbputils/img/text"
)
const servicename = "guessmusic"
var (
filelist []listinfo
musictypelist = "mp3;MP3;wav;WAV;amr;AMR;3gp;3GP;3gpp;3GPP;acc;ACC"
@@ -42,26 +40,27 @@ var (
)
func init() { // 插件主体
engine := control.Register(servicename, &ctrl.Options[*zero.Ctx]{
engine := control.Register("guessmusic", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "猜歌插件该插件依赖ffmpeg\n" +
"由于不可抗因素无法获取网易云歌单内容,\n插件改为本地猜歌了但保留了下歌功能\n" +
Brief: "猜歌插件",
Help: "由于不可抗因素无法获取网易云歌单内容, 插件改为本地猜歌了, 但保留了下歌功能\n" +
"------bot主人指令------\n" +
"- 设置猜歌歌库路径 [绝对路径]\n" +
"-(指令仅歌词有效) 猜歌[开启/关闭][歌单/歌词]自动下载\n" +
"-(指令已失效) 添加歌单 [网易云歌单链接/ID] [歌单名称]\n" +
"- (指令仅歌词有效) 猜歌[开启/关闭][歌单/歌词]自动下载\n" +
"- (指令已失效) 添加歌单 [网易云歌单链接/ID] [歌单名称]\n" +
"- 下载歌曲 [歌曲名称/网易云歌曲ID] [歌单名称]\n" +
"- 删除歌单 [网易云歌单ID/歌单名称]\n" +
"注\n删除网易云歌单ID仅只是解除绑定\n删除歌单名称是将本地数据全部删除慎用\n" +
"注: 删除网易云歌单ID仅只是解除绑定\n删除歌单名称是将本地数据全部删除, 慎用\n" +
"------管 理 员 指 令------\n" +
"- 设置猜歌默认歌单 [歌单名称]\n" +
"------公 用 指 令------\n" +
"- 歌单列表\n" +
"- [个人/团队]猜歌\n" +
"注默认歌库为歌单列表第一个\n如果设置了默认歌单变为指定的歌单\n" +
"可在[个人/团队]猜歌指令后面添加[-歌单名称]进行指定歌单猜歌\n" +
"注: 默认歌库为歌单列表第一个, 如果设置了默认歌单变为指定的歌单\n" +
"可在\"[个人/团队]猜歌指令\"后面添加[-歌单名称]进行指定歌单猜歌\n" +
"猜歌内容必须以[-]开头才会识别\n" +
"本地歌曲命名规则为:\n歌名 - 歌手 - 其他(歌曲出处之类)",
"本地歌曲命名规则为:\n歌名 - 歌手 - 其他(歌曲出处之类)\n" +
"重要事项: 本插件依赖ffmpeg",
PrivateDataFolder: "guessmusic",
}).ApplySingle(single.New(
single.WithKeyFn(func(ctx *zero.Ctx) int64 { return ctx.Event.GroupID }),
@@ -73,7 +72,7 @@ func init() { // 插件主体
)
}),
))
serviceErr := "[" + servicename + "]"
serviceErr := "[guessmusic]"
// 用于存放歌曲三个片段的文件夹
cachePath := engine.DataFolder() + "cache/"
err := os.MkdirAll(cachePath, 0777)

View File

@@ -27,8 +27,8 @@ var (
func init() { // 插件主体
engine := control.Register("heisi", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "黑丝\n" +
"- 来点黑丝\n- 来点白丝\n- 来点jk\n- 来点巨乳\n- 来点足控\n- 来点网红",
Brief: "黑丝",
Help: "- 来点黑丝\n- 来点白丝\n- 来点jk\n- 来点巨乳\n- 来点足控\n- 来点网红",
PublicDataFolder: "Heisi",
})

View File

@@ -43,8 +43,8 @@ const (
func init() {
engine := control.Register("hs", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "炉石\n" +
"- 搜卡[xxxx]\n" +
Brief: "炉石搜卡",
Help: "- 搜卡[xxxx]\n" +
"- [卡组代码xxx]\n" +
"- 更多搜卡指令参数https://hs.fbigame.com/misc/searchhelp",
PrivateDataFolder: "hs",

View File

@@ -23,7 +23,7 @@ import (
const bed = "https://gitcode.net/u011570312/OguraHyakuninIsshu/-/raw/master/"
//nolint: asciicheck
// nolint: asciicheck
type line struct {
番号, 歌人, 上の句, 下の句, 上の句ひらがな, 下の句ひらがな string
}
@@ -56,8 +56,8 @@ var lines [100]*line
func init() {
engine := control.Register("hyaku", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "百人一首\n" +
"- 百人一首(随机发一首)\n" +
Brief: "百人一首",
Help: "- 百人一首(随机发一首)\n" +
"- 百人一首之n",
PrivateDataFolder: "hyaku",
})

View File

@@ -64,8 +64,8 @@ var hrefre = regexp.MustCompile(`<a href=".*">`)
func init() {
control.Register("imgfinder", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "关键字搜图\n" +
"- 来张 [xxx]",
Brief: "关键字搜图",
Help: "- 来张 [xxx]",
}).OnRegex(`^来张\s?(.*)$`, zero.AdminPermission).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
keyword := ctx.State["regex_matched"].([]string)[1]

View File

@@ -11,8 +11,8 @@ import (
func init() {
en := control.Register("inject", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "注入指令\n" +
"- run[CQ码]",
Brief: "注入指令",
Help: "- run[CQ码]",
})
// 运行 CQ 码
en.OnPrefix("run", zero.SuperUserPermission).SetBlock(true).

View File

@@ -25,7 +25,8 @@ const (
func init() {
engine := control.Register("jandan", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "煎蛋网无聊图\n- 来份[屌|弔|吊]图\n- 更新[屌|弔|吊]图\n",
Brief: "煎蛋网无聊图",
Help: "- 来份[屌|弔|吊]图\n- 更新[屌|弔|吊]图\n",
PublicDataFolder: "Jandan",
})

65
plugin/jiami/jiami.go Normal file
View File

@@ -0,0 +1,65 @@
// Package jiami 兽语加密与解密
package jiami
import (
"encoding/json"
"fmt"
"github.com/FloatTech/floatbox/web"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
const (
jiami1 = "http://ovooa.com/API/sho_u/?msg=%v" // 加密api地址
jiami2 = "http://ovooa.com/API/sho_u/?format=1&msg=%v" // 解密api地址
)
type nmd struct { // struct解析格式大概是
Data struct {
Message string
} `json:"data"`
}
func init() { // 主函数
en := control.Register("jiami", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "兽语加解密",
Help: "兽语加解密\n" +
"- 兽语加密xxx\n- 兽语解密xxx",
})
en.OnRegex(`^兽语加密\s*(.+)$`).SetBlock(true).Handle(func(ctx *zero.Ctx) {
str := ctx.State["regex_matched"].([]string)[1]
es, err := web.GetData(fmt.Sprintf(jiami1, str)) // 将网站返回结果赋值
if err != nil {
ctx.SendChain(message.Text("出现错误捏:", err))
return
}
var r nmd // r数组
err = json.Unmarshal(es, &r) // 填api返回结果struct地址
if err != nil {
ctx.SendChain(message.Text("出现错误捏:", err))
return
}
ctx.SendChain(message.Text(r.Data.Message)) // 输出提取后的结果
})
en.OnRegex(`^兽语解密\s*(.+)$`).SetBlock(true).Handle(func(ctx *zero.Ctx) {
str := ctx.State["regex_matched"].([]string)[1]
es, err := web.GetData(fmt.Sprintf(jiami2, str)) // 将网站返回结果赋值
if err != nil {
ctx.SendChain(message.Text("出现错误捏:", err))
return
}
var n nmd // r数组
err = json.Unmarshal(es, &n) // 填api返回结果struct地址
if err != nil {
ctx.SendChain(message.Text("出现错误捏:", err))
return
}
ctx.SendChain(message.Text(n.Data.Message)) // 输出提取后的结果
})
}

View File

@@ -32,12 +32,11 @@ type value struct {
func init() {
// 初始化engine
engine := control.Register(
"jikipedia",
&ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "小鸡词典\n -[查梗|小鸡词典][梗]",
},
engine := control.Register("jikipedia", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "小鸡词典",
Help: "- [查梗|小鸡词典][梗]",
},
)
engine.OnPrefixGroup([]string{"小鸡词典", "查梗"}).Limit(ctxext.LimitByGroup).SetBlock(true).Handle(
func(ctx *zero.Ctx) {

View File

@@ -17,8 +17,8 @@ import (
func init() { // 插件主体
engine := control.Register("jptingroom", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "日语听力学习材料\n" +
"- 随机日语听力\n" +
Brief: "日语听力学习材料",
Help: "- 随机日语听力\n" +
"- 随机日语歌曲\n" +
"- 日语听力 xxx\n" +
"- 日语歌曲 xxx\n",

View File

@@ -25,8 +25,8 @@ const (
func init() {
control.Register("juejuezi", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "绝绝子生成器\n" +
"- 喝奶茶绝绝子 | 绝绝子吃饭",
Brief: "绝绝子生成器",
Help: "例: 喝奶茶绝绝子\n绝绝子吃饭",
}).OnRegex("[\u4E00-\u9FA5]{0,10}绝绝子[\u4E00-\u9FA5]{0,10}").SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
toDealStr := []rune(strings.ReplaceAll(ctx.ExtractPlainText(), "绝绝子", ""))
switch len(toDealStr) {

View File

@@ -34,8 +34,8 @@ var (
func init() {
en := control.Register("lolicon", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "lolicon\n" +
"- 随机图片\n" +
Brief: "随机图片",
Help: "- 随机图片\n" +
"- 随机图片 萝莉|少女\n" +
"- 设置随机图片地址[http...]",
}).ApplySingle(ctxext.DefaultSingle)

View File

@@ -0,0 +1,91 @@
// Package magicprompt MagicPrompt-Stable-Diffusion吟唱提示
package magicprompt
import (
"context"
"encoding/json"
"fmt"
"strings"
"time"
hf "github.com/FloatTech/AnimeAPI/huggingface"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
"github.com/RomiChan/websocket"
"github.com/tidwall/gjson"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
const (
magicpromptRepo = "Gustavosta/MagicPrompt-Stable-Diffusion"
)
func init() { // 插件主体
engine := control.Register("magicprompt", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "MagicPrompt-Stable-Diffusion吟唱提示",
Help: "- 吟唱提示 xxx",
PrivateDataFolder: "magicprompt",
})
// 开启
engine.OnPrefixGroup([]string{`吟唱提示`, "吟唱补全"}).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
_ctx, _cancel := context.WithTimeout(context.Background(), hf.TimeoutMax*time.Second)
defer _cancel()
ctx.SendChain(message.Text("少女祈祷中..."))
magicpromptURL := fmt.Sprintf(hf.WssJoinPath, magicpromptRepo)
args := ctx.State["args"].(string)
c, _, err := websocket.DefaultDialer.Dial(magicpromptURL, nil)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
defer c.Close()
r := hf.PushRequest{
FnIndex: 0,
Data: []interface{}{args},
}
b, err := json.Marshal(r)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
err = c.WriteMessage(websocket.TextMessage, b)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
t := time.NewTicker(time.Second * 1)
defer t.Stop()
for {
select {
case <-t.C:
_, data, err := c.ReadMessage()
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
j := gjson.ParseBytes(data)
if j.Get("msg").String() == hf.WssCompleteStatus {
m := message.Message{}
for _, v := range strings.Split(j.Get("output.data.0").String(), "\n\n") {
m = append(m, ctxext.FakeSenderForwardNode(ctx, message.Text(v)))
}
if id := ctx.Send(m).ID(); id == 0 {
ctx.SendChain(message.Text("ERROR: 可能被风控或下载图片用时过长,请耐心等待"))
}
return
}
case <-_ctx.Done():
ctx.SendChain(message.Text("ERROR: 吟唱提示指令超时"))
return
}
}
})
}

View File

@@ -47,11 +47,15 @@ const (
"- 取消在\"cron\"的提醒\n" +
"- 列出所有提醒\n" +
"- 翻牌\n" +
"- 设置欢迎语XXX 可选添加 [{at}] [{nickname}] [{avatar}] [{uid}] [{gid}] [{groupname}] {at}可在发送时艾特被欢迎者 {nickname}是被欢迎者名字 {avatar}是被欢迎者头像 {uid}是被欢迎者QQ号 {gid}是当前群群号 {groupname} 是当前群群名\n" +
"- 设置欢迎语XXX 可选添加 [{at}] [{nickname}] [{avatar}] [{uid}] [{gid}] [{groupname}]\n" +
"- 测试欢迎语\n" +
"- 设置告别辞 参数同设置欢迎语\n" +
"- 测试告别辞\n" +
"- [开启 | 关闭]入群验证"
"- [开启 | 关闭]入群验证\n" +
"- 对信息回复:[设置 | 取消]精华\n" +
"- 取消精华 [信息ID]\n" +
"- /精华列表\n" +
"Tips: {at}可在发送时艾特被欢迎者 {nickname}是被欢迎者名字 {avatar}是被欢迎者头像 {uid}是被欢迎者QQ号 {gid}是当前群群号 {groupname} 是当前群群名"
)
var (
@@ -62,6 +66,7 @@ var (
func init() { // 插件主体
engine := control.Register("manager", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "群管插件",
Help: hint,
PrivateDataFolder: "manager",
})
@@ -577,6 +582,72 @@ func init() { // 插件主体
}
}
})
// 设精
engine.OnRegex(`^\[CQ:reply,id=(\d+)\].*(设置|取消)精华$`, zero.OnlyGroup, zero.AdminPermission).SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
essenceID, _ := strconv.ParseInt(ctx.State["regex_matched"].([]string)[1], 10, 64)
option := ctx.State["regex_matched"].([]string)[2]
var rsp zero.APIResponse
switch option {
case "设置":
rsp = ctx.SetGroupEssenceMessage(essenceID)
case "取消":
rsp = ctx.DeleteGroupEssenceMessage(essenceID)
}
if rsp.RetCode == 0 {
ctx.SendChain(message.Text(option, "成功"))
} else {
ctx.SendChain(message.Text(option, "失败, 信息: ", rsp.Msg, "解释: ", rsp.Wording))
}
})
engine.OnCommand("精华列表", zero.OnlyGroup, zero.AdminPermission).SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
list := ctx.GetGroupEssenceMessageList(ctx.Event.GroupID).Array()
msg := message.Message{ctxext.FakeSenderForwardNode(ctx, message.Text("本群精华列表:"))}
n := len(list)
if n > 30 {
ctx.SendChain(message.Text("精华内容太多,仅显示前30个"))
n = 30
}
for _, info := range list[:n] {
msg = append(msg, ctxext.FakeSenderForwardNode(ctx,
message.Text(fmt.Sprintf(
"信息ID: %d\n发送者昵称: %s\n发送者QQ 号: %d\n消息发送时间: %s\n操作者昵称: %s\n操作者QQ 号: %d\n精华设置时间: %s",
info.Get("message_id").Int(),
info.Get("sender_nick").String(),
info.Get("sender_id").Int(),
time.Unix(info.Get("sender_time").Int(), 0).Format("2006/01/02 15:04:05"),
info.Get("operator_nick").String(),
info.Get("operator_id").Int(),
time.Unix(info.Get("operator_time").Int(), 0).Format("2006/01/02 15:04:05"),
))),
)
msgData := ctx.GetMessage(message.NewMessageIDFromInteger(info.Get("message_id").Int())).Elements
if msgData != nil {
msg = append(msg,
message.CustomNode(info.Get("sender_nick").String(), info.Get("sender_id").Int(), msgData),
)
} else {
msg = append(msg,
message.CustomNode(info.Get("sender_nick").String(), info.Get("sender_id").Int(), "[error]信息久远,无法获取,如需查看原始内容请在“精华信息”中查看"),
)
}
}
if id := ctx.Send(msg).ID(); id == 0 {
ctx.SendChain(message.Text("ERROR: 可能被风控了"))
}
})
engine.OnPrefix("取消精华", zero.OnlyGroup, zero.AdminPermission).SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
essenceID, err := strconv.ParseInt(strings.TrimSpace(ctx.State["args"].(string)), 10, 64)
if err != nil {
ctx.SendChain(message.Text("ERROR: 请输入正确的设精ID"))
return
}
rsp := ctx.DeleteGroupEssenceMessage(essenceID)
if rsp.RetCode == 0 {
ctx.SendChain(message.Text("取消成功"))
} else {
ctx.SendChain(message.Text("取消失败, 信息: ", rsp.Msg, "解释: ", rsp.Wording))
}
})
}
// 传入 ctx 和 welcome格式string 返回cq格式string 使用方法:welcometocq(ctx,w.Msg)

View File

@@ -30,13 +30,15 @@ import (
func init() {
engine := control.Register("midicreate", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "midi音乐制作, 该插件需要安装timidity, linux安装脚本可参考https://gitcode.net/anto_july/midi/-/raw/master/timidity.sh, windows安装脚本可参考https://gitcode.net/anto_july/midi/-/raw/master/timidity.bat?inline=false, windows需要管理员模式运行\n" +
"- midi制作 CCGGAAGR FFEEDDCR GGFFEEDR GGFFEEDR CCGGAAGR FFEEDDCR\n" +
Brief: "midi音乐制作",
Help: "- midi制作 CCGGAAGR FFEEDDCR GGFFEEDR GGFFEEDR CCGGAAGR FFEEDDCR\n" +
"- 个人听音练习\n" +
"- 团队听音练习\n" +
"- *.mid (midi 转 txt)\n" +
"- midi制作*.txt (txt 转 midi)\n" +
"- 设置音色40 (0~127)",
"- 设置音色40 (0~127)\n" +
"重要事项: 该插件依赖timidity\n" +
"linux安装脚本可参考https://gitcode.net/anto_july/midi/-/raw/master/timidity.sh\nwindows安装脚本可参考https://gitcode.net/anto_july/midi/-/raw/master/timidity.bat?inline=false, windows需要管理员模式运行",
PrivateDataFolder: "midicreate",
})
cachePath := engine.DataFolder() + "cache/"

View File

@@ -28,8 +28,8 @@ var speakers = map[string]uint{
func init() {
en := control.Register("moegoe", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "moegoe\n" +
"- 让[宁宁|爱瑠|芳乃|茉子|丛雨|小春|七海]说(日语)\n" +
Brief: "日韩中 VITS 模型拟声",
Help: "- 让[宁宁|爱瑠|芳乃|茉子|丛雨|小春|七海]说(日语)\n" +
"- 让[Sua|Mimiru|Arin|Yeonhwa|Yuhwa|Seonbae]说(韩语)\n" +
"- 让[派蒙|凯亚|安柏|丽莎|琴|香菱|枫原万叶|迪卢克|温迪|可莉|早柚|托马|芭芭拉|优菈|云堇|钟离|魈|凝光|雷电将军|北斗|甘雨|七七|刻晴|神里绫华|雷泽|神里绫人|罗莎莉亚|阿贝多|八重神子|宵宫|荒泷一斗|九条裟罗|夜兰|珊瑚宫心海|五郎|达达利亚|莫娜|班尼特|申鹤|行秋|烟绯|久岐忍|辛焱|砂糖|胡桃|重云|菲谢尔|诺艾尔|迪奥娜|鹿野院平藏]说(中文)",
}).ApplySingle(ctxext.DefaultSingle)

View File

@@ -20,8 +20,8 @@ var (
func init() { // 插件主体
control.Register("moyu", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: true,
Help: "moyu\n" +
"- /启用 moyu\n" +
Brief: "摸鱼提醒",
Help: "- /启用 moyu\n" +
"- /禁用 moyu\n" +
"- 记录在\"0 10 * * *\"触发的指令\n" +
" - 摸鱼提醒",

View File

@@ -12,8 +12,8 @@ import (
func init() {
control.Register("moyucalendar", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: true,
Help: "摸鱼人日历\n" +
"- /启用 moyucalendar\n" +
Brief: "摸鱼人日历",
Help: "- /启用 moyucalendar\n" +
"- /禁用 moyucalendar\n" +
"- 记录在\"30 8 * * *\"触发的指令\n" +
" - 摸鱼人日历",

View File

@@ -24,8 +24,8 @@ import (
func init() {
control.Register("music", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "点歌\n" +
"- 点歌[xxx]\n" +
Brief: "点歌",
Help: "- 点歌[xxx]\n" +
"- 网易点歌[xxx]\n" +
"- 酷我点歌[xxx]\n" +
"- 酷狗点歌[xxx]",

View File

@@ -24,8 +24,8 @@ var (
func init() {
engine := control.Register("nativesetu", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "本地涩图\n" +
"- 本地[xxx]\n" +
Brief: "本地涩图",
Help: "- 本地[xxx]\n" +
"- 刷新本地[xxx]\n" +
"- 设置本地setu绝对路径[xxx]\n" +
"- 刷新所有本地setu\n" +

View File

@@ -24,7 +24,8 @@ import (
func init() {
engine := control.Register("nwife", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "nativewife\n- 抽wife[@xxx]\n- 添加wife[名字][图片]\n- 删除wife[名字]\n- [让 | 不让]所有人均可添加wife",
Brief: "本地老婆",
Help: "- 抽wife[@xxx]\n- 添加wife[名字][图片]\n- 删除wife[名字]\n- [让 | 不让]所有人均可添加wife",
PrivateDataFolder: "nwife",
})
base := engine.DataFolder()

View File

@@ -17,7 +17,8 @@ import (
func init() {
control.Register("nbnhhsh", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "拼音首字母释义工具\n- ?? [缩写]",
Brief: "拼音首字母释义工具",
Help: "- ?? [缩写]",
}).OnRegex(`^[?]{1,2} ?([a-z0-9]+)$`).SetBlock(false).
Handle(func(ctx *zero.Ctx) {
keyword := ctx.State["regex_matched"].([]string)[1]

View File

@@ -17,7 +17,8 @@ import (
func init() {
engine := control.Register("nihongo", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "日语学习\n- 日语语法[xxx](使用tag随机)\n" +
Brief: "日语学习",
Help: "- 日语语法[xxx](使用tag随机)\n" +
"搜索日语语法[xxx]",
PublicDataFolder: "Nihongo",
})

View File

@@ -40,7 +40,8 @@ var gCurCookieJar *cookiejar.Jar
func init() {
control.Register("novel", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "铅笔小说网搜索\n- 小说[xxx]",
Brief: "铅笔小说网搜索",
Help: "- 小说[xxx]",
}).OnRegex("^小说([\u4E00-\u9FA5A-Za-z0-9]{1,25})$").SetBlock(true).Limit(ctxext.LimitByUser).
Handle(func(ctx *zero.Ctx) {
ctx.SendChain(message.Text("少女祈祷中......"))

View File

@@ -16,7 +16,8 @@ const hso = "https://gchat.qpic.cn/gchatpic_new//--4234EDEC5F147A4C319A41149D7E0
func init() {
engine := control.Register("nsfw", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "nsfw图片识别\n- nsfw打分[图片]",
Brief: "nsfw图片识别",
Help: "- nsfw打分[图片]",
}).ApplySingle(ctxext.DefaultSingle)
// 上传一张图进行评价
engine.OnKeywordGroup([]string{"nsfw打分"}, zero.OnlyGroup, zero.MustProvidePicture).SetBlock(true).
@@ -34,7 +35,8 @@ func init() {
})
control.Register("nsfwauto", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: true,
Help: "nsfw图片自动识别\n- 当图片属于非 neutral 类别时自动发送评价",
Brief: "nsfw图片自动识别",
Help: "- 当图片属于非 neutral 类别时自动发送评价",
}).OnMessage(zero.HasPicture).SetBlock(false).
Handle(func(ctx *zero.Ctx) {
url := ctx.State["image_url"].([]string)

View File

@@ -22,8 +22,8 @@ const bed = "https://gitcode.net/u011570312/senso-ji-omikuji/-/raw/main/"
func init() { // 插件主体
engine := control.Register("omikuji", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "浅草寺求签\n" +
"- 求签 | 占卜\n- 解签",
Brief: "浅草寺求签",
Help: "- 求签 | 占卜\n- 解签",
PublicDataFolder: "Omikuji",
}).ApplySingle(ctxext.DefaultSingle)

View File

@@ -24,6 +24,9 @@ import (
"github.com/FloatTech/floatbox/file"
"github.com/FloatTech/floatbox/img/writer"
"github.com/FloatTech/zbputils/img/text"
// 货币系统
"github.com/FloatTech/AnimeAPI/wallet"
)
// nolint: asciicheck
@@ -58,17 +61,19 @@ var (
func init() {
engine := control.Register("qqwife", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
PrivateDataFolder: "qqwife",
Help: "一群一天一夫一妻制群老婆\n每天凌晨刷新CP\n" +
"- 娶群友\n- 群老婆列表\n- [允许|禁止]自由恋爱\n- [允许|禁止]牛头人\n- 设置CD为xx小时 →(默认12小时)\n- 重置花名册\n- 重置所有花名册(用于清除所有群数据及其设置)\n" +
DisableOnDefault: false,
Brief: "一群一天一夫一妻制群老婆",
Help: "- 娶群友\n- 群老婆列表\n- [允许|禁止]自由恋爱\n- [允许|禁止]牛头人\n- 设置CD为xx小时 →(默认12小时)\n- 重置花名册\n- 重置所有花名册(用于清除所有群数据及其设置)\n" +
"--------------------------------\n以下指令存在CD,不跨天刷新,前两个受指令开关\n--------------------------------\n" +
"- (娶|嫁)@对方QQ\n自由选择对象自由恋爱(好感度越高成功率越高,保底30%概率)\n" +
"- 当[对方Q号|@对方QQ]的小三\n我和你才是真爱为了你我愿意付出一切(好感度越高成功率越高,保底10%概率)\n" +
"- 闹离婚\n你谁啊给我滚(好感度越高成功率越低)\n" +
"- 做媒 @攻方QQ @受方QQ\n身为管理群友的xing福是要搭把手的(攻受双方好感度越高成功率越高,保底30%概率)\n" +
"- (娶|嫁)@对方QQ\n自由选择对象, 自由恋爱(好感度越高成功率越高,保底30%概率)\n" +
"- 当[对方Q号|@对方QQ]的小三\n我和你才是真爱, 为了你我愿意付出一切(好感度越高成功率越高,保底10%概率)\n" +
"- 闹离婚\n你谁啊, 给我滚(好感度越高成功率越低)\n" +
"- 买礼物给[对方Q号|@对方QQ]\n使用小熊饼干获取好感度\n" +
"- 做媒 @攻方QQ @受方QQ\n身为管理, 群友的xing福是要搭把手的(攻受双方好感度越高成功率越高,保底30%概率)\n" +
"--------------------------------\n好感度规则\n--------------------------------\n" +
"娶群友指令好感度随机增加1~5。\nA牛B的C会导致C恨A好感度-5;\nB为了报复A好感度+5(什么柜子play)\nA为BC做媒,成功B、C对A好感度+1反之-1\n做媒成功BC好感度+1",
"\"娶群友\"指令好感度随机增加1~5。\n\"A牛B的C\"会导致C恨A, 好感度-5;\nB为了报复A, 好感度+5(什么柜子play)\nA为BC做媒,成功B、C对A好感度+1反之-1\n做媒成功BC好感度+1" +
"Tips: 群老婆列表过0点刷新",
PrivateDataFolder: "qqwife",
}).ApplySingle(single.New(
single.WithKeyFn(func(ctx *zero.Ctx) int64 { return ctx.Event.GroupID }),
single.WithPostFn[int64](func(ctx *zero.Ctx) {
@@ -458,6 +463,75 @@ func init() {
),
)
})
// 礼物系统
engine.OnRegex(`^买礼物给\s?(\[CQ:at,qq=(\d+)\]|(\d+))`, getdb).SetBlock(true).Limit(ctxext.LimitByUser).
Handle(func(ctx *zero.Ctx) {
gid := ctx.Event.GroupID
uid := ctx.Event.UserID
fiancee := ctx.State["regex_matched"].([]string)
gay, _ := strconv.ParseInt(fiancee[2]+fiancee[3], 10, 64)
// 获取CD
cdTime, err := 民政局.getCDtime(gid)
if err != nil {
ctx.SendChain(message.Text("[qqwife]获取该群技能CD错误(将以CD12H计算)\n", err))
}
ok, err := 民政局.compareCDtime(gid, uid, 5, cdTime)
if err != nil {
ctx.SendChain(message.Text("[qqwife]查询用户CD状态失败,请重试\n", err))
return
}
if !ok {
ctx.SendChain(message.Text("舔狗,今天你已经送过礼物了。"))
return
}
// 获取好感度
favor, err := 民政局.getFavorability(uid, gay)
if err != nil {
ctx.SendChain(message.Text("[qqwife]好感度库发生问题力\n", err))
return
}
// 对接小熊饼干
walletinfo := wallet.GetWalletOf(uid)
if walletinfo < 1 {
ctx.SendChain(message.Text("你钱包没钱啦!"))
return
}
moneyToFavor := rand.Intn(math.Min(walletinfo, 100)) + 1
// 计算钱对应的好感值
newFavor := 1
if favor > 50 {
newFavor += moneyToFavor % 10 // 礼物厌倦
} else {
newFavor += rand.Intn(moneyToFavor)
}
// 随机对方心情
mood := rand.Intn(5)
if mood == 0 {
newFavor = -newFavor
}
// 记录结果
err = wallet.InsertWalletOf(uid, -moneyToFavor)
if err != nil {
ctx.SendChain(message.Text("[qqwife]钱包坏掉力:\n", err))
return
}
lastfavor, err := 民政局.setFavorability(uid, gay, newFavor)
if err != nil {
ctx.SendChain(message.Text("[qqwife]好感度数据库发生问题力\n", err))
return
}
// 写入CD
err = 民政局.writeCDtime(gid, uid, 5)
if err != nil {
ctx.SendChain(message.At(uid), message.Text("[qqwife]你的技能CD记录失败\n", err))
}
// 输出结果
if mood == 0 {
ctx.SendChain(message.Text("你花了", moneyToFavor, "ATRI币买了一件女装送给了ta,ta很不喜欢,你们的好感度降低至", lastfavor))
} else {
ctx.SendChain(message.Text("你花了", moneyToFavor, "ATRI币买了一件女装送给了ta,ta很喜欢,你们的好感度升至", lastfavor))
}
})
engine.OnFullMatchGroup([]string{"闹离婚", "办离婚"}, zero.OnlyGroup, getdb, checkdivorce).Limit(ctxext.LimitByUser).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
gid := ctx.Event.GroupID

View File

@@ -17,8 +17,8 @@ import (
// nolint: asciicheck
// nolint: asciicheck
type 婚姻登记 struct {
db *sql.Sqlite
dbmu sync.RWMutex
db *sql.Sqlite
sync.RWMutex
}
// 结婚证信息
@@ -55,8 +55,8 @@ type cdsheet struct {
}
func (sql *婚姻登记) 开门时间(gid int64) (ok bool, err error) {
sql.dbmu.Lock()
defer sql.dbmu.Unlock()
sql.Lock()
defer sql.Unlock()
ok = false
err = sql.db.Create("updateinfo", &updateinfo{})
if err != nil {
@@ -99,8 +99,8 @@ func (sql *婚姻登记) 开门时间(gid int64) (ok bool, err error) {
}
func (sql *婚姻登记) 营业模式(gid int64) (canMatch, canNtr int, err error) {
sql.dbmu.Lock()
defer sql.dbmu.Unlock()
sql.Lock()
defer sql.Unlock()
err = sql.db.Create("updateinfo", &updateinfo{})
if err != nil {
if err = sql.db.Drop("updateinfo"); err == nil {
@@ -130,8 +130,8 @@ func (sql *婚姻登记) 营业模式(gid int64) (canMatch, canNtr int, err erro
}
func (sql *婚姻登记) 修改模式(gid int64, mode string, stauts int) (err error) {
sql.dbmu.Lock()
defer sql.dbmu.Unlock()
sql.Lock()
defer sql.Unlock()
err = sql.db.Create("updateinfo", &updateinfo{})
if err != nil {
if err = sql.db.Drop("updateinfo"); err == nil {
@@ -169,8 +169,8 @@ func (sql *婚姻登记) 修改模式(gid int64, mode string, stauts int) (err e
}
func (sql *婚姻登记) 清理花名册(gid string) error {
sql.dbmu.Lock()
defer sql.dbmu.Unlock()
sql.Lock()
defer sql.Unlock()
grouplist, err := sql.db.ListTables()
if err != nil {
return err
@@ -209,8 +209,8 @@ func (sql *婚姻登记) 清理花名册(gid string) error {
}
func (sql *婚姻登记) 查户口(gid, uid int64) (info userinfo, status string, err error) {
sql.dbmu.Lock()
defer sql.dbmu.Unlock()
sql.Lock()
defer sql.Unlock()
gidstr := "group" + strconv.FormatInt(gid, 10)
uidstr := strconv.FormatInt(uid, 10)
status = "单"
@@ -232,8 +232,8 @@ func (sql *婚姻登记) 查户口(gid, uid int64) (info userinfo, status string
}
func (sql *婚姻登记) 登记(gid, uid, target int64, username, targetname string) error {
sql.dbmu.Lock()
defer sql.dbmu.Unlock()
sql.Lock()
defer sql.Unlock()
gidstr := "group" + strconv.FormatInt(gid, 10)
err := sql.db.Create(gidstr, &userinfo{})
if err != nil {
@@ -254,24 +254,24 @@ func (sql *婚姻登记) 登记(gid, uid, target int64, username, targetname str
}
func (sql *婚姻登记) 离婚休妻(gid, wife int64) error {
sql.dbmu.Lock()
defer sql.dbmu.Unlock()
sql.Lock()
defer sql.Unlock()
gidstr := "group" + strconv.FormatInt(gid, 10)
wifestr := strconv.FormatInt(wife, 10)
return sql.db.Del(gidstr, "where target = "+wifestr)
}
func (sql *婚姻登记) 离婚休夫(gid, husband int64) error {
sql.dbmu.Lock()
defer sql.dbmu.Unlock()
sql.Lock()
defer sql.Unlock()
gidstr := "group" + strconv.FormatInt(gid, 10)
husbandstr := strconv.FormatInt(husband, 10)
return sql.db.Del(gidstr, "where user = "+husbandstr)
}
func (sql *婚姻登记) 花名册(gid int64) (list [][4]string, number int, err error) {
sql.dbmu.Lock()
defer sql.dbmu.Unlock()
sql.Lock()
defer sql.Unlock()
gidstr := "group" + strconv.FormatInt(gid, 10)
err = sql.db.Create(gidstr, &userinfo{})
if err != nil {
@@ -322,8 +322,8 @@ func slicename(name string, canvas *gg.Context) (resultname string) {
// 获取好感度
func (sql *婚姻登记) getFavorability(uid, target int64) (favor int, err error) {
sql.dbmu.Lock()
defer sql.dbmu.Unlock()
sql.Lock()
defer sql.Unlock()
err = sql.db.Create("favorability", &favorability{})
if err != nil {
return
@@ -345,8 +345,8 @@ func (sql *婚姻登记) getFavorability(uid, target int64) (favor int, err erro
// 设置好感度 正增负减
func (sql *婚姻登记) setFavorability(uid, target int64, score int) (favor int, err error) {
sql.dbmu.Lock()
defer sql.dbmu.Unlock()
sql.Lock()
defer sql.Unlock()
err = sql.db.Create("favorability", &favorability{})
if err != nil {
return
@@ -360,7 +360,10 @@ func (sql *婚姻登记) setFavorability(uid, target int64, score int) (favor in
Userinfo: uidstr + "+" + targstr + "+" + uidstr,
Favor: score,
})
return score, err
if err == nil {
err = sql.db.Find("favorability", &info, "where Userinfo glob '*"+uidstr+"+"+targstr+"*'")
}
return info.Favor, err
}
info.Favor += score
if info.Favor > 100 {
@@ -374,8 +377,8 @@ func (sql *婚姻登记) setFavorability(uid, target int64, score int) (favor in
// 获取技能时长
func (sql *婚姻登记) getCDtime(gid int64) (skillCD float64, err error) {
sql.dbmu.Lock()
defer sql.dbmu.Unlock()
sql.Lock()
defer sql.Unlock()
skillCD = 12
err = sql.db.Create("updateinfo", &updateinfo{})
if err != nil {
@@ -404,8 +407,8 @@ func (sql *婚姻登记) getCDtime(gid int64) (skillCD float64, err error) {
// 设置技能时长
func (sql *婚姻登记) setCDtime(gid int64, cdTime float64) (err error) {
sql.dbmu.Lock()
defer sql.dbmu.Unlock()
sql.Lock()
defer sql.Unlock()
err = sql.db.Create("updateinfo", &updateinfo{})
if err != nil {
if err = sql.db.Drop("updateinfo"); err == nil {
@@ -435,8 +438,8 @@ func (sql *婚姻登记) setCDtime(gid int64, cdTime float64) (err error) {
// 记录CD
func (sql *婚姻登记) writeCDtime(gid, uid, mun int64) error {
sql.dbmu.Lock()
defer sql.dbmu.Unlock()
sql.Lock()
defer sql.Unlock()
err := sql.db.Create("cdsheet", &cdsheet{})
if err != nil {
if err = sql.db.Drop("cdsheet"); err == nil {
@@ -457,8 +460,8 @@ func (sql *婚姻登记) writeCDtime(gid, uid, mun int64) error {
// 判断CD是否过时
func (sql *婚姻登记) compareCDtime(gid, uid, mun int64, cdtime float64) (ok bool, err error) {
sql.dbmu.Lock()
defer sql.dbmu.Unlock()
sql.Lock()
defer sql.Unlock()
ok = false
err = sql.db.Create("cdsheet", &cdsheet{})
if err != nil {

View File

@@ -0,0 +1,105 @@
// Package realcugan Real-CUGAN清晰术
package realcugan
import (
"bytes"
"encoding/base64"
"encoding/json"
"fmt"
"image"
"strings"
hf "github.com/FloatTech/AnimeAPI/huggingface"
"github.com/FloatTech/floatbox/web"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/ctxext"
"github.com/tidwall/gjson"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
const (
realcuganRepo = "shichen1231/Real-CUGAN"
)
func init() { // 插件主体
engine := control.Register("realcugan", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "Real-CUGAN清晰术",
Help: "- 清晰术(双重吟唱|三重吟唱|四重吟唱)(强力术式|中等术式|弱术式|不变式|原式)[图片]",
PrivateDataFolder: "realcugan",
})
engine.OnPrefix("清晰术", zero.MustProvidePicture).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
ctx.SendChain(message.Text("少女祈祷中..."))
realcuganURL := fmt.Sprintf(hf.HTTPSPredictPath, realcuganRepo)
for _, url := range ctx.State["image_url"].([]string) {
imgdata, err := web.GetData(url)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
img, _, err := image.Decode(bytes.NewReader(imgdata))
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
// 初始化参数
var (
fashu = ctx.Event.Message.ExtractPlainText()
scale = 2
con = "conservative"
)
switch {
case strings.Contains(fashu, "双重吟唱"):
scale = 2
case strings.Contains(fashu, "三重吟唱") && img.Bounds().Dx()*img.Bounds().Dy() < 400000:
scale = 3
case strings.Contains(fashu, "四重吟唱") && img.Bounds().Dx()*img.Bounds().Dy() < 400000:
scale = 4
}
switch {
case strings.Contains(fashu, "强力术式"):
con = "denoise3x"
case strings.Contains(fashu, "中等术式"):
con = "no-denoise"
if scale == 2 {
con = "denoise2x"
}
case strings.Contains(fashu, "弱术式"):
con = "no-denoise"
if scale == 2 {
con = "denoise1x"
}
case strings.Contains(fashu, "不变式"):
con = "no-denoise"
case strings.Contains(fashu, "原式"):
con = "conservative"
}
modelname := fmt.Sprintf("up%vx-latest-%v.pth", scale, con)
encodeStr := base64.StdEncoding.EncodeToString(imgdata)
encodeStr = "data:image/jpeg;base64," + encodeStr
pr := hf.PushRequest{
Data: []interface{}{encodeStr, modelname, 2},
}
buf := bytes.NewBuffer([]byte{})
err = json.NewEncoder(buf).Encode(pr)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
data, err := web.PostData(realcuganURL, "application/json", buf)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
imgStr := gjson.ParseBytes(data).Get("data.0").String()
m := message.Message{ctxext.FakeSenderForwardNode(ctx, message.Text(scale, "重唱", con, "分支大清晰术!")),
ctxext.FakeSenderForwardNode(ctx, message.Image("base64://"+strings.TrimPrefix(imgStr, "data:image/png;base64,")))}
if id := ctx.Send(m).ID(); id == 0 {
ctx.SendChain(message.Text("ERROR: 可能被风控或下载图片用时过长,请耐心等待"))
}
}
})
}

View File

@@ -17,7 +17,8 @@ import (
func init() {
en := control.Register("reborn", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "投胎\n- reborn",
Brief: "投胎模拟器",
Help: "- reborn",
PublicDataFolder: "Reborn",
})

View File

@@ -17,8 +17,8 @@ var ro = runoob.NewRunOOB("b6365362a90ac2ac7098ba52c13e352b")
func init() {
control.Register("runcode", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "在线代码运行: \n" +
">runcode [language] [code block]\n" +
Brief: "在线代码运行",
Help: ">runcode [language] [code block]\n" +
"模板查看: \n" +
">runcode [language] help\n" +
"支持语种: \n" +

View File

@@ -31,8 +31,8 @@ var (
func init() { // 插件主体
engine := control.Register("saucenao", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "搜图\n" +
"- 以图搜图 | 搜索图片 | 以图识图[图片]\n" +
Brief: "以图搜图",
Help: "- 以图搜图 | 搜索图片 | 以图识图[图片]\n" +
"- 搜图[P站图片ID]",
PrivateDataFolder: "saucenao",
})

View File

@@ -34,7 +34,8 @@ import (
func init() {
engine := control.Register("scale", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "叔叔的AI二次元图片放大\n- 放大图片[图片]",
Brief: "二次元图片放大",
Help: "- 放大图片[图片]",
PrivateDataFolder: "scale",
}).ApplySingle(ctxext.DefaultSingle)
cachedir := engine.DataFolder()

View File

@@ -107,7 +107,7 @@ func (sdb *scoredb) InsertOrUpdateSignInCountByUID(uid int64, count int) (err er
if err = db.Model(&signintable{}).First(&si, "uid = ? ", uid).Error; err != nil {
// error handling...
if gorm.IsRecordNotFoundError(err) {
db.Model(&signintable{}).Create(&si) // newUser not user
err = db.Model(&signintable{}).Create(&si).Error // newUser not user
}
} else {
err = db.Model(&signintable{}).Where("uid = ? ", uid).Update(

View File

@@ -3,17 +3,13 @@ package score
import (
"fmt"
"math"
"math/rand"
"os"
"strconv"
"time"
"github.com/Coloured-glaze/gg"
"github.com/golang/freetype"
log "github.com/sirupsen/logrus"
"github.com/wcharczuk/go-chart/v2"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
"github.com/FloatTech/floatbox/file"
"github.com/FloatTech/floatbox/img/writer"
ctrl "github.com/FloatTech/zbpctrl"
@@ -21,20 +17,29 @@ import (
"github.com/FloatTech/zbputils/ctxext"
"github.com/FloatTech/zbputils/img"
"github.com/FloatTech/zbputils/img/text"
"github.com/golang/freetype"
log "github.com/sirupsen/logrus"
"github.com/wcharczuk/go-chart/v2"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
// 货币系统
"github.com/FloatTech/AnimeAPI/wallet"
)
const (
backgroundURL = "https://img.moehu.org/pic.php?id=pc"
signinMax = 1
// SCOREMAX 分数上限定为120
SCOREMAX = 120
// SCOREMAX 分数上限定为1200
SCOREMAX = 1200
)
var (
levelArray = [...]int{0, 1, 2, 5, 10, 20, 35, 55, 75, 100, 120}
engine = control.Register("score", &ctrl.Options[*zero.Ctx]{
rankArray = [...]int{0, 10, 20, 50, 100, 200, 350, 550, 750, 1000, 1200}
engine = control.Register("score", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "签到得分\n- 签到\n- 获得签到背景[@xxx] | 获得签到背景\n- 查看分数排名",
Brief: "签到",
Help: "- 签到\n- 获得签到背景[@xxx] | 获得签到背景\n- 查看等级排名\n注:为跨群排名\n- 查看我的钱包\n- 查看钱包排名\n注:为本群排行,若群人数太多不建议使用该功能!!!",
PrivateDataFolder: "score",
})
)
@@ -49,25 +54,66 @@ func init() {
}
sdb = initialize(engine.DataFolder() + "score.db")
}()
zero.OnFullMatch("查看我的钱包").SetBlock(true).Handle(func(ctx *zero.Ctx) {
uid := ctx.Event.UserID
money := wallet.GetWalletOf(uid)
ctx.SendChain(message.At(uid), message.Text("你的钱包当前有", money, "ATRI币"))
})
engine.OnFullMatch("签到").Limit(ctxext.LimitByUser).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
uid := ctx.Event.UserID
now := time.Now()
today := now.Format("20060102")
// 签到图片
drawedFile := cachePath + strconv.FormatInt(uid, 10) + today + "signin.png"
picFile := cachePath + strconv.FormatInt(uid, 10) + today + ".png"
// 获取签到时间
si := sdb.GetSignInByUID(uid)
siUpdateTimeStr := si.UpdatedAt.Format("20060102")
drawedFile := cachePath + strconv.FormatInt(uid, 10) + today + "signin.png"
picFile := cachePath + strconv.FormatInt(uid, 10) + today + ".png"
if si.Count >= signinMax && siUpdateTimeStr == today {
switch {
case si.Count >= signinMax && siUpdateTimeStr == today:
// 如果签到时间是今天
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("今天你已经签到过了!"))
if file.IsExist(drawedFile) {
ctx.SendChain(message.Image("file:///" + file.BOTPATH + "/" + drawedFile))
}
return
case siUpdateTimeStr != today:
// 如果是跨天签到就清数据
err := sdb.InsertOrUpdateSignInCountByUID(uid, 0)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
}
err := initPic(picFile)
// 更新签到次数
err := sdb.InsertOrUpdateSignInCountByUID(uid, si.Count+1)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
// 更新经验
level := sdb.GetScoreByUID(uid).Score + 1
if level > SCOREMAX {
level = SCOREMAX
ctx.SendChain(message.At(uid), message.Text("你的等级已经达到上限"))
}
err = sdb.InsertOrUpdateScoreByUID(uid, level)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
// 更新钱包
rank := getrank(level)
add := 1 + rand.Intn(10) + rank*5 // 等级越高获得的钱越高
err = wallet.InsertWalletOf(uid, add)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
score := wallet.GetWalletOf(uid)
// 绘图
err = initPic(picFile)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
@@ -77,20 +123,12 @@ func init() {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
if siUpdateTimeStr != today {
_ = sdb.InsertOrUpdateSignInCountByUID(uid, 0)
}
_ = sdb.InsertOrUpdateSignInCountByUID(uid, si.Count+1)
// 避免图片过大,最大 1280*720
back = img.Limit(back, 1280, 720)
canvas := gg.NewContext(back.Bounds().Size().X, int(float64(back.Bounds().Size().Y)*1.7))
canvas.SetRGB(1, 1, 1)
canvas.Clear()
canvas.DrawImage(back, 0, 0)
monthWord := now.Format("01/02")
hourWord := getHourWord(now)
_, err = file.GetLazyData(text.BoldFontFile, true)
@@ -115,32 +153,23 @@ func init() {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
add := 1
canvas.DrawString(nickName+fmt.Sprintf(" 小熊饼干+%d", add), float64(back.Bounds().Size().X)*0.1, float64(back.Bounds().Size().Y)*1.3)
score := sdb.GetScoreByUID(uid).Score
score += add
if score > SCOREMAX {
score = SCOREMAX
ctx.SendChain(message.At(uid), message.Text("你获得的小熊饼干已经达到上限"))
}
_ = sdb.InsertOrUpdateScoreByUID(uid, score)
level := getLevel(score)
canvas.DrawString("当前小熊饼干:"+strconv.FormatInt(int64(score), 10), float64(back.Bounds().Size().X)*0.1, float64(back.Bounds().Size().Y)*1.4)
canvas.DrawString("LEVEL:"+strconv.FormatInt(int64(level), 10), float64(back.Bounds().Size().X)*0.1, float64(back.Bounds().Size().Y)*1.5)
canvas.DrawString(nickName+fmt.Sprintf(" ATRI币+%d", add), float64(back.Bounds().Size().X)*0.1, float64(back.Bounds().Size().Y)*1.3)
canvas.DrawString("当前ATRI币:"+strconv.FormatInt(int64(score), 10), float64(back.Bounds().Size().X)*0.1, float64(back.Bounds().Size().Y)*1.4)
canvas.DrawString("LEVEL:"+strconv.FormatInt(int64(rank), 10), float64(back.Bounds().Size().X)*0.1, float64(back.Bounds().Size().Y)*1.5)
canvas.DrawRectangle(float64(back.Bounds().Size().X)*0.1, float64(back.Bounds().Size().Y)*1.55, float64(back.Bounds().Size().X)*0.6, float64(back.Bounds().Size().Y)*0.1)
canvas.SetRGB255(150, 150, 150)
canvas.Fill()
var nextLevelScore int
if level < 10 {
nextLevelScore = levelArray[level+1]
var nextrankScore int
if rank < 10 {
nextrankScore = rankArray[rank+1]
} else {
nextLevelScore = SCOREMAX
nextrankScore = SCOREMAX
}
canvas.SetRGB255(0, 0, 0)
canvas.DrawRectangle(float64(back.Bounds().Size().X)*0.1, float64(back.Bounds().Size().Y)*1.55, float64(back.Bounds().Size().X)*0.6*float64(score)/float64(nextLevelScore), float64(back.Bounds().Size().Y)*0.1)
canvas.DrawRectangle(float64(back.Bounds().Size().X)*0.1, float64(back.Bounds().Size().Y)*1.55, float64(back.Bounds().Size().X)*0.6*float64(level)/float64(nextrankScore), float64(back.Bounds().Size().Y)*0.1)
canvas.SetRGB255(102, 102, 102)
canvas.Fill()
canvas.DrawString(fmt.Sprintf("%d/%d", score, nextLevelScore), float64(back.Bounds().Size().X)*0.75, float64(back.Bounds().Size().Y)*1.62)
canvas.DrawString(fmt.Sprintf("%d/%d", level, nextrankScore), float64(back.Bounds().Size().X)*0.75, float64(back.Bounds().Size().Y)*1.62)
f, err := os.Create(drawedFile)
if err != nil {
@@ -174,7 +203,7 @@ func init() {
}
ctx.SendChain(message.Image("file:///" + file.BOTPATH + "/" + picFile))
})
engine.OnFullMatch("查看分数排名", zero.OnlyGroup).Limit(ctxext.LimitByGroup).SetBlock(true).
engine.OnFullMatch("查看等级排名", zero.OnlyGroup).Limit(ctxext.LimitByGroup).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
today := time.Now().Format("20060102")
drawedFile := cachePath + today + "scoreRank.png"
@@ -211,19 +240,111 @@ func init() {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
bars := make([]chart.Value, len(st))
for i, v := range st {
bars[i].Value = float64(v.Score)
bars[i].Label = ctx.CardOrNickName(v.UID)
var bars []chart.Value
for _, v := range st {
if v.Score != 0 {
bars = append(bars, chart.Value{
Label: ctx.CardOrNickName(v.UID),
Value: float64(v.Score),
})
}
}
err = chart.BarChart{
Font: font,
Title: "饼干排名",
Title: "等级排名(1天只刷新1次)",
Background: chart.Style{
Padding: chart.Box{
Top: 40,
},
},
YAxis: chart.YAxis{
Range: &chart.ContinuousRange{
Min: 0,
Max: math.Ceil(bars[0].Value/10) * 10,
},
},
Height: 500,
BarWidth: 50,
Bars: bars,
}.Render(chart.PNG, f)
_ = f.Close()
if err != nil {
_ = os.Remove(drawedFile)
ctx.SendChain(message.Text("ERROR: ", err))
return
}
ctx.SendChain(message.Image("file:///" + file.BOTPATH + "/" + drawedFile))
})
engine.OnFullMatch("查看钱包排名", zero.OnlyGroup).Limit(ctxext.LimitByGroup).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
gid := strconv.FormatInt(ctx.Event.GroupID, 10)
today := time.Now().Format("20060102")
drawedFile := cachePath + gid + today + "walletRank.png"
if file.IsExist(drawedFile) {
ctx.SendChain(message.Image("file:///" + file.BOTPATH + "/" + drawedFile))
return
}
// 无缓存获取群员列表
temp := ctx.GetThisGroupMemberListNoCache().Array()
var usergroup []int64
for _, info := range temp {
usergroup = append(usergroup, info.Get("user_id").Int())
}
// 获取钱包信息
st, err := wallet.GetGroupWalletOf(usergroup, true)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
if len(st) == 0 {
ctx.SendChain(message.Text("ERROR: 当前没人获取过ATRI币"))
return
} else if len(st) > 10 {
st = st[:10]
}
_, err = file.GetLazyData(text.FontFile, true)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
b, err := os.ReadFile(text.FontFile)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
font, err := freetype.ParseFont(b)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
f, err := os.Create(drawedFile)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
var bars []chart.Value
for _, v := range st {
if v.Money != 0 {
bars = append(bars, chart.Value{
Label: ctx.CardOrNickName(v.UID),
Value: float64(v.Money),
})
}
}
err = chart.BarChart{
Font: font,
Title: "ATRI币排名(1天只刷新1次)",
Background: chart.Style{
Padding: chart.Box{
Top: 40,
},
},
YAxis: chart.YAxis{
Range: &chart.ContinuousRange{
Min: 0,
Max: math.Ceil(bars[0].Value/10) * 10,
},
},
Height: 500,
BarWidth: 50,
Bars: bars,
@@ -256,8 +377,8 @@ func getHourWord(t time.Time) string {
}
}
func getLevel(count int) int {
for k, v := range levelArray {
func getrank(count int) int {
for k, v := range rankArray {
if count == v {
return k
} else if count < v {

View File

@@ -53,8 +53,8 @@ var pool = &imgpool{
func init() { // 插件主体
engine := control.Register("setutime", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "涩图\n" +
"- 来份[涩图/二次元/风景/车万]\n" +
Brief: "涩图",
Help: "- 来份[涩图/二次元/风景/车万]\n" +
"- 添加[涩图/二次元/风景/车万][P站图片ID]\n" +
"- 删除[涩图/二次元/风景/车万][P站图片ID]\n" +
"- >setu status",

View File

@@ -29,8 +29,8 @@ const (
var (
engine = control.Register("shadiao", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "沙雕app\n" +
"- 哄我\n- 渣我\n- 来碗绿茶\n- 发个朋友圈\n- 来碗毒鸡汤\n- 讲个段子\n- 马丁路德骂我\n",
Brief: "沙雕app", // 也许可以更好
Help: "- 哄我\n- 渣我\n- 来碗绿茶\n- 发个朋友圈\n- 来碗毒鸡汤\n- 讲个段子\n- 马丁路德骂我\n",
})
sdMap = map[string]string{"哄我": chpURL, "来碗毒鸡汤": duURL, "发个朋友圈": pyqURL}
)

View File

@@ -16,11 +16,12 @@ import (
func init() {
engine := control.Register("shindan", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "shindan\n" +
"- 今天是什么少女[@xxx]\n" +
Brief: "shindan测定",
Help: "- 今天是什么少女[@xxx]\n" +
"- 异世界转生[@xxx]\n" +
"- 卖萌[@xxx]\n" +
"- 抽老婆[@xxx]",
"- 抽老婆[@xxx]\n" +
"- 黄油角色[@xxx]",
})
engine.OnPrefix("异世界转生", number(587874)).SetBlock(true).Limit(ctxext.LimitByUser).Handle(handlepic)
engine.OnPrefix("今天是什么少女", number(162207)).SetBlock(true).Limit(ctxext.LimitByUser).Handle(handlepic)

View File

@@ -16,7 +16,8 @@ import (
func init() {
engine := control.Register("sleepmanage", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "sleepmanage\n- 早安\n- 晚安",
Brief: "睡眠小助手",
Help: "- 早安\n- 晚安",
PrivateDataFolder: "sleep",
})
go func() {

View File

@@ -53,8 +53,8 @@ var (
func init() {
engine := control.Register("tarot", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "塔罗牌\n" +
"- 抽[塔罗牌|大阿卡纳|小阿卡纳]\n" +
Brief: "塔罗牌",
Help: "- 抽[塔罗牌|大阿卡纳|小阿卡纳]\n" +
"- 抽n张[塔罗牌|大阿卡纳|小阿卡纳]\n" +
"- 解塔罗牌[牌名]\n" +
"- [塔罗|大阿卡纳|小阿卡纳|混合]牌阵[圣三角|时间之流|四要素|五牌阵|吉普赛十字|马蹄|六芒星]",

View File

@@ -17,7 +17,8 @@ type kimo = map[string]*[]string
func init() {
engine := control.Register("thesaurus", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "thesaurus\n- 词典匹配回复",
Brief: "词典匹配回复",
Help: "- 词典匹配回复",
PublicDataFolder: "Chat",
})
go func() {

View File

@@ -24,8 +24,8 @@ var db = &sql.Sqlite{}
func init() {
en := control.Register("tiangou", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "舔狗日记\n" +
"- 舔狗日记",
Brief: "舔狗日记",
Help: "- 舔狗日记",
PublicDataFolder: "Tiangou",
})

View File

@@ -16,10 +16,11 @@ var (
func init() { // 插件主体
engine := control.Register("tracemoe", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "tracemoe\n- 搜番 | 搜索番剧[图片]",
Brief: "以图搜番",
Help: "- 以图搜番 | 搜番 | 搜索番剧[图片]",
})
// 以图搜图
engine.OnKeywordGroup([]string{"搜番", "搜索番剧"}, zero.MustProvidePicture).SetBlock(true).
engine.OnKeywordGroup([]string{"以图搜番", "搜番", "搜索番剧"}, zero.MustProvidePicture).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
// 开始搜索图片
ctx.SendChain(message.Text("少女祈祷中......"))

View File

@@ -13,8 +13,8 @@ import (
func init() {
control.Register("translation", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "翻译\n" +
">TL 你好",
Brief: "单词翻译",
Help: ">TL [好|good]",
}).OnRegex(`^>TL\s(-.{1,10}? )?(.*)$`).SetBlock(true).Limit(ctxext.LimitByUser).
Handle(func(ctx *zero.Ctx) {
msg := []string{ctx.State["regex_matched"].([]string)[2]}

View File

@@ -0,0 +1,141 @@
// Package vitsnyaru vits猫雷
package vitsnyaru
import (
"context"
"encoding/json"
"fmt"
"strings"
"time"
hf "github.com/FloatTech/AnimeAPI/huggingface"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
"github.com/tidwall/gjson"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
)
const (
vitsnyaruRepo = "innnky/vits-nyaru"
)
func init() { // 插件主体
engine := control.Register("vitsnyaru", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "vits猫雷",
Help: "- 让猫雷说 xxx",
PrivateDataFolder: "vitsnyaru",
})
// 开启
engine.OnPrefix(`让猫雷说`).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
_ctx, _cancel := context.WithTimeout(context.Background(), hf.TimeoutMax*time.Second)
defer _cancel()
ch := make(chan []byte, 1)
args := ctx.State["args"].(string)
pushURL := fmt.Sprintf(hf.HTTPSPushPath, vitsnyaruRepo)
statusURL := fmt.Sprintf(hf.HTTPSStatusPath, vitsnyaruRepo)
ctx.SendChain(message.Text("少女祈祷中..."))
var (
pushReq hf.PushRequest
pushRes hf.PushResponse
statusReq hf.StatusRequest
statusRes hf.StatusResponse
data []byte
)
// 获取clean后的文本
pushReq = hf.PushRequest{
Action: hf.DefaultAction,
Data: []interface{}{args},
FnIndex: 1,
}
pushRes, err := hf.Push(pushURL, pushReq)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
statusReq = hf.StatusRequest{
Hash: pushRes.Hash,
}
t := time.NewTicker(time.Second * 1)
defer t.Stop()
LOOP:
for {
select {
case <-t.C:
data, err = hf.Status(statusURL, statusReq)
if err != nil {
ch <- data
break LOOP
}
if gjson.ParseBytes(data).Get("status").String() == hf.CompleteStatus {
ch <- data
break LOOP
}
case <-_ctx.Done():
ch <- data
break LOOP
}
}
data = <-ch
err = json.Unmarshal(data, &statusRes)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
// 用clean的文本预测语音
pushReq = hf.PushRequest{
Action: hf.DefaultAction,
Data: statusRes.Data.Data,
FnIndex: 2,
}
pushRes, err = hf.Push(pushURL, pushReq)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
statusReq = hf.StatusRequest{
Hash: pushRes.Hash,
}
LOOP2:
for {
select {
case <-t.C:
data, err = hf.Status(statusURL, statusReq)
if err != nil {
ch <- data
break LOOP2
}
if gjson.ParseBytes(data).Get("status").String() == hf.CompleteStatus {
ch <- data
break LOOP2
}
case <-_ctx.Done():
ch <- data
break LOOP2
}
}
data = <-ch
err = json.Unmarshal(data, &statusRes)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
}
// 发送语音
if len(statusRes.Data.Data) < 2 {
ctx.SendChain(message.Text("ERROR: 未能获取语音"))
return
}
ctx.SendChain(message.Record("base64://" + strings.TrimPrefix(statusRes.Data.Data[1].(string), "data:audio/wav;base64,")))
})
}

View File

@@ -33,7 +33,8 @@ var reg = regexp.MustCompile(".*/(.*)")
func init() {
engine := control.Register("vtbquotation", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "vtbkeyboard.moe\n- vtb语录\n- 随机vtb\n- 更新vtb\n",
Brief: "vtb语录",
Help: "- vtb语录\n- 随机vtb\n- 更新vtb\n来源: vtbkeyboard.moe",
PublicDataFolder: "VtbQuotation",
})
dbfile := engine.DataFolder() + "vtb.db"

View File

@@ -20,7 +20,8 @@ const (
func init() {
control.Register("wangyiyun", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "wangyiyun \n- 来份网易云热评",
Brief: "网易云热评",
Help: "- 来份网易云热评",
}).OnFullMatch("来份网易云热评").SetBlock(true).Limit(ctxext.LimitByUser).
Handle(func(ctx *zero.Ctx) {
data, err := web.RequestDataWith(web.NewDefaultClient(), wangyiyunURL, "GET", wangyiyunReferer, ua)

112
plugin/wenben/wenben.go Normal file
View File

@@ -0,0 +1,112 @@
// Package wenben 文本链接
package wenben
import (
"encoding/json"
"fmt"
"github.com/FloatTech/floatbox/web"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message"
"github.com/wdvxdr1123/ZeroBot/utils/helper"
"strings"
)
const (
tianqi = "https://xiaobai.klizi.cn/API/other/weather_1.php?data=&msg=%v" // api地址
pinyin = "http://ovooa.com/API/pinyin/api.php?type=text&msg=%v"
yiyan = "https://v1.hitokoto.cn/?c=a&c=b&c=c&c=d&c=h&c=i" // 动漫 漫画 游戏 文学 影视 诗词
kouling = "http://ovooa.com/API/rao/api.php?type=text" //口令
tang = "http://api.btstu.cn/yan/api.php?charset=utf-8&encode=text"
qing = "https://xiaobai.klizi.cn/API/other/wtqh.php"
)
type rspData struct {
Hitokoto string `json:"hitokoto"`
From string `json:"from"`
FromWho string `json:"from_who"`
}
func init() { // 主函数
en := control.Register("tianqi", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "天气/拼音查询",
Help: "文本命令大全\n" +
"- 天气查询xxx天气" +
"- 拼音查询xxx拼音" +
"- 每日一言" +
"- 每日鸡汤" +
"- 每日情话" +
"- 绕口令",
})
en.OnSuffix("天气").SetBlock(true).
Handle(func(ctx *zero.Ctx) {
str := ctx.State["args"].(string)
es, err := web.GetData(fmt.Sprintf(tianqi, str)) // 将网站返回结果赋值
if err != nil {
ctx.SendChain(message.Text("出现错误捏:", err))
return
}
ctx.SendChain(message.Text(str, "天气如下:\n", helper.BytesToString(es)))
})
en.OnSuffix("拼音").SetBlock(true).
Handle(func(ctx *zero.Ctx) {
str := ctx.State["args"].(string)
es, err := web.GetData(fmt.Sprintf(pinyin, str)) // 将网站返回结果赋值
if err != nil {
ctx.SendChain(message.Text("出现错误捏:", err))
return
}
ctx.SendChain(message.Text(str, "的拼音为:", helper.BytesToString(es)))
})
en.OnFullMatch("每日情话").SetBlock(true).
Handle(func(ctx *zero.Ctx) {
data, err := web.GetData(qing)
if err != nil {
ctx.SendChain(message.Text("获取失败惹", err))
return
}
ctx.SendChain(message.Text(helper.BytesToString(data)))
})
en.OnFullMatch("每日鸡汤").SetBlock(true).
Handle(func(ctx *zero.Ctx) {
data, err := web.GetData(tang)
if err != nil {
ctx.SendChain(message.Text("获取失败惹", err))
return
}
ctx.SendChain(message.Text(helper.BytesToString(data)))
})
en.OnFullMatch("绕口令").SetBlock(true).Handle(func(ctx *zero.Ctx) {
data, err := web.GetData(kouling)
if err != nil {
ctx.SendChain(message.Text("获取失败惹", err))
return
}
ctx.SendChain(message.Text(helper.BytesToString(data)))
})
en.OnFullMatch("每日一言").SetBlock(true).Handle(func(ctx *zero.Ctx) { //每日一言
var rsp rspData
data, err := web.GetData(yiyan)
if err != nil {
ctx.SendChain(message.Text("Err:", err))
return
}
err = json.Unmarshal(data, &rsp)
if err != nil {
ctx.SendChain(message.Text("出现错误捏:", err))
return
}
var msg strings.Builder
msg.WriteString(rsp.Hitokoto)
msg.WriteString("\n出自")
msg.WriteString(rsp.From)
msg.WriteByte('\n')
if len(rsp.FromWho) != 0 {
msg.WriteString("作者:")
msg.WriteString(rsp.FromWho)
}
ctx.SendChain(message.Text(msg.String()))
})
}

View File

@@ -26,10 +26,8 @@ import (
)
const (
serviceName = "wenxinvilg"
serviceErr = "[" + serviceName + "]ERROR:\n"
modelName = "wenxinmodel"
modelErr = "[" + modelName + "]ERROR:\n"
serviceErr = "[wenxinvilg]ERROR:\n"
modelErr = "[wenxinmodel]ERROR:\n"
)
type keydb struct {
@@ -69,10 +67,10 @@ func init() { // 插件主体
defer process.GlobalInitMutex.Unlock()
name = zero.BotConfig.NickName[0]
}()
engine := control.Register(serviceName, &ctrl.Options[*zero.Ctx]{
engine := control.Register("wenxinvilg", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "文心AI画图\n" +
"基于百度文心的免费AI画图插件,\n因为是免费的,图片质量你懂的。\n" +
Brief: "文心AI画图",
Help: "基于百度文心的免费AI画图插件,\n因为是免费的,图片质量你懂的。\n" +
"key申请链接:https://wenxin.baidu.com/moduleApi/key\n" +
"key和erniemodel插件的key相同。\n" +
"注意:每个apikey每日上限50次,总上限500次请求。次数超过了请自行更新apikey\n" +
@@ -261,10 +259,10 @@ func init() { // 插件主体
ctx.SendChain(message.Text("成功!"))
})
/*********************************************************/
en := control.Register(modelName, &ctrl.Options[*zero.Ctx]{
en := control.Register("wenxinmodel", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "文心AI文本处理\n" +
"基于百度文心AI的API文本处理\n" +
Brief: "文心AI文本处理",
Help: "基于百度文心AI的API文本处理\n" +
"key申请链接:https://wenxin.baidu.com/moduleApi/key\n" +
"key和ernievilg插件的key相同。\n" +
"注意:每个apikey每日上限200条,总上限2000条。次数超过了请自行更新apikey\n" +

View File

@@ -34,8 +34,8 @@ var (
func init() {
engine := control.Register("wordcount", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "聊天热词\n" +
"- 热词 [群号] [消息数目]|热词 123456 1000",
Brief: "聊天热词",
Help: "- 热词 [群号] [消息数目]|热词 123456 1000",
PublicDataFolder: "WordCount",
})
cachePath := engine.DataFolder() + "cache/"

View File

@@ -63,8 +63,8 @@ var words = make(dictionary)
func init() {
en := control.Register("wordle", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "猜单词\n" +
"- 个人猜单词\n" +
Brief: "猜单词",
Help: "- 个人猜单词\n" +
"- 团队猜单词\n" +
"- 团队六阶猜单词\n" +
"- 团队七阶猜单词",

View File

@@ -15,7 +15,8 @@ import (
func init() {
en := control.Register("wtf", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "鬼东西\n- 鬼东西列表\n- 查询鬼东西[序号][@xxx]",
Brief: "鬼东西",
Help: "- 鬼东西列表\n- 查询鬼东西[序号][@xxx]",
})
en.OnFullMatch("鬼东西列表").SetBlock(true).
Handle(func(ctx *zero.Ctx) {

View File

@@ -15,7 +15,8 @@ import (
func init() {
engine := control.Register("ymgal", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Help: "月galgame\n- 随机galCG\n- 随机gal表情包\n- galCG[xxx]\n- gal表情包[xxx]\n- 更新gal\n",
Brief: "月galgame相关",
Help: "- 随机galCG\n- 随机gal表情包\n- galCG[xxx]\n- gal表情包[xxx]\n- 更新gal",
PublicDataFolder: "Ymgal",
})
getdb := fcext.DoOnceOnSuccess(func(ctx *zero.Ctx) bool {