update single user max diange count

This commit is contained in:
aynakeya
2024-06-23 15:22:57 +08:00
parent 7e089913be
commit a06412e833
4 changed files with 40 additions and 2 deletions

View File

@@ -384,6 +384,10 @@
"en": "User", "en": "User",
"zh-CN": "普通用户" "zh-CN": "普通用户"
}, },
"plugin.diange.user_max": {
"en": "User Maximum queue",
"zh-CN": "单个用户最大点歌数"
},
"plugin.maxduration.description": { "plugin.maxduration.description": {
"en": "Set the maximum duration of a song", "en": "Set the maximum duration of a song",
"zh-CN": "设置歌曲最长能播多久" "zh-CN": "设置歌曲最长能播多久"

1
go.mod
View File

@@ -62,6 +62,7 @@ require (
github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-isatty v0.0.19 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/sahilm/fuzzy v0.1.0 // indirect github.com/sahilm/fuzzy v0.1.0 // indirect
github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d // indirect
github.com/spf13/cast v1.5.1 // indirect github.com/spf13/cast v1.5.1 // indirect
github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect
github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect

View File

@@ -18,6 +18,7 @@ import (
"golang.org/x/exp/slices" "golang.org/x/exp/slices"
"sort" "sort"
"strings" "strings"
"sync"
"time" "time"
) )
@@ -35,6 +36,7 @@ type Diange struct {
MedalName string MedalName string
MedalPermission int MedalPermission int
QueueMax int QueueMax int
UserMax int
UserCoolDown int UserCoolDown int
CustomCMD string CustomCMD string
SourceConfigPath string SourceConfigPath string
@@ -46,6 +48,7 @@ type Diange struct {
sourceConfigs map[string]*sourceConfig sourceConfigs map[string]*sourceConfig
blacklist []blacklistItem blacklist []blacklistItem
cooldowns map[string]int cooldowns map[string]int
userCount sync.Map
panel fyne.CanvasObject panel fyne.CanvasObject
log logger.ILogger log logger.ILogger
} }
@@ -59,6 +62,7 @@ func NewDiange() *Diange {
AdminPermission: true, AdminPermission: true,
QueueMax: 128, QueueMax: 128,
UserCoolDown: -1, UserCoolDown: -1,
UserMax: 128,
CustomCMD: "点歌", CustomCMD: "点歌",
SourceConfigPath: "./config/diange.json", SourceConfigPath: "./config/diange.json",
BlackListItemPath: "./config/diange_blacklist.json", BlackListItemPath: "./config/diange_blacklist.json",
@@ -92,6 +96,7 @@ func NewDiange() *Diange {
}, },
}, },
cooldowns: make(map[string]int), cooldowns: make(map[string]int),
userCount: sync.Map{},
log: global.Logger.WithPrefix("Plugin.Diange"), log: global.Logger.WithPrefix("Plugin.Diange"),
} }
return diange return diange
@@ -124,6 +129,18 @@ func (d *Diange) Enable() error {
"plugin.diange.queue.update", "plugin.diange.queue.update",
func(event *event.Event) { func(event *event.Event) {
d.currentQueueLength = len(event.Data.(events.PlaylistDetailUpdateEvent).Medias) d.currentQueueLength = len(event.Data.(events.PlaylistDetailUpdateEvent).Medias)
medias := event.Data.(events.PlaylistDetailUpdateEvent).Medias
tmpUserCount := make(map[string]int)
for _, media := range medias {
_, ok := tmpUserCount[media.ToUser().Name]
if !ok {
tmpUserCount[media.ToUser().Name] = 0
}
tmpUserCount[media.ToUser().Name]++
}
for user, count := range tmpUserCount {
d.userCount.Store(user, count)
}
}) })
global.EventManager.RegisterA( global.EventManager.RegisterA(
events.PlayerPlayingUpdate, events.PlayerPlayingUpdate,
@@ -186,6 +203,18 @@ func (d *Diange) handleMessage(event *event.Event) {
return return
} }
//check user max
if d.UserMax > 0 {
userCount, ok := d.userCount.Load(message.User.Username)
if !ok {
userCount = 0
}
if userCount.(int) >= d.UserMax {
d.log.Infof("User %s(%s) exceed max diange count, ignore", message.User.Username, message.User.Uid)
return
}
}
// if in user cool down, return // if in user cool down, return
ct := int(time.Now().Unix()) ct := int(time.Now().Unix())
if (ct - d.cooldowns[message.User.Uid]) <= d.UserCoolDown { if (ct - d.cooldowns[message.User.Uid]) <= d.UserCoolDown {
@@ -326,6 +355,10 @@ func (d *Diange) CreatePanel() fyne.CanvasObject {
widget.NewLabel(i18n.T("plugin.diange.queue_max")), nil, widget.NewLabel(i18n.T("plugin.diange.queue_max")), nil,
widget.NewEntryWithData(binding.IntToString(binding.BindInt(&d.QueueMax))), widget.NewEntryWithData(binding.IntToString(binding.BindInt(&d.QueueMax))),
) )
dgUserMax := container.NewBorder(nil, nil,
widget.NewLabel(i18n.T("plugin.diange.user_max")), nil,
widget.NewEntryWithData(binding.IntToString(binding.BindInt(&d.UserMax))),
)
dgCoolDown := container.NewBorder(nil, nil, dgCoolDown := container.NewBorder(nil, nil,
widget.NewLabel(i18n.T("plugin.diange.cooldown")), nil, widget.NewLabel(i18n.T("plugin.diange.cooldown")), nil,
widget.NewEntryWithData(binding.IntToString(binding.BindInt(&d.UserCoolDown))), widget.NewEntryWithData(binding.IntToString(binding.BindInt(&d.UserCoolDown))),
@@ -355,6 +388,6 @@ func (d *Diange) CreatePanel() fyne.CanvasObject {
dgSourceCMD := container.NewBorder( dgSourceCMD := container.NewBorder(
nil, nil, widget.NewLabel(i18n.T("plugin.diange.source_cmd")), nil, nil, nil, widget.NewLabel(i18n.T("plugin.diange.source_cmd")), nil,
container.NewVBox(sourceCfgs...)) container.NewVBox(sourceCfgs...))
d.panel = container.NewVBox(dgPerm, dgMdPerm, dgQueue, dgCoolDown, dgShortCut, skipPlaylist, dgSourceCMD) d.panel = container.NewVBox(dgPerm, dgMdPerm, dgQueue, dgUserMax, dgCoolDown, dgShortCut, skipPlaylist, dgSourceCMD)
return d.panel return d.panel
} }