Skip to content

Commit c8266f4

Browse files
committed
feat: whitelist
1 parent 5dfbd36 commit c8266f4

File tree

7 files changed

+177
-27
lines changed

7 files changed

+177
-27
lines changed

basic/ban/init.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ func init() {
4343
}
4444
proxy.OnCommands([]string{"开启"}, zero.OnlyToMe).SetBlock(true).FirstPriority().Handle(openPlugin)
4545
proxy.OnCommands([]string{"关闭"}, zero.OnlyToMe).SetBlock(true).FirstPriority().Handle(closePlugin)
46+
proxy.OnCommands([]string{"白名单模式"}, zero.OnlyToMe).SetBlock(true).FirstPriority().Handle(setModeWhite)
47+
proxy.OnCommands([]string{"黑名单模式"}, zero.OnlyToMe).SetBlock(true).FirstPriority().Handle(setModeBlack)
4648
proxy.OnCommands([]string{"封禁", "ban", "Ban"}, zero.OnlyToMe).SetBlock(true).FirstPriority().Handle(banUser)
4749
proxy.OnCommands([]string{"解封", "unban", "Unban"}, zero.OnlyToMe).SetBlock(true).FirstPriority().Handle(unbanUser)
4850
proxy.OnCommands([]string{"黑名单"}, zero.OnlyToMe).SetBlock(true).FirstPriority().Handle(showBlack)

basic/ban/public.go

