mirror of
https://github.com/FloatTech/ZeroBot-Plugin.git
synced 2025-12-19 13:59:39 +08:00
优化
This commit is contained in:
parent
acb7b42ded
commit
fd9f19562f
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
})
|
})
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user