Skip to content

Commit 5199706

Browse files
committed
Merge remote-tracking branch 'upsteram/master'
2 parents fd7b126 + 21bfa14 commit 5199706

File tree

11 files changed

+194
-419
lines changed

11 files changed

+194
-419
lines changed

config.go

Lines changed: 0 additions & 14 deletions
This file was deleted.

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ require (
77
github.com/FloatTech/AnimeAPI v1.5.1-0.20220901132657-2585bbc03bf6
88
github.com/FloatTech/floatbox v0.0.0-20220822040527-f059031fec44
99
github.com/FloatTech/sqlite v0.3.3
10+
github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b
1011
github.com/FloatTech/zbpctrl v1.4.1-0.20220715042842-93f081cb0133
11-
github.com/FloatTech/zbputils v1.5.1-0.20220826103123-0c73a585e38f
12+
github.com/FloatTech/zbputils v1.5.1-0.20220906100116-30c0892066d6
1213
github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c
1314
github.com/antchfx/htmlquery v1.2.5
1415
github.com/corona10/goimagehash v1.0.3
@@ -36,7 +37,6 @@ require (
3637
)
3738

3839
require (
39-
github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b // indirect
4040
github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc // indirect
4141
github.com/antchfx/xpath v1.2.1 // indirect
4242
github.com/cheekybits/genny v1.0.0 // indirect

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b h1:tvciXWq2nuvTbFeJG
2121
github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs=
2222
github.com/FloatTech/zbpctrl v1.4.1-0.20220715042842-93f081cb0133 h1:nP9NI4I+vtwAbiU7wCJwjuzCzMZ/yJYg8h3667HGnv0=
2323
github.com/FloatTech/zbpctrl v1.4.1-0.20220715042842-93f081cb0133/go.mod h1:72BnjyBwQWUC8mqM9dPk5ZrjxXCilQCVp+jfgHATNdw=
24-
github.com/FloatTech/zbputils v1.5.1-0.20220826103123-0c73a585e38f h1:R13GKhRZfB42nsCEqek/ZlGbKBopQOZFYwBU9qSCfhg=
25-
github.com/FloatTech/zbputils v1.5.1-0.20220826103123-0c73a585e38f/go.mod h1:ZT91eCYR6y1HbLRTO5EB7o8K7qEPbCsX7vjhYIuMijc=
24+
github.com/FloatTech/zbputils v1.5.1-0.20220906100116-30c0892066d6 h1:9+PCM0UzbtrpYSzkvy+AeVy6bpprmVd6BUs17Njao04=
25+
github.com/FloatTech/zbputils v1.5.1-0.20220906100116-30c0892066d6/go.mod h1:ZT91eCYR6y1HbLRTO5EB7o8K7qEPbCsX7vjhYIuMijc=
2626
github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
2727
github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c h1:cNPOdTNiVwxLpROLjXCgbIPvdkE+BwvxDvgmdYmWx6Q=
2828
github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c/go.mod h1:KqZzu7slNKROh3TSYEH/IUMG6f4M+1qubZ5e52QypsE=

main.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ import (
3131
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/event" // 事件
3232

3333
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/antiabuse" // 违禁词
34-
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/chat" // 基础词库
34+
35+
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/chat" // 基础词库
3536

3637
_ "github.com/FloatTech/ZeroBot-Plugin/plugin/sleep_manage" // 统计睡眠时间
3738

@@ -180,6 +181,13 @@ import (
180181
// -----------------------以上为内置依赖,勿动------------------------ //
181182
)
182183

184+
type zbpcfg struct {
185+
Z zero.Config `json:"zero"`
186+
W []*driver.WSClient `json:"ws"`
187+
}
188+
189+
var config zbpcfg
190+
183191
func init() {
184192
sus := make([]int64, 0, 16)
185193
// 解析命令行参数

plugin/antiabuse/anti.go

Lines changed: 77 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,69 +2,122 @@
22
package antiabuse
33

44
import (
5-
"fmt"
5+
"strconv"
66
"strings"
77
"time"
88

9+
"github.com/FloatTech/floatbox/binary"
910
fcext "github.com/FloatTech/floatbox/ctxext"
11+
"github.com/FloatTech/ttl"
1012
ctrl "github.com/FloatTech/zbpctrl"
1113
"github.com/FloatTech/zbputils/control"
14+
"github.com/FloatTech/zbputils/img/text"
15+
"github.com/sirupsen/logrus"
1216
zero "github.com/wdvxdr1123/ZeroBot"
1317
"github.com/wdvxdr1123/ZeroBot/message"
1418
)
1519

20+
const bandur time.Duration = time.Minute * 10
21+
22+
var (
23+
managers *ctrl.Manager[*zero.Ctx] // managers lazy load
24+
cache = ttl.NewCacheOn(bandur, [4]func(int64, struct{}){nil, nil, onDel, nil})
25+
db *antidb
26+
)
27+
28+
func onDel(uid int64, _ struct{}) {
29+
if managers == nil {
30+
return
31+
}
32+
if err := managers.DoUnblock(uid); err != nil {
33+
logrus.Errorln("[antiabuse.onDel] unblock:", err)
34+
}
35+
if err := db.Del("__bantime__", "WHERE id="+strconv.FormatInt(uid, 10)); err != nil {
36+
logrus.Errorln("[antiabuse.onDel] db:", err)
37+
}
38+
}
39+
1640
func init() {
1741
engine := control.Register("antiabuse", &ctrl.Options[*zero.Ctx]{
1842
DisableOnDefault: false,
19-
Help: "违禁词检测",
43+
Help: "违禁词检测\n- /[添加|删除|查看]违禁词",
2044
PrivateDataFolder: "anti_abuse",
2145
})
46+
2247
onceRule := fcext.DoOnceOnSuccess(func(ctx *zero.Ctx) bool {
2348
managers = ctx.State["manager"].(*ctrl.Control[*zero.Ctx]).Manager
24-
db.DBPath = engine.DataFolder() + "anti_abuse.db"
25-
err := db.Open(time.Hour * 4)
49+
var err error
50+
db, err = newantidb(engine.DataFolder() + "anti_abuse.db")
2651
if err != nil {
27-
ctx.SendChain(message.Text("open db error: ", err))
52+
ctx.SendChain(message.Text("ERROR: ", err))
2853
return false
2954
}
30-
err = db.Create("banWord", &banWord{})
31-
if err != nil {
32-
ctx.SendChain(message.Text("create table error: ", err))
33-
return false
55+
return true
56+
})
57+
58+
engine.OnMessage(onceRule, zero.OnlyGroup, func(ctx *zero.Ctx) bool {
59+
if !ctx.Event.IsToMe {
60+
return true
3461
}
35-
err = recoverWord()
36-
if err != nil {
37-
ctx.SendChain(message.Text("recover data error: ", err))
62+
uid := ctx.Event.UserID
63+
gid := ctx.Event.GroupID
64+
msg := strings.ReplaceAll(ctx.MessageString(), "\n", "")
65+
msg = strings.ReplaceAll(msg, "\r", "")
66+
msg = strings.ReplaceAll(msg, "\t", "")
67+
msg = strings.ReplaceAll(msg, ";", "")
68+
if db.isInAntiList(uid, gid, msg) {
69+
if err := ctx.State["manager"].(*ctrl.Control[*zero.Ctx]).Manager.DoBlock(uid); err == nil {
70+
t := time.Now().Unix()
71+
cache.Set(uid, struct{}{})
72+
ctx.SetGroupBan(gid, uid, int64(bandur.Minutes()))
73+
ctx.SendChain(message.Text("检测到违禁词, 已封禁/屏蔽", bandur))
74+
db.Lock()
75+
defer db.Unlock()
76+
err := db.Create("__bantime__", nilbt)
77+
if err != nil {
78+
ctx.SendChain(message.Text("ERROR: ", err))
79+
return false
80+
}
81+
err = db.Insert("__bantime__", &banTime{ID: uid, Time: t})
82+
if err != nil {
83+
ctx.SendChain(message.Text("ERROR: ", err))
84+
return false
85+
}
86+
} else {
87+
ctx.SendChain(message.Text("ERROR: block user: ", err))
88+
}
3889
return false
3990
}
4091
return true
4192
})
42-
engine.OnMessage(onceRule, zero.OnlyGroup, banRule)
93+
4394
engine.OnCommand("添加违禁词", zero.OnlyGroup, zero.AdminPermission, onceRule).Handle(
4495
func(ctx *zero.Ctx) {
4596
args := ctx.State["args"].(string)
46-
if err := insertWord(ctx.Event.GroupID, args); err != nil {
47-
ctx.SendChain(message.Text("error:", err))
97+
if err := db.insertWord(ctx.Event.GroupID, args); err != nil {
98+
ctx.SendChain(message.Text("ERROR: ", err))
4899
} else {
49-
ctx.SendChain(message.Text(fmt.Sprintf("添加违禁词 %s 成功", args)))
100+
ctx.SendChain(message.Text("成功"))
50101
}
51102
})
103+
52104
engine.OnCommand("删除违禁词", zero.OnlyGroup, zero.AdminPermission, onceRule).Handle(
53105
func(ctx *zero.Ctx) {
54106
args := ctx.State["args"].(string)
55-
if err := deleteWord(ctx.Event.GroupID, args); err != nil {
56-
ctx.SendChain(message.Text("error:", err))
107+
if err := db.deleteWord(ctx.Event.GroupID, args); err != nil {
108+
ctx.SendChain(message.Text("ERROR: ", err))
57109
} else {
58-
ctx.SendChain(message.Text(fmt.Sprintf("删除违禁词 %s 成功", args)))
110+
ctx.SendChain(message.Text("成功"))
59111
}
60112
})
113+
61114
engine.OnCommand("查看违禁词", zero.OnlyGroup, onceRule).Handle(
62115
func(ctx *zero.Ctx) {
63-
if set, ok := wordMap[ctx.Event.GroupID]; !ok {
64-
ctx.SendChain(message.Text("本群无违禁词"))
65-
} else {
66-
ctx.SendChain(message.Text("本群违禁词有:", strings.Join(set.ToSlice(), " |")))
116+
b, err := text.RenderToBase64(db.listWords(ctx.Event.GroupID), text.FontFile, 400, 20)
117+
if err != nil {
118+
ctx.SendChain(message.Text("ERROR: ", err))
119+
return
67120
}
121+
ctx.SendChain(message.Text("本群违禁词有\n"), message.Image("base64://"+binary.BytesToString(b)))
68122
})
69-
70123
}

plugin/antiabuse/db.go

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package antiabuse
2+
3+
import (
4+
"errors"
5+
"strconv"
6+
"strings"
7+
"sync"
8+
"time"
9+
10+
sqlite "github.com/FloatTech/sqlite"
11+
)
12+
13+
type antidb struct {
14+
sync.RWMutex
15+
sqlite.Sqlite
16+
}
17+
18+
type banWord struct {
19+
Word string `db:"word"`
20+
}
21+
22+
type banTime struct {
23+
ID int64 `db:"id"`
24+
Time int64 `db:"time"`
25+
}
26+
27+
var (
28+
nilban = &banWord{}
29+
nilbt = &banTime{}
30+
)
31+
32+
func newantidb(path string) (*antidb, error) {
33+
db := &antidb{Sqlite: sqlite.Sqlite{DBPath: path}}
34+
err := db.Open(bandur)
35+
if err != nil {
36+
return nil, err
37+
}
38+
_ = db.FindFor("__bantime__", nilbt, "", func() error {
39+
t := time.Unix(nilbt.Time, 0)
40+
ttl := time.Until(t.Add(bandur))
41+
if ttl < time.Minute {
42+
_ = managers.DoUnblock(nilbt.ID)
43+
return nil
44+
}
45+
cache.Set(nilbt.ID, struct{}{})
46+
cache.Touch(nilbt.ID, -time.Since(t))
47+
return nil
48+
})
49+
_ = db.Del("__bantime__", "WHERE time<="+strconv.FormatInt(time.Now().Add(time.Minute-bandur).Unix(), 10))
50+
return db, nil
51+
}
52+
53+
func (db *antidb) isInAntiList(uid, gid int64, msg string) bool {
54+
grp := strconv.FormatInt(gid, 36)
55+
db.RLock()
56+
defer db.RUnlock()
57+
return db.CanFind(grp, "WHERE instr('"+msg+"', word)>0")
58+
}
59+
60+
func (db *antidb) insertWord(gid int64, word string) error {
61+
grp := strconv.FormatInt(gid, 36)
62+
db.Lock()
63+
defer db.Unlock()
64+
err := db.Create(grp, nilban)
65+
if err != nil {
66+
return err
67+
}
68+
return db.Insert(grp, &banWord{Word: word})
69+
}
70+
71+
func (db *antidb) deleteWord(gid int64, word string) error {
72+
grp := strconv.FormatInt(gid, 36)
73+
db.Lock()
74+
defer db.Unlock()
75+
if n, _ := db.Count(grp); n == 0 {
76+
return errors.New("本群还没有违禁词~")
77+
}
78+
return db.Del(grp, "WHERE word='"+word+"'")
79+
}
80+
81+
func (db *antidb) listWords(gid int64) string {
82+
grp := strconv.FormatInt(gid, 36)
83+
word := &banWord{}
84+
sb := strings.Builder{}
85+
sb.WriteByte('[')
86+
i := 0
87+
db.RLock()
88+
defer db.RUnlock()
89+
_ = db.FindFor(grp, word, "", func() error {
90+
if i > 0 {
91+
sb.WriteString(" | ")
92+
}
93+
sb.WriteString(word.Word)
94+
i++
95+
return nil
96+
})
97+
if sb.Len() <= 4 {
98+
return "[]"
99+
}
100+
sb.WriteByte(']')
101+
return sb.String()
102+
}

plugin/antiabuse/set.go

Lines changed: 0 additions & 62 deletions
This file was deleted.

0 commit comments

Comments
 (0)