Lines changed: 54 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,29 @@ func SetUserPluginStatus(status bool, userID int64, plugin *manager.PluginCondit
1616
var key string
1717
if plugin != nil {
1818
key = plugin.Key
19-
} else { // plugin 为空,代表所有插件
20-
key = AllPluginKey
19+
} else {
20+
panic("SetGroupPluginStatus: plugin is nil")
2121
}
2222
// 更新数据库
2323
var preUser dao.UserSetting
2424
proxy.GetDB().Take(&preUser, userID)
2525
preUser.ID = userID
26-
if status { // 启用
27-
preUser.BlackPlugins = delPluginKey(preUser.BlackPlugins, key)
28-
} else { // 关闭
29-
preUser.BlackPlugins = addPluginKey(preUser.BlackPlugins, key)
26+
if preUser.WhiteMode {
27+
if status { // 启用
28+
preUser.WhitePlugins = addPluginKey(preUser.WhitePlugins, key)
29+
} else { // 关闭
30+
preUser.WhitePlugins = delPluginKey(preUser.WhitePlugins, key)
31+
}
32+
} else {
33+
if status { // 启用
34+
preUser.BlackPlugins = delPluginKey(preUser.BlackPlugins, key)
35+
} else { // 关闭
36+
preUser.BlackPlugins = addPluginKey(preUser.BlackPlugins, key)
37+
}
3038
}
3139
if err := proxy.GetDB().Clauses(clause.OnConflict{
3240
Columns: []clause.Column{{Name: "id"}},
33-
DoUpdates: clause.AssignmentColumns([]string{"black_plugins"}), // Upsert
41+
DoUpdates: clause.AssignmentColumns([]string{"black_plugins", "white_plugins"}), // Upsert
3442
}).Create(&preUser).Error; err != nil {
3543
log.Errorf("set user(%v) black_plugins error(sql): %v", userID, err)
3644
return err
@@ -51,21 +59,29 @@ func SetGroupPluginStatus(status bool, groupID int64, plugin *manager.PluginCond
5159
var key string
5260
if plugin != nil {
5361
key = plugin.Key
54-
} else { // plugin 为空,代表所有插件
55-
key = AllPluginKey
62+
} else {
63+
panic("SetGroupPluginStatus: plugin is nil")
5664
}
5765
// 更新数据库
5866
var preGroup dao.GroupSetting
5967
proxy.GetDB().Take(&preGroup, groupID)
6068
preGroup.ID = groupID
61-
if status { // 启用
62-
preGroup.BlackPlugins = delPluginKey(preGroup.BlackPlugins, key)
63-
} else { // 关闭
64-
preGroup.BlackPlugins = addPluginKey(preGroup.BlackPlugins, key)
69+
if preGroup.WhiteMode {
70+
if status { // 启用
71+
preGroup.WhitePlugins = addPluginKey(preGroup.WhitePlugins, key)
72+
} else { // 关闭
73+
preGroup.WhitePlugins = delPluginKey(preGroup.WhitePlugins, key)
74+
}
75+
} else {
76+
if status { // 启用
77+
preGroup.BlackPlugins = delPluginKey(preGroup.BlackPlugins, key)
78+
} else { // 关闭
79+
preGroup.BlackPlugins = addPluginKey(preGroup.BlackPlugins, key)
80+
}
6581
}
6682
if err := proxy.GetDB().Clauses(clause.OnConflict{
6783
Columns: []clause.Column{{Name: "id"}},
68-
DoUpdates: clause.AssignmentColumns([]string{"black_plugins"}), // Upsert
84+
DoUpdates: clause.AssignmentColumns([]string{"black_plugins", "white_plugins"}), // Upsert
6985
}).Create(&preGroup).Error; err != nil {
7086
log.Errorf("set group(%v) black_plugins error(sql): %v", groupID, err)
7187
return err
@@ -92,7 +108,11 @@ func GetUserPluginStatus(userID int64, plugin *manager.PluginCondition) bool {
92108
// 查询
93109
var preUser dao.UserSetting
94110
proxy.GetDB().Take(&preUser, userID)
95-
return !(hasPluginKey(preUser.BlackPlugins, key) || hasPluginKey(preUser.BlackPlugins, AllPluginKey))
111+
if preUser.WhiteMode { // 白名单模式
112+
return hasPluginKey(preUser.WhitePlugins, key)
113+
} else {
114+
return !(hasPluginKey(preUser.BlackPlugins, key) || hasPluginKey(preUser.BlackPlugins, AllPluginKey))
115+
}
96116
}
97117

98118
// GetGroupPluginStatus 获取群插件状态(能否使用)
@@ -101,11 +121,28 @@ func GetGroupPluginStatus(groupID int64, plugin *manager.PluginCondition) bool {
101121
var key string
102122
if plugin != nil {
103123
key = plugin.Key
104-
} else { // plugin 为空,代表所有插件
124+
} else {
105125
key = AllPluginKey
106126
}
107127
// 查询
108128
var preGroup dao.GroupSetting
109129
proxy.GetDB().Take(&preGroup, groupID)
110-
return !(hasPluginKey(preGroup.BlackPlugins, key) || hasPluginKey(preGroup.BlackPlugins, AllPluginKey))
130+
if preGroup.WhiteMode { // 白名单模式
131+
return hasPluginKey(preGroup.WhitePlugins, key)
132+
} else {
133+
return !(hasPluginKey(preGroup.BlackPlugins, key) || hasPluginKey(preGroup.BlackPlugins, AllPluginKey))
134+
}
135+
}
136+
137+
// GetGroupRunningMode 获取群运行模式(白名单模式为true,黑名单为false)
138+
func GetGroupRunningMode(groupID int64) bool {
139+
var preGroup dao.GroupSetting
140+
proxy.GetDB().Take(&preGroup, groupID)
141+
return preGroup.WhiteMode
142+
}
143+
144+
func GetUserRunningMode(userID int64) bool {
145+
var preUser dao.UserSetting
146+
proxy.GetDB().Take(&preUser, userID)
147+
return preUser.WhiteMode
111148
}

basic/ban/switch.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ package ban
22

33
import (
44
"fmt"
5+
"github.com/RicheyJang/PaimengBot/basic/auth"
6+
"github.com/RicheyJang/PaimengBot/basic/dao"
7+
"gorm.io/gorm/clause"
58
"strconv"
69
"strings"
710
"time"
@@ -84,3 +87,79 @@ func switchPlugin(status bool, ctx *zero.Ctx) {
8487
}
8588
dealGroupPluginStatus(ctx, status, ctx.Event.GroupID, plugin, period)
8689
}
90+
91+
func setModeWhite(ctx *zero.Ctx) {
92+
if utils.IsMessageGroup(ctx) {
93+
// 查询
94+
var preGroup dao.GroupSetting
95+
proxy.GetDB().Take(&preGroup, ctx.Event.GroupID)
96+
if preGroup.WhiteMode {
97+
ctx.Send("该群已处于白名单模式,无需再设置")
98+
return
99+
}
100+
preGroup.WhiteMode = true
101+
if err := proxy.GetDB().Clauses(clause.OnConflict{
102+
Columns: []clause.Column{{Name: "id"}},
103+
DoUpdates: clause.AssignmentColumns([]string{"white_mode"}), // Upsert
104+
}).Create(&preGroup).Error; err != nil {
105+
log.Errorf("setModeWhite err: %v", err)
106+
ctx.Send("失败了...")
107+
return
108+
}
109+
ctx.Send(fmt.Sprintf("群%d运行模式切换为白名单", ctx.Event.GroupID))
110+
} else {
111+
//私聊如果是超级管理员设置全局
112+
if utils.IsSuperUser(ctx.Event.UserID) {
113+
var preUser dao.UserSetting
114+
if err := proxy.GetDB().Model(&preUser).Where("id = ?", 0).Update("white_mode", false).Error; err != nil {
115+
log.Errorf("setModeBlack err: %v", err)
116+
ctx.Send("失败了...")
117+
return
118+
}
119+
ctx.Send("全局运行模式切换为白名单")
120+
return
121+
}
122+
ctx.Send("请在群聊环境设置运行模式,如需帮助请联系BOT主人")
123+
}
124+
}
125+
func setModeBlack(ctx *zero.Ctx) {
126+
if utils.IsMessageGroup(ctx) {
127+
if !auth.CheckPriority(ctx, 5, false) {
128+
return
129+
}
130+
// 查询
131+
var preGroup dao.GroupSetting
132+
proxy.GetDB().Take(&preGroup, ctx.Event.GroupID)
133+
if !preGroup.WhiteMode {
134+
ctx.Send("该群已处于黑名单模式,无需再设置")
135+
return
136+
}
137+
preGroup.WhiteMode = false
138+
if preGroup.WhitePlugins == "" {
139+
preGroup.WhitePlugins = "auth|ban|event|help|invite|limiter|nickname|sc"
140+
}
141+
if err := proxy.GetDB().Clauses(clause.OnConflict{
142+
Columns: []clause.Column{{Name: "id"}},
143+
DoUpdates: clause.AssignmentColumns([]string{"white_mode"}), // Upsert
144+
}).Create(&preGroup).Error; err != nil {
145+
log.Errorf("setModeBlack err: %v", err)
146+
ctx.Send("失败了...")
147+
return
148+
}
149+
ctx.Send(fmt.Sprintf("群%d运行模式切换为黑名单", ctx.Event.GroupID))
150+
} else {
151+
//私聊如果是超级管理员设置全局
152+
if utils.IsSuperUser(ctx.Event.UserID) {
153+
var preUser dao.UserSetting
154+
if err := proxy.GetDB().Model(&preUser).Where("id = ?", 0).Update("white_mode", true).Error; err != nil {
155+
log.Errorf("setModeBlack err: %v", err)
156+
ctx.Send("失败了...")
157+
return
158+
}
159+
ctx.Send("全局运行模式切换为黑名单")
160+
return
161+
}
162+
ctx.Send("请在群聊环境设置运行模式,如需帮助请联系BOT主人")
163+
}
164+
165+
}

basic/dao/models.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ import (
1010

1111
type UserSetting struct {
1212
ID int64 `gorm:"primaryKey;autoIncrement:false"`
13-
BlackPlugins string `gorm:"size:512"` // 白名单插件
14-
WhitePlugins string `gorm:"size:512"` // 黑名单插件
13+
BlackPlugins string `gorm:"size:512"` // 黑名单插件
14+
WhitePlugins string `gorm:"size:512"` // 白名单插件
15+
WhiteMode bool //是否以白名单模式运行
1516
Nickname string // 昵称
1617
Likeability float64 // 好感度(无用,抱歉...)
1718
Flag string // 非空时代表该用户尚未成为好友,是他的好友请求flag
@@ -22,6 +23,7 @@ type GroupSetting struct {
2223
ID int64 `gorm:"primaryKey;autoIncrement:false"`
2324
BlackPlugins string `gorm:"size:512"`
2425
WhitePlugins string `gorm:"size:512"`
26+
WhiteMode bool //是否以白名单模式运行
2527
Flag string // 非空时代表该群尚未加入,是邀请入群请求flag
2628
CouldAdd bool `gorm:"default:false"` // 能否入此群标志位
2729
Welcome string

basic/help/init.go

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package help
22

33
import (
4+
"github.com/RicheyJang/PaimengBot/basic/ban"
45
"math"
56
"strings"
67

@@ -41,15 +42,24 @@ func helpHandle(ctx *zero.Ctx) {
4142
isSuper := utils.IsSuperUser(ctx.Event.UserID)
4243
arg := strings.TrimSpace(utils.GetArgs(ctx))
4344
level := auth.GetGroupUserPriority(ctx.Event.GroupID, ctx.Event.UserID)
44-
blacks := getBlackKeys(ctx.Event.UserID, ctx.Event.GroupID)
45+
whiteMode := ban.GetGroupRunningMode(ctx.Event.GroupID)
46+
if !utils.IsMessageGroup(ctx) {
47+
whiteMode = ban.GetUserRunningMode(ctx.Event.UserID)
48+
}
49+
var keys map[string]struct{}
50+
if whiteMode {
51+
keys = getWhiteKeys(ctx.Event.UserID, ctx.Event.GroupID)
52+
} else {
53+
keys = getBlackKeys(ctx.Event.UserID, ctx.Event.GroupID)
54+
}
4555
if utils.IsGroupAnonymous(ctx) { // 匿名用户单独处理
4656
isSuper = false
4757
level = math.MaxInt
4858
}
4959
if len(arg) == 0 {
50-
ctx.SendChain(formSummaryHelpMsg(isSuper, utils.IsMessagePrimary(ctx), level, blacks))
60+
ctx.SendChain(formSummaryHelpMsg(isSuper, utils.IsMessagePrimary(ctx), level, whiteMode, keys))
5161
} else {
52-
ctx.SendChain(formSingleHelpMsg(arg, isSuper, utils.IsMessagePrimary(ctx), level, blacks))
62+
ctx.SendChain(formSingleHelpMsg(arg, isSuper, utils.IsMessagePrimary(ctx), level, whiteMode, keys))
5363
}
5464
}
5565

@@ -85,3 +95,17 @@ func getBlackKeys(userID, groupID int64) map[string]struct{} {
8595
return utils.FormSetByStrings(strings.Split(groupS.BlackPlugins, "|"),
8696
strings.Split(usersKey, "|"))
8797
}
98+
func getWhiteKeys(userID, groupID int64) map[string]struct{} {
99+
var users []dao.UserSetting
100+
var groupS dao.GroupSetting
101+
proxy.GetDB().Find(&users, []int64{0, userID})
102+
if groupID != 0 {
103+
proxy.GetDB().Find(&groupS, groupID)
104+
}
105+
var usersKey string
106+
for _, user := range users {
107+
usersKey += user.BlackPlugins
108+
}
109+
return utils.FormSetByStrings(strings.Split(groupS.WhitePlugins, "|"),
110+
strings.Split(usersKey, "|"))
111+
}

basic/help/single.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
"github.com/wdvxdr1123/ZeroBot/message"
1010
)
1111

12-
func formSingleHelpMsg(cmd string, isSuper, isPrimary bool, priority int, blackKeys map[string]struct{}) message.MessageSegment {
12+
func formSingleHelpMsg(cmd string, isSuper, isPrimary bool, priority int, white bool, blackKeys map[string]struct{}) message.MessageSegment {
1313
plugins := manager.GetAllPluginConditions()
1414
// 寻找插件
1515
var selected *manager.PluginCondition
@@ -31,7 +31,10 @@ func formSingleHelpMsg(cmd string, isSuper, isPrimary bool, priority int, blackK
3131
return message.Text("没有找到这个功能哦,或在群聊中无法查看功能详情")
3232
}
3333
// 插件状态检查
34-
if _, ok := blackKeys[selected.Key]; ok {
34+
if _, ok := blackKeys[selected.Key]; !white && ok {
35+
return message.Text("功能被禁用中")
36+
}
37+
if _, ok := blackKeys[selected.Key]; white && !ok {
3538
return message.Text("功能被禁用中")
3639
}
3740
// 生成图片 名称|普通用法|超级用户用法

basic/help/summary.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,23 @@ import (
1818
const defaultClassify = "一般功能"
1919
const passiveClassify = "被动"
2020

21-
func formSummaryHelpMsg(isSuper, isPrimary bool, priority int, blackKeys map[string]struct{}) message.MessageSegment {
21+
func formSummaryHelpMsg(isSuper, isPrimary bool, priority int, white bool, keys map[string]struct{}) message.MessageSegment {
2222
plugins := manager.GetAllPluginConditions()
2323
// 获取所有插件信息
2424
var helps helpSummaryMap = make(map[string]*blockInfo)
2525
for _, plugin := range plugins {
2626
// 过滤
27-
if !checkPluginCouldShow(plugin, isSuper, isPrimary, priority, blackKeys) {
27+
if !checkPluginCouldShow(plugin, isSuper, isPrimary, priority, keys) {
2828
continue
2929
}
3030
// 生成项目(一个插件)
3131
var item blockItem
3232
item.name = plugin.Name
3333
item.color = "black"
34-
if _, ok := blackKeys[plugin.Key]; ok {
34+
if _, ok := keys[plugin.Key]; white && !ok {
35+
item.disabled = true // 插件对该用户或群被禁用
36+
}
37+
if _, ok := keys[plugin.Key]; !white && ok {
3538
item.disabled = true // 插件对该用户或群被禁用
3639
}
3740
if plugin.IsPassive && len(plugin.Classify) != 0 && plugin.Classify != passiveClassify {

0 commit comments

Comments
 (0)