mirror of
https://github.com/FloatTech/ZeroBot-Plugin.git
synced 2025-12-19 13:59:39 +08:00
97 lines
1.9 KiB
Go
97 lines
1.9 KiB
Go
package nativesetu
|
|
|
|
import (
|
|
"image"
|
|
"io/fs"
|
|
"os"
|
|
"sync"
|
|
|
|
"github.com/corona10/goimagehash"
|
|
"github.com/sirupsen/logrus"
|
|
"github.com/wdvxdr1123/ZeroBot/utils/helper"
|
|
|
|
"github.com/FloatTech/ZeroBot-Plugin/utils/file"
|
|
"github.com/FloatTech/ZeroBot-Plugin/utils/process"
|
|
"github.com/FloatTech/ZeroBot-Plugin/utils/sql"
|
|
)
|
|
|
|
// setuclass holds setus in a folder, which is the class name.
|
|
type setuclass struct {
|
|
ImgID uint64 `db:"imgid"` // ImgID 图片唯一 id (dhash)
|
|
Name string `db:"name"` // Name 图片名
|
|
}
|
|
|
|
var (
|
|
setuclasses []string
|
|
db = &sql.Sqlite{DBPath: dbfile}
|
|
mu sync.RWMutex
|
|
)
|
|
|
|
func init() {
|
|
go func() {
|
|
process.SleepAbout1sTo2s()
|
|
err := os.MkdirAll(datapath, 0755)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if file.IsExist(cfgfile) {
|
|
b, err := os.ReadFile(cfgfile)
|
|
if err == nil {
|
|
setupath = helper.BytesToString(b)
|
|
logrus.Println("[nsetu] set setu dir to", setupath)
|
|
}
|
|
}
|
|
}()
|
|
}
|
|
|
|
func scanall(path string) error {
|
|
setuclasses = setuclasses[:0]
|
|
model := &setuclass{}
|
|
root := os.DirFS(path)
|
|
return fs.WalkDir(root, "./", func(path string, d fs.DirEntry, err error) error {
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if d.IsDir() {
|
|
clsn := d.Name()
|
|
mu.Lock()
|
|
err = db.Create(clsn, model)
|
|
setuclasses = append(setuclasses, clsn)
|
|
mu.Unlock()
|
|
if err == nil {
|
|
err = scanclass(root, clsn)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
return err
|
|
})
|
|
}
|
|
|
|
func scanclass(root fs.FS, clsn string) error {
|
|
return fs.WalkDir(root, clsn, func(path string, d fs.DirEntry, err error) error {
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !d.IsDir() {
|
|
f, e := os.Open(path)
|
|
if e != nil {
|
|
return e
|
|
}
|
|
img, _, e := image.Decode(f)
|
|
if e != nil {
|
|
return e
|
|
}
|
|
dh, e := goimagehash.DifferenceHash(img)
|
|
if e != nil {
|
|
return e
|
|
}
|
|
mu.Lock()
|
|
err = db.Insert(clsn, &setuclass{ImgID: dh.GetHash(), Name: d.Name()})
|
|
mu.Unlock()
|
|
}
|
|
return err
|
|
})
|
|
}
|