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: 可能被风控或下载图片用时过长,请耐心等待"))
+ }
+}