| package ratio_setting |
|
|
| import ( |
| "encoding/json" |
| "errors" |
| "sync" |
|
|
| "github.com/QuantumNous/new-api/common" |
| "github.com/QuantumNous/new-api/setting/config" |
| "github.com/QuantumNous/new-api/types" |
| ) |
|
|
| var groupRatio = map[string]float64{ |
| "default": 1, |
| "vip": 1, |
| "svip": 1, |
| } |
|
|
| var groupRatioMutex sync.RWMutex |
|
|
| var ( |
| GroupGroupRatio = map[string]map[string]float64{ |
| "vip": { |
| "edit_this": 0.9, |
| }, |
| } |
| groupGroupRatioMutex sync.RWMutex |
| ) |
|
|
| var defaultGroupSpecialUsableGroup = map[string]map[string]string{ |
| "vip": { |
| "append_1": "vip_special_group_1", |
| "-:remove_1": "vip_removed_group_1", |
| }, |
| } |
|
|
| type GroupRatioSetting struct { |
| GroupRatio map[string]float64 `json:"group_ratio"` |
| GroupGroupRatio map[string]map[string]float64 `json:"group_group_ratio"` |
| GroupSpecialUsableGroup *types.RWMap[string, map[string]string] `json:"group_special_usable_group"` |
| } |
|
|
| var groupRatioSetting GroupRatioSetting |
|
|
| func init() { |
| groupSpecialUsableGroup := types.NewRWMap[string, map[string]string]() |
| groupSpecialUsableGroup.AddAll(defaultGroupSpecialUsableGroup) |
|
|
| groupRatioSetting = GroupRatioSetting{ |
| GroupSpecialUsableGroup: groupSpecialUsableGroup, |
| GroupRatio: groupRatio, |
| GroupGroupRatio: GroupGroupRatio, |
| } |
|
|
| config.GlobalConfig.Register("group_ratio_setting", &groupRatioSetting) |
| } |
|
|
| func GetGroupRatioSetting() *GroupRatioSetting { |
| if groupRatioSetting.GroupSpecialUsableGroup == nil { |
| groupRatioSetting.GroupSpecialUsableGroup = types.NewRWMap[string, map[string]string]() |
| groupRatioSetting.GroupSpecialUsableGroup.AddAll(defaultGroupSpecialUsableGroup) |
| } |
| return &groupRatioSetting |
| } |
|
|
| func GetGroupRatioCopy() map[string]float64 { |
| groupRatioMutex.RLock() |
| defer groupRatioMutex.RUnlock() |
|
|
| groupRatioCopy := make(map[string]float64) |
| for k, v := range groupRatio { |
| groupRatioCopy[k] = v |
| } |
| return groupRatioCopy |
| } |
|
|
| func ContainsGroupRatio(name string) bool { |
| groupRatioMutex.RLock() |
| defer groupRatioMutex.RUnlock() |
|
|
| _, ok := groupRatio[name] |
| return ok |
| } |
|
|
| func GroupRatio2JSONString() string { |
| groupRatioMutex.RLock() |
| defer groupRatioMutex.RUnlock() |
|
|
| jsonBytes, err := json.Marshal(groupRatio) |
| if err != nil { |
| common.SysLog("error marshalling model ratio: " + err.Error()) |
| } |
| return string(jsonBytes) |
| } |
|
|
| func UpdateGroupRatioByJSONString(jsonStr string) error { |
| groupRatioMutex.Lock() |
| defer groupRatioMutex.Unlock() |
|
|
| groupRatio = make(map[string]float64) |
| return json.Unmarshal([]byte(jsonStr), &groupRatio) |
| } |
|
|
| func GetGroupRatio(name string) float64 { |
| groupRatioMutex.RLock() |
| defer groupRatioMutex.RUnlock() |
|
|
| ratio, ok := groupRatio[name] |
| if !ok { |
| common.SysLog("group ratio not found: " + name) |
| return 1 |
| } |
| return ratio |
| } |
|
|
| func GetGroupGroupRatio(userGroup, usingGroup string) (float64, bool) { |
| groupGroupRatioMutex.RLock() |
| defer groupGroupRatioMutex.RUnlock() |
|
|
| gp, ok := GroupGroupRatio[userGroup] |
| if !ok { |
| return -1, false |
| } |
| ratio, ok := gp[usingGroup] |
| if !ok { |
| return -1, false |
| } |
| return ratio, true |
| } |
|
|
| func GroupGroupRatio2JSONString() string { |
| groupGroupRatioMutex.RLock() |
| defer groupGroupRatioMutex.RUnlock() |
|
|
| jsonBytes, err := json.Marshal(GroupGroupRatio) |
| if err != nil { |
| common.SysLog("error marshalling group-group ratio: " + err.Error()) |
| } |
| return string(jsonBytes) |
| } |
|
|
| func UpdateGroupGroupRatioByJSONString(jsonStr string) error { |
| groupGroupRatioMutex.Lock() |
| defer groupGroupRatioMutex.Unlock() |
|
|
| GroupGroupRatio = make(map[string]map[string]float64) |
| return json.Unmarshal([]byte(jsonStr), &GroupGroupRatio) |
| } |
|
|
| func CheckGroupRatio(jsonStr string) error { |
| checkGroupRatio := make(map[string]float64) |
| err := json.Unmarshal([]byte(jsonStr), &checkGroupRatio) |
| if err != nil { |
| return err |
| } |
| for name, ratio := range checkGroupRatio { |
| if ratio < 0 { |
| return errors.New("group ratio must be not less than 0: " + name) |
| } |
| } |
| return nil |
| } |
|
|