Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

白名单运行 #34

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions basic/ban/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,13 @@ func init() {
}
proxy.OnCommands([]string{"开启"}, zero.OnlyToMe).SetBlock(true).FirstPriority().Handle(openPlugin)
proxy.OnCommands([]string{"关闭"}, zero.OnlyToMe).SetBlock(true).FirstPriority().Handle(closePlugin)
proxy.OnCommands([]string{"白名单模式"}, zero.OnlyToMe).SetBlock(true).FirstPriority().Handle(setModeWhite)
proxy.OnCommands([]string{"黑名单模式"}, zero.OnlyToMe).SetBlock(true).FirstPriority().Handle(setModeBlack)
proxy.OnCommands([]string{"封禁", "ban", "Ban"}, zero.OnlyToMe).SetBlock(true).FirstPriority().Handle(banUser)
proxy.OnCommands([]string{"解封", "unban", "Unban"}, zero.OnlyToMe).SetBlock(true).FirstPriority().Handle(unbanUser)
proxy.OnCommands([]string{"黑名单"}, zero.OnlyToMe).SetBlock(true).FirstPriority().Handle(showBlack)
// 仅超级用户可以使用白名单查看某个白名单模式群的启用功能
proxy.OnCommands([]string{"白名单"}, zero.OnlyToMe, zero.SuperUserPermission).SetBlock(true).FirstPriority().Handle(showWhite)
proxy.AddConfig("tip", false)
manager.AddPreHook(checkPluginStatus)
}
Expand Down
72 changes: 55 additions & 17 deletions basic/ban/public.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,29 @@ func SetUserPluginStatus(status bool, userID int64, plugin *manager.PluginCondit
var key string
if plugin != nil {
key = plugin.Key
} else { // plugin 为空,代表所有插件
key = AllPluginKey
Copy link
Contributor Author

@RikaCelery RikaCelery Feb 10, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

看了一下这里没有这种情况出现

// 处理插件名
plugin = findPluginByName(args[0])
if plugin == nil {
ctx.Send(fmt.Sprintf("没有叫%v的功能哦,可以看看帮助", args[0]))
return 0, nil, period, fmt.Errorf("no such plugin %v", args[0])
}

} else {
panic("SetGroupPluginStatus: plugin is nil")
}
// 更新数据库
var preUser dao.UserSetting
proxy.GetDB().Take(&preUser, userID)
preUser.ID = userID
if status { // 启用
preUser.BlackPlugins = delPluginKey(preUser.BlackPlugins, key)
} else { // 关闭
preUser.BlackPlugins = addPluginKey(preUser.BlackPlugins, key)
if preUser.WhiteMode {
if status { // 启用
preUser.WhitePlugins = addPluginKey(preUser.WhitePlugins, key)
} else { // 关闭
preUser.WhitePlugins = delPluginKey(preUser.WhitePlugins, key)
}
} else {
if status { // 启用
preUser.BlackPlugins = delPluginKey(preUser.BlackPlugins, key)
} else { // 关闭
preUser.BlackPlugins = addPluginKey(preUser.BlackPlugins, key)
}
}
if err := proxy.GetDB().Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "id"}},
DoUpdates: clause.AssignmentColumns([]string{"black_plugins"}), // Upsert
DoUpdates: clause.AssignmentColumns([]string{"black_plugins", "white_plugins"}), // Upsert
}).Create(&preUser).Error; err != nil {
log.Errorf("set user(%v) black_plugins error(sql): %v", userID, err)
return err
Expand All @@ -51,21 +59,29 @@ func SetGroupPluginStatus(status bool, groupID int64, plugin *manager.PluginCond
var key string
if plugin != nil {
key = plugin.Key
} else { // plugin 为空,代表所有插件
key = AllPluginKey
Copy link
Contributor Author

@RikaCelery RikaCelery Feb 10, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

同上,传入参数不可能为nil

// 处理插件名
plugin = findPluginByName(args[0])
if plugin == nil {
ctx.Send(fmt.Sprintf("没有叫%v的功能哦,可以看看帮助", args[0]))
return 0, nil, period, fmt.Errorf("no such plugin %v", args[0])
}

} else {
panic("SetGroupPluginStatus: plugin is nil")
}
// 更新数据库
var preGroup dao.GroupSetting
proxy.GetDB().Take(&preGroup, groupID)
preGroup.ID = groupID
if status { // 启用
preGroup.BlackPlugins = delPluginKey(preGroup.BlackPlugins, key)
} else { // 关闭
preGroup.BlackPlugins = addPluginKey(preGroup.BlackPlugins, key)
if preGroup.WhiteMode {
if status { // 启用
preGroup.WhitePlugins = addPluginKey(preGroup.WhitePlugins, key)
} else { // 关闭
preGroup.WhitePlugins = delPluginKey(preGroup.WhitePlugins, key)
}
} else {
if status { // 启用
preGroup.BlackPlugins = delPluginKey(preGroup.BlackPlugins, key)
} else { // 关闭
preGroup.BlackPlugins = addPluginKey(preGroup.BlackPlugins, key)
}
}
if err := proxy.GetDB().Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "id"}},
DoUpdates: clause.AssignmentColumns([]string{"black_plugins"}), // Upsert
DoUpdates: clause.AssignmentColumns([]string{"black_plugins", "white_plugins"}), // Upsert
}).Create(&preGroup).Error; err != nil {
log.Errorf("set group(%v) black_plugins error(sql): %v", groupID, err)
return err
Expand All @@ -92,7 +108,11 @@ func GetUserPluginStatus(userID int64, plugin *manager.PluginCondition) bool {
// 查询
var preUser dao.UserSetting
proxy.GetDB().Take(&preUser, userID)
return !(hasPluginKey(preUser.BlackPlugins, key) || hasPluginKey(preUser.BlackPlugins, AllPluginKey))
if preUser.WhiteMode { // 白名单模式
return hasPluginKey(preUser.WhitePlugins, key)
} else {
return !(hasPluginKey(preUser.BlackPlugins, key) || hasPluginKey(preUser.BlackPlugins, AllPluginKey))
}
}

// GetGroupPluginStatus 获取群插件状态(能否使用)
Expand All @@ -101,11 +121,29 @@ func GetGroupPluginStatus(groupID int64, plugin *manager.PluginCondition) bool {
var key string
if plugin != nil {
key = plugin.Key
} else { // plugin 为空,代表所有插件
} else {
key = AllPluginKey
}
// 查询
var preGroup dao.GroupSetting
proxy.GetDB().Take(&preGroup, groupID)
return !(hasPluginKey(preGroup.BlackPlugins, key) || hasPluginKey(preGroup.BlackPlugins, AllPluginKey))
if preGroup.WhiteMode { // 白名单模式
return hasPluginKey(preGroup.WhitePlugins, key)
} else {
return !(hasPluginKey(preGroup.BlackPlugins, key) || hasPluginKey(preGroup.BlackPlugins, AllPluginKey))
}
}

// GetGroupRunningMode 获取群运行模式(白名单模式为true,黑名单为false)
func GetGroupRunningMode(groupID int64) bool {
var preGroup dao.GroupSetting
proxy.GetDB().Take(&preGroup, groupID)
return preGroup.WhiteMode
}

// GetUserRunningMode 获取用户运行模式(白名单模式为true,黑名单为false)
func GetUserRunningMode(userID int64) bool {
var preUser dao.UserSetting
proxy.GetDB().Take(&preUser, userID)
return preUser.WhiteMode
}
98 changes: 83 additions & 15 deletions basic/ban/show.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,32 +15,49 @@ import (
zero "github.com/wdvxdr1123/ZeroBot"
)

// userID -> 被封插件列表
func getUsersBlack() map[int64][]string {
// userID -> 被封插件列表(白名单为启用的列表)
func getUsersBlackOrWhite(filterWhite bool) map[int64][]string {
var users []dao.UserSetting
proxy.GetDB().Select("id", "black_plugins").Where("LENGTH(black_plugins) > 1").Find(&users)

proxy.GetDB().Select("id", "black_plugins", "white_plugins", "white_mode").Where("LENGTH(black_plugins) > 1 or LENGTH(white_plugins) > 1").Find(&users)
res := make(map[int64][]string)
for _, user := range users {
blacks := utils.MergeStringSlices(strings.Split(user.BlackPlugins, "|")) // 去重去空
if len(blacks) == 0 {
var plugins []string
if user.WhiteMode != filterWhite {
continue
}
res[user.ID] = blacks
if filterWhite {
plugins = utils.MergeStringSlices(strings.Split(user.WhitePlugins, "|")) // 去重去空
} else {
plugins = utils.MergeStringSlices(strings.Split(user.BlackPlugins, "|")) // 去重去空
}
if len(plugins) == 0 {
continue
}
res[user.ID] = plugins
}
return res
}

// groupID -> 被封插件列表
func getGroupsBlack() map[int64][]string {
// groupID -> 被封插件列表(白名单为启用的列表)
func getGroupsBlackOrWhite(filterWhite bool) map[int64][]string {
var groups []dao.GroupSetting
proxy.GetDB().Select("id", "black_plugins").Where("LENGTH(black_plugins) > 1").Find(&groups)
proxy.GetDB().Select("id", "black_plugins", "white_plugins", "white_mode").Where("LENGTH(black_plugins) > 1").Find(&groups)
res := make(map[int64][]string)
for _, group := range groups {
blacks := utils.MergeStringSlices(strings.Split(group.BlackPlugins, "|")) // 去重去空
if len(blacks) == 0 {
var plugins []string
if group.WhiteMode != filterWhite {
continue
}
if filterWhite {
plugins = utils.MergeStringSlices(strings.Split(group.WhitePlugins, "|")) // 去重去空
} else {
plugins = utils.MergeStringSlices(strings.Split(group.BlackPlugins, "|")) // 去重去空
}
if len(plugins) == 0 {
continue
}
res[group.ID] = blacks
res[group.ID] = plugins
}
return res
}
Expand All @@ -57,7 +74,7 @@ func showBlack(ctx *zero.Ctx) {
}
// 群管理员 in 群聊
var str string
userM := getUsersBlack()
userM := getUsersBlackOrWhite(false)
rsp := ctx.GetGroupMemberList(ctx.Event.GroupID) // 过滤掉非本群成员
users := rsp.Array()
for _, user := range users {
Expand Down Expand Up @@ -88,9 +105,60 @@ func showBlack(ctx *zero.Ctx) {
ctx.SendChain(msg)
}

func showWhite(ctx *zero.Ctx) {
userM := getUsersBlackOrWhite(true)
groupM := getGroupsBlackOrWhite(true)
if len(userM) == 0 && len(groupM) == 0 {
ctx.Send("没有群/用户运行在白名单模式")
return
}
// 用户
if len(userM) > 0 {
str := "用户:"
userDesM := make(map[int64]string)
for id, blacks := range userM {
var des string
if id == 0 { // 全体用户(全局)
des = fmt.Sprintf("全体: %v\n", formBlackDescription(blacks))
} else { // 正常用户
user := ctx.GetStrangerInfo(id, false)
des = fmt.Sprintf("%v(%v): %v\n", user.Get("nickname"), id, formBlackDescription(blacks))
}
userDesM[id] = des
str += des + "\n"
}
w, _ := images.MeasureStringDefault(str, 24, 1.3)
msg, err := images.GenQQListMsgWithAva(userDesM, w, true)
if err != nil {
ctx.Send(str)
} else {
ctx.SendChain(message.Text("用户:\n"), msg)
}
}
// 群聊
if len(groupM) > 0 {
str := "群:"
groupDesM := make(map[int64]string)
for id, blacks := range groupM {
group := ctx.GetGroupInfo(id, false)
des := fmt.Sprintf("%v(%v): %v\n",
group.Name, id, formBlackDescription(blacks))
groupDesM[id] = des
str += des + "\n"
}
w, _ := images.MeasureStringDefault(str, 24, 1.3)
msg, err := images.GenQQListMsgWithAva(groupDesM, w, false)
if err != nil {
ctx.Send(str)
} else {
ctx.SendChain(message.Text("群:\n"), msg)
}
}
}

func showBlackInPrimarySuper(ctx *zero.Ctx) {
userM := getUsersBlack()
groupM := getGroupsBlack()
userM := getUsersBlackOrWhite(false)
groupM := getGroupsBlackOrWhite(false)
if len(userM) == 0 && len(groupM) == 0 {
ctx.Send("大家都是好人,黑名单暂时是空哒")
return
Expand Down
86 changes: 86 additions & 0 deletions basic/ban/switch.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ package ban

import (
"fmt"
"github.com/RicheyJang/PaimengBot/basic/auth"
"github.com/RicheyJang/PaimengBot/basic/dao"
"gorm.io/gorm/clause"
"strconv"
"strings"
"time"
Expand Down Expand Up @@ -84,3 +87,86 @@ func switchPlugin(status bool, ctx *zero.Ctx) {
}
dealGroupPluginStatus(ctx, status, ctx.Event.GroupID, plugin, period)
}

func setModeWhite(ctx *zero.Ctx) {
if utils.IsMessageGroup(ctx) {
// 查询
var preGroup dao.GroupSetting
proxy.GetDB().Take(&preGroup, ctx.Event.GroupID)
if preGroup.WhiteMode {
ctx.Send("该群已处于白名单模式,无需再设置")
return
}
preGroup.WhiteMode = true
if preGroup.WhitePlugins == "" {
preGroup.WhitePlugins = "auth|ban|event|help|invite|limiter|nickname|sc"
}
if err := proxy.GetDB().Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "id"}},
DoUpdates: clause.AssignmentColumns([]string{"white_mode"}), // Upsert
}).Create(&preGroup).Error; err != nil {
log.Errorf("setModeWhite err: %v", err)
ctx.Send("失败了...")
return
}
ctx.Send(fmt.Sprintf("群%d运行模式切换为白名单", ctx.Event.GroupID))
} else {
//私聊如果是超级管理员设置全局
if utils.IsSuperUser(ctx.Event.UserID) {
var preUser dao.UserSetting
preUser.WhiteMode = true
if preUser.WhitePlugins == "" {
preUser.WhitePlugins = "auth|ban|event|help|invite|limiter|nickname|sc"
}
if err := proxy.GetDB().Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "id"}},
DoUpdates: clause.AssignmentColumns([]string{"white_mode", "white_plugins"}), // Upsert
}).Create(&preUser).Error; err != nil {
log.Errorf("setModeWhite err: %v", err)
ctx.Send("失败了...")
return
}
ctx.Send("全局运行模式切换为白名单")
return
}
ctx.Send("请在群聊环境设置运行模式,如需帮助请联系BOT主人")
}
}
func setModeBlack(ctx *zero.Ctx) {
if utils.IsMessageGroup(ctx) {
if !auth.CheckPriority(ctx, 5, false) {
return
}
// 查询
var preGroup dao.GroupSetting
proxy.GetDB().Take(&preGroup, ctx.Event.GroupID)
if !preGroup.WhiteMode {
ctx.Send("该群已处于黑名单模式,无需再设置")
return
}
preGroup.WhiteMode = false
if err := proxy.GetDB().Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "id"}},
DoUpdates: clause.AssignmentColumns([]string{"white_mode"}), // Upsert
}).Create(&preGroup).Error; err != nil {
log.Errorf("setModeBlack err: %v", err)
ctx.Send("失败了...")
return
}
ctx.Send(fmt.Sprintf("群%d运行模式切换为黑名单", ctx.Event.GroupID))
} else {
//私聊如果是超级管理员设置全局
if utils.IsSuperUser(ctx.Event.UserID) {
var preUser dao.UserSetting
if err := proxy.GetDB().Model(&preUser).Where("id = ?", 0).Update("white_mode", true).Error; err != nil {
log.Errorf("setModeBlack err: %v", err)
ctx.Send("失败了...")
return
}
ctx.Send("全局运行模式切换为黑名单")
return
}
ctx.Send("请在群聊环境设置运行模式,如需帮助请联系BOT主人")
}

}
6 changes: 4 additions & 2 deletions basic/dao/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@ import (

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