2
2
package control
3
3
4
4
import (
5
+ "crypto/md5"
6
+ "encoding/binary"
7
+ "fmt"
5
8
"os"
6
9
"strconv"
7
10
"strings"
@@ -11,6 +14,7 @@ import (
11
14
zero "github.com/wdvxdr1123/ZeroBot"
12
15
"github.com/wdvxdr1123/ZeroBot/extension"
13
16
"github.com/wdvxdr1123/ZeroBot/message"
17
+ "github.com/wdvxdr1123/ZeroBot/utils/helper"
14
18
15
19
"github.com/FloatTech/ZeroBot-Plugin/utils/sql"
16
20
)
@@ -47,6 +51,10 @@ func newctrl(service string, o *Options) *Control {
47
51
if err != nil {
48
52
panic (err )
49
53
}
54
+ err = db .Create (service + "ban" , & ban {})
55
+ if err != nil {
56
+ panic (err )
57
+ }
50
58
return m
51
59
}
52
60
@@ -125,6 +133,78 @@ func (m *Control) IsEnabledIn(gid int64) bool {
125
133
return ! m .options .DisableOnDefault
126
134
}
127
135
136
+ // Ban 禁止某人在某群使用本插件
137
+ func (m * Control ) Ban (uid , gid int64 ) {
138
+ var err error
139
+ var digest [16 ]byte
140
+ logrus .Debugln ("[control] Ban recv gid =" , gid , "uid =" , uid )
141
+ if gid != 0 { // 特定群
142
+ digest = md5 .Sum (helper .StringToBytes (fmt .Sprintf ("%d_%d" , uid , gid )))
143
+ m .RLock ()
144
+ err = db .Insert (m .service + "ban" , & ban {ID : int64 (binary .LittleEndian .Uint64 (digest [:8 ])), UserID : uid , GroupID : gid })
145
+ m .RUnlock ()
146
+ if err == nil {
147
+ logrus .Debugf ("[control] plugin %s is banned in grp %d for usr %d." , m .service , gid , uid )
148
+ return
149
+ }
150
+ }
151
+ // 所有群
152
+ digest = md5 .Sum (helper .StringToBytes (fmt .Sprintf ("%d_all" , uid )))
153
+ m .RLock ()
154
+ err = db .Insert (m .service + "ban" , & ban {ID : int64 (binary .LittleEndian .Uint64 (digest [:8 ])), UserID : uid , GroupID : 0 })
155
+ m .RUnlock ()
156
+ if err == nil {
157
+ logrus .Debugf ("[control] plugin %s is banned in all grp for usr %d." , m .service , uid )
158
+ }
159
+ }
160
+
161
+ // Permit 允许某人在某群使用本插件
162
+ func (m * Control ) Permit (uid , gid int64 ) {
163
+ var digest [16 ]byte
164
+ logrus .Debugln ("[control] Permit recv gid =" , gid , "uid =" , uid )
165
+ if gid != 0 { // 特定群
166
+ digest = md5 .Sum (helper .StringToBytes (fmt .Sprintf ("%d_%d" , uid , gid )))
167
+ m .RLock ()
168
+ _ = db .Del (m .service + "ban" , "WHERE id = " + strconv .FormatInt (int64 (binary .LittleEndian .Uint64 (digest [:8 ])), 10 ))
169
+ m .RUnlock ()
170
+ logrus .Debugf ("[control] plugin %s is permitted in grp %d for usr %d." , m .service , gid , uid )
171
+ return
172
+ }
173
+ // 所有群
174
+ digest = md5 .Sum (helper .StringToBytes (fmt .Sprintf ("%d_all" , uid )))
175
+ m .RLock ()
176
+ _ = db .Del (m .service + "ban" , "WHERE id = " + strconv .FormatInt (int64 (binary .LittleEndian .Uint64 (digest [:8 ])), 10 ))
177
+ m .RUnlock ()
178
+ logrus .Debugf ("[control] plugin %s is permitted in all grp for usr %d." , m .service , uid )
179
+ }
180
+
181
+ // IsBannedIn 某人是否在某群被 ban
182
+ func (m * Control ) IsBannedIn (uid , gid int64 ) bool {
183
+ var b ban
184
+ var err error
185
+ var digest [16 ]byte
186
+ logrus .Debugln ("[control] IsBannedIn recv gid =" , gid , "uid =" , uid )
187
+ if gid != 0 {
188
+ digest = md5 .Sum (helper .StringToBytes (fmt .Sprintf ("%d_%d" , uid , gid )))
189
+ m .RLock ()
190
+ err = db .Find (m .service + "ban" , & b , "WHERE id = " + strconv .FormatInt (int64 (binary .LittleEndian .Uint64 (digest [:8 ])), 10 ))
191
+ m .RUnlock ()
192
+ if err == nil && gid == b .GroupID && uid == b .UserID {
193
+ logrus .Debugf ("[control] plugin %s is banned in grp %d for usr %d." , m .service , b .GroupID , b .UserID )
194
+ return true
195
+ }
196
+ }
197
+ digest = md5 .Sum (helper .StringToBytes (fmt .Sprintf ("%d_all" , uid )))
198
+ m .RLock ()
199
+ err = db .Find (m .service + "ban" , & b , "WHERE id = " + strconv .FormatInt (int64 (binary .LittleEndian .Uint64 (digest [:8 ])), 10 ))
200
+ m .RUnlock ()
201
+ if err == nil && b .GroupID == 0 && uid == b .UserID {
202
+ logrus .Debugf ("[control] plugin %s is banned in all grp for usr %d." , m .service , b .UserID )
203
+ return true
204
+ }
205
+ return false
206
+ }
207
+
128
208
// GetData 获取某个群的 63 字节配置信息
129
209
func (m * Control ) GetData (gid int64 ) int64 {
130
210
var c grpcfg
@@ -173,21 +253,19 @@ func (m *Control) SetData(groupID int64, data int64) error {
173
253
}
174
254
175
255
// Handler 返回 预处理器
176
- func (m * Control ) Handler () zero.Rule {
177
- return func (ctx * zero.Ctx ) bool {
178
- ctx .State ["manager" ] = m
179
- grp := ctx .Event .GroupID
180
- if grp == 0 {
181
- // 个人用户
182
- grp = - ctx .Event .UserID
183
- }
184
- logrus .Debugln ("[control] handler get gid =" , grp )
185
- return m .IsEnabledIn (grp )
256
+ func (m * Control ) Handler (ctx * zero.Ctx ) bool {
257
+ ctx .State ["manager" ] = m
258
+ grp := ctx .Event .GroupID
259
+ if grp == 0 {
260
+ // 个人用户
261
+ return m .IsEnabledIn (- ctx .Event .UserID )
186
262
}
263
+ logrus .Debugln ("[control] handler get gid =" , grp )
264
+ return m .IsEnabledIn (grp ) && ! m .IsBannedIn (ctx .Event .UserID , grp )
187
265
}
188
266
189
267
// Lookup returns a Manager by the service name, if
190
- // not exist, it will returns nil.
268
+ // not exist, it will return nil.
191
269
func Lookup (service string ) (* Control , bool ) {
192
270
mu .RLock ()
193
271
m , ok := managers [service ]
@@ -276,6 +354,47 @@ func init() {
276
354
ctx .SendChain (message .Text ("已还原服务的默认启用状态: " + model .Args ))
277
355
})
278
356
357
+ zero .OnCommandGroup ([]string {
358
+ "禁止" , "ban" , "允许" , "permit" ,
359
+ "全局禁止" , "banall" , "全局允许" , "permitall" ,
360
+ }, zero .OnlyGroup , zero .AdminPermission ).Handle (func (ctx * zero.Ctx ) {
361
+ model := extension.CommandModel {}
362
+ _ = ctx .Parse (& model )
363
+ args := strings .Split (model .Args , " " )
364
+ if len (args ) >= 2 {
365
+ service , ok := Lookup (args [0 ])
366
+ if ! ok {
367
+ ctx .SendChain (message .Text ("没有找到指定服务!" ))
368
+ return
369
+ }
370
+ grp := ctx .Event .GroupID
371
+ if strings .Contains (model .Command , "全局" ) || strings .Contains (model .Command , "all" ) {
372
+ grp = 0
373
+ }
374
+ msg := "**" + args [0 ] + "报告**"
375
+ if strings .Contains (model .Command , "允许" ) || strings .Contains (model .Command , "permit" ) {
376
+ for _ , usr := range args [1 :] {
377
+ uid , err := strconv .ParseInt (usr , 10 , 64 )
378
+ if err == nil {
379
+ service .Permit (uid , grp )
380
+ msg += "\n + 已允许" + usr
381
+ }
382
+ }
383
+ } else {
384
+ for _ , usr := range args [1 :] {
385
+ uid , err := strconv .ParseInt (usr , 10 , 64 )
386
+ if err == nil {
387
+ service .Ban (uid , grp )
388
+ msg += "\n - 已禁止" + usr
389
+ }
390
+ }
391
+ }
392
+ ctx .SendChain (message .Text (msg ))
393
+ return
394
+ }
395
+ ctx .SendChain (message .Text ("参数错误!" ))
396
+ })
397
+
279
398
zero .OnCommandGroup ([]string {"用法" , "usage" }, userOrGrpAdmin ).
280
399
Handle (func (ctx * zero.Ctx ) {
281
400
model := extension.CommandModel {}
0 commit comments