diff --git a/README.md b/README.md index 5da037c1f7..a877dda8fc 100644 --- a/README.md +++ b/README.md @@ -633,6 +633,20 @@ print("run[CQ:image,file="+j["img"]+"]") - [x] 教你一篇小作文[作文] + +
+ 女装 + + `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/dress"` + + - [x] 女装 + + - [x] 男装 + + - [x] 随机女装 + + - [x] 随机男装 +
漂流瓶 diff --git a/main.go b/main.go index df2699c54d..a2eaae9e17 100644 --- a/main.go +++ b/main.go @@ -78,6 +78,7 @@ import ( _ "github.com/FloatTech/ZeroBot-Plugin/plugin/cpstory" // cp短打 _ "github.com/FloatTech/ZeroBot-Plugin/plugin/danbooru" // DeepDanbooru二次元图标签识别 _ "github.com/FloatTech/ZeroBot-Plugin/plugin/diana" // 嘉心糖发病 + _ "github.com/FloatTech/ZeroBot-Plugin/plugin/dress" // 女装 _ "github.com/FloatTech/ZeroBot-Plugin/plugin/drift_bottle" // 漂流瓶 _ "github.com/FloatTech/ZeroBot-Plugin/plugin/emojimix" // 合成emoji _ "github.com/FloatTech/ZeroBot-Plugin/plugin/epidemic" // 城市疫情查询 @@ -136,7 +137,7 @@ import ( _ "github.com/FloatTech/ZeroBot-Plugin/plugin/wenxinAI" // 百度文心AI画图 _ "github.com/FloatTech/ZeroBot-Plugin/plugin/word_count" // 聊天热词 _ "github.com/FloatTech/ZeroBot-Plugin/plugin/wordle" // 猜单词 - _ "github.com/FloatTech/ZeroBot-Plugin/plugin/ygo" // 游戏王相关插件 + _ "github.com/FloatTech/ZeroBot-Plugin/plugin/ygo" // 游戏王相关插件 _ "github.com/FloatTech/ZeroBot-Plugin/plugin/ymgal" // 月幕galgame // _ "github.com/FloatTech/ZeroBot-Plugin/plugin/wtf" // 鬼东西 diff --git a/plugin/dress/api.go b/plugin/dress/api.go new file mode 100644 index 0000000000..f0ec077511 --- /dev/null +++ b/plugin/dress/api.go @@ -0,0 +1,39 @@ +package dress + +import ( + "fmt" + + "github.com/FloatTech/floatbox/web" + "github.com/tidwall/gjson" +) + +const ( + dressURL = "http://www.yoooooooooo.com/gitdress" + male = "dress" + female = "girldress" + dressListURL = dressURL + "/%v/album/list.json" + dressDetailURL = dressURL + "/%v/album/%v/info.json" + dressImageURL = dressURL + "/%v/album/%v/%v-m.webp" +) + +func dressList(sex string) (dressList []string, err error) { + data, err := web.GetData(fmt.Sprintf(dressListURL, sex)) + if err != nil { + return + } + arr := gjson.ParseBytes(data).Get("@this").Array() + dressList = make([]string, len(arr)) + for i, v := range arr { + dressList[i] = v.String() + } + return +} + +func detail(sex, name string) (count int, err error) { + data, err := web.GetData(fmt.Sprintf(dressDetailURL, sex, name)) + if err != nil { + return + } + count = int(gjson.ParseBytes(data).Get("@this.#").Int()) + return +} diff --git a/plugin/dress/dress.go b/plugin/dress/dress.go new file mode 100644 index 0000000000..e9b22f6244 --- /dev/null +++ b/plugin/dress/dress.go @@ -0,0 +1,113 @@ +// Package dress 女装 +package dress + +import ( + "fmt" + "math/rand" + "strconv" + "strings" + "time" + + "github.com/FloatTech/floatbox/binary" + ctrl "github.com/FloatTech/zbpctrl" + "github.com/FloatTech/zbputils/control" + "github.com/FloatTech/zbputils/ctxext" + "github.com/FloatTech/zbputils/img/text" + zero "github.com/wdvxdr1123/ZeroBot" + "github.com/wdvxdr1123/ZeroBot/message" +) + +func init() { // 插件主体 + engine := control.Register("dress", &ctrl.Options[*zero.Ctx]{ + DisableOnDefault: false, + Brief: "女装", + Help: "女装\n" + + "- 女装\n" + + "- 男装\n" + + "- 随机女装\n" + + "- 随机男装", + PrivateDataFolder: "dress", + }) + engine.OnFullMatchGroup([]string{"女装", "男装"}).SetBlock(true). + Handle(func(ctx *zero.Ctx) { + matched := ctx.State["matched"].(string) + sex := male + if matched == "男装" { + sex = female + } + next := zero.NewFutureEvent("message", 999, false, ctx.CheckSession()) + recv, cancel := next.Repeat() + defer cancel() + nameList, err := dressList(sex) + if err != nil { + ctx.SendChain(message.Text("ERROR: ", err)) + return + } + tex := "请输入" + matched + "序号\n" + for i, v := range nameList { + tex += fmt.Sprintf("%d. %s\n", i, v) + } + base64Str, err := text.RenderToBase64(tex, text.FontFile, 400, 20) + if err != nil { + ctx.SendChain(message.Text("ERROR: ", err)) + return + } + ctx.SendChain(message.Image("base64://" + binary.BytesToString(base64Str))) + for { + select { + case <-time.After(time.Second * 120): + ctx.SendChain(message.Text(matched, "指令过期")) + return + case c := <-recv: + msg := c.Event.Message.ExtractPlainText() + num, err := strconv.Atoi(msg) + if err != nil { + ctx.SendChain(message.Text("请输入数字!")) + continue + } + if num < 0 || num >= len(nameList) { + ctx.SendChain(message.Text("序号非法!")) + continue + } + name := nameList[num] + sendImage(ctx, sex, matched, name) + return + } + } + }) + engine.OnFullMatchGroup([]string{"随机女装", "随机男装"}).SetBlock(true). + Handle(func(ctx *zero.Ctx) { + matched := strings.TrimPrefix(ctx.State["matched"].(string), "随机") + sex := male + if matched == "男装" { + sex = female + } + nameList, err := dressList(sex) + if err != nil { + ctx.SendChain(message.Text("ERROR: ", err)) + return + } + name := nameList[rand.Intn(len(nameList))] + sendImage(ctx, sex, matched, name) + }) +} + +func sendImage(ctx *zero.Ctx, sex, matched, name string) { + ctx.SendChain(message.Text("请欣赏", matched, ": ", name)) + count, err := detail(sex, name) + if err != nil { + ctx.SendChain(message.Text("ERROR: ", err)) + return + } + imageList := make([]string, count) + for i := range imageList { + imageList[i] = fmt.Sprintf(dressImageURL, sex, name, i+1) + } + m := message.Message{} + for _, v := range imageList { + m = append(m, ctxext.FakeSenderForwardNode(ctx, message.Image(v))) + } + if id := ctx.Send(m).ID(); id == 0 { + ctx.SendChain(message.Text("ERROR: 可能被风控或下载图片用时过长,请耐心等待")) + } +}