This commit is contained in:
源文雨 2022-09-06 19:47:26 +08:00
parent acb7b42ded
commit fd9f19562f
2 changed files with 39 additions and 39 deletions

View File

@ -8,13 +8,30 @@ import (
"github.com/FloatTech/floatbox/binary" "github.com/FloatTech/floatbox/binary"
fcext "github.com/FloatTech/floatbox/ctxext" fcext "github.com/FloatTech/floatbox/ctxext"
"github.com/FloatTech/ttl"
ctrl "github.com/FloatTech/zbpctrl" ctrl "github.com/FloatTech/zbpctrl"
"github.com/FloatTech/zbputils/control" "github.com/FloatTech/zbputils/control"
"github.com/FloatTech/zbputils/img/text" "github.com/FloatTech/zbputils/img/text"
"github.com/sirupsen/logrus"
zero "github.com/wdvxdr1123/ZeroBot" zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/message" "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() { func init() {
engine := control.Register("antiabuse", &ctrl.Options[*zero.Ctx]{ engine := control.Register("antiabuse", &ctrl.Options[*zero.Ctx]{
DisableOnDefault: false, DisableOnDefault: false,
@ -49,10 +66,10 @@ func init() {
msg = strings.ReplaceAll(msg, "\r", "") msg = strings.ReplaceAll(msg, "\r", "")
msg = strings.ReplaceAll(msg, "\t", "") msg = strings.ReplaceAll(msg, "\t", "")
msg = strings.ReplaceAll(msg, ";", "") msg = strings.ReplaceAll(msg, ";", "")
mu.RLock() db.RLock()
defer mu.RUnlock() defer db.RUnlock()
if db.CanFind(grp, "WHERE instr('"+msg+"', word)>=0") { 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{}{}) cache.Set(uid, struct{}{})
ctx.SetGroupBan(gid, uid, 4*3600) ctx.SetGroupBan(gid, uid, 4*3600)
ctx.SendChain(message.Text("检测到违禁词, 已封禁/屏蔽4小时")) ctx.SendChain(message.Text("检测到违禁词, 已封禁/屏蔽4小时"))
@ -67,7 +84,7 @@ func init() {
engine.OnCommand("添加违禁词", zero.OnlyGroup, zero.AdminPermission, onceRule).Handle( engine.OnCommand("添加违禁词", zero.OnlyGroup, zero.AdminPermission, onceRule).Handle(
func(ctx *zero.Ctx) { func(ctx *zero.Ctx) {
args := ctx.State["args"].(string) 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)) ctx.SendChain(message.Text("ERROR: ", err))
} else { } else {
ctx.SendChain(message.Text("成功")) ctx.SendChain(message.Text("成功"))
@ -77,7 +94,7 @@ func init() {
engine.OnCommand("删除违禁词", zero.OnlyGroup, zero.AdminPermission, onceRule).Handle( engine.OnCommand("删除违禁词", zero.OnlyGroup, zero.AdminPermission, onceRule).Handle(
func(ctx *zero.Ctx) { func(ctx *zero.Ctx) {
args := ctx.State["args"].(string) 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)) ctx.SendChain(message.Text("ERROR: ", err))
} else { } else {
ctx.SendChain(message.Text("成功")) ctx.SendChain(message.Text("成功"))
@ -86,7 +103,7 @@ func init() {
engine.OnCommand("查看违禁词", zero.OnlyGroup, onceRule).Handle( engine.OnCommand("查看违禁词", zero.OnlyGroup, onceRule).Handle(
func(ctx *zero.Ctx) { 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 { if err != nil {
ctx.SendChain(message.Text("ERROR: ", err)) ctx.SendChain(message.Text("ERROR: ", err))
return return

View File

@ -5,67 +5,50 @@ import (
"strconv" "strconv"
"strings" "strings"
"sync" "sync"
"time"
"unsafe"
sqlite "github.com/FloatTech/sqlite" 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 type antidb struct {
var db = &sqlite.Sqlite{} sync.RWMutex
var mu sync.RWMutex sqlite.Sqlite
func onDel(uid int64, _ struct{}) {
if managers == nil {
return
}
if err := managers.DoUnblock(uid); err != nil {
logrus.Errorln("[antiabuse] do unblock:", err)
}
} }
var cache = ttl.NewCacheOn(4*time.Hour, [4]func(int64, struct{}){nil, nil, onDel, nil})
type banWord struct { type banWord struct {
Word string `db:"word"` Word string `db:"word"`
} }
var nilban = &banWord{} var nilban = &banWord{}
func insertWord(gid int64, word string) error { func (db *antidb) insertWord(gid int64, word string) error {
grp := strconv.FormatInt(gid, 36) grp := strconv.FormatInt(gid, 36)
mu.Lock() db.Lock()
defer mu.Unlock() defer db.Unlock()
err := db.Create(grp, nilban) err := db.Create(grp, nilban)
if err != nil { if err != nil {
return err 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) grp := strconv.FormatInt(gid, 36)
mu.Lock() db.Lock()
defer mu.Unlock() defer db.Unlock()
if n, _ := db.Count(grp); n == 0 { if n, _ := db.Count(grp); n == 0 {
return errors.New("本群还没有违禁词~") return errors.New("本群还没有违禁词~")
} }
return db.Del(grp, "WHRER word='"+word+"'") return db.Del(grp, "WHRER word='"+word+"'")
} }
func listWords(gid int64) string { func (db *antidb) listWords(gid int64) string {
grp := strconv.FormatInt(gid, 36) grp := strconv.FormatInt(gid, 36)
word := "" word := &banWord{}
ptr := (*banWord)(unsafe.Pointer(&word))
sb := strings.Builder{} sb := strings.Builder{}
mu.Lock() db.Lock()
defer mu.Unlock() defer db.Unlock()
_ = db.FindFor(grp, ptr, "", func() error { _ = db.FindFor(grp, &word, "", func() error {
sb.WriteString(word) sb.WriteString(word.Word)
sb.WriteString(" |") sb.WriteString(" |")
return nil return nil
}) })