| package ratio_setting |
|
|
| import ( |
| "encoding/json" |
| "errors" |
|
|
| "github.com/QuantumNous/new-api/common" |
| "github.com/QuantumNous/new-api/setting/config" |
| "github.com/QuantumNous/new-api/types" |
| ) |
|
|
| var defaultGroupRatio = map[string]float64{ |
| "default": 1, |
| "vip": 1, |
| "svip": 1, |
| } |
|
|
| var groupRatioMap = types.NewRWMap[string, float64]() |
|
|
| var defaultGroupGroupRatio = map[string]map[string]float64{ |
| "vip": { |
| "edit_this": 0.9, |
| }, |
| } |
|
|
| var groupGroupRatioMap = types.NewRWMap[string, map[string]float64]() |
|
|
| var defaultGroupSpecialUsableGroup = map[string]map[string]string{ |
| "vip": { |
| "append_1": "vip_special_group_1", |
| "-:remove_1": "vip_removed_group_1", |
| }, |
| } |
|
|
| type GroupRatioSetting struct { |
| GroupRatio *types.RWMap[string, float64] `json:"group_ratio"` |
| GroupGroupRatio *types.RWMap[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) |
|
|
| groupRatioMap.AddAll(defaultGroupRatio) |
| groupGroupRatioMap.AddAll(defaultGroupGroupRatio) |
|
|
| groupRatioSetting = GroupRatioSetting{ |
| GroupSpecialUsableGroup: groupSpecialUsableGroup, |
| GroupRatio: groupRatioMap, |
| GroupGroupRatio: groupGroupRatioMap, |
| } |
|
|
| 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 { |
| return groupRatioMap.ReadAll() |
| } |
|
|
| func ContainsGroupRatio(name string) bool { |
| _, ok := groupRatioMap.Get(name) |
| return ok |
| } |
|
|
| func GroupRatio2JSONString() string { |
| return groupRatioMap.MarshalJSONString() |
| } |
|
|
| func UpdateGroupRatioByJSONString(jsonStr string) error { |
| return types.LoadFromJsonString(groupRatioMap, jsonStr) |
| } |
|
|
| func GetGroupRatio(name string) float64 { |
| ratio, ok := groupRatioMap.Get(name) |
| if !ok { |
| common.SysLog("group ratio not found: " + name) |
| return 1 |
| } |
| return ratio |
| } |
|
|
| func GetGroupGroupRatio(userGroup, usingGroup string) (float64, bool) { |
| gp, ok := groupGroupRatioMap.Get(userGroup) |
| if !ok { |
| return -1, false |
| } |
| ratio, ok := gp[usingGroup] |
| if !ok { |
| return -1, false |
| } |
| return ratio, true |
| } |
|
|
| func GroupGroupRatio2JSONString() string { |
| return groupGroupRatioMap.MarshalJSONString() |
| } |
|
|
| func UpdateGroupGroupRatioByJSONString(jsonStr string) error { |
| return types.LoadFromJsonString(groupGroupRatioMap, jsonStr) |
| } |
|
|
| 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 |
| } |
|
|