From a5130cd7f6eca002b7f98e0e868886911151cc16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 1 May 2024 02:17:46 +0900 Subject: [PATCH] =?UTF-8?q?chore:=20del=20aipaint=20due=20to=20=E8=BF=87?= =?UTF-8?q?=E6=B0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 ---- main.go | 1 - plugin/aipaint/aipaint.go | 224 -------------------------------------- plugin/aipaint/config.go | 56 ---------- plugin/aipaint/context.go | 41 ------- plugin/aipaint/img2img.go | 88 --------------- 6 files changed, 434 deletions(-) delete mode 100644 plugin/aipaint/aipaint.go delete mode 100644 plugin/aipaint/config.go delete mode 100644 plugin/aipaint/context.go delete mode 100644 plugin/aipaint/img2img.go diff --git a/README.md b/README.md index 9ee01c87..88978ae4 100644 --- a/README.md +++ b/README.md @@ -373,30 +373,6 @@ print("run[CQ:image,file="+j["img"]+"]") - [x] 设置默认限速为每 m [分钟 | 秒] n 次触发 - -
- ai绘图 - - `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin/aipaint"` - - - [x] [ ai绘图 | 生成色图 | 生成涩图 | ai画图 ] xxx - - - [x] [ ai高级绘图 | 高级生成色图 | 高级生成涩图 | ai高级画图 ] xxx - - - [x] [ 以图绘图 | 以图生图 | 以图画图 ] xxx [图片]|@xxx|[qq号] - - - [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 - - 通过 http://91.217.139.190:5010/token 获取token -
AIWife diff --git a/main.go b/main.go index 715a8d82..a83933be 100644 --- a/main.go +++ b/main.go @@ -62,7 +62,6 @@ import ( _ "github.com/FloatTech/ZeroBot-Plugin/plugin/ahsai" // ahsai tts _ "github.com/FloatTech/ZeroBot-Plugin/plugin/aifalse" // 服务器监控 - _ "github.com/FloatTech/ZeroBot-Plugin/plugin/aipaint" // ai绘图 _ "github.com/FloatTech/ZeroBot-Plugin/plugin/aiwife" // 随机老婆 _ "github.com/FloatTech/ZeroBot-Plugin/plugin/alipayvoice" // 支付宝到账语音 _ "github.com/FloatTech/ZeroBot-Plugin/plugin/autowithdraw" // 触发者撤回时也自动撤回 diff --git a/plugin/aipaint/aipaint.go b/plugin/aipaint/aipaint.go deleted file mode 100644 index 6e370a64..00000000 --- a/plugin/aipaint/aipaint.go +++ /dev/null @@ -1,224 +0,0 @@ -// Package aipaint ai绘图 -package aipaint - -import ( - "encoding/base64" - "encoding/json" - "fmt" - "net/url" - "os" - "regexp" - "strconv" - "strings" - "time" - - "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" - zero "github.com/wdvxdr1123/ZeroBot" - "github.com/wdvxdr1123/ZeroBot/message" -) - -var ( - datapath string - predictRe = regexp.MustCompile(`{"steps".+?}`) - // 参考host http://91.217.139.190:5010 http://91.216.169.75:5010 - aipaintTxt2ImgURL = "/got_image?token=%v&tags=%v" - aipaintImg2ImgURL = "/got_image2image?token=%v&tags=%v" - cfg = newServerConfig("data/aipaint/config.json") -) - -type result struct { - Steps int `json:"steps"` - Sampler string `json:"sampler"` - Seed int `json:"seed"` - Strength float64 `json:"strength"` - Noise float64 `json:"noise"` - Scale float64 `json:"scale"` - Uc string `json:"uc"` -} - -func (r *result) String() string { - return fmt.Sprintf("steps: %v\nsampler: %v\nseed: %v\nstrength: %v\nnoise: %v\nscale: %v\nuc: %v\n", r.Steps, r.Sampler, r.Seed, r.Strength, r.Noise, r.Scale, r.Uc) -} - -func init() { // 插件主体 - engine := control.AutoRegister(&ctrl.Options[*zero.Ctx]{ - DisableOnDefault: false, - Brief: "ai绘图", - Help: "- [ ai绘图 | 生成色图 | 生成涩图 | ai画图 ] xxx\n" + - "- [ ai高级绘图 | 高级生成色图 | 高级生成涩图 | ai高级画图 ] [prompt]\n" + - "- 设置ai绘图配置 [server] [token]\n" + - "- 设置ai绘图撤回时间90s\n" + - "- 查看ai绘图配置\n" + - "Tips: 使用前请先前往 http://91.217.139.190:5010/token 按提示获取token" + - "设置token示例(请确保是主人并且响应): 设置ai绘图配置 http://91.217.139.190:5010 [token] (中括号无需输入)\n" + - "参考服务器 http://91.217.139.190:5010, http://91.216.169.75:5010, http://185.80.202.180:5010\n" + - "[prompt]参数如下\n" + - "tags:tag词条\nntags:ntag词条\nshape:[Portrait|Landscape|Square]\nscale:[6:20]\nseed:种子\nstrength:[0-1] 建议0-0.7\nnoise:[0-1] 建议0-0.15" + - "参数与参数内容用:连接,每个参数之间用回车分割", - PrivateDataFolder: "aipaint", - }) - datapath = file.BOTPATH + "/" + engine.DataFolder() - if file.IsNotExist(cfg.file) { - s := serverConfig{} - data, err := json.Marshal(s) - if err != nil { - panic(err) - } - err = os.WriteFile(cfg.file, data, 0666) - if err != nil { - panic(err) - } - } - engine.OnPrefixGroup([]string{`ai绘图`, `生成色图`, `生成涩图`, `ai画图`}).SetBlock(true). - Handle(func(ctx *zero.Ctx) { - 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(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, cfg.Interval) - }) - engine.OnPrefixGroup([]string{`ai高级绘图`, `高级生成色图`, `高级生成涩图`, `ai高级画图`}).SetBlock(true). - Handle(func(ctx *zero.Ctx) { - err := cfg.load() - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - tags := make(map[string]string) - args := strings.Split(ctx.State["args"].(string), "\n") - if len(args) < 1 { - ctx.SendChain(message.Text("ERROR: 请输入正确的参数")) - return - } - for _, info := range args { - value := strings.Split(info, ":") - if len(value) > 1 { - if value[0] == "R18" && value[1] == "1" { - value[1] = "0" - ctx.SendChain(message.Text("不准涩涩! 已将R18设置为0. ")) - } - tags[value[0]] = strings.Join(value[1:], ":") - } - } - ctx.SendChain(message.Text("少女祈祷中...")) - apiurl := "/got_image?token=" + cfg.Token - if _, ok := tags["tags"]; ok { - apiurl += "&tags=" + url.QueryEscape(strings.ReplaceAll(strings.TrimSpace(tags["tags"]), " ", "%20")) - } - if _, ok := tags["ntags"]; ok { - apiurl += "&ntags=" + url.QueryEscape(strings.ReplaceAll(strings.TrimSpace(tags["ntags"]), " ", "%20")) - } - if _, ok := tags["R18"]; ok { - apiurl += "&R18=" + url.QueryEscape(strings.TrimSpace(tags["R18"])) - } - if _, ok := tags["shape"]; ok { - apiurl += "&shape=" + url.QueryEscape(strings.TrimSpace(tags["shape"])) - } - if _, ok := tags["scale"]; ok { - apiurl += "&scale=" + url.QueryEscape(strings.TrimSpace(tags["scale"])) - } - if _, ok := tags["seed"]; ok { - apiurl += "&seed=" + url.QueryEscape(strings.TrimSpace(tags["seed"])) - } - if _, ok := tags["strength"]; ok { - apiurl += "&strength=" + url.QueryEscape(strings.TrimSpace(tags["strength"])) - } - if _, ok := tags["noise"]; ok { - apiurl += "&noise=" + url.QueryEscape(strings.TrimSpace(tags["noise"])) - } - data, err := web.GetData(cfg.BaseURL + apiurl) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - sendAiImg(ctx, data, cfg.Interval) - }) - engine.OnRegex(`^设置ai绘图配置\s(.*[^\s$])\s(.+)$`, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). - Handle(func(ctx *zero.Ctx) { - regexMatched := ctx.State["regex_matched"].([]string) - err := cfg.load() - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - err = cfg.update(regexMatched[1], regexMatched[2], cfg.Interval) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - ctx.SendChain(message.Text("成功设置\nbase_url: ", cfg.BaseURL, "\ntoken: ", cfg.Token, "\ninterval: ", cfg.Interval)) - }) - 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 - } - ctx.SendChain(message.Text("成功设置撤回时间为", cfg.Interval, "s")) - }) - engine.OnFullMatch(`查看ai绘图配置`, zero.OnlyPrivate, zero.SuperUserPermission).SetBlock(true). - Handle(func(ctx *zero.Ctx) { - err := cfg.load() - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - ctx.SendChain(message.Text("base_url: ", cfg.BaseURL, "\ntoken: ", cfg.Token, "\ninterval: ", cfg.Interval)) - }) -} - -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] - } - var r result - if loadData != "" { - err := json.Unmarshal(binary.StringToBytes(loadData), &r) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - r.Uc, err = url.QueryUnescape(r.Uc) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - } - encodeStr := base64.StdEncoding.EncodeToString(data) - m := message.Message{ctxext.FakeSenderForwardNode(ctx, message.Image("base64://"+encodeStr))} - m = append(m, ctxext.FakeSenderForwardNode(ctx, message.Text(r.String()))) - if mid := ctx.Send(m); mid.ID() == 0 { - ctx.SendChain(message.Text("ERROR: 可能被风控或下载图片用时过长,请耐心等待")) - } else if interval > 0 { - go func(i message.MessageID) { - time.Sleep(time.Duration(interval) * time.Second) - ctx.DeleteMessage(i) - }(mid) - } -} diff --git a/plugin/aipaint/config.go b/plugin/aipaint/config.go deleted file mode 100644 index 12f80967..00000000 --- a/plugin/aipaint/config.go +++ /dev/null @@ -1,56 +0,0 @@ -package aipaint - -import ( - "encoding/json" - "errors" - "os" - - "github.com/FloatTech/floatbox/file" -) - -// 配置结构体 -type serverConfig struct { - BaseURL string `json:"base_url"` - Token string `json:"token"` - Interval int `json:"interval"` - file string -} - -func newServerConfig(file string) *serverConfig { - return &serverConfig{ - file: file, - } -} - -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 - } - defer reader.Close() - return json.NewEncoder(reader).Encode(cfg) -} - -func (cfg *serverConfig) load() (err error) { - if cfg.BaseURL != "" && cfg.Token != "" && cfg.Interval != 0 { - return - } - if file.IsNotExist(cfg.file) { - err = errors.New("no server config") - return - } - reader, err := os.Open(cfg.file) - if err != nil { - return - } - defer reader.Close() - err = json.NewDecoder(reader).Decode(cfg) - return -} diff --git a/plugin/aipaint/context.go b/plugin/aipaint/context.go deleted file mode 100644 index 5e7dbc96..00000000 --- a/plugin/aipaint/context.go +++ /dev/null @@ -1,41 +0,0 @@ -package aipaint - -import ( - "os" - "strconv" - "strings" - - "github.com/FloatTech/floatbox/file" - "github.com/FloatTech/floatbox/process" -) - -type context struct { - usrdir string - headimgsdir []string -} - -func newContext(user int64) *context { - c := new(context) - c.usrdir = datapath + "users/" + strconv.FormatInt(user, 10) + `/` - _ = os.MkdirAll(c.usrdir, 0755) - c.headimgsdir = make([]string, 2) - c.headimgsdir[0] = c.usrdir + "0.gif" - c.headimgsdir[1] = c.usrdir + "1.gif" - return c -} - -func (cc *context) prepareLogos(s ...string) error { - for i, v := range s { - _, err := strconv.Atoi(v) - if err != nil { - err = file.DownloadTo("https://gchat.qpic.cn/gchatpic_new//--"+strings.ToUpper(v)+"/0", cc.usrdir+strconv.Itoa(i)+".gif") - } else { - err = file.DownloadTo("http://q4.qlogo.cn/g?b=qq&nk="+v+"&s=640", cc.usrdir+strconv.Itoa(i)+".gif") - } - if err != nil { - return err - } - process.SleepAbout1sTo2s() - } - return nil -} diff --git a/plugin/aipaint/img2img.go b/plugin/aipaint/img2img.go deleted file mode 100644 index 75c48ba7..00000000 --- a/plugin/aipaint/img2img.go +++ /dev/null @@ -1,88 +0,0 @@ -// Package aipaint ai绘图 -package aipaint - -import ( - "bytes" - "fmt" - "image" - "net/url" - "os" - "strconv" - "strings" - - "github.com/FloatTech/floatbox/file" - "github.com/FloatTech/floatbox/web" - "github.com/FloatTech/imgfactory" - ctrl "github.com/FloatTech/zbpctrl" - "github.com/FloatTech/zbputils/control" - zero "github.com/wdvxdr1123/ZeroBot" - "github.com/wdvxdr1123/ZeroBot/message" -) - -func init() { // 插件主体 - engine := control.Register("img2img", &ctrl.Options[*zero.Ctx]{ - DisableOnDefault: true, - Brief: "以图绘图", - Help: "- [ 以图绘图 | 以图生图 | 以图画图 ] xxx [图片]|@xxx|[qq号]\n" + - "- 官方以图绘图api已失效 需要自建api 其他配置参数同ai绘图", - PrivateDataFolder: "img2img", - }) - datapath = file.BOTPATH + "/" + engine.DataFolder() - engine.OnRegex(`^(以图绘图|以图生图|以图画图)[\s\S]*?(\[CQ:(image\,file=([0-9a-zA-Z]{32}).*|at.+?(\d{5,11}))\].*|(\d+))$`).SetBlock(true). - Handle(func(ctx *zero.Ctx) { - err := cfg.load() - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - c := newContext(ctx.Event.UserID) - list := ctx.State["regex_matched"].([]string) - err = c.prepareLogos(list[4]+list[5]+list[6], strconv.FormatInt(ctx.Event.UserID, 10)) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - args := strings.TrimSuffix(strings.TrimPrefix(list[0], list[1]), list[2]) - if args == "" { - ctx.SendChain(message.Text("ERROR: 以图绘图必须添加tag")) - return - } - ctx.SendChain(message.Text("少女祈祷中...")) - 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 { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - defer f.Close() - - img, _, err := image.Decode(f) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - imageShape := "" - switch { - case img.Bounds().Dx() > img.Bounds().Dy(): - imageShape = "Landscape" - case img.Bounds().Dx() == img.Bounds().Dy(): - imageShape = "Square" - default: - imageShape = "Portrait" - } - - // 图片转base64 - base64Bytes, err := imgfactory.ToBase64(img) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - data, err := web.PostData(postURL+"&shape="+imageShape, "text/plain", bytes.NewReader(base64Bytes)) - if err != nil { - ctx.SendChain(message.Text("ERROR: ", err)) - return - } - sendAiImg(ctx, data, cfg.Interval) - }) -}