diff --git a/README.md b/README.md
index b6a5390ab6..9ee01c872d 100644
--- a/README.md
+++ b/README.md
@@ -242,6 +242,8 @@ zerobot [-h] [-m] [-n nickname] [-t token] [-u url] [-g url] [-p prefix] [-d|w]
- [x] 列出所有提醒
- [x] 翻牌
+
+ - [x] 赞我
- [x] [开启 | 关闭]入群验证
@@ -959,6 +961,24 @@ print("run[CQ:image,file="+j["img"]+"]")
来份萝莉
```
+
+
+ 桑帛云 API
+
+ `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/lolimi"`
+
+ - [x] 随机妹子
+
+ - [x] 随机绕口令
+
+ - [x] 颜值鉴定[图片]
+
+ - [x] 随机情话
+
+ - [x] 发病 嘉然
+
+ - [x] 让[嘉然|塔菲|东雪莲|懒羊羊|科比|孙笑川|陈泽|丁真|空|荧|派蒙|纳西妲|阿贝多|温迪|枫原万叶|钟离|荒泷一斗|八重神子|艾尔海森|提纳里|迪希雅|卡维|宵宫|莱依拉|赛诺|诺艾尔|托马|凝光|莫娜|北斗|神里绫华|雷电将军|芭芭拉|鹿野院平藏|五郎|迪奥娜|凯亚|安柏|班尼特|琴|柯莱|夜兰|妮露|辛焱|珐露珊|魈|香菱|达达利亚|砂糖|早柚|云堇|刻晴|丽莎|迪卢克|烟绯|重云|珊瑚宫心海|胡桃|可莉|流浪者|久岐忍|神里绫人|甘雨|戴因斯雷布|优菈|菲谢尔|行秋|白术|九条裟罗|雷泽|申鹤|迪娜泽黛|凯瑟琳|多莉|坎蒂丝|萍姥姥|罗莎莉亚|留云借风真君|绮良良|瑶瑶|七七|奥兹|米卡|夏洛蒂|埃洛伊|博士|女士|大慈树王|三月七|娜塔莎|希露瓦|虎克|克拉拉|丹恒|希儿|布洛妮娅|瓦尔特|杰帕德|佩拉|姬子|艾丝妲|白露|星|穹|桑博|伦纳德|停云|罗刹|卡芙卡|彦卿|史瓦罗|螺丝咕姆|阿兰|银狼|素裳|丹枢|黑塔|景元|帕姆|可可利亚|半夏|符玄|公输师傅|奥列格|青雀|大毫|青镞|费斯曼|绿芙蓉|镜流|信使|丽塔|失落迷迭|缭乱星棘|伊甸|伏特加女孩|狂热蓝调|莉莉娅|萝莎莉娅|八重樱|八重霞|卡莲|第六夜想曲|卡萝尔|姬子|极地战刃|布洛妮娅|次生银翼|理之律者|真理之律者|迷城骇兔|希儿|魇夜星渊|黑希儿|帕朵菲莉丝|天元骑英|幽兰黛尔|德丽莎|月下初拥|朔夜观星|暮光骑士|明日香|李素裳|格蕾修|梅比乌斯|渡鸦|人之律者|爱莉希雅|爱衣|天穹游侠|琪亚娜|空之律者|终焉之律者|薪炎之律者|云墨丹心|符华|识之律者|维尔薇|始源之律者|芽衣|雷之律者|苏莎娜|阿波尼亚|陆景和|莫弈|夏彦|左然]说我测尼玛
+
MagicPrompt-Stable-Diffusion吟唱提示
@@ -1012,10 +1032,6 @@ print("run[CQ:image,file="+j["img"]+"]")
`import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/moegoe"`
- - [x] 让[宁宁|爱瑠|芳乃|茉子|丛雨|小春|七海]说(日语)
-
- - [x] 让[수아|미미르|아린|연화|유화|선배]说(韩语)
-
- [x] 让[派蒙|空|荧|阿贝多|枫原万叶|温迪|八重神子|纳西妲|钟离|诺艾尔|凝光|托马|北斗|莫娜|荒泷一斗|提纳里|芭芭拉|艾尔海森|雷电将军|赛诺|琴|班尼特|五郎|神里绫华|迪希雅|夜兰|辛焱|安柏|宵宫|云堇|妮露|烟绯|鹿野院平藏|凯亚|达达利亚|迪卢克|可莉|早柚|香菱|重云|刻晴|久岐忍|珊瑚宫心海|迪奥娜|戴因斯雷布|魈|神里绫人|丽莎|优菈|凯瑟琳|雷泽|菲谢尔|九条裟罗|甘雨|行秋|胡桃|迪娜泽黛|柯莱|申鹤|砂糖|萍姥姥|奥兹|罗莎莉亚|式大将|哲平|坎蒂丝|托克|留云借风真君|昆钧|塞琉斯|多莉|大肉丸|莱依拉|散兵|拉赫曼|杜拉夫|阿守|玛乔丽|纳比尔|海芭夏|九条镰治|阿娜耶|阿晃|阿扎尔|七七|博士|白术|埃洛伊|大慈树王|女士|丽塔|失落迷迭|缭乱星棘|伊甸|伏特加女孩|狂热蓝调|莉莉娅|萝莎莉娅|八重樱|八重霞|卡莲|第六夜想曲|卡萝尔|姬子|极地战刃|布洛妮娅|次生银翼|理之律者|迷城骇兔|希儿|魇夜星渊|黑希儿|帕朵菲莉丝|天元骑英|幽兰黛尔|德丽莎|月下初拥|朔夜观星|暮光骑士|明日香|李素裳|格蕾修|梅比乌斯|渡鸦|人之律者|爱莉希雅|爱衣|天穹游侠|琪亚娜|空之律者|薪炎之律者|云墨丹心|符华|识之律者|维尔薇|芽衣|雷之律者|阿波尼亚]说(中文)
@@ -1250,14 +1266,6 @@ print("run[CQ:image,file="+j["img"]+"]")
- [x] 设置 saucenao api key [apikey]
-
-
- 叔叔的AI二次元图片放大
-
- `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/scale"`
-
- - [x] 放大图片[图片]
-
签到得分
@@ -1517,6 +1525,18 @@ print("run[CQ:image,file="+j["img"]+"]")
- [x] 团队七阶猜单词
+
+
+ 鬼东西
+
+ `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/wtf"`
+
+ - [x] 鬼东西列表
+
+ - [x] 查询鬼东西[序号][@xxx]
+
+ - 注:由于需要科学,默认注释。
+
一些游戏王插件
@@ -1558,15 +1578,39 @@ print("run[CQ:image,file="+j["img"]+"]")
- 鬼东西
-
- `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/wtf"`
-
- - [x] 鬼东西列表
+ 遇见API
- - [x] 查询鬼东西[序号][@xxx]
-
- - 注:由于需要科学,默认注释。
+ `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/yujn"`
+
+ - [x] 小姐姐视频
+ - [x] 小姐姐视频2
+ - [x] 黑丝视频
+ - [x] 白丝视频
+ - [x] 欲梦视频
+ - [x] 甜妹视频
+ - [x] 双倍快乐
+ - [x] 纯情女高
+ - [x] 萝莉视频
+ - [x] 玉足视频
+ - [x] 帅哥视频
+ - [x] 热舞视频
+ - [x] 吊带视频
+ - [x] 汉服视频
+ - [x] 极品狱卒
+ - [x] 清纯视频
+ - [x] 快手变装
+ - [x] 抖音变装
+ - [x] 萌娃视频
+ - [x] 穿搭视频
+ - [x] 完美身材
+ - [x] 御姐撒娇
+ - [x] 绿茶语音
+ - [x] 怼人语音
+ - [x] 随机骚话
+ - [x] 随机污句子
+ - [x] 随机美句
+ - [x] 土味情话
+ - [x] 让[lulu]说我测尼玛
@@ -1589,7 +1633,7 @@ print("run[CQ:image,file="+j["img"]+"]")
- [x] @Bot 任意文本(任意一句话回复)
- - [x] 设置回复模式[青云客 | 小爱 | ChatGPT]
+ - [x] 设置文字回复模式[婧枫|沫沫|青云客|小爱|ChatGPT]
- [x] 设置 ChatGPT api key xxx
diff --git a/go.mod b/go.mod
index ef5416dd63..689d7ca752 100644
--- a/go.mod
+++ b/go.mod
@@ -4,8 +4,8 @@ go 1.20
require (
github.com/Baidu-AIP/golang-sdk v1.1.1
- github.com/FloatTech/AnimeAPI v1.7.1-0.20231017135344-aefd1d56e900
- github.com/FloatTech/floatbox v0.0.0-20231107124407-e38535efa2a2
+ github.com/FloatTech/AnimeAPI v1.7.1-0.20240423052513-58ad4b85322a
+ github.com/FloatTech/floatbox v0.0.0-20240304064110-78a83f1af9a6
github.com/FloatTech/gg v1.1.3-0.20230226151425-6ea91286ba08
github.com/FloatTech/imgfactory v0.2.2-0.20230413152719-e101cc3606ef
github.com/FloatTech/rendercard v0.0.10-0.20230223064326-45d29fa4ede9
@@ -24,7 +24,6 @@ require (
github.com/fumiama/go-base16384 v1.7.0
github.com/fumiama/go-registry v0.2.6
github.com/fumiama/gotracemoe v0.0.3
- github.com/fumiama/imgsz v0.0.2
github.com/fumiama/jieba v0.0.0-20221203025406-36c17a10b565
github.com/fumiama/unibase2n v0.0.0-20221020155353-02876e777430
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
@@ -41,7 +40,7 @@ require (
github.com/sirupsen/logrus v1.9.3
github.com/tidwall/gjson v1.14.4
github.com/wcharczuk/go-chart/v2 v2.1.0
- github.com/wdvxdr1123/ZeroBot v1.7.5-0.20231009162356-57f71b9f5258
+ github.com/wdvxdr1123/ZeroBot v1.7.5-0.20240410141841-6970df23ca54
gitlab.com/gomidi/midi/v2 v2.0.25
golang.org/x/image v0.3.0
golang.org/x/sys v0.8.0
@@ -57,6 +56,7 @@ require (
github.com/faiface/beep v1.1.0 // indirect
github.com/fumiama/go-simple-protobuf v0.1.0 // indirect
github.com/fumiama/gofastTEA v0.0.10 // indirect
+ github.com/fumiama/imgsz v0.0.2 // indirect
github.com/gabriel-vasile/mimetype v1.0.4 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
diff --git a/go.sum b/go.sum
index 8e9eed39fd..c3b72dbb82 100644
--- a/go.sum
+++ b/go.sum
@@ -2,10 +2,10 @@ github.com/Baidu-AIP/golang-sdk v1.1.1 h1:RQsAmgDSAkiq22I6n7XJ2t3afgzFeqjY46FGhv
github.com/Baidu-AIP/golang-sdk v1.1.1/go.mod h1:bXnGw7xPeKt8aF7UCELKrV6UZ/46spItONK1RQBQj1Y=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
-github.com/FloatTech/AnimeAPI v1.7.1-0.20231017135344-aefd1d56e900 h1:UPXoj+lMHFBulp/m+F7uHju0MXslFKQqEplDDz/nOiU=
-github.com/FloatTech/AnimeAPI v1.7.1-0.20231017135344-aefd1d56e900/go.mod h1:7Olb5U9q1oeayRZQTNBhXQNMf8QT4T9hccsn38IEt/U=
-github.com/FloatTech/floatbox v0.0.0-20231107124407-e38535efa2a2 h1:O4kptIzgYzNwZlBARZFv8EkA40yB6M5LGxxIF7NKLR8=
-github.com/FloatTech/floatbox v0.0.0-20231107124407-e38535efa2a2/go.mod h1:TeTlp+hTxpJti4JSdmUqzxGEr4wUBOVct9YWBepilpc=
+github.com/FloatTech/AnimeAPI v1.7.1-0.20240423052513-58ad4b85322a h1:K+1RAkIBb+3kkSxSkSTdTugSIsXJXrjEbwuv/BwUsP8=
+github.com/FloatTech/AnimeAPI v1.7.1-0.20240423052513-58ad4b85322a/go.mod h1:bNHsYcUd1+Y5Al3CR6tdzKxcc0XLivXjmUsL9xG6sSw=
+github.com/FloatTech/floatbox v0.0.0-20240304064110-78a83f1af9a6 h1:Vaj8ulVbN8vTD4W7aj+BYeT6x8iKFneDnkgBCezomDY=
+github.com/FloatTech/floatbox v0.0.0-20240304064110-78a83f1af9a6/go.mod h1:TeTlp+hTxpJti4JSdmUqzxGEr4wUBOVct9YWBepilpc=
github.com/FloatTech/gg v1.1.3-0.20230226151425-6ea91286ba08 h1:dPLeoiTVSBlgls+66EB/UJ2e38BaASmBN5nANaycSBU=
github.com/FloatTech/gg v1.1.3-0.20230226151425-6ea91286ba08/go.mod h1:uzPzAeT35egARdRuu+1oyjU3CmTwCceoq3Vvje7LpcI=
github.com/FloatTech/imgfactory v0.2.2-0.20230413152719-e101cc3606ef h1:CJbK/2FRwPuZpeb6M4sWK2d7oXDnBEGhpkQuQrgc91A=
@@ -216,8 +216,8 @@ github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYm
github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4=
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.7.5-0.20231009162356-57f71b9f5258 h1:Q0dKoj9SHrR8WjjlcX+eyYBjQKqBn/x1pdJJO1IIOxQ=
-github.com/wdvxdr1123/ZeroBot v1.7.5-0.20231009162356-57f71b9f5258/go.mod h1:y29UIOy0RD3P+0meDNIWRhcJF3jtWPN9xP9hgt/AJAU=
+github.com/wdvxdr1123/ZeroBot v1.7.5-0.20240410141841-6970df23ca54 h1:s7k0Pf4RoeCUHe9rlVsg0mqAH3WO7xLMhe9qih/CxnE=
+github.com/wdvxdr1123/ZeroBot v1.7.5-0.20240410141841-6970df23ca54/go.mod h1:y29UIOy0RD3P+0meDNIWRhcJF3jtWPN9xP9hgt/AJAU=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=
diff --git a/kanban/banner/banner.go b/kanban/banner/banner.go
index 8f21540a97..2ce6cc5485 100644
--- a/kanban/banner/banner.go
+++ b/kanban/banner/banner.go
@@ -3,13 +3,13 @@
package banner
// Version ...
-var Version = "v1.7.6"
+var Version = "v1.7.7"
// Copyright ...
-var Copyright = "© 2020 - 2023 FloatTech"
+var Copyright = "© 2020 - 2024 FloatTech"
// Banner ...
var Banner = "* OneBot + ZeroBot + Golang\n" +
- "* Version " + Version + " - 2023-11-08 14:13:37 +0900 JST\n" +
+ "* Version " + Version + " - 2024-04-01 21:34:55 +0900 JST\n" +
"* Copyright " + Copyright + ". All Rights Reserved.\n" +
"* Project: https://github.com/FloatTech/ZeroBot-Plugin"
diff --git a/main.go b/main.go
index fe8d6ba347..81b313fd75 100644
--- a/main.go
+++ b/main.go
@@ -108,6 +108,7 @@ import (
// _ "github.com/FloatTech/ZeroBot-Plugin/plugin/juejuezi" // 绝绝子生成器
// _ "github.com/FloatTech/ZeroBot-Plugin/plugin/kfccrazythursday" // 疯狂星期四
// _ "github.com/FloatTech/ZeroBot-Plugin/plugin/lolicon" // lolicon 随机图片
+ // _ "github.com/FloatTech/ZeroBot-Plugin/plugin/lolimi" // 桑帛云 API
// _ "github.com/FloatTech/ZeroBot-Plugin/plugin/magicprompt" // magicprompt吟唱提示
// _ "github.com/FloatTech/ZeroBot-Plugin/plugin/mcfish" // 钓鱼模拟器
// _ "github.com/FloatTech/ZeroBot-Plugin/plugin/midicreate" // 简易midi音乐制作
@@ -129,7 +130,6 @@ import (
// _ "github.com/FloatTech/ZeroBot-Plugin/plugin/reborn" // 投胎
// _ "github.com/FloatTech/ZeroBot-Plugin/plugin/runcode" // 在线运行代码
// _ "github.com/FloatTech/ZeroBot-Plugin/plugin/saucenao" // 以图搜图
- // _ "github.com/FloatTech/ZeroBot-Plugin/plugin/scale" // 叔叔的AI二次元图片放大
// _ "github.com/FloatTech/ZeroBot-Plugin/plugin/score" // 分数
// _ "github.com/FloatTech/ZeroBot-Plugin/plugin/setutime" // 来份涩图
// _ "github.com/FloatTech/ZeroBot-Plugin/plugin/shadiao" // 沙雕app
@@ -153,6 +153,7 @@ import (
// _ "github.com/FloatTech/ZeroBot-Plugin/plugin/wordle" // 猜单词
// _ "github.com/FloatTech/ZeroBot-Plugin/plugin/ygo" // 游戏王相关插件
// _ "github.com/FloatTech/ZeroBot-Plugin/plugin/ymgal" // 月幕galgame
+ // _ "github.com/FloatTech/ZeroBot-Plugin/plugin/yujn" // 遇见API
// _ "github.com/FloatTech/ZeroBot-Plugin/plugin/wtf" // 鬼东西
diff --git a/plugin/ai_reply/ai_tts.go b/plugin/ai_reply/ai_tts.go
index eaa7579e72..dcf9a2a154 100644
--- a/plugin/ai_reply/ai_tts.go
+++ b/plugin/ai_reply/ai_tts.go
@@ -11,28 +11,29 @@ import (
"github.com/FloatTech/AnimeAPI/tts"
"github.com/FloatTech/AnimeAPI/tts/baidutts"
"github.com/FloatTech/AnimeAPI/tts/genshin"
+ "github.com/FloatTech/AnimeAPI/tts/lolimi"
"github.com/FloatTech/AnimeAPI/tts/ttscn"
ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control"
)
-// 数据结构: [4 bits] [4 bits] [8 bits] [8 bits]
-// [ttscn模式] [百度模式] [tts模式] [回复模式]
+// 数据结构: [8 bits] [8 bits] [8 bits]
+// [具体人物] [tts模式] [回复模式]
// defaultttsindexkey
-// 数据结构: [4 bits] [4 bits] [8 bits]
-// [ttscn模式] [百度模式] [tts模式]
+// 数据结构: [8 bits] [8 bits]
+// [具体人物] [tts模式]
-// [tts模式]: 0~200 genshin 201 baidu 202 ttscn
+// [tts模式]: 0~200 genshin 201 baidu 202 ttscn 203 lolimi
const (
- lastgsttsindex = 200 + iota
- baiduttsindex
+ baiduttsindex = 201 + iota
ttscnttsindex
+ lolimittsindex
)
// extrattsname is the tts other than genshin vits
-var extrattsname = []string{"百度", "TTSCN"}
+var extrattsname = []string{"百度", "TTSCN", "桑帛云"}
var ttscnspeakers = [...]string{
"晓晓(女 - 年轻人)",
@@ -84,7 +85,7 @@ func (r replymode) setReplyMode(ctx *zero.Ctx, name string) error {
if !ok {
return errors.New("no such plugin")
}
- return m.SetData(gid, (m.GetData(index)&^0xff)|(index&0xff))
+ return m.SetData(gid, (m.GetData(gid)&^0xff)|(index&0xff))
}
func (r replymode) getReplyMode(ctx *zero.Ctx) aireply.AIReply {
@@ -96,18 +97,22 @@ func (r replymode) getReplyMode(ctx *zero.Ctx) aireply.AIReply {
if ok {
switch m.GetData(gid) & 0xff {
case 0:
- return aireply.NewQYK(aireply.QYKURL, aireply.QYKBotName)
+ return aireply.NewLolimiAi(aireply.JingfengURL, aireply.JingfengBotName)
case 1:
- return aireply.NewXiaoAi(aireply.XiaoAiURL, aireply.XiaoAiBotName)
+ return aireply.NewLolimiAi(aireply.MomoURL, aireply.MomoBotName)
case 2:
+ return aireply.NewQYK(aireply.QYKURL, aireply.QYKBotName)
+ case 3:
+ return aireply.NewXiaoAi(aireply.XiaoAiURL, aireply.XiaoAiBotName)
+ case 4:
k := ཆཏ.k
if k != "" {
return aireply.NewChatGPT(aireply.ChatGPTURL, k)
}
- return aireply.NewQYK(aireply.QYKURL, aireply.QYKBotName)
+ return aireply.NewLolimiAi(aireply.JingfengURL, aireply.JingfengBotName)
}
}
- return aireply.NewQYK(aireply.QYKURL, aireply.QYKBotName)
+ return aireply.NewLolimiAi(aireply.JingfengURL, aireply.JingfengBotName)
}
var ttsins = func() map[string]tts.TTS {
@@ -119,8 +124,8 @@ var ttsins = func() map[string]tts.TTS {
}()
var ttsModes = func() []string {
- s := append(genshin.SoundList[:], make([]string, lastgsttsindex-len(genshin.SoundList))...) // 0-200
- s = append(s, extrattsname...) // 201 202 ...
+ s := append(genshin.SoundList[:], make([]string, baiduttsindex-len(genshin.SoundList))...) // 0-200
+ s = append(s, extrattsname...) // 201 202 ...
return s
}()
@@ -146,14 +151,14 @@ func newttsmode() *ttsmode {
if ok {
index := m.GetData(defaultttsindexkey)
msk := index & 0xff
- if msk >= 0 && (msk < int64(len(genshin.SoundList)) || msk == baiduttsindex || msk == ttscnttsindex) {
+ if msk >= 0 && (msk < int64(len(ttsModes))) {
(*syncx.Map[int64, int64])(t).Store(defaultttsindexkey, index)
}
}
return t
}
-func (t *ttsmode) setSoundMode(ctx *zero.Ctx, name string, baiduper, mockingsynt int) error {
+func (t *ttsmode) setSoundMode(ctx *zero.Ctx, name string, character int) error {
gid := ctx.Event.GroupID
if gid == 0 {
gid = -ctx.Event.UserID
@@ -165,7 +170,7 @@ func (t *ttsmode) setSoundMode(ctx *zero.Ctx, name string, baiduper, mockingsynt
var index = int64(-1)
for i, s := range genshin.SoundList {
if s == name {
- index = int64(i)
+ index = int64(i + 1)
break
}
}
@@ -175,13 +180,17 @@ func (t *ttsmode) setSoundMode(ctx *zero.Ctx, name string, baiduper, mockingsynt
index = baiduttsindex
case extrattsname[1]:
index = ttscnttsindex
+ case extrattsname[2]:
+ index = lolimittsindex
default:
return errors.New("语音人物" + name + "未注册index")
}
}
m := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
- (*syncx.Map[int64, int64])(t).Store(gid, index)
- return m.SetData(gid, (m.GetData(gid)&^0xffff00)|((index<<8)&0xff00)|((int64(baiduper)<<16)&0x0f0000)|((int64(mockingsynt)<<20)&0xf00000))
+ // 按原来的逻辑map存的是前16位
+ storeIndex := (m.GetData(gid) &^ 0xffff00) | ((index << 8) & 0xff00) | ((int64(character) << 16) & 0xff0000)
+ (*syncx.Map[int64, int64])(t).Store(gid, (storeIndex>>8)&0xffff)
+ return m.SetData(gid, storeIndex)
}
func (t *ttsmode) getSoundMode(ctx *zero.Ctx) (tts.TTS, error) {
@@ -195,8 +204,12 @@ func (t *ttsmode) getSoundMode(ctx *zero.Ctx) (tts.TTS, error) {
i = m.GetData(gid) >> 8
}
m := i & 0xff
- if m < 0 || (m >= int64(len(genshin.SoundList)) && m != baiduttsindex && m != ttscnttsindex) {
+ if m <= 0 || (m >= int64(len(ttsModes))) {
i, _ = (*syncx.Map[int64, int64])(t).Load(defaultttsindexkey)
+ if i == 0 {
+ i = ctx.State["manager"].(*ctrl.Control[*zero.Ctx]).GetData(defaultttsindexkey)
+ (*syncx.Map[int64, int64])(t).Store(defaultttsindexkey, i)
+ }
m = i & 0xff
}
mode := ttsModes[m]
@@ -205,20 +218,22 @@ func (t *ttsmode) getSoundMode(ctx *zero.Ctx) (tts.TTS, error) {
switch mode {
case extrattsname[0]:
id, sec, _ := strings.Cut(百.k, ",")
- ins = baidutts.NewBaiduTTS(int(i&0x0f00)>>8, id, sec)
+ ins = baidutts.NewBaiduTTS(int(i&0xff00)>>8, id, sec)
case extrattsname[1]:
var err error
- ins, err = ttscn.NewTTSCN("中文(普通话,简体)", ttscnspeakers[int(i&0xf000)>>12], ttscn.KBRates[0])
+ ins, err = ttscn.NewTTSCN("中文(普通话,简体)", ttscnspeakers[int(i&0xff00)>>8], ttscn.KBRates[0])
if err != nil {
return nil, err
}
+ case extrattsname[2]:
+ ins = lolimi.NewLolimi(int(i&0xff00) >> 8)
default: // 原神
k := 原.k
if k != "" {
- ins = genshin.NewGenshin(int(m), 原.k)
+ ins = genshin.NewGenshin(int(m-1), 原.k)
ttsins[mode] = ins
} else {
- return nil, errors.New("no valid speaker")
+ ins = lolimi.NewLolimi(int(i&0xff00) >> 8)
}
}
}
@@ -231,11 +246,12 @@ func (t *ttsmode) resetSoundMode(ctx *zero.Ctx) error {
gid = -ctx.Event.UserID
}
m := ctx.State["manager"].(*ctrl.Control[*zero.Ctx])
- index := m.GetData(defaultttsindexkey)
- return m.SetData(gid, (m.GetData(gid)&0xff)|((index&^0xff)<<8)) // 重置数据
+ // 只保留后面8位
+ (*syncx.Map[int64, int64])(t).Delete(gid)
+ return m.SetData(gid, (m.GetData(gid) & 0xff)) // 重置数据
}
-func (t *ttsmode) setDefaultSoundMode(name string, baiduper, mockingsynt int) error {
+func (t *ttsmode) setDefaultSoundMode(name string, character int) error {
_, ok := ttsins[name]
if !ok {
return errors.New("不支持设置语音人物" + name)
@@ -243,7 +259,7 @@ func (t *ttsmode) setDefaultSoundMode(name string, baiduper, mockingsynt int) er
index := int64(-1)
for i, s := range genshin.SoundList {
if s == name {
- index = int64(i)
+ index = int64(i + 1)
break
}
}
@@ -253,6 +269,8 @@ func (t *ttsmode) setDefaultSoundMode(name string, baiduper, mockingsynt int) er
index = baiduttsindex
case extrattsname[1]:
index = ttscnttsindex
+ case extrattsname[2]:
+ index = lolimittsindex
default:
return errors.New("语音人物" + name + "未注册index")
}
@@ -261,6 +279,7 @@ func (t *ttsmode) setDefaultSoundMode(name string, baiduper, mockingsynt int) er
if !ok {
return errors.New("[tts] service not found")
}
- (*syncx.Map[int64, int64])(t).Store(defaultttsindexkey, index)
- return m.SetData(defaultttsindexkey, (index&0xff)|((int64(baiduper)<<8)&0x0f00)|((int64(mockingsynt)<<12)&0xf000))
+ storeIndex := (index & 0xff) | ((int64(character) << 8) & 0xff00)
+ (*syncx.Map[int64, int64])(t).Store(defaultttsindexkey, storeIndex)
+ return m.SetData(defaultttsindexkey, storeIndex)
}
diff --git a/plugin/ai_reply/main.go b/plugin/ai_reply/main.go
index 447ee33469..40faff1714 100644
--- a/plugin/ai_reply/main.go
+++ b/plugin/ai_reply/main.go
@@ -5,6 +5,7 @@ import (
"os"
"regexp"
"strconv"
+ "strings"
"time"
"github.com/FloatTech/AnimeAPI/tts/genshin"
@@ -16,7 +17,7 @@ import (
"github.com/wdvxdr1123/ZeroBot/message"
)
-var replmd = replymode([]string{"青云客", "小爱", "ChatGPT"})
+var replmd = replymode([]string{"婧枫", "沫沫", "青云客", "小爱", "ChatGPT"})
var ttsmd = newttsmode()
@@ -25,9 +26,10 @@ func init() { // 插件主体
DisableOnDefault: true,
Brief: "人工智能语音回复",
Help: "- @Bot 任意文本(任意一句话回复)\n" +
- "- 设置语音模式[原神人物/百度/TTSCN] 数字(百度/TTSCN说话人)\n" +
- "- 设置默认语音模式[原神人物/百度/TTSCN] 数字(百度/TTSCN说话人)\n" +
+ "- 设置语音模式[原神人物/百度/TTSCN/桑帛云] 数字(百度/TTSCN说话人/桑帛云)\n" +
+ "- 设置默认语音模式[原神人物/百度/TTSCN/桑帛云] 数字(百度/TTSCN说话人/桑帛云)\n" +
"- 恢复成默认语音模式\n" +
+ "- 设置语音回复模式[沫沫|婧枫|青云客|小爱|ChatGPT]\n" +
"- 设置原神语音 api key xxxxxx (key请加开发群获得)\n" +
"- 设置百度语音 api id xxxxxx secret xxxxxx (请自行获得)\n" +
"当前适用的原神人物含有以下: \n" + list(genshin.SoundList[:], 5) +
@@ -38,7 +40,7 @@ func init() { // 插件主体
enr := control.Register("aireply", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "人工智能回复",
- Help: "- @Bot 任意文本(任意一句话回复)\n- 设置回复模式[青云客|小爱|ChatGPT]\n- 设置 ChatGPT api key xxx",
+ Help: "- @Bot 任意文本(任意一句话回复)\n- 设置文字回复模式[婧枫|沫沫|青云客|小爱|ChatGPT]\n- 设置 ChatGPT api key xxx",
PrivateDataFolder: "aireply",
})
@@ -48,15 +50,10 @@ func init() { // 插件主体
reply := message.ParseMessageFromString(aireply.Talk(ctx.Event.UserID, ctx.ExtractPlainText(), zero.BotConfig.NickName[0]))
// 回复
time.Sleep(time.Second * 1)
- if zero.OnlyPublic(ctx) {
- reply = append(reply, message.Reply(ctx.Event.MessageID))
- ctx.Send(reply)
- return
- }
+ reply = append(reply, message.Reply(ctx.Event.MessageID))
ctx.Send(reply)
})
-
- enr.OnPrefix("设置回复模式", zero.AdminPermission).SetBlock(true).Handle(func(ctx *zero.Ctx) {
+ setReplyMode := func(ctx *zero.Ctx) {
param := ctx.State["args"].(string)
err := replmd.setReplyMode(ctx, param)
if err != nil {
@@ -64,8 +61,8 @@ func init() { // 插件主体
return
}
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("成功"))
- })
-
+ }
+ enr.OnPrefix("设置文字回复模式", zero.AdminPermission).SetBlock(true).Handle(setReplyMode)
enr.OnRegex(`^设置\s*ChatGPT\s*api\s*key\s*(.*)$`, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true).Handle(func(ctx *zero.Ctx) {
err := ཆཏ.set(ctx.State["regex_matched"].([]string)[1])
if err != nil {
@@ -88,7 +85,20 @@ func init() { // 插件主体
// 获取回复模式
r := replmd.getReplyMode(ctx)
// 获取回复的文本
- reply := r.TalkPlain(ctx.Event.UserID, msg, zero.BotConfig.NickName[0])
+ reply := message.ParseMessageFromString(r.TalkPlain(ctx.Event.UserID, msg, zero.BotConfig.NickName[0]))
+ // 过滤掉文字消息
+ filterMsg := make([]message.MessageSegment, 0, len(reply))
+ sb := strings.Builder{}
+ for _, v := range reply {
+ if v.Type != "text" {
+ filterMsg = append(filterMsg, v)
+ } else {
+ sb.WriteString(v.Data["text"])
+ }
+ }
+ // 纯文本
+ plainReply := sb.String()
+ plainReply = strings.ReplaceAll(plainReply, "\n", "")
// 获取语音
speaker, err := ttsmd.getSoundMode(ctx)
if err != nil {
@@ -96,21 +106,26 @@ func init() { // 插件主体
return
}
rec, err := speaker.Speak(ctx.Event.UserID, func() string {
- if !endpre.MatchString(reply) {
- return reply + "。"
+ if !endpre.MatchString(plainReply) {
+ return plainReply + "。"
}
- return reply
+ return plainReply
})
+ // 发送前面的图片
+ if len(filterMsg) != 0 {
+ filterMsg = append(filterMsg, message.Reply(ctx.Event.MessageID))
+ ctx.Send(filterMsg)
+ }
if err != nil {
- ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(reply))
+ ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(plainReply))
return
}
// 发送语音
if id := ctx.SendChain(message.Record(rec)); id.ID() == 0 {
- ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(reply))
+ ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(plainReply))
}
})
-
+ ent.OnPrefix("设置语音回复模式", zero.AdminPermission).SetBlock(true).Handle(setReplyMode)
ent.OnRegex(`^设置语音模式\s*([\S\D]*)\s+(\d*)$`, zero.AdminPermission).SetBlock(true).Handle(func(ctx *zero.Ctx) {
param := ctx.State["regex_matched"].([]string)[1]
num := ctx.State["regex_matched"].([]string)[2]
@@ -124,8 +139,8 @@ func init() { // 插件主体
}
}
// 保存设置
- logrus.Debugln("[tts] t.setSoundMode( ctx", param, n, n, ")")
- err = ttsmd.setSoundMode(ctx, param, n, n)
+ logrus.Debugln("[tts] t.setSoundMode( ctx", param, n, ")")
+ err = ttsmd.setSoundMode(ctx, param, n)
if err != nil {
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(err))
return
@@ -153,7 +168,7 @@ func init() { // 插件主体
return
}
time.Sleep(time.Second * 2)
- ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("设置成功"))
+ ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("设置成功,当前为", speaker))
})
ent.OnRegex(`^设置默认语音模式\s*([\S\D]*)\s+(\d*)$`, zero.SuperUserPermission).SetBlock(true).Handle(func(ctx *zero.Ctx) {
@@ -169,7 +184,7 @@ func init() { // 插件主体
}
}
// 保存设置
- err = ttsmd.setDefaultSoundMode(param, n, n)
+ err = ttsmd.setDefaultSoundMode(param, n)
if err != nil {
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(err))
return
diff --git a/plugin/baidu/search.go b/plugin/baidu/search.go
index 3b44544a83..91ac83f06a 100644
--- a/plugin/baidu/search.go
+++ b/plugin/baidu/search.go
@@ -4,6 +4,7 @@ package baidu
import (
"encoding/json"
"fmt"
+ "net/url"
"github.com/FloatTech/floatbox/web"
ctrl "github.com/FloatTech/zbpctrl"
@@ -37,9 +38,9 @@ func init() { // 主函数
var err error
switch ctx.State["regex_matched"].([]string)[1] {
case "百度", "百科":
- es, err = web.GetData(fmt.Sprintf(duURL, key, ctx.State["regex_matched"].([]string)[2])) // 将网站返回结果赋值
+ es, err = web.GetData(fmt.Sprintf(duURL, key, url.QueryEscape(ctx.State["regex_matched"].([]string)[2]))) // 将网站返回结果赋值
case "wiki", "维基":
- es, err = web.GetData(fmt.Sprintf(wikiURL, key, ctx.State["regex_matched"].([]string)[2])) // 将网站返回结果赋值
+ es, err = web.GetData(fmt.Sprintf(wikiURL, key, url.QueryEscape(ctx.State["regex_matched"].([]string)[2]))) // 将网站返回结果赋值
}
if err != nil {
ctx.SendChain(message.Text("出现错误捏:", err))
diff --git a/plugin/bilibili/bilibili.go b/plugin/bilibili/bilibili.go
index 9451dffe1e..f7f9335842 100644
--- a/plugin/bilibili/bilibili.go
+++ b/plugin/bilibili/bilibili.go
@@ -337,12 +337,12 @@ func init() {
faceH := float64(510)
totalDanmuku := 0
- for i := 0; i < len(danmaku.Data.Data); i++ {
- totalDanmuku += len(danmaku.Data.Data[i].Danmakus) + 1
+ for i := 0; i < len(danmaku.Data.Data.Records); i++ {
+ totalDanmuku += len(danmaku.Data.Data.Records[i].Danmakus) + 1
}
cw := 3000
mcw := float64(2000)
- ch := 550 + len(danmaku.Data.Data)*int(faceH) + totalDanmuku*int(danmuH)
+ ch := 550 + len(danmaku.Data.Data.Records)*int(faceH) + totalDanmuku*int(danmuH)
canvas = gg.NewContext(cw, ch)
canvas.SetColor(color.White)
canvas.Clear()
@@ -372,9 +372,9 @@ func init() {
canvas.DrawString("网页链接: "+fmt.Sprintf(bz.DanmakuURL, u.Mid), startWidth, 422.5)
var channelStart float64
channelStart = float64(550)
- for i := 0; i < len(danmaku.Data.Data); i++ {
- item := danmaku.Data.Data[i]
- facePath = cachePath + strconv.Itoa(int(item.Channel.UID)) + "vupFace" + path.Ext(item.Channel.FaceURL)
+ for i := 0; i < len(danmaku.Data.Data.Records); i++ {
+ item := danmaku.Data.Data.Records[i]
+ facePath = cachePath + strconv.Itoa(item.Channel.UID) + "vupFace" + path.Ext(item.Channel.FaceURL)
if path.Ext(item.Channel.FaceURL) != ".webp" {
err = initFacePic(facePath, item.Channel.FaceURL)
if err != nil {
@@ -393,7 +393,7 @@ func init() {
}
canvas.SetRGB255(24, 144, 255)
canvas.DrawString("标题: "+item.Live.Title, startWidth, channelStart+fontH)
- canvas.DrawString("主播: "+item.Channel.Name, startWidth, channelStart+fontH*2)
+ canvas.DrawString("主播: "+item.Channel.UName, startWidth, channelStart+fontH*2)
canvas.SetColor(color.Black)
canvas.DrawString("开始时间: "+time.UnixMilli(item.Live.StartDate).Format("2006-01-02 15:04:05"), startWidth, channelStart+fontH*3)
if item.Live.IsFinish {
@@ -411,8 +411,8 @@ func init() {
canvas.DrawString("直播时长: "+strconv.FormatFloat(float64(time.Now().UnixMilli()-item.Live.StartDate)/3600000.0, 'f', 1, 64)+"小时", startWidth, channelStart+fontH*5)
}
- canvas.DrawString("弹幕数量: "+strconv.Itoa(int(item.Live.DanmakusCount)), startWidth, channelStart+fontH*6)
- canvas.DrawString("观看次数: "+strconv.Itoa(int(item.Live.WatchCount)), startWidth, channelStart+fontH*7)
+ canvas.DrawString("弹幕数量: "+strconv.Itoa(item.Live.DanmakusCount), startWidth, channelStart+fontH*6)
+ canvas.DrawString("观看次数: "+strconv.Itoa(item.Live.WatchCount), startWidth, channelStart+fontH*7)
t := "收益:"
l, _ := canvas.MeasureString(t)
@@ -434,7 +434,7 @@ func init() {
canvas.DrawString(t, moveW, danmuNow)
moveW += l + dz
- t = danItem.Name
+ t = danItem.UName
l, _ = canvas.MeasureString(t)
canvas.SetRGB255(24, 144, 255)
canvas.DrawString(t, moveW, danmuNow)
diff --git a/plugin/bilibili/bilibilimodel.go b/plugin/bilibili/bilibilimodel.go
index 3fce1d01b1..70397b63d8 100644
--- a/plugin/bilibili/bilibilimodel.go
+++ b/plugin/bilibili/bilibilimodel.go
@@ -75,7 +75,7 @@ func updateVup() error {
if err != nil {
return err
}
- gjson.Get(binary.BytesToString(data), "@this").ForEach(func(key, value gjson.Result) bool {
+ gjson.Get(binary.BytesToString(data), "@this").ForEach(func(_, value gjson.Result) bool {
mid := value.Get("mid").Int()
uname := value.Get("uname").String()
roomid := value.Get("roomid").Int()
diff --git a/plugin/bilibili/bilibilipush.go b/plugin/bilibili/bilibilipush.go
index f114d78ee2..8a944305fb 100644
--- a/plugin/bilibili/bilibilipush.go
+++ b/plugin/bilibili/bilibilipush.go
@@ -24,7 +24,7 @@ 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://space.bilibili.com/%v"
- infoURL = "https://api.bilibili.com/x/space/wbi/acc/info?mid=%v&token=&platform=web&web_location=1550101"
+ infoURL = "https://api.bilibili.com/x/space/wbi/acc/info?mid=%v"
)
// bdb bilibili推送数据库
@@ -77,7 +77,7 @@ func init() {
en.OnRegex(`^添加[B|b]站订阅\s?(.{1,25})$`, zero.UserOrGrpAdmin, getPara).SetBlock(true).Handle(func(ctx *zero.Ctx) {
buid, _ := strconv.ParseInt(ctx.State["uid"].(string), 10, 64)
- name, err := getName(buid)
+ name, err := getName(buid, cfg)
if err != nil || name == "" {
ctx.SendChain(message.Text("ERROR: ", err))
return
@@ -95,7 +95,7 @@ func init() {
en.OnRegex(`^取消[B|b]站订阅\s?(.{1,25})$`, zero.UserOrGrpAdmin, getPara).SetBlock(true).Handle(func(ctx *zero.Ctx) {
buid, _ := strconv.ParseInt(ctx.State["uid"].(string), 10, 64)
- name, err := getName(buid)
+ name, err := getName(buid, cfg)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
@@ -112,7 +112,7 @@ func init() {
})
en.OnRegex(`^取消[B|b]站动态订阅\s?(.{1,25})$`, zero.UserOrGrpAdmin, getPara).SetBlock(true).Handle(func(ctx *zero.Ctx) {
buid, _ := strconv.ParseInt(ctx.State["uid"].(string), 10, 64)
- name, err := getName(buid)
+ name, err := getName(buid, cfg)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
@@ -133,7 +133,7 @@ func init() {
if gid == 0 {
gid = -ctx.Event.UserID
}
- name, err := getName(buid)
+ name, err := getName(buid, cfg)
if err != nil {
ctx.SendChain(message.Text("ERROR: ", err))
return
@@ -200,10 +200,18 @@ func changeAtAll(gid int64, b int) (err error) {
}
// 取得uid的名字
-func getName(buid int64) (name string, err error) {
+func getName(buid int64, cookiecfg *bz.CookieConfig) (name string, err error) {
var ok bool
if name, ok = upMap[buid]; !ok {
data, err := web.RequestDataWithHeaders(web.NewDefaultClient(), bz.SignURL(fmt.Sprintf(infoURL, buid)), "GET", func(r *http.Request) error {
+ if cookiecfg != nil {
+ cookie := ""
+ cookie, err = cookiecfg.Load()
+ if err != nil {
+ return err
+ }
+ r.Header.Add("Cookie", cookie)
+ }
r.Header.Set("User-Agent", ua)
return nil
}, nil)
@@ -262,8 +270,19 @@ func unsubscribeLive(buid, groupid int64) (err error) {
return bdb.insertOrUpdateLiveAndDynamic(bpMap)
}
-func getUserDynamicCard(buid int64) (cardList []gjson.Result, err error) {
- data, err := web.RequestDataWith(web.NewDefaultClient(), fmt.Sprintf(bz.SpaceHistoryURL, buid, 0), "GET", referer, ua, nil)
+func getUserDynamicCard(buid int64, cookiecfg *bz.CookieConfig) (cardList []gjson.Result, err error) {
+ data, err := web.RequestDataWithHeaders(web.NewDefaultClient(), fmt.Sprintf(bz.SpaceHistoryURL, buid, 0), "GET", func(req *http.Request) error {
+ if cookiecfg != nil {
+ cookie := ""
+ cookie, err = cookiecfg.Load()
+ if err != nil {
+ return err
+ }
+ req.Header.Add("Cookie", cookie)
+ }
+ req.Header.Add("User-Agent", ua)
+ return nil
+ }, nil)
if err != nil {
return
}
@@ -289,7 +308,7 @@ func sendDynamic(ctx *zero.Ctx) error {
uids := bdb.getAllBuidByDynamic()
for _, buid := range uids {
time.Sleep(2 * time.Second)
- cardList, err := getUserDynamicCard(buid)
+ cardList, err := getUserDynamicCard(buid, cfg)
if err != nil {
return err
}
diff --git a/plugin/guessmusic/struct.go b/plugin/guessmusic/struct.go
index cd4532ca3f..7e9d788cb4 100644
--- a/plugin/guessmusic/struct.go
+++ b/plugin/guessmusic/struct.go
@@ -241,9 +241,9 @@ type listInfoOfAPI struct {
PublishTime int64 `json:"publishTime"`
Tns []string `json:"tns,omitempty"`
} `json:"tracks"`
- VideoIds interface{} `json:"videoIds"`
+ VideoIDs interface{} `json:"videoIds"`
Videos interface{} `json:"videos"`
- TrackIds []struct {
+ TrackIDs []struct {
ID int `json:"id"`
V int `json:"v"`
T int `json:"t"`
diff --git a/plugin/lolimi/lolimi.go b/plugin/lolimi/lolimi.go
new file mode 100644
index 0000000000..7f8a24becf
--- /dev/null
+++ b/plugin/lolimi/lolimi.go
@@ -0,0 +1,112 @@
+// Package lolimi 来源于 https://api.lolimi.cn/ 的接口
+package lolimi
+
+import (
+ "fmt"
+ "net/url"
+ "strconv"
+ "strings"
+
+ "github.com/FloatTech/AnimeAPI/tts/lolimi"
+ "github.com/FloatTech/floatbox/binary"
+ "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 (
+ lolimiURL = "https://api.lolimi.cn"
+ raoURL = lolimiURL + "/API/rao/api.php"
+ yanURL = lolimiURL + "/API/yan/?url=%v"
+ xjjURL = lolimiURL + "/API/tup/xjj.php"
+ qingURL = lolimiURL + "/API/qing/api.php"
+ fabingURL = lolimiURL + "/API/fabing/fb.php?name=%v"
+)
+
+var (
+ engine = control.AutoRegister(&ctrl.Options[*zero.Ctx]{
+ DisableOnDefault: false,
+ Brief: "桑帛云 API",
+ Help: "- 让[嘉然|塔菲|东雪莲|懒羊羊|科比|孙笑川|陈泽|丁真|空|荧|派蒙|纳西妲|阿贝多|温迪|枫原万叶|钟离|荒泷一斗|八重神子|艾尔海森|提纳里|迪希雅|卡维|宵宫|莱依拉|赛诺|诺艾尔|托马|凝光|莫娜|北斗|神里绫华|雷电将军|芭芭拉|鹿野院平藏|五郎|迪奥娜|凯亚|安柏|班尼特|琴|柯莱|夜兰|妮露|辛焱|珐露珊|魈|香菱|达达利亚|砂糖|早柚|云堇|刻晴|丽莎|迪卢克|烟绯|重云|珊瑚宫心海|胡桃|可莉|流浪者|久岐忍|神里绫人|甘雨|戴因斯雷布|优菈|菲谢尔|行秋|白术|九条裟罗|雷泽|申鹤|迪娜泽黛|凯瑟琳|多莉|坎蒂丝|萍姥姥|罗莎莉亚|留云借风真君|绮良良|瑶瑶|七七|奥兹|米卡|夏洛蒂|埃洛伊|博士|女士|大慈树王|三月七|娜塔莎|希露瓦|虎克|克拉拉|丹恒|希儿|布洛妮娅|瓦尔特|杰帕德|佩拉|姬子|艾丝妲|白露|星|穹|桑博|伦纳德|停云|罗刹|卡芙卡|彦卿|史瓦罗|螺丝咕姆|阿兰|银狼|素裳|丹枢|黑塔|景元|帕姆|可可利亚|半夏|符玄|公输师傅|奥列格|青雀|大毫|青镞|费斯曼|绿芙蓉|镜流|信使|丽塔|失落迷迭|缭乱星棘|伊甸|伏特加女孩|狂热蓝调|莉莉娅|萝莎莉娅|八重樱|八重霞|卡莲|第六夜想曲|卡萝尔|姬子|极地战刃|布洛妮娅|次生银翼|理之律者|真理之律者|迷城骇兔|希儿|魇夜星渊|黑希儿|帕朵菲莉丝|天元骑英|幽兰黛尔|德丽莎|月下初拥|朔夜观星|暮光骑士|明日香|李素裳|格蕾修|梅比乌斯|渡鸦|人之律者|爱莉希雅|爱衣|天穹游侠|琪亚娜|空之律者|终焉之律者|薪炎之律者|云墨丹心|符华|识之律者|维尔薇|始源之律者|芽衣|雷之律者|苏莎娜|阿波尼亚|陆景和|莫弈|夏彦|左然]说我测尼玛\n- 随机绕口令\n- 颜值鉴定[图片]\n" +
+ "- 随机妹子\n- 随机情话\n- 发病 嘉然\n\n说明: 颜值鉴定只能鉴定三次元图片",
+ })
+)
+
+func init() {
+ engine.OnFullMatch("随机妹子").SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
+ ctx.SendChain(message.Image(xjjURL))
+ })
+ engine.OnFullMatch("随机绕口令").SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
+ data, err := web.GetData(raoURL)
+ if err != nil {
+ ctx.SendChain(message.Text("ERROR: ", err))
+ return
+ }
+ ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(gjson.Get(binary.BytesToString(data), "data.Msg").String()))
+ })
+ engine.OnFullMatch("随机情话").SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
+ data, err := web.GetData(qingURL)
+ if err != nil {
+ ctx.SendChain(message.Text("ERROR: ", err))
+ return
+ }
+ ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(binary.BytesToString(data)))
+ })
+ engine.OnPrefix(`发病`).SetBlock(true).Handle(func(ctx *zero.Ctx) {
+ name := ctx.NickName()
+ data, err := web.GetData(fmt.Sprintf(fabingURL, url.QueryEscape(name)))
+ if err != nil {
+ ctx.SendChain(message.Text("ERROR: ", err))
+ return
+ }
+ ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(gjson.Get(binary.BytesToString(data), "data").String()))
+ })
+ engine.OnKeywordGroup([]string{"颜值鉴定"}, zero.MustProvidePicture).SetBlock(true).
+ Handle(func(ctx *zero.Ctx) {
+ list := ctx.State["image_url"].([]string)
+ if len(list) > 0 {
+ ctx.SendChain(message.Text("少女祈祷中..."))
+ data, err := web.GetData(fmt.Sprintf(yanURL, url.QueryEscape(list[0])))
+ if err != nil {
+ ctx.SendChain(message.Text("ERROR: ", err))
+ return
+ }
+ assessment := gjson.Get(binary.BytesToString(data), "data.text").String()
+ if assessment == "" {
+ ctx.SendChain(message.Text("ERROR: 请输入正确的图片"))
+ return
+ }
+ var text strings.Builder // 创建一个strings.Builder实例
+ text.WriteString("评价: ")
+ text.WriteString(assessment) // 添加评估信息
+
+ for i := 0; i <= 2; i++ {
+ key := gjson.Get(binary.BytesToString(data), "data.grade.key"+strconv.Itoa(i)).String()
+ score := gjson.Get(binary.BytesToString(data), "data.grade.score"+strconv.Itoa(i)).String()
+ if key != "" {
+ text.WriteString("\n")
+ text.WriteString(key)
+ text.WriteString(": ")
+ text.WriteString(score)
+ }
+ }
+
+ ctx.SendChain(message.Text(text.String())) // 发送构建好的字符串
+ }
+ })
+ engine.OnRegex("^让(嘉然|塔菲|东雪莲|懒羊羊|科比|孙笑川|陈泽|丁真|空|荧|派蒙|纳西妲|阿贝多|温迪|枫原万叶|钟离|荒泷一斗|八重神子|艾尔海森|提纳里|迪希雅|卡维|宵宫|莱依拉|赛诺|诺艾尔|托马|凝光|莫娜|北斗|神里绫华|雷电将军|芭芭拉|鹿野院平藏|五郎|迪奥娜|凯亚|安柏|班尼特|琴|柯莱|夜兰|妮露|辛焱|珐露珊|魈|香菱|达达利亚|砂糖|早柚|云堇|刻晴|丽莎|迪卢克|烟绯|重云|珊瑚宫心海|胡桃|可莉|流浪者|久岐忍|神里绫人|甘雨|戴因斯雷布|优菈|菲谢尔|行秋|白术|九条裟罗|雷泽|申鹤|迪娜泽黛|凯瑟琳|多莉|坎蒂丝|萍姥姥|罗莎莉亚|留云借风真君|绮良良|瑶瑶|七七|奥兹|米卡|夏洛蒂|埃洛伊|博士|女士|大慈树王|三月七|娜塔莎|希露瓦|虎克|克拉拉|丹恒|希儿|布洛妮娅|瓦尔特|杰帕德|佩拉|姬子|艾丝妲|白露|星|穹|桑博|伦纳德|停云|罗刹|卡芙卡|彦卿|史瓦罗|螺丝咕姆|阿兰|银狼|素裳|丹枢|黑塔|景元|帕姆|可可利亚|半夏|符玄|公输师傅|奥列格|青雀|大毫|青镞|费斯曼|绿芙蓉|镜流|信使|丽塔|失落迷迭|缭乱星棘|伊甸|伏特加女孩|狂热蓝调|莉莉娅|萝莎莉娅|八重樱|八重霞|卡莲|第六夜想曲|卡萝尔|姬子|极地战刃|布洛妮娅|次生银翼|理之律者|真理之律者|迷城骇兔|希儿|魇夜星渊|黑希儿|帕朵菲莉丝|天元骑英|幽兰黛尔|德丽莎|月下初拥|朔夜观星|暮光骑士|明日香|李素裳|格蕾修|梅比乌斯|渡鸦|人之律者|爱莉希雅|爱衣|天穹游侠|琪亚娜|空之律者|终焉之律者|薪炎之律者|云墨丹心|符华|识之律者|维尔薇|始源之律者|芽衣|雷之律者|苏莎娜|阿波尼亚|陆景和|莫弈|夏彦|左然)说([\\s\u4e00-\u9fa5\u3040-\u309F\u30A0-\u30FF\\w\\p{P}\u3000-\u303F\uFF00-\uFFEF]+)$").Limit(ctxext.LimitByGroup).Handle(func(ctx *zero.Ctx) {
+ name := ctx.State["regex_matched"].([]string)[1]
+ msg := ctx.State["regex_matched"].([]string)[2]
+ ctx.SendChain(message.Text("少女祈祷中......"))
+ recordURL, err := lolimi.TTS(name, msg)
+ if err != nil {
+ ctx.SendChain(message.Text("ERROR: ", err))
+ return
+ }
+ ctx.SendChain(message.Record(recordURL))
+ })
+}
diff --git a/plugin/manager/manager.go b/plugin/manager/manager.go
index fa9ac42c04..fa676aba58 100644
--- a/plugin/manager/manager.go
+++ b/plugin/manager/manager.go
@@ -47,6 +47,7 @@ const (
"- 取消在\"cron\"的提醒\n" +
"- 列出所有提醒\n" +
"- 翻牌\n" +
+ "- 赞我\n" +
"- 设置欢迎语XXX 可选添加 [{at}] [{nickname}] [{avatar}] [{uid}] [{gid}] [{groupname}]\n" +
"- 测试欢迎语\n" +
"- 设置告别辞 参数同设置欢迎语\n" +
@@ -384,6 +385,24 @@ func init() { // 插件主体
),
)
})
+ // 给好友点赞
+ engine.OnFullMatch("赞我").SetBlock(true).Limit(ctxext.LimitByUser).
+ Handle(func(ctx *zero.Ctx) {
+ list := ctx.GetFriendList().Array()
+ flag := false
+ for _, v := range list {
+ if ctx.Event.UserID == v.Get("user_id").Int() {
+ flag = true
+ break
+ }
+ }
+ if !flag {
+ ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("不加好友不给赞!"))
+ return
+ }
+ ctx.SendLike(ctx.Event.UserID, 10)
+ ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("给你赞了10下哦,记得回我~"))
+ })
// 入群欢迎
engine.OnNotice().SetBlock(false).
Handle(func(ctx *zero.Ctx) {
diff --git a/plugin/manager/timer/sleep.go b/plugin/manager/timer/sleep.go
index a6aae76378..e3652909ed 100644
--- a/plugin/manager/timer/sleep.go
+++ b/plugin/manager/timer/sleep.go
@@ -155,7 +155,7 @@ func (t *Timer) judgeHM() {
if t.SelfID != 0 {
t.sendmsg(t.GrpID, zero.GetBot(t.SelfID))
} else {
- zero.RangeBot(func(id int64, ctx *zero.Ctx) (_ bool) {
+ zero.RangeBot(func(_ int64, ctx *zero.Ctx) (_ bool) {
t.sendmsg(t.GrpID, ctx)
return
})
diff --git a/plugin/moegoe/main.go b/plugin/moegoe/main.go
index 5b43f17771..fa8038edc1 100644
--- a/plugin/moegoe/main.go
+++ b/plugin/moegoe/main.go
@@ -18,38 +18,14 @@ import (
"github.com/FloatTech/zbputils/ctxext"
)
-const (
- jpapi = "https://moegoe.azurewebsites.net/api/speak?text=%s&id=%d"
- krapi = "https://moegoe.azurewebsites.net/api/speakkr?text=%s&id=%d"
-)
-
-var speakers = map[string]uint{
- "宁宁": 0, "爱瑠": 1, "芳乃": 2, "茉子": 3, "丛雨": 4, "小春": 5, "七海": 6,
- "Sua": 0, "Mimiru": 1, "Arin": 2, "Yeonhwa": 3, "Yuhwa": 4, "Seonbae": 5,
-}
-
var 原 = newapikeystore("./data/tts/o.txt")
func init() {
en := control.AutoRegister(&ctrl.Options[*zero.Ctx]{
DisableOnDefault: false,
Brief: "日韩中 VITS 模型拟声",
- Help: "- 让[宁宁|爱瑠|芳乃|茉子|丛雨|小春|七海]说(日语)\n" +
- "- 让[Sua|Mimiru|Arin|Yeonhwa|Yuhwa|Seonbae]说(韩语)\n" +
- "- 让[空|荧|派蒙|纳西妲|阿贝多|温迪|枫原万叶|钟离|荒泷一斗|八重神子|艾尔海森|提纳里|迪希雅|卡维|宵宫|莱依拉|赛诺|诺艾尔|托马|凝光|莫娜|北斗|神里绫华|雷电将军|芭芭拉|鹿野院平藏|五郎|迪奥娜|凯亚|安柏|班尼特|琴|柯莱|夜兰|妮露|辛焱|珐露珊|魈|香菱|达达利亚|砂糖|早柚|云堇|刻晴|丽莎|迪卢克|烟绯|重云|珊瑚宫心海|胡桃|可莉|流浪者|久岐忍|神里绫人|甘雨|戴因斯雷布|优菈|菲谢尔|行秋|白术|九条裟罗|雷泽|申鹤|迪娜泽黛|凯瑟琳|多莉|坎蒂丝|萍姥姥|罗莎莉亚|留云借风真君|绮良良|瑶瑶|七七|奥兹|米卡|夏洛蒂|埃洛伊|博士|女士|大慈树王|三月七|娜塔莎|希露瓦|虎克|克拉拉|丹恒|希儿|布洛妮娅|瓦尔特|杰帕德|佩拉|姬子|艾丝妲|白露|星|穹|桑博|伦纳德|停云|罗刹|卡芙卡|彦卿|史瓦罗|螺丝咕姆|阿兰|银狼|素裳|丹枢|黑塔|景元|帕姆|可可利亚|半夏|符玄|公输师傅|奥列格|青雀|大毫|青镞|费斯曼|绿芙蓉|镜流|信使|丽塔|失落迷迭|缭乱星棘|伊甸|伏特加女孩|狂热蓝调|莉莉娅|萝莎莉娅|八重樱|八重霞|卡莲|第六夜想曲|卡萝尔|姬子|极地战刃|布洛妮娅|次生银翼|理之律者|真理之律者|迷城骇兔|希儿|魇夜星渊|黑希儿|帕朵菲莉丝|天元骑英|幽兰黛尔|德丽莎|月下初拥|朔夜观星|暮光骑士|明日香|李素裳|格蕾修|梅比乌斯|渡鸦|人之律者|爱莉希雅|爱衣|天穹游侠|琪亚娜|空之律者|终焉之律者|薪炎之律者|云墨丹心|符华|识之律者|维尔薇|始源之律者|芽衣|雷之律者|苏莎娜|阿波尼亚|陆景和|莫弈|夏彦|左然|标贝]说(中文)",
+ Help: "- 让[空|荧|派蒙|纳西妲|阿贝多|温迪|枫原万叶|钟离|荒泷一斗|八重神子|艾尔海森|提纳里|迪希雅|卡维|宵宫|莱依拉|赛诺|诺艾尔|托马|凝光|莫娜|北斗|神里绫华|雷电将军|芭芭拉|鹿野院平藏|五郎|迪奥娜|凯亚|安柏|班尼特|琴|柯莱|夜兰|妮露|辛焱|珐露珊|魈|香菱|达达利亚|砂糖|早柚|云堇|刻晴|丽莎|迪卢克|烟绯|重云|珊瑚宫心海|胡桃|可莉|流浪者|久岐忍|神里绫人|甘雨|戴因斯雷布|优菈|菲谢尔|行秋|白术|九条裟罗|雷泽|申鹤|迪娜泽黛|凯瑟琳|多莉|坎蒂丝|萍姥姥|罗莎莉亚|留云借风真君|绮良良|瑶瑶|七七|奥兹|米卡|夏洛蒂|埃洛伊|博士|女士|大慈树王|三月七|娜塔莎|希露瓦|虎克|克拉拉|丹恒|希儿|布洛妮娅|瓦尔特|杰帕德|佩拉|姬子|艾丝妲|白露|星|穹|桑博|伦纳德|停云|罗刹|卡芙卡|彦卿|史瓦罗|螺丝咕姆|阿兰|银狼|素裳|丹枢|黑塔|景元|帕姆|可可利亚|半夏|符玄|公输师傅|奥列格|青雀|大毫|青镞|费斯曼|绿芙蓉|镜流|信使|丽塔|失落迷迭|缭乱星棘|伊甸|伏特加女孩|狂热蓝调|莉莉娅|萝莎莉娅|八重樱|八重霞|卡莲|第六夜想曲|卡萝尔|姬子|极地战刃|布洛妮娅|次生银翼|理之律者|真理之律者|迷城骇兔|希儿|魇夜星渊|黑希儿|帕朵菲莉丝|天元骑英|幽兰黛尔|德丽莎|月下初拥|朔夜观星|暮光骑士|明日香|李素裳|格蕾修|梅比乌斯|渡鸦|人之律者|爱莉希雅|爱衣|天穹游侠|琪亚娜|空之律者|终焉之律者|薪炎之律者|云墨丹心|符华|识之律者|维尔薇|始源之律者|芽衣|雷之律者|苏莎娜|阿波尼亚|陆景和|莫弈|夏彦|左然|标贝]说(中文)",
}).ApplySingle(ctxext.DefaultSingle)
- en.OnRegex("^让(宁宁|爱瑠|芳乃|茉子|丛雨|小春|七海)说([A-Za-z\\s\\d\u3005\u3040-\u30ff\u4e00-\u9fff\uff11-\uff19\uff21-\uff3a\uff41-\uff5a\uff66-\uff9d\\pP]+)$").Limit(ctxext.LimitByGroup).SetBlock(true).
- Handle(func(ctx *zero.Ctx) {
- text := ctx.State["regex_matched"].([]string)[2]
- id := speakers[ctx.State["regex_matched"].([]string)[1]]
- ctx.SendChain(message.Record(fmt.Sprintf(jpapi, url.QueryEscape(text), id)))
- })
- en.OnRegex("^让(Sua|Mimiru|Arin|Yeonhwa|Yuhwa|Seonbae)说([A-Za-z\\s\\d\u3131-\u3163\uac00-\ud7ff\\pP]+)$").Limit(ctxext.LimitByGroup).SetBlock(true).
- Handle(func(ctx *zero.Ctx) {
- text := ctx.State["regex_matched"].([]string)[2]
- id := speakers[ctx.State["regex_matched"].([]string)[1]]
- ctx.SendChain(message.Record(fmt.Sprintf(krapi, url.QueryEscape(text), id)))
- })
en.OnRegex("^让(空|荧|派蒙|纳西妲|阿贝多|温迪|枫原万叶|钟离|荒泷一斗|八重神子|艾尔海森|提纳里|迪希雅|卡维|宵宫|莱依拉|赛诺|诺艾尔|托马|凝光|莫娜|北斗|神里绫华|雷电将军|芭芭拉|鹿野院平藏|五郎|迪奥娜|凯亚|安柏|班尼特|琴|柯莱|夜兰|妮露|辛焱|珐露珊|魈|香菱|达达利亚|砂糖|早柚|云堇|刻晴|丽莎|迪卢克|烟绯|重云|珊瑚宫心海|胡桃|可莉|流浪者|久岐忍|神里绫人|甘雨|戴因斯雷布|优菈|菲谢尔|行秋|白术|九条裟罗|雷泽|申鹤|迪娜泽黛|凯瑟琳|多莉|坎蒂丝|萍姥姥|罗莎莉亚|留云借风真君|绮良良|瑶瑶|七七|奥兹|米卡|夏洛蒂|埃洛伊|博士|女士|大慈树王|三月七|娜塔莎|希露瓦|虎克|克拉拉|丹恒|希儿|布洛妮娅|瓦尔特|杰帕德|佩拉|姬子|艾丝妲|白露|星|穹|桑博|伦纳德|停云|罗刹|卡芙卡|彦卿|史瓦罗|螺丝咕姆|阿兰|银狼|素裳|丹枢|黑塔|景元|帕姆|可可利亚|半夏|符玄|公输师傅|奥列格|青雀|大毫|青镞|费斯曼|绿芙蓉|镜流|信使|丽塔|失落迷迭|缭乱星棘|伊甸|伏特加女孩|狂热蓝调|莉莉娅|萝莎莉娅|八重樱|八重霞|卡莲|第六夜想曲|卡萝尔|姬子|极地战刃|布洛妮娅|次生银翼|理之律者|真理之律者|迷城骇兔|希儿|魇夜星渊|黑希儿|帕朵菲莉丝|天元骑英|幽兰黛尔|德丽莎|月下初拥|朔夜观星|暮光骑士|明日香|李素裳|格蕾修|梅比乌斯|渡鸦|人之律者|爱莉希雅|爱衣|天穹游侠|琪亚娜|空之律者|终焉之律者|薪炎之律者|云墨丹心|符华|识之律者|维尔薇|始源之律者|芽衣|雷之律者|苏莎娜|阿波尼亚|陆景和|莫弈|夏彦|左然|标贝)说([\\s\u4e00-\u9fa5\\pP]+)$").Limit(ctxext.LimitByGroup).SetBlock(true).
Handle(func(ctx *zero.Ctx) {
if 原.k == "" {
diff --git a/plugin/scale/main.go b/plugin/scale/main.go
deleted file mode 100644
index 12fa6fe854..0000000000
--- a/plugin/scale/main.go
+++ /dev/null
@@ -1,152 +0,0 @@
-// Package scale 叔叔的AI二次元图片放大
-package scale
-
-import (
- "bytes"
- "image"
- "math"
- "os"
- "strconv"
- "time"
-
- _ "image/gif" // import gif decoding
- _ "image/jpeg" // import jpg decoding
- _ "image/png" // import png decoding
-
- _ "golang.org/x/image/webp" // import webp decoding
-
- zero "github.com/wdvxdr1123/ZeroBot"
- "github.com/wdvxdr1123/ZeroBot/message"
-
- "github.com/FloatTech/AnimeAPI/nsfw"
- "github.com/FloatTech/AnimeAPI/scale"
- "github.com/FloatTech/imgfactory"
-
- "github.com/FloatTech/floatbox/binary"
- "github.com/FloatTech/floatbox/file"
- "github.com/FloatTech/floatbox/web"
- ctrl "github.com/FloatTech/zbpctrl"
- "github.com/FloatTech/zbputils/control"
- "github.com/FloatTech/zbputils/ctxext"
-)
-
-func init() {
- engine := control.AutoRegister(&ctrl.Options[*zero.Ctx]{
- DisableOnDefault: false,
- Brief: "二次元图片放大",
- Help: "- 放大图片[图片]",
- PrivateDataFolder: "scale",
- }).ApplySingle(ctxext.DefaultSingle)
- cachedir := engine.DataFolder()
- // 上传一张图进行评价
- engine.OnKeywordGroup([]string{"放大图片"}, zero.OnlyGroup, zero.MustProvidePicture, getPara).SetBlock(true).
- Handle(func(ctx *zero.Ctx) {
- url := ctx.State["image_url"].([]string)
- if len(url) > 0 {
- datachan := make(chan []byte, 1)
- var errsub error
- go func() {
- var d []byte
- d, errsub = web.GetData(url[0])
- datachan <- d
- }()
- ctx.SendChain(message.Text("少女祈祷中..."))
-
- p, err := nsfw.Classify(url[0])
- if err != nil {
- ctx.SendChain(message.Text("ERROR: ", err))
- return
- }
- if p.Drawings < 0.1 || p.Neutral > 0.8 {
- ctx.SendChain(message.Text("请发送二次元图片!"))
- return
- }
-
- data := <-datachan
- if errsub != nil {
- ctx.SendChain(message.Text("ERROR: ", errsub))
- return
- }
- im, _, err := image.Decode(bytes.NewReader(data))
- if err != nil {
- ctx.SendChain(message.Text("ERROR: ", err))
- return
- }
- px := im.Bounds().Size().X * im.Bounds().Size().Y
- paras := ctx.State["scale_paras"].([2]int)
-
- if px > 512*512 {
- px = int(math.Pow(float64(px), 0.5) + 0.5)
- x := im.Bounds().Size().X * 512 / px
- y := im.Bounds().Size().Y * 512 / px
- ctx.SendChain(message.Text("图片", im.Bounds().Size().X, "x", im.Bounds().Size().Y, "过大,调整图片至", x, "x", y))
- im = imgfactory.Size(im, x, y).Image()
- w := binary.SelectWriter()
- defer binary.PutWriter(w)
- _, err = imgfactory.WriteTo(im, w)
- if err != nil {
- ctx.SendChain(message.Text("ERROR: ", err))
- return
- }
- data, err = scale.Post(bytes.NewReader(w.Bytes()), paras[0], paras[1], 2)
- } else {
- data, err = scale.Get(url[0], paras[0], paras[1], 2)
- }
- if err != nil {
- ctx.SendChain(message.Text("ERROR: ", err))
- return
- }
-
- n := cachedir + strconv.Itoa(int(ctx.Event.UserID))
- f, err := os.Create(n)
- if err != nil {
- ctx.SendChain(message.Text("ERROR: ", err))
- return
- }
- _, _ = f.Write(data)
- _ = f.Close()
- ctx.SendChain(message.Image("file:///" + file.BOTPATH + "/" + n))
- }
- })
-}
-
-func getPara(ctx *zero.Ctx) bool {
- next := zero.NewFutureEvent("message", 999, false, ctx.CheckSession())
- recv, cancel := next.Repeat()
- i := 0
- paras := [2]int{}
- ctx.SendChain(message.Text("请输入模型序号\n0.", scale.Models[0], "\n1.", scale.Models[1], "\n2.", scale.Models[2], "\n3.", scale.Models[3], "\n4.", scale.Models[4]))
- for {
- select {
- case <-time.After(time.Second * 120):
- cancel()
- return false
- case c := <-recv:
- msg := c.Event.Message.ExtractPlainText()
- num, err := strconv.Atoi(msg)
- if err != nil {
- ctx.SendChain(message.Text("请输入数字!"))
- continue
- }
- switch i {
- case 0:
- if num < 0 || num > 4 {
- ctx.SendChain(message.Text("模型序号非法!"))
- continue
- }
- paras[0] = num
- ctx.SendChain(message.Text("请输入放大倍数(2-4)"))
- case 1:
- if num < 2 || num > 4 {
- ctx.SendChain(message.Text("放大倍数非法!"))
- continue
- }
- cancel()
- paras[1] = num
- ctx.State["scale_paras"] = paras
- return true
- }
- i++
- }
- }
-}
diff --git a/plugin/steam/listenter.go b/plugin/steam/listenter.go
index 25032f983d..25c2c7c7af 100644
--- a/plugin/steam/listenter.go
+++ b/plugin/steam/listenter.go
@@ -57,14 +57,14 @@ func init() {
return
}
// 收集这波用户的streamId,然后查当前的状态,并建立信息映射表
- streamIds := make([]string, len(infos))
+ streamIDs := make([]string, len(infos))
localPlayerMap := make(map[int64]*player)
for i := 0; i < len(infos); i++ {
- streamIds[i] = strconv.FormatInt(infos[i].SteamID, 10)
+ streamIDs[i] = strconv.FormatInt(infos[i].SteamID, 10)
localPlayerMap[infos[i].SteamID] = infos[i]
}
// 将所有用户状态查一遍
- playerStatus, err := getPlayerStatus(streamIds...)
+ playerStatus, err := getPlayerStatus(streamIDs...)
if err != nil {
// 出错就发消息
ctx.SendPrivateMessage(su, message.Text("[steam] ERROR: ", err))
@@ -117,11 +117,11 @@ func init() {
}
// getPlayerStatus 获取用户状态
-func getPlayerStatus(streamIds ...string) ([]*player, error) {
+func getPlayerStatus(streamIDs ...string) ([]*player, error) {
players := make([]*player, 0)
// 拼接请求地址
apiKeyMu.Lock()
- url := fmt.Sprintf(apiurl+statusurl, apiKey, strings.Join(streamIds, ","))
+ url := fmt.Sprintf(apiurl+statusurl, apiKey, strings.Join(streamIDs, ","))
apiKeyMu.Unlock()
// 拉取并解析数据
data, err := web.GetData(url)
diff --git a/plugin/thesaurus/chat.go b/plugin/thesaurus/chat.go
index 99d0f84916..6fc9303823 100644
--- a/plugin/thesaurus/chat.go
+++ b/plugin/thesaurus/chat.go
@@ -178,7 +178,7 @@ func init() {
engine.OnMessage(canmatch(tKAWA), match(chatListK, seg)).
SetBlock(false).
Handle(randreply(sm.K))
- engine.OnMessage(canmatch(tALPACA), func(ctx *zero.Ctx) bool {
+ engine.OnMessage(canmatch(tALPACA), func(_ *zero.Ctx) bool {
return alpacapiurl != "" && alpacatoken != ""
}).SetBlock(false).Handle(func(ctx *zero.Ctx) {
msg := ctx.ExtractPlainText()
diff --git a/plugin/yujn/yujn.go b/plugin/yujn/yujn.go
new file mode 100644
index 0000000000..c25e110204
--- /dev/null
+++ b/plugin/yujn/yujn.go
@@ -0,0 +1,143 @@
+// Package yujn 来源于 https://api.yujn.cn/ 的接口
+package yujn
+
+import (
+ "fmt"
+ "net/url"
+ "strings"
+
+ "github.com/FloatTech/floatbox/binary"
+ "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 (
+ yujnURL = "https://api.yujn.cn"
+ zzxjjURL = yujnURL + "/api/zzxjj.php?type=video"
+ baisisURL = yujnURL + "/api/baisis.php?type=video"
+ heisisURL = yujnURL + "/api/heisis.php?type=video"
+ xjjURL = yujnURL + "/api/xjj.php?type=video"
+ tianmeiURL = yujnURL + "/api/tianmei.php?type=video"
+ ndymURL = yujnURL + "/api/ndym.php?type=video"
+ sbklURL = yujnURL + "/api/sbkl.php?type=video"
+ nvgaoURL = yujnURL + "/api/nvgao.php?type=video"
+ luoliURL = yujnURL + "/api/luoli.php?type=video"
+ yuzuURL = yujnURL + "/api/yuzu.php?type=video"
+ xggURL = yujnURL + "/api/xgg.php?type=video"
+ rewuURL = yujnURL + "/api/rewu.php?type=video"
+ diaodaiURL = yujnURL + "/api/diaodai.php?type=video"
+ hanfuURL = yujnURL + "/api/hanfu.php?type=video"
+ jpyzURL = yujnURL + "/api/jpmt.php?type=video"
+ qingchunURL = yujnURL + "/api/qingchun.php?type=video"
+ ksbianzhuang = yujnURL + "/api/ksbianzhuang.php?type=video"
+ dybianzhuang = yujnURL + "/api/bianzhuang.php?type=video"
+ mengwaURL = yujnURL + "/api/mengwa.php?type=video"
+ chuandaURL = yujnURL + "/api/chuanda.php?type=video"
+ wmscURL = yujnURL + "/api/wmsc.php?type=video"
+ yujieURL = yujnURL + "/api/yujie.php"
+ luchaURL = yujnURL + "/api/lvcha.php"
+ duirenURL = yujnURL + "/api/duiren.php"
+ saohuaURL = yujnURL + "/api/saohua.php"
+ qinghuaURL = yujnURL + "/api/qinghua.php"
+ wuURL = yujnURL + "/api/text_wu.php"
+ wenanURL = yujnURL + "/api/wenan.php"
+ yuyinURL = yujnURL + "/api/yuyin.php?type=json&from=%v&msg=%v"
+)
+
+var (
+ engine = control.AutoRegister(&ctrl.Options[*zero.Ctx]{
+ DisableOnDefault: false,
+ Brief: "遇见API",
+ Help: "- 小姐姐视频\n- 小姐姐视频2\n- 黑丝视频\n- 白丝视频\n" +
+ "- 欲梦视频\n- 甜妹视频\n- 双倍快乐\n- 纯情女高\n" +
+ "- 萝莉视频\n- 玉足视频\n- 帅哥视频\n- 热舞视频\n" +
+ "- 吊带视频\n- 汉服视频\n- 极品狱卒\n- 清纯视频\n" +
+ "- 快手变装\n- 抖音变装\n- 萌娃视频\n- 穿搭视频\n" +
+ "- 完美身材\n- 御姐撒娇\n- 绿茶语音\n- 怼人语音\n" +
+ "- 随机骚话\n- 随机污句子\n- 随机美句\n- 土味情话\n- 让[丁真|陈泽|梅西|孙笑川|科比|懒羊羊|胡桃|雫るる]说我测尼玛",
+ })
+ urlMap = map[string]string{
+ "小姐姐视频": zzxjjURL,
+ "小姐姐视频2": xjjURL,
+ "黑丝视频": heisisURL,
+ "白丝视频": baisisURL,
+ "欲梦视频": ndymURL,
+ "甜妹视频": tianmeiURL,
+ "双倍快乐": sbklURL,
+ "纯情女高": nvgaoURL,
+ "萝莉视频": luoliURL,
+ "玉足视频": yuzuURL,
+ "帅哥视频": xggURL,
+ "热舞视频": rewuURL,
+ "吊带视频": diaodaiURL,
+ "汉服视频": hanfuURL,
+ "极品狱卒": jpyzURL,
+ "清纯视频": qingchunURL,
+ "快手变装": ksbianzhuang,
+ "抖音变装": dybianzhuang,
+ "萌娃视频": mengwaURL,
+ "穿搭视频": chuandaURL,
+ "完美身材": wmscURL,
+ "御姐撒娇": yujieURL,
+ "绿茶语音": luchaURL,
+ "怼人语音": duirenURL,
+ "随机骚话": saohuaURL,
+ "土味情话": qinghuaURL,
+ "随机污句子": wuURL,
+ }
+)
+
+func init() {
+ // 这里是您的处理逻辑的switch case重构版本
+ engine.OnFullMatchGroup([]string{"小姐姐视频", "小姐姐视频2", "黑丝视频", "白丝视频", "欲梦视频", "甜妹视频", "双倍快乐", "纯情女高", "萝莉视频", "玉足视频", "帅哥视频", "热舞视频", "吊带视频", "汉服视频", "极品狱卒", "清纯视频", "快手变装", "抖音变装", "萌娃视频", "穿搭视频", "完美身材"}).SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
+ videoType := ctx.State["matched"].(string) // 假设这是获取消息文本的方式
+ videoURL := urlMap[videoType]
+ ctx.SendChain(message.Video(videoURL))
+ })
+ engine.OnFullMatchGroup([]string{"御姐撒娇", "绿茶语音", "怼人语音"}).SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
+ recordType := ctx.State["matched"].(string) // 假设这是获取消息文本的方式
+ recordURL := urlMap[recordType]
+ ctx.SendChain(message.Record(recordURL))
+ })
+ engine.OnFullMatchGroup([]string{"随机骚话", "土味情话", "随机污句子"}).SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
+ textType := ctx.State["matched"].(string) // 假设这是获取消息文本的方式
+ textURL := urlMap[textType]
+ data, err := web.GetData(textURL)
+ if err != nil {
+ ctx.SendChain(message.Text("ERROR: ", err))
+ return
+ }
+ ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(binary.BytesToString(data)))
+ })
+ engine.OnFullMatch("随机美句").SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
+ data, err := web.GetData(wenanURL)
+ if err != nil {
+ ctx.SendChain(message.Text("ERROR: ", err))
+ return
+ }
+ text := binary.BytesToString(data)
+ text = strings.ReplaceAll(text, "
", "")
+ text = strings.ReplaceAll(text, "
", "")
+ ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text(text))
+ })
+ engine.OnRegex("^让(lulu)说([\\s\u4e00-\u9fa5\u3040-\u309F\u30A0-\u30FF\\w\\p{P}\u3000-\u303F\uFF00-\uFFEF]+)$").Limit(ctxext.LimitByGroup).Handle(func(ctx *zero.Ctx) {
+ name := ctx.State["regex_matched"].([]string)[1]
+ msg := ctx.State["regex_matched"].([]string)[2]
+ data, err := web.GetData(fmt.Sprintf(yuyinURL, url.QueryEscape(name), url.QueryEscape(msg)))
+ if err != nil {
+ ctx.SendChain(message.Text("ERROR: ", err))
+ return
+ }
+ recordURL := gjson.Get(binary.BytesToString(data), "url").String()
+ if recordURL == "" {
+ ctx.SendChain(message.Text("ERROR: 语音生成失败"))
+ return
+ }
+ ctx.SendChain(message.Record(recordURL))
+ })
+}
diff --git a/winres/winres.json b/winres/winres.json
index 5627491279..41e9fe6431 100644
--- a/winres/winres.json
+++ b/winres/winres.json
@@ -12,7 +12,7 @@
"0409": {
"identity": {
"name": "ZeroBot-Plugin",
- "version": "1.7.6.1905"
+ "version": "1.7.7.1918"
},
"description": "",
"minimum-os": "vista",
@@ -36,23 +36,23 @@
"#1": {
"0000": {
"fixed": {
- "file_version": "1.7.6.1905",
- "product_version": "v1.7.6",
- "timestamp": "2023-11-08T14:13:49+08:00"
+ "file_version": "1.7.7.1918",
+ "product_version": "v1.7.7",
+ "timestamp": "2024-04-01T21:35:17+08:00"
},
"info": {
"0409": {
"Comments": "OneBot plugins based on ZeroBot",
"CompanyName": "FloatTech",
"FileDescription": "https://github.com/FloatTech/ZeroBot-Plugin",
- "FileVersion": "1.7.6.1905",
+ "FileVersion": "1.7.7.1918",
"InternalName": "",
- "LegalCopyright": "© 2020 - 2023 FloatTech. All Rights Reserved.",
+ "LegalCopyright": "© 2020 - 2024 FloatTech. All Rights Reserved.",
"LegalTrademarks": "",
"OriginalFilename": "ZBP.EXE",
"PrivateBuild": "",
"ProductName": "ZeroBot-Plugin",
- "ProductVersion": "v1.7.6",
+ "ProductVersion": "v1.7.7",
"SpecialBuild": ""
}
}