group_ratio.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package ratio_setting
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "github.com/QuantumNous/new-api/common"
  6. "github.com/QuantumNous/new-api/setting/config"
  7. "github.com/QuantumNous/new-api/types"
  8. )
  9. var defaultGroupRatio = map[string]float64{
  10. "default": 1,
  11. "vip": 1,
  12. "svip": 1,
  13. }
  14. var groupRatioMap = types.NewRWMap[string, float64]()
  15. var defaultGroupGroupRatio = map[string]map[string]float64{
  16. "vip": {
  17. "edit_this": 0.9,
  18. },
  19. }
  20. var groupGroupRatioMap = types.NewRWMap[string, map[string]float64]()
  21. var defaultGroupSpecialUsableGroup = map[string]map[string]string{
  22. "vip": {
  23. "append_1": "vip_special_group_1",
  24. "-:remove_1": "vip_removed_group_1",
  25. },
  26. }
  27. type GroupRatioSetting struct {
  28. GroupRatio *types.RWMap[string, float64] `json:"group_ratio"`
  29. GroupGroupRatio *types.RWMap[string, map[string]float64] `json:"group_group_ratio"`
  30. GroupSpecialUsableGroup *types.RWMap[string, map[string]string] `json:"group_special_usable_group"`
  31. }
  32. var groupRatioSetting GroupRatioSetting
  33. func init() {
  34. groupSpecialUsableGroup := types.NewRWMap[string, map[string]string]()
  35. groupSpecialUsableGroup.AddAll(defaultGroupSpecialUsableGroup)
  36. groupRatioMap.AddAll(defaultGroupRatio)
  37. groupGroupRatioMap.AddAll(defaultGroupGroupRatio)
  38. groupRatioSetting = GroupRatioSetting{
  39. GroupSpecialUsableGroup: groupSpecialUsableGroup,
  40. GroupRatio: groupRatioMap,
  41. GroupGroupRatio: groupGroupRatioMap,
  42. }
  43. config.GlobalConfig.Register("group_ratio_setting", &groupRatioSetting)
  44. }
  45. func GetGroupRatioSetting() *GroupRatioSetting {
  46. if groupRatioSetting.GroupSpecialUsableGroup == nil {
  47. groupRatioSetting.GroupSpecialUsableGroup = types.NewRWMap[string, map[string]string]()
  48. groupRatioSetting.GroupSpecialUsableGroup.AddAll(defaultGroupSpecialUsableGroup)
  49. }
  50. return &groupRatioSetting
  51. }
  52. func GetGroupRatioCopy() map[string]float64 {
  53. return groupRatioMap.ReadAll()
  54. }
  55. func ContainsGroupRatio(name string) bool {
  56. _, ok := groupRatioMap.Get(name)
  57. return ok
  58. }
  59. func GroupRatio2JSONString() string {
  60. return groupRatioMap.MarshalJSONString()
  61. }
  62. func UpdateGroupRatioByJSONString(jsonStr string) error {
  63. return types.LoadFromJsonString(groupRatioMap, jsonStr)
  64. }
  65. func GetGroupRatio(name string) float64 {
  66. ratio, ok := groupRatioMap.Get(name)
  67. if !ok {
  68. common.SysLog("group ratio not found: " + name)
  69. return 1
  70. }
  71. return ratio
  72. }
  73. func GetGroupGroupRatio(userGroup, usingGroup string) (float64, bool) {
  74. gp, ok := groupGroupRatioMap.Get(userGroup)
  75. if !ok {
  76. return -1, false
  77. }
  78. ratio, ok := gp[usingGroup]
  79. if !ok {
  80. return -1, false
  81. }
  82. return ratio, true
  83. }
  84. func GroupGroupRatio2JSONString() string {
  85. return groupGroupRatioMap.MarshalJSONString()
  86. }
  87. func UpdateGroupGroupRatioByJSONString(jsonStr string) error {
  88. return types.LoadFromJsonString(groupGroupRatioMap, jsonStr)
  89. }
  90. func CheckGroupRatio(jsonStr string) error {
  91. checkGroupRatio := make(map[string]float64)
  92. err := json.Unmarshal([]byte(jsonStr), &checkGroupRatio)
  93. if err != nil {
  94. return err
  95. }
  96. for name, ratio := range checkGroupRatio {
  97. if ratio < 0 {
  98. return errors.New("group ratio must be not less than 0: " + name)
  99. }
  100. }
  101. return nil
  102. }