diff --git a/go.mod b/go.mod index 34e03418..4823642e 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module github.com/FloatTech/ZeroBot-Plugin go 1.17 require ( - github.com/FloatTech/AnimeAPI v1.2.4-fix13 - github.com/FloatTech/zbputils v1.2.4-fix7 + github.com/FloatTech/AnimeAPI v1.2.5-beta1 + github.com/FloatTech/zbputils v1.2.5-beta1 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 4e972e3c..9de3aebe 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,8 @@ -github.com/FloatTech/AnimeAPI v1.2.4-fix13 h1:sAaVw946DMId2absfBQTlbcBWwZ02CRgpitTs/vm3r4= -github.com/FloatTech/AnimeAPI v1.2.4-fix13/go.mod h1:ttVc5AiHkQOGOjKgrAS0yZFRefGwlMsBCxFwEPXznYs= +github.com/FloatTech/AnimeAPI v1.2.5-beta1 h1:Iv/Uy7ODu06Rd0n9CzUsivfHfI/Nmg4cHHdMU5j6FX4= +github.com/FloatTech/AnimeAPI v1.2.5-beta1/go.mod h1:tWU3xDvkSqnFD8SCTS5oko1UhkVlrNLK6PmN0ea6n6Q= github.com/FloatTech/bot-manager v1.0.0/go.mod h1:8YYRJ16oroGHQGD2En0oVnmcKJkxR9O/jd5BPSfWfOQ= -github.com/FloatTech/zbputils v1.2.4-fix7 h1:rgjiy9b/vkqUDmRjrjzGlSjKCNPMY+0dybuhar2CfF4= -github.com/FloatTech/zbputils v1.2.4-fix7/go.mod h1:1VE4gxnrr+uRz/TDPgx3GT8GmVayoF5e0wolBQU3t+k= +github.com/FloatTech/zbputils v1.2.5-beta1 h1:wptmjPpsaoK77igPKFmdUB86AWPyNyuEtT7LNYt2t4U= +github.com/FloatTech/zbputils v1.2.5-beta1/go.mod h1:1VE4gxnrr+uRz/TDPgx3GT8GmVayoF5e0wolBQU3t+k= github.com/Mrs4s/MiraiGo v0.0.0-20211120033824-43b23f4e6fcb h1:Rkj28fqIwGx/EgBzRYtpmJRfH6wqVn7cNdc7aJ0QE4M= github.com/Mrs4s/MiraiGo v0.0.0-20211120033824-43b23f4e6fcb/go.mod h1:imVKbfKqqeit+C/eaWGb4MKQ3z3gN6pRpBU5RMtp5so= github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= diff --git a/plugin_nativesetu/data.go b/plugin_nativesetu/data.go index 60074eb2..b12a795d 100644 --- a/plugin_nativesetu/data.go +++ b/plugin_nativesetu/data.go @@ -5,6 +5,7 @@ import ( "image" "io/fs" "os" + "strings" "sync" "github.com/corona10/goimagehash" @@ -24,11 +25,7 @@ type setuclass struct { Path string `db:"path"` // Path 图片路径 } -var ( - setuclasses []string - db = &sql.Sqlite{DBPath: dbfile} - mu sync.RWMutex -) +var ns *nsetu func init() { go func() { @@ -44,24 +41,33 @@ func init() { logrus.Println("[nsetu] set setu dir to", setupath) } } - if file.IsExist(dbfile) { - err := db.Open() - if err == nil { - setuclasses, err = db.ListTables() - } - if err != nil { - logrus.Errorln("[nsetu]", err) - } - } + ns = &nsetu{db: &sql.Sqlite{DBPath: dbfile}} }() } -func scanall(path string) error { - setuclasses = nil +type nsetu struct { + db *sql.Sqlite + mu sync.RWMutex +} + +func (n *nsetu) List() (l []string) { + if file.IsExist(n.db.DBPath) { + err := n.db.Open() + if err == nil { + l, err = n.db.ListTables() + } + if err != nil { + logrus.Errorln("[nsetu]", err) + } + } + return +} + +func (n *nsetu) scanall(path string) error { model := &setuclass{} root := os.DirFS(path) - _ = db.Close() - _ = os.Remove(dbfile) + _ = n.db.Close() + _ = os.Remove(n.db.DBPath) return fs.WalkDir(root, ".", func(path string, d fs.DirEntry, err error) error { if err != nil { return err @@ -69,12 +75,11 @@ func scanall(path string) error { if d.IsDir() { clsn := d.Name() if clsn != "." { - mu.Lock() - err = db.Create(clsn, model) - setuclasses = append(setuclasses, clsn) - mu.Unlock() + n.mu.Lock() + err = n.db.Create(clsn, model) + n.mu.Unlock() if err == nil { - err = scanclass(root, path, clsn) + err = n.scanclass(root, path, clsn) if err != nil { logrus.Errorln("[nsetu]", err) return err @@ -86,17 +91,21 @@ func scanall(path string) error { }) } -func scanclass(root fs.FS, path, clsn string) error { +func (n *nsetu) scanclass(root fs.FS, path, clsn string) error { ds, err := fs.ReadDir(root, path) if err != nil { return err } - mu.Lock() - _ = db.Truncate(clsn) - mu.Unlock() + n.mu.Lock() + _ = n.db.Truncate(clsn) + n.mu.Unlock() for _, d := range ds { - if !d.IsDir() { - relpath := path + "/" + d.Name() + nm := d.Name() + ln := strings.ToLower(nm) + if !d.IsDir() && + (strings.HasSuffix(ln, ".jpg") || strings.HasSuffix(ln, ".jpeg") || + strings.HasSuffix(ln, ".png") || strings.HasSuffix(ln, ".gif") || strings.HasSuffix(ln, ".webp")) { + relpath := path + "/" + nm logrus.Debugln("[nsetu] read", relpath) f, e := fs.ReadFile(root, relpath) if e != nil { @@ -112,10 +121,10 @@ func scanclass(root fs.FS, path, clsn string) error { return e } dhi := int64(dh.GetHash()) - logrus.Debugln("[nsetu] insert", d.Name(), "with id", dhi, "into", clsn) - mu.Lock() - err = db.Insert(clsn, &setuclass{ImgID: dhi, Name: d.Name(), Path: relpath}) - mu.Unlock() + logrus.Debugln("[nsetu] insert", nm, "with id", dhi, "into", clsn) + n.mu.Lock() + err = n.db.Insert(clsn, &setuclass{ImgID: dhi, Name: nm, Path: relpath}) + n.mu.Unlock() if err != nil { return err } diff --git a/plugin_nativesetu/main.go b/plugin_nativesetu/main.go index f5001cd4..ff9cd2fd 100644 --- a/plugin_nativesetu/main.go +++ b/plugin_nativesetu/main.go @@ -36,13 +36,13 @@ func init() { "- 刷新所有本地setu\n" + "- 所有本地setu分类", }) - engine.OnRegex(`^本地(.*)$`, func(ctx *zero.Ctx) bool { return rule.FirstValueInList(setuclasses)(ctx) }).SetBlock(true). + engine.OnRegex(`^本地(.*)$`, rule.FirstValueInList(ns)).SetBlock(true). Handle(func(ctx *zero.Ctx) { imgtype := ctx.State["regex_matched"].([]string)[1] sc := new(setuclass) - mu.RLock() - err := db.Pick(imgtype, sc) - mu.RUnlock() + ns.mu.RLock() + err := ns.db.Pick(imgtype, sc) + ns.mu.RUnlock() if err != nil { ctx.SendChain(message.Text("ERROR: ", err)) } else { @@ -50,10 +50,10 @@ func init() { ctx.SendChain(message.Text(imgtype, ": ", sc.Name, "\n"), message.Image(p)) } }) - engine.OnRegex(`^刷新本地(.*)$`, func(ctx *zero.Ctx) bool { return rule.FirstValueInList(setuclasses)(ctx) }, zero.SuperUserPermission).SetBlock(true). + engine.OnRegex(`^刷新本地(.*)$`, rule.FirstValueInList(ns), zero.SuperUserPermission).SetBlock(true). Handle(func(ctx *zero.Ctx) { imgtype := ctx.State["regex_matched"].([]string)[1] - err := scanclass(os.DirFS(setupath), imgtype, imgtype) + err := ns.scanclass(os.DirFS(setupath), imgtype, imgtype) if err == nil { ctx.SendChain(message.Text("成功!")) } else { @@ -72,7 +72,7 @@ func init() { }) engine.OnFullMatch("刷新所有本地setu", zero.SuperUserPermission).SetBlock(true). Handle(func(ctx *zero.Ctx) { - err := scanall(setupath) + err := ns.scanall(setupath) if err == nil { ctx.SendChain(message.Text("成功!")) } else { @@ -82,9 +82,9 @@ func init() { engine.OnFullMatch("所有本地setu分类").SetBlock(true). Handle(func(ctx *zero.Ctx) { msg := "所有本地setu分类" - mu.RLock() - for i, c := range setuclasses { - n, err := db.Count(c) + ns.mu.RLock() + for i, c := range ns.List() { + n, err := ns.db.Count(c) if err == nil { msg += fmt.Sprintf("\n%02d. %s(%d)", i, c, n) } else { @@ -92,7 +92,7 @@ func init() { logrus.Errorln("[nsetu]", err) } } - mu.RUnlock() + ns.mu.RUnlock() ctx.SendChain(message.Text(msg)) }) } diff --git a/plugin_setutime/setu_geter.go b/plugin_setutime/setu_geter.go index 9b3269d5..3b59b0b3 100644 --- a/plugin_setutime/setu_geter.go +++ b/plugin_setutime/setu_geter.go @@ -35,7 +35,7 @@ type imgpool struct { pool map[string][]*pixiv.Illust } -func (p *imgpool) list() (l []string) { +func (p *imgpool) List() (l []string) { var err error l, err = p.db.ListTables() if err != nil { @@ -44,7 +44,32 @@ func (p *imgpool) list() (l []string) { return l } +var pool *imgpool + func init() { // 插件主体 + _ = os.MkdirAll("data/SetuTime", 0755) + + go func() { + process.SleepAbout1sTo2s() + pool = &imgpool{ + db: &sql.Sqlite{DBPath: "data/SetuTime/SetuTime.db"}, + path: pixiv.CacheDir, + max: 10, + pool: map[string][]*pixiv.Illust{}, + } + // 如果数据库不存在则下载 + _, _ = fileutil.GetLazyData(pool.db.DBPath, false, false) + err := pool.db.Open() + if err != nil { + panic(err) + } + for _, imgtype := range pool.List() { + if err := pool.db.Create(imgtype, &pixiv.Illust{}); err != nil { + panic(err) + } + } + }() + limit := rate.NewManager(time.Minute*1, 5) engine := control.Register("setutime", order.PrioSetuTime, &control.Options{ DisableOnDefault: false, @@ -54,29 +79,7 @@ func init() { // 插件主体 "- 删除[涩图/二次元/风景/车万][P站图片ID]\n" + "- >setu status", }) - process.SleepAbout1sTo2s() - pool := func() *imgpool { - cache := &imgpool{ - db: &sql.Sqlite{DBPath: "data/SetuTime/SetuTime.db"}, - path: pixiv.CacheDir, - max: 10, - pool: map[string][]*pixiv.Illust{}, - } - _ = os.MkdirAll("data/SetuTime", 0755) - // 如果数据库不存在则下载 - _, _ = fileutil.GetLazyData(cache.db.DBPath, false, false) - err := cache.db.Open() - if err != nil { - panic(err) - } - for _, imgtype := range cache.list() { - if err := cache.db.Create(imgtype, &pixiv.Illust{}); err != nil { - panic(err) - } - } - return cache - }() - engine.OnRegex(`^来份(.*)$`, rule.FirstValueInList(pool.list())).SetBlock(true). + engine.OnRegex(`^来份(.*)$`, rule.FirstValueInList(pool)).SetBlock(true). Handle(func(ctx *zero.Ctx) { if !limit.Load(ctx.Event.UserID).Acquire() { ctx.SendChain(message.Text("请稍后重试0x0...")) @@ -114,7 +117,7 @@ func init() { // 插件主体 ctx.SendChain(message.Text("成功向分类", imgtype, "添加图片", id)) }) - engine.OnRegex(`^删除(.*?)(\d+)$`, rule.FirstValueInList(pool.list()), zero.SuperUserPermission).SetBlock(true). + engine.OnRegex(`^删除(.*?)(\d+)$`, rule.FirstValueInList(pool), zero.SuperUserPermission).SetBlock(true). Handle(func(ctx *zero.Ctx) { var ( imgtype = ctx.State["regex_matched"].([]string)[1] @@ -132,7 +135,7 @@ func init() { // 插件主体 engine.OnFullMatchGroup([]string{">setu status"}).SetBlock(true). Handle(func(ctx *zero.Ctx) { state := []string{"[SetuTime]"} - for _, imgtype := range pool.list() { + for _, imgtype := range pool.List() { num, err := pool.db.Count(imgtype) if err != nil { num = 0