diff --git a/plugin/antiabuse/anti.go b/plugin/antiabuse/anti.go index 14c8e9ca..60e128d1 100644 --- a/plugin/antiabuse/anti.go +++ b/plugin/antiabuse/anti.go @@ -8,13 +8,30 @@ import ( "github.com/FloatTech/floatbox/binary" fcext "github.com/FloatTech/floatbox/ctxext" + "github.com/FloatTech/ttl" ctrl "github.com/FloatTech/zbpctrl" "github.com/FloatTech/zbputils/control" "github.com/FloatTech/zbputils/img/text" + "github.com/sirupsen/logrus" zero "github.com/wdvxdr1123/ZeroBot" "github.com/wdvxdr1123/ZeroBot/message" ) +var ( + managers *ctrl.Manager[*zero.Ctx] // managers lazy load + cache = ttl.NewCacheOn(4*time.Hour, [4]func(int64, struct{}){nil, nil, onDel, nil}) + db = &antidb{} +) + +func onDel(uid int64, _ struct{}) { + if managers == nil { + return + } + if err := managers.DoUnblock(uid); err != nil { + logrus.Errorln("[antiabuse] do unblock:", err) + } +} + func init() { engine := control.Register("antiabuse", &ctrl.Options[*zero.Ctx]{ DisableOnDefault: false, @@ -49,10 +66,10 @@ func init() { msg = strings.ReplaceAll(msg, "\r", "") msg = strings.ReplaceAll(msg, "\t", "") msg = strings.ReplaceAll(msg, ";", "") - mu.RLock() - defer mu.RUnlock() + db.RLock() + defer db.RUnlock() if db.CanFind(grp, "WHERE instr('"+msg+"', word)>=0") { - if err := managers.DoBlock(uid); err == nil { + if err := ctx.State["manager"].(*ctrl.Control[*zero.Ctx]).Manager.DoBlock(uid); err == nil { cache.Set(uid, struct{}{}) ctx.SetGroupBan(gid, uid, 4*3600) ctx.SendChain(message.Text("检测到违禁词, 已封禁/屏蔽4小时")) @@ -67,7 +84,7 @@ func init() { engine.OnCommand("添加违禁词", zero.OnlyGroup, zero.AdminPermission, onceRule).Handle( func(ctx *zero.Ctx) { args := ctx.State["args"].(string) - if err := insertWord(ctx.Event.GroupID, args); err != nil { + if err := db.insertWord(ctx.Event.GroupID, args); err != nil { ctx.SendChain(message.Text("ERROR: ", err)) } else { ctx.SendChain(message.Text("成功")) @@ -77,7 +94,7 @@ func init() { engine.OnCommand("删除违禁词", zero.OnlyGroup, zero.AdminPermission, onceRule).Handle( func(ctx *zero.Ctx) { args := ctx.State["args"].(string) - if err := deleteWord(ctx.Event.GroupID, args); err != nil { + if err := db.deleteWord(ctx.Event.GroupID, args); err != nil { ctx.SendChain(message.Text("ERROR: ", err)) } else { ctx.SendChain(message.Text("成功")) @@ -86,7 +103,7 @@ func init() { engine.OnCommand("查看违禁词", zero.OnlyGroup, onceRule).Handle( func(ctx *zero.Ctx) { - b, err := text.RenderToBase64(listWords(ctx.Event.GroupID), text.FontFile, 400, 20) + b, err := text.RenderToBase64(db.listWords(ctx.Event.GroupID), text.FontFile, 400, 20) if err != nil { ctx.SendChain(message.Text("ERROR: ", err)) return diff --git a/plugin/antiabuse/db.go b/plugin/antiabuse/db.go index 7e78325c..13261809 100644 --- a/plugin/antiabuse/db.go +++ b/plugin/antiabuse/db.go @@ -5,67 +5,50 @@ import ( "strconv" "strings" "sync" - "time" - "unsafe" sqlite "github.com/FloatTech/sqlite" - "github.com/FloatTech/ttl" - ctrl "github.com/FloatTech/zbpctrl" - "github.com/sirupsen/logrus" - zero "github.com/wdvxdr1123/ZeroBot" ) -var managers *ctrl.Manager[*zero.Ctx] // managers lazy load -var db = &sqlite.Sqlite{} -var mu sync.RWMutex - -func onDel(uid int64, _ struct{}) { - if managers == nil { - return - } - if err := managers.DoUnblock(uid); err != nil { - logrus.Errorln("[antiabuse] do unblock:", err) - } +type antidb struct { + sync.RWMutex + sqlite.Sqlite } -var cache = ttl.NewCacheOn(4*time.Hour, [4]func(int64, struct{}){nil, nil, onDel, nil}) - type banWord struct { Word string `db:"word"` } var nilban = &banWord{} -func insertWord(gid int64, word string) error { +func (db *antidb) insertWord(gid int64, word string) error { grp := strconv.FormatInt(gid, 36) - mu.Lock() - defer mu.Unlock() + db.Lock() + defer db.Unlock() err := db.Create(grp, nilban) if err != nil { return err } - return db.Insert(grp, (*banWord)(unsafe.Pointer(&word))) + return db.Insert(grp, &banWord{Word: word}) } -func deleteWord(gid int64, word string) error { +func (db *antidb) deleteWord(gid int64, word string) error { grp := strconv.FormatInt(gid, 36) - mu.Lock() - defer mu.Unlock() + db.Lock() + defer db.Unlock() if n, _ := db.Count(grp); n == 0 { return errors.New("本群还没有违禁词~") } return db.Del(grp, "WHRER word='"+word+"'") } -func listWords(gid int64) string { +func (db *antidb) listWords(gid int64) string { grp := strconv.FormatInt(gid, 36) - word := "" - ptr := (*banWord)(unsafe.Pointer(&word)) + word := &banWord{} sb := strings.Builder{} - mu.Lock() - defer mu.Unlock() - _ = db.FindFor(grp, ptr, "", func() error { - sb.WriteString(word) + db.Lock() + defer db.Unlock() + _ = db.FindFor(grp, &word, "", func() error { + sb.WriteString(word.Word) sb.WriteString(" |") return nil })