diff --git a/go.mod b/go.mod index 80fc0c23..1d924b52 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,9 @@ module github.com/FloatTech/ZeroBot-Plugin go 1.17 require ( - github.com/FloatTech/AnimeAPI v1.3.0-beta6 + github.com/FloatTech/AnimeAPI v1.3.0-beta7 github.com/FloatTech/sqlite v0.1.0 - github.com/FloatTech/zbputils v1.3.0-beta6 + github.com/FloatTech/zbputils v1.3.0-beta7 github.com/antchfx/htmlquery v1.2.4 github.com/corona10/goimagehash v1.0.3 github.com/fogleman/gg v1.3.0 diff --git a/go.sum b/go.sum index a2ceaffb..b97f3e30 100644 --- a/go.sum +++ b/go.sum @@ -1,10 +1,10 @@ -github.com/FloatTech/AnimeAPI v1.3.0-beta6 h1:u4I6I4HvIyJZqmRgvPtguvopEenjdxk4fXIjpqzdRyE= -github.com/FloatTech/AnimeAPI v1.3.0-beta6/go.mod h1:MXGvC1Od3MuycW825f7HBaaIO7YPaFjdh+CnJeO7Cmw= +github.com/FloatTech/AnimeAPI v1.3.0-beta7 h1:IdusxP4eFRk3ghU/+4CtAd5xPe0xGa6pK/k2CzlYORM= +github.com/FloatTech/AnimeAPI v1.3.0-beta7/go.mod h1:vqOt05nnc7vwEvAJfnRw37OLmrxoMCzLzDdCBLYknXg= github.com/FloatTech/bot-manager v1.0.0/go.mod h1:8YYRJ16oroGHQGD2En0oVnmcKJkxR9O/jd5BPSfWfOQ= github.com/FloatTech/sqlite v0.1.0 h1:Geh6Z+DWZXmyXVOhM0U2oXT7b1Ob6sQtuyjInk+MCUk= github.com/FloatTech/sqlite v0.1.0/go.mod h1:XS0oeSqtH6lFzpPRiDE9fV6+zMcuUF5/6o+tQVO1QZE= -github.com/FloatTech/zbputils v1.3.0-beta6 h1:dqmsBoC6xnPf05aFr+OA4ru8iqXKktkIxLw6LOUOMnk= -github.com/FloatTech/zbputils v1.3.0-beta6/go.mod h1:P3tTFIIQJs/cijG80jwxrs0NBGISEDkXtrZhiev/eMk= +github.com/FloatTech/zbputils v1.3.0-beta7 h1:An+//viWflHwuG/1Z3NPbUjOO0XNsd60+b0c4vJm9I0= +github.com/FloatTech/zbputils v1.3.0-beta7/go.mod h1:P3tTFIIQJs/cijG80jwxrs0NBGISEDkXtrZhiev/eMk= github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc h1:AAx50/fb/xS4lvsdQg+bFbGvqSDhyV1MF+p2PLCamZ0= github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc/go.mod h1:OMmITAib6POA37xCichWM0aRnoVpSMZO1rB/G01wrr0= diff --git a/plugin_ai_reply/tts.go b/plugin_ai_reply/tts.go index 50a7334e..11692da2 100644 --- a/plugin_ai_reply/tts.go +++ b/plugin_ai_reply/tts.go @@ -5,8 +5,8 @@ import ( "github.com/wdvxdr1123/ZeroBot/message" "github.com/FloatTech/AnimeAPI/aireply" - "github.com/FloatTech/AnimeAPI/mockingbird" - control "github.com/FloatTech/zbputils/control" + "github.com/FloatTech/AnimeAPI/tts/mockingbird" + "github.com/FloatTech/zbputils/control" "github.com/FloatTech/zbputils/ctxext" "github.com/FloatTech/zbputils/control/order" @@ -20,7 +20,7 @@ func init() { Handle(func(ctx *zero.Ctx) { msg := ctx.ExtractPlainText() r := aireply.NewAIReply(getReplyMode(ctx)) - ctx.SendChain(message.Record(mockingbird.Speak(ctx.Event.UserID, func() string { + ctx.SendChain(message.Record(mockingbird.NewMockingBirdTTS(1).Speak(ctx.Event.UserID, func() string { return r.TalkPlain(msg, zero.BotConfig.NickName[0]) }))) }) diff --git a/plugin_gif/context.go b/plugin_gif/context.go index ed84d87d..d99987bc 100644 --- a/plugin_gif/context.go +++ b/plugin_gif/context.go @@ -3,8 +3,10 @@ package gif import ( "os" "strconv" + "sync" "github.com/FloatTech/zbputils/file" + "github.com/FloatTech/zbputils/img" "github.com/sirupsen/logrus" ) @@ -13,36 +15,51 @@ type context struct { headimgsdir []string } -func dlchan(name string, c *chan *string) { +func dlchan(name string, s *string, wg *sync.WaitGroup, exit func(error)) { + defer wg.Done() target := datapath + `materials/` + name + var err error if file.IsNotExist(target) { - _ = file.DownloadTo(`https://codechina.csdn.net/u011570312/imagematerials/-/raw/main/`+name, target, true) + err = file.DownloadTo(`https://codechina.csdn.net/u011570312/imagematerials/-/raw/main/`+name, target, true) + if err != nil { + exit(err) + return + } + logrus.Debugln("[gif] dl", name, "to", target, "succeeded") } else { - logrus.Debugln("[gif] dl", name, "exists") + logrus.Debugln("[gif] dl", name, "exists at", target) } - *c <- &target + *s = target } -func dlblock(name string) string { +func dlblock(name string) (string, error) { target := datapath + `materials/` + name if file.IsNotExist(target) { - _ = file.DownloadTo(`https://codechina.csdn.net/u011570312/imagematerials/-/raw/main/`+name, target, true) + err := file.DownloadTo(`https://codechina.csdn.net/u011570312/imagematerials/-/raw/main/`+name, target, true) + if err != nil { + return "", err + } + logrus.Debugln("[gif] dl", name, "to", target, "succeeded") } else { - logrus.Debugln("[gif] dl", name, "exists") + logrus.Debugln("[gif] dl", name, "exists at", target) } - return target + return target, nil } -func dlrange(prefix string, end int) *[]chan *string { +func dlrange(prefix string, end int, wg *sync.WaitGroup, exit func(error)) []string { if file.IsNotExist(datapath + `materials/` + prefix) { - _ = os.MkdirAll(datapath+`materials/`+prefix, 0755) + err := os.MkdirAll(datapath+`materials/`+prefix, 0755) + if err != nil { + exit(err) + return nil + } } - c := make([]chan *string, end) + c := make([]string, end) for i := range c { - c[i] = make(chan *string) - go dlchan(prefix+"/"+strconv.Itoa(i)+".png", &c[i]) + wg.Add(1) + go dlchan(prefix+"/"+strconv.Itoa(i)+".png", &c[i], wg, exit) } - return &c + return c } // 新的上下文 @@ -55,3 +72,14 @@ func newContext(user int64) *context { c.headimgsdir[1] = c.usrdir + "1.gif" return c } + +func LoadFirstFrames(paths []string, size int) (imgs []*img.ImgFactory, err error) { + imgs = make([]*img.ImgFactory, size) + for i := range imgs { + imgs[i], err = img.LoadFirstFrame(paths[i], 0, 0) + if err != nil { + return nil, err + } + } + return imgs, nil +} diff --git a/plugin_gif/gif.go b/plugin_gif/gif.go index 64a6e27d..34dfe8f9 100644 --- a/plugin_gif/gif.go +++ b/plugin_gif/gif.go @@ -2,160 +2,344 @@ package gif import ( "image" + "sync" "github.com/FloatTech/zbputils/img" "github.com/FloatTech/zbputils/img/writer" ) -// 摸 -func (cc *context) mo() string { +// A摸 +func (cc *context) A摸() (string, error) { + var wg sync.WaitGroup + var err error + var m sync.Mutex name := cc.usrdir + "摸.gif" - c := dlrange("mo", 5) - tou := img.LoadFirstFrame(cc.headimgsdir[0], 0, 0).Circle(0).Im - mo := []*image.NRGBA{ - img.LoadFirstFrame(*<-(*c)[0], 0, 0).InsertBottom(tou, 80, 80, 32, 32).Im, - img.LoadFirstFrame(*<-(*c)[1], 0, 0).InsertBottom(tou, 70, 90, 42, 22).Im, - img.LoadFirstFrame(*<-(*c)[2], 0, 0).InsertBottom(tou, 75, 85, 37, 27).Im, - img.LoadFirstFrame(*<-(*c)[3], 0, 0).InsertBottom(tou, 85, 75, 27, 37).Im, - img.LoadFirstFrame(*<-(*c)[4], 0, 0).InsertBottom(tou, 90, 70, 22, 42).Im, + c := dlrange("mo", 5, &wg, func(e error) { + m.Lock() + err = e + m.Unlock() + }) + if err != nil { + return "", err } - _ = writer.SaveGIF2Path(name, img.MergeGif(1, mo)) - return "file:///" + name + tou, err := cc.getLogo(0, 0) + if err != nil { + return "", err + } + wg.Wait() + if err != nil { + return "", err + } + imgs, err := LoadFirstFrames(c, 5) + if err != nil { + return "", err + } + mo := []*image.NRGBA{ + imgs[0].InsertBottom(tou, 80, 80, 32, 32).Im, + imgs[1].InsertBottom(tou, 70, 90, 42, 22).Im, + imgs[2].InsertBottom(tou, 75, 85, 37, 27).Im, + imgs[3].InsertBottom(tou, 85, 75, 27, 37).Im, + imgs[4].InsertBottom(tou, 90, 70, 22, 42).Im, + } + return "file:///" + name, writer.SaveGIF2Path(name, img.MergeGif(1, mo)) } -// 搓 -func (cc *context) cuo() string { +// A搓 +func (cc *context) A搓() (string, error) { + var wg sync.WaitGroup + var err error + var m sync.Mutex name := cc.usrdir + "搓.gif" - c := dlrange("cuo", 5) - tou := img.LoadFirstFrame(cc.headimgsdir[0], 110, 110).Circle(0).Im + c := dlrange("cuo", 5, &wg, func(e error) { + m.Lock() + err = e + m.Unlock() + }) + if err != nil { + return "", err + } + tou, err := cc.getLogo(110, 110) + if err != nil { + return "", err + } m1 := img.Rotate(tou, 72, 0, 0) m2 := img.Rotate(tou, 144, 0, 0) m3 := img.Rotate(tou, 216, 0, 0) m4 := img.Rotate(tou, 288, 0, 0) + wg.Wait() + if err != nil { + return "", err + } + imgs, err := LoadFirstFrames(c, 5) + if err != nil { + return "", err + } cuo := []*image.NRGBA{ - img.LoadFirstFrame(*<-(*c)[0], 0, 0).InsertBottomC(tou, 0, 0, 75, 130).Im, - img.LoadFirstFrame(*<-(*c)[1], 0, 0).InsertBottomC(m1.Im, 0, 0, 75, 130).Im, - img.LoadFirstFrame(*<-(*c)[2], 0, 0).InsertBottomC(m2.Im, 0, 0, 75, 130).Im, - img.LoadFirstFrame(*<-(*c)[3], 0, 0).InsertBottomC(m3.Im, 0, 0, 75, 130).Im, - img.LoadFirstFrame(*<-(*c)[4], 0, 0).InsertBottomC(m4.Im, 0, 0, 75, 130).Im, + imgs[0].InsertBottomC(tou, 0, 0, 75, 130).Im, + imgs[1].InsertBottomC(m1.Im, 0, 0, 75, 130).Im, + imgs[2].InsertBottomC(m2.Im, 0, 0, 75, 130).Im, + imgs[3].InsertBottomC(m3.Im, 0, 0, 75, 130).Im, + imgs[4].InsertBottomC(m4.Im, 0, 0, 75, 130).Im, } - _ = writer.SaveGIF2Path(name, img.MergeGif(5, cuo)) - return "file:///" + name + return "file:///" + name, writer.SaveGIF2Path(name, img.MergeGif(5, cuo)) } -// 敲 -func (cc *context) qiao() string { +// A敲 +func (cc *context) A敲() (string, error) { + var wg sync.WaitGroup + var err error + var m sync.Mutex name := cc.usrdir + "敲.gif" - c := dlrange("qiao", 2) - tou := img.LoadFirstFrame(cc.headimgsdir[0], 40, 40).Circle(0).Im + c := dlrange("qiao", 2, &wg, func(e error) { + m.Lock() + err = e + m.Unlock() + }) + if err != nil { + return "", err + } + tou, err := cc.getLogo(40, 40) + if err != nil { + return "", err + } + wg.Wait() + if err != nil { + return "", err + } + imgs, err := LoadFirstFrames(c, 2) + if err != nil { + return "", err + } qiao := []*image.NRGBA{ - img.LoadFirstFrame(*<-(*c)[0], 0, 0).InsertUp(tou, 40, 33, 57, 52).Im, - img.LoadFirstFrame(*<-(*c)[1], 0, 0).InsertUp(tou, 38, 36, 58, 50).Im, + imgs[0].InsertUp(tou, 40, 33, 57, 52).Im, + imgs[1].InsertUp(tou, 38, 36, 58, 50).Im, } - _ = writer.SaveGIF2Path(name, img.MergeGif(1, qiao)) - return "file:///" + name + return "file:///" + name, writer.SaveGIF2Path(name, img.MergeGif(1, qiao)) } -// 吃 -func (cc *context) chi() string { +// A吃 +func (cc *context) A吃() (string, error) { + var wg sync.WaitGroup + var err error + var m sync.Mutex name := cc.usrdir + "吃.gif" - c := dlrange("chi", 3) - tou := img.LoadFirstFrame(cc.headimgsdir[0], 32, 32).Im + c := dlrange("chi", 3, &wg, func(e error) { + m.Lock() + err = e + m.Unlock() + }) + if err != nil { + return "", err + } + tou, err := cc.getLogo(32, 32) + if err != nil { + return "", err + } + wg.Wait() + if err != nil { + return "", err + } + imgs, err := LoadFirstFrames(c, 3) + if err != nil { + return "", err + } chi := []*image.NRGBA{ - img.LoadFirstFrame(*<-(*c)[0], 0, 0).InsertBottom(tou, 0, 0, 1, 38).Im, - img.LoadFirstFrame(*<-(*c)[1], 0, 0).InsertBottom(tou, 0, 0, 1, 38).Im, - img.LoadFirstFrame(*<-(*c)[2], 0, 0).InsertBottom(tou, 0, 0, 1, 38).Im, + imgs[0].InsertBottom(tou, 0, 0, 1, 38).Im, + imgs[1].InsertBottom(tou, 0, 0, 1, 38).Im, + imgs[2].InsertBottom(tou, 0, 0, 1, 38).Im, } - _ = writer.SaveGIF2Path(name, img.MergeGif(1, chi)) - return "file:///" + name + return "file:///" + name, writer.SaveGIF2Path(name, img.MergeGif(1, chi)) } -// 蹭 -func (cc *context) ceng() string { +// A蹭 +func (cc *context) A蹭() (string, error) { + var wg sync.WaitGroup + var err error + var m sync.Mutex name := cc.usrdir + "蹭.gif" - c := dlrange("ceng", 6) - tou := img.LoadFirstFrame(cc.headimgsdir[0], 100, 100).Circle(0).Im - tou2 := img.LoadFirstFrame(cc.headimgsdir[1], 100, 100).Circle(0).Im + c := dlrange("ceng", 6, &wg, func(e error) { + m.Lock() + err = e + m.Unlock() + }) + if err != nil { + return "", err + } + tou, err := cc.getLogo(100, 100) + if err != nil { + return "", err + } + tou2, err := cc.getLogo2(100, 100) + if err != nil { + return "", err + } + wg.Wait() + if err != nil { + return "", err + } + imgs, err := LoadFirstFrames(c, 6) + if err != nil { + return "", err + } ceng := []*image.NRGBA{ - img.LoadFirstFrame(*<-(*c)[0], 0, 0).InsertUp(tou, 75, 77, 40, 88).InsertUp(tou2, 77, 103, 102, 81).Im, - img.LoadFirstFrame(*<-(*c)[1], 0, 0).InsertUp(tou, 75, 77, 46, 100).InsertUp(img.Rotate(tou2, 10, 62, 127).Im, 0, 0, 92, 40).Im, - img.LoadFirstFrame(*<-(*c)[2], 0, 0).InsertUp(tou, 75, 77, 67, 99).InsertUp(tou2, 76, 117, 90, 8).Im, - img.LoadFirstFrame(*<-(*c)[3], 0, 0).InsertUp(tou, 75, 77, 52, 83).InsertUp(img.Rotate(tou2, -40, 94, 94).Im, 0, 0, 53, -20).Im, - img.LoadFirstFrame(*<-(*c)[4], 0, 0).InsertUp(tou, 75, 77, 56, 110).InsertUp(img.Rotate(tou2, -66, 132, 80).Im, 0, 0, 78, 40).Im, - img.LoadFirstFrame(*<-(*c)[5], 0, 0).InsertUp(tou, 75, 77, 62, 102).InsertUp(tou2, 71, 100, 110, 94).Im, + imgs[0].InsertUp(tou, 75, 77, 40, 88).InsertUp(tou2, 77, 103, 102, 81).Im, + imgs[1].InsertUp(tou, 75, 77, 46, 100).InsertUp(img.Rotate(tou2, 10, 62, 127).Im, 0, 0, 92, 40).Im, + imgs[2].InsertUp(tou, 75, 77, 67, 99).InsertUp(tou2, 76, 117, 90, 8).Im, + imgs[3].InsertUp(tou, 75, 77, 52, 83).InsertUp(img.Rotate(tou2, -40, 94, 94).Im, 0, 0, 53, -20).Im, + imgs[4].InsertUp(tou, 75, 77, 56, 110).InsertUp(img.Rotate(tou2, -66, 132, 80).Im, 0, 0, 78, 40).Im, + imgs[5].InsertUp(tou, 75, 77, 62, 102).InsertUp(tou2, 71, 100, 110, 94).Im, } - _ = writer.SaveGIF2Path(name, img.MergeGif(8, ceng)) - return "file:///" + name + return "file:///" + name, writer.SaveGIF2Path(name, img.MergeGif(8, ceng)) } -// 啃 -func (cc *context) ken() string { +// A啃 +func (cc *context) A啃() (string, error) { + var wg sync.WaitGroup + var err error + var m sync.Mutex name := cc.usrdir + "啃.gif" - c := dlrange("ken", 16) - tou := img.LoadFirstFrame(cc.headimgsdir[0], 100, 100).Im + c := dlrange("ken", 16, &wg, func(e error) { + m.Lock() + err = e + m.Unlock() + }) + if err != nil { + return "", err + } + tou, err := cc.getLogo(100, 100) + if err != nil { + return "", err + } + wg.Wait() + if err != nil { + return "", err + } + imgs, err := LoadFirstFrames(c, 16) + if err != nil { + return "", err + } ken := []*image.NRGBA{ - img.LoadFirstFrame(*<-(*c)[0], 0, 0).InsertBottom(tou, 90, 90, 105, 150).Im, - img.LoadFirstFrame(*<-(*c)[1], 0, 0).InsertBottom(tou, 90, 83, 96, 172).Im, - img.LoadFirstFrame(*<-(*c)[2], 0, 0).InsertBottom(tou, 90, 90, 106, 148).Im, - img.LoadFirstFrame(*<-(*c)[3], 0, 0).InsertBottom(tou, 88, 88, 97, 167).Im, - img.LoadFirstFrame(*<-(*c)[4], 0, 0).InsertBottom(tou, 90, 85, 89, 179).Im, - img.LoadFirstFrame(*<-(*c)[5], 0, 0).InsertBottom(tou, 90, 90, 106, 151).Im, - img.LoadFirstFrame(*<-(*c)[6], 0, 0).Im, - img.LoadFirstFrame(*<-(*c)[7], 0, 0).Im, - img.LoadFirstFrame(*<-(*c)[8], 0, 0).Im, - img.LoadFirstFrame(*<-(*c)[9], 0, 0).Im, - img.LoadFirstFrame(*<-(*c)[10], 0, 0).Im, - img.LoadFirstFrame(*<-(*c)[11], 0, 0).Im, - img.LoadFirstFrame(*<-(*c)[12], 0, 0).Im, - img.LoadFirstFrame(*<-(*c)[13], 0, 0).Im, - img.LoadFirstFrame(*<-(*c)[14], 0, 0).Im, - img.LoadFirstFrame(*<-(*c)[15], 0, 0).Im, + imgs[0].InsertBottom(tou, 90, 90, 105, 150).Im, + imgs[1].InsertBottom(tou, 90, 83, 96, 172).Im, + imgs[2].InsertBottom(tou, 90, 90, 106, 148).Im, + imgs[3].InsertBottom(tou, 88, 88, 97, 167).Im, + imgs[4].InsertBottom(tou, 90, 85, 89, 179).Im, + imgs[5].InsertBottom(tou, 90, 90, 106, 151).Im, + imgs[6].Im, + imgs[7].Im, + imgs[8].Im, + imgs[9].Im, + imgs[10].Im, + imgs[11].Im, + imgs[12].Im, + imgs[13].Im, + imgs[14].Im, + imgs[15].Im, } - _ = writer.SaveGIF2Path(name, img.MergeGif(7, ken)) - return "file:///" + name + return "file:///" + name, writer.SaveGIF2Path(name, img.MergeGif(7, ken)) } -// 拍 -func (cc *context) pai() string { +// A拍 +func (cc *context) A拍() (string, error) { + var wg sync.WaitGroup + var err error + var m sync.Mutex name := cc.usrdir + "拍.gif" - c := dlrange("pai", 2) - tou := img.LoadFirstFrame(cc.headimgsdir[0], 30, 30).Circle(0).Im + c := dlrange("pai", 2, &wg, func(e error) { + m.Lock() + err = e + m.Unlock() + }) + if err != nil { + return "", err + } + tou, err := cc.getLogo(30, 30) + if err != nil { + return "", err + } + wg.Wait() + if err != nil { + return "", err + } + imgs, err := LoadFirstFrames(c, 2) + if err != nil { + return "", err + } pai := []*image.NRGBA{ - img.LoadFirstFrame(*<-(*c)[0], 0, 0).InsertUp(tou, 0, 0, 1, 47).Im, - img.LoadFirstFrame(*<-(*c)[1], 0, 0).InsertUp(tou, 0, 0, 1, 67).Im, + imgs[0].InsertUp(tou, 0, 0, 1, 47).Im, + imgs[1].InsertUp(tou, 0, 0, 1, 67).Im, } - _ = writer.SaveGIF2Path(name, img.MergeGif(1, pai)) - return "file:///" + name + return "file:///" + name, writer.SaveGIF2Path(name, img.MergeGif(1, pai)) } -// 冲 -func (cc *context) chong() string { +// A冲 +func (cc *context) A冲() (string, error) { + var wg sync.WaitGroup + var err error + var m sync.Mutex name := cc.usrdir + "冲.gif" - c := dlrange("xqe", 2) - tou := img.LoadFirstFrame(cc.headimgsdir[0], 0, 0).Circle(0).Im - chong := []*image.NRGBA{ - img.LoadFirstFrame(*<-(*c)[0], 0, 0).InsertUp(tou, 30, 30, 15, 53).Im, - img.LoadFirstFrame(*<-(*c)[1], 0, 0).InsertUp(tou, 30, 30, 40, 53).Im, + c := dlrange("xqe", 2, &wg, func(e error) { + m.Lock() + err = e + m.Unlock() + }) + if err != nil { + return "", err } - _ = writer.SaveGIF2Path(name, img.MergeGif(1, chong)) - return "file:///" + name + tou, err := cc.getLogo(0, 0) + if err != nil { + return "", err + } + wg.Wait() + if err != nil { + return "", err + } + imgs, err := LoadFirstFrames(c, 2) + if err != nil { + return "", err + } + chong := []*image.NRGBA{ + imgs[0].InsertUp(tou, 30, 30, 15, 53).Im, + imgs[1].InsertUp(tou, 30, 30, 40, 53).Im, + } + return "file:///" + name, writer.SaveGIF2Path(name, img.MergeGif(1, chong)) } -// 丢 -func (cc *context) diu() string { +// A丢 +func (cc *context) A丢() (string, error) { + var wg sync.WaitGroup + var err error + var m sync.Mutex name := cc.usrdir + "丢.gif" - c := dlrange("diu", 8) - tou := img.LoadFirstFrame(cc.headimgsdir[0], 0, 0).Circle(0).Im - diu := []*image.NRGBA{ - img.LoadFirstFrame(*<-(*c)[0], 0, 0).InsertUp(tou, 32, 32, 108, 36).Im, - img.LoadFirstFrame(*<-(*c)[1], 0, 0).InsertUp(tou, 32, 32, 122, 36).Im, - img.LoadFirstFrame(*<-(*c)[2], 0, 0).Im, - img.LoadFirstFrame(*<-(*c)[3], 0, 0).InsertUp(tou, 123, 123, 19, 129).Im, - img.LoadFirstFrame(*<-(*c)[4], 0, 0).InsertUp(tou, 185, 185, -50, 200).InsertUp(tou, 33, 33, 289, 70).Im, - img.LoadFirstFrame(*<-(*c)[5], 0, 0).InsertUp(tou, 32, 32, 280, 73).Im, - img.LoadFirstFrame(*<-(*c)[6], 0, 0).InsertUp(tou, 35, 35, 259, 31).Im, - img.LoadFirstFrame(*<-(*c)[7], 0, 0).InsertUp(tou, 175, 175, -50, 220).Im, + c := dlrange("diu", 8, &wg, func(e error) { + m.Lock() + err = e + m.Unlock() + }) + if err != nil { + return "", err } - _ = writer.SaveGIF2Path(name, img.MergeGif(7, diu)) - return "file:///" + name + tou, err := cc.getLogo(0, 0) + if err != nil { + return "", err + } + wg.Wait() + if err != nil { + return "", err + } + imgs, err := LoadFirstFrames(c, 8) + if err != nil { + return "", err + } + diu := []*image.NRGBA{ + imgs[0].InsertUp(tou, 32, 32, 108, 36).Im, + imgs[1].InsertUp(tou, 32, 32, 122, 36).Im, + imgs[2].Im, + imgs[3].InsertUp(tou, 123, 123, 19, 129).Im, + imgs[4].InsertUp(tou, 185, 185, -50, 200).InsertUp(tou, 33, 33, 289, 70).Im, + imgs[5].InsertUp(tou, 32, 32, 280, 73).Im, + imgs[6].InsertUp(tou, 35, 35, 259, 31).Im, + imgs[7].InsertUp(tou, 175, 175, -50, 220).Im, + } + return "file:///" + name, writer.SaveGIF2Path(name, img.MergeGif(7, diu)) } diff --git a/plugin_gif/logo.go b/plugin_gif/logo.go index 9be8c093..c942294f 100644 --- a/plugin_gif/logo.go +++ b/plugin_gif/logo.go @@ -1,19 +1,41 @@ package gif import ( + "image" "strconv" "strings" "github.com/FloatTech/zbputils/file" + "github.com/FloatTech/zbputils/img" ) -func (cc *context) prepareLogos(s ...string) { +func (cc *context) prepareLogos(s ...string) error { for i, v := range s { _, err := strconv.Atoi(v) if err != nil { - _ = file.DownloadTo("https://gchat.qpic.cn/gchatpic_new//--"+strings.ToUpper(v)+"/0", cc.usrdir+strconv.Itoa(i)+".gif", true) + err = file.DownloadTo("https://gchat.qpic.cn/gchatpic_new//--"+strings.ToUpper(v)+"/0", cc.usrdir+strconv.Itoa(i)+".gif", true) } else { - _ = file.DownloadTo("http://q4.qlogo.cn/g?b=qq&nk="+v+"&s=640", cc.usrdir+strconv.Itoa(i)+".gif", true) + err = file.DownloadTo("http://q4.qlogo.cn/g?b=qq&nk="+v+"&s=640", cc.usrdir+strconv.Itoa(i)+".gif", true) + } + if err != nil { + return err } } + return nil +} + +func (cc *context) getLogo(w int, h int) (*image.NRGBA, error) { + frame, err := img.LoadFirstFrame(cc.headimgsdir[0], w, h) + if err != nil { + return nil, err + } + return frame.Circle(0).Im, nil +} + +func (cc *context) getLogo2(w int, h int) (*image.NRGBA, error) { + frame, err := img.LoadFirstFrame(cc.headimgsdir[1], w, h) + if err != nil { + return nil, err + } + return frame.Circle(0).Im, nil } diff --git a/plugin_gif/png.go b/plugin_gif/png.go index 198dd554..4714c3be 100644 --- a/plugin_gif/png.go +++ b/plugin_gif/png.go @@ -1,6 +1,7 @@ package gif import ( + "errors" "image" "math/rand" "strconv" @@ -9,62 +10,85 @@ import ( "github.com/FloatTech/zbputils/img/writer" ) -// 爬 -func (cc *context) pa() string { +// A爬 +func (cc *context) A爬() (string, error) { name := cc.usrdir + `爬.png` - tou := img.LoadFirstFrame(cc.headimgsdir[0], 0, 0).Circle(0).Im + tou, err := cc.getLogo(0, 0) + if err != nil { + return "", err + } // 随机爬图序号 rand := rand.Intn(60) + 1 - dc := img.LoadFirstFrame(dlblock(`pa/`+strconv.Itoa(rand)+`.png`), 0, 0). - InsertBottom(tou, 100, 100, 0, 400).Im - _ = writer.SavePNG2Path(name, dc) - return "file:///" + name + f, err := dlblock(`pa/` + strconv.Itoa(rand) + `.png`) + if err != nil { + return "", err + } + imgf, err := img.LoadFirstFrame(f, 0, 0) + if err != nil { + return "", err + } + return "file:///" + name, writer.SavePNG2Path(name, imgf.InsertBottom(tou, 100, 100, 0, 400).Im) } -// 撕 -func (cc *context) si() string { +// A撕 +func (cc *context) A撕() (string, error) { name := cc.usrdir + `撕.png` - tou := img.LoadFirstFrame(cc.headimgsdir[0], 0, 0).Im + tou, err := cc.getLogo(0, 0) + if err != nil { + return "", err + } im1 := img.Rotate(tou, 20, 380, 380) im2 := img.Rotate(tou, -12, 380, 380) - dc := img.LoadFirstFrame(dlblock(`si/0.png`), 0, 0). - InsertBottom(im1.Im, im1.W, im1.H, -3, 370). - InsertBottom(im2.Im, im2.W, im2.H, 653, 310).Im - _ = writer.SavePNG2Path(name, dc) - return "file:///" + name + f, err := dlblock(`si/0.png`) + if err != nil { + return "", err + } + imgf, err := img.LoadFirstFrame(f, 0, 0) + if err != nil { + return "", err + } + return "file:///" + name, writer.SavePNG2Path(name, imgf.InsertBottom(im1.Im, im1.W, im1.H, -3, 370).InsertBottom(im2.Im, im2.W, im2.H, 653, 310).Im) } // 简单 -func (cc *context) other(value ...string) string { +func (cc *context) other(value ...string) (string, error) { name := cc.usrdir + value[0] + `.png` // 加载图片 - im := img.LoadFirstFrame(cc.headimgsdir[0], 0, 0) - var a *image.NRGBA - + im, err := img.LoadFirstFrame(cc.headimgsdir[0], 0, 0) + if err != nil { + return "", err + } + var imgnrgba *image.NRGBA switch value[0] { case "上翻", "下翻": - a = im.FlipV().Im + imgnrgba = im.FlipV().Im case "左翻", "右翻": - a = im.FlipH().Im + imgnrgba = im.FlipH().Im case "反色": - a = im.Invert().Im + imgnrgba = im.Invert().Im case "灰度": - a = im.Grayscale().Im + imgnrgba = im.Grayscale().Im case "负片": - a = im.Invert().Grayscale().Im + imgnrgba = im.Invert().Grayscale().Im case "浮雕": - a = im.Convolve3x3().Im + imgnrgba = im.Convolve3x3().Im case "打码": - a = im.Blur(10).Im + imgnrgba = im.Blur(10).Im case "旋转": r, _ := strconv.ParseFloat(value[1], 64) - a = img.Rotate(im.Im, r, 0, 0).Im + imgnrgba = img.Rotate(im.Im, r, 0, 0).Im case "变形": - w, _ := strconv.Atoi(value[1]) - h, _ := strconv.Atoi(value[2]) - a = img.Size(im.Im, w, h).Im + w, err := strconv.Atoi(value[1]) + if err != nil { + return "", err + } + h, err := strconv.Atoi(value[2]) + if err != nil { + return "", err + } + imgnrgba = img.Size(im.Im, w, h).Im + default: + return "", errors.New("no such method") } - - _ = writer.SavePNG2Path(name, a) - return "file:///" + name + return "file:///" + name, writer.SavePNG2Path(name, imgnrgba) } diff --git a/plugin_gif/run.go b/plugin_gif/run.go index 1f6c1125..a7d492d9 100644 --- a/plugin_gif/run.go +++ b/plugin_gif/run.go @@ -4,6 +4,7 @@ package gif import ( "math/rand" "os" + "reflect" "strconv" "strings" "time" @@ -24,11 +25,7 @@ var ( ) func init() { // 插件主体 - _ = os.RemoveAll(datapath) // 清除缓存图片 - err := os.MkdirAll(datapath, 0755) - if err != nil { - panic(err) - } + _ = os.MkdirAll(datapath, 0755) rand.Seed(time.Now().UnixNano()) // 设置种子 control.Register("gif", order.AcquirePrio(), &control.Options{ DisableOnDefault: false, @@ -39,31 +36,19 @@ func init() { // 插件主体 list := ctx.State["regex_matched"].([]string) c.prepareLogos(list[4]+list[5]+list[6], strconv.FormatInt(ctx.Event.UserID, 10)) var picurl string - switch list[1] { - case "爬": - picurl = c.pa() - case "摸": - picurl = c.mo() - case "吃": - picurl = c.chi() - case "啃": - picurl = c.ken() - case "蹭": - picurl = c.ceng() - case "敲": - picurl = c.qiao() - case "搓": - picurl = c.cuo() - case "拍": - picurl = c.pai() - case "丢": - picurl = c.diu() - case "撕": - picurl = c.si() - case "冲": - picurl = c.chong() - default: - picurl = c.other(list[1]) // "灰度", "上翻", "下翻", "左翻", "右翻", "反色", "倒放", "浮雕", "打码", "负片" + var err error + if len([]rune(list[1])) == 1 { + r := reflect.ValueOf(c).MethodByName("A" + list[1]).Call(nil) + picurl = r[0].String() + if !r[1].IsNil() { + err = r[1].Interface().(error) + } + } else { + picurl, err = c.other(list[1]) // "灰度", "上翻", "下翻", "左翻", "右翻", "反色", "倒放", "浮雕", "打码", "负片" + } + if err != nil { + ctx.SendChain(message.Text("ERROR:", err)) + return } ctx.SendChain(message.Image(picurl)) })