group_ratio.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package ratio_setting
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "sync"
  6. "github.com/QuantumNous/new-api/common"
  7. "github.com/QuantumNous/new-api/setting/config"
  8. "github.com/QuantumNous/new-api/types"
  9. )
  10. var groupRatio = map[string]float64{
  11. "default": 1,
  12. "vip": 1,
  13. "svip": 1,
  14. }
  15. var groupRatioMutex sync.RWMutex
  16. var (
  17. GroupGroupRatio = map[string]map[string]float64{
  18. "vip": {
  19. "edit_this": 0.9,
  20. },
  21. }
  22. groupGroupRatioMutex sync.RWMutex
  23. )
  24. var defaultGroupSpecialUsableGroup = map[string]map[string]string{
  25. "vip": {
  26. "append_1": "vip_special_group_1",
  27. "-:remove_1": "vip_removed_group_1",
  28. },
  29. }
  30. type GroupRatioSetting struct {
  31. GroupRatio map[string]float64 `json:"group_ratio"`
  32. GroupGroupRatio map[string]map[string]float64 `json:"group_group_ratio"`
  33. GroupSpecialUsableGroup *types.RWMap[string, map[string]string] `json:"group_special_usable_group"`
  34. }
  35. var groupRatioSetting GroupRatioSetting
  36. func init() {
  37. groupSpecialUsableGroup := types.NewRWMap[string, map[string]string]()
  38. groupSpecialUsableGroup.AddAll(defaultGroupSpecialUsableGroup)
  39. groupRatioSetting = GroupRatioSetting{
  40. GroupSpecialUsableGroup: groupSpecialUsableGroup,
  41. GroupRatio: groupRatio,
  42. GroupGroupRatio: GroupGroupRatio,
  43. }
  44. config.GlobalConfig.Register("group_ratio_setting", &groupRatioSetting)
  45. }
  46. func GetGroupRatioSetting() *GroupRatioSetting {
  47. if groupRatioSetting.GroupSpecialUsableGroup == nil {
  48. groupRatioSetting.GroupSpecialUsableGroup = types.NewRWMap[string, map[string]string]()
  49. groupRatioSetting.GroupSpecialUsableGroup.AddAll(defaultGroupSpecialUsableGroup)
  50. }
  51. return &groupRatioSetting
  52. }
  53. func GetGroupRatioCopy() map[string]float64 {
  54. groupRatioMutex.RLock()
  55. defer groupRatioMutex.RUnlock()
  56. groupRatioCopy := make(map[string]float64)
  57. for k, v := range groupRatio {
  58. groupRatioCopy[k] = v
  59. }
  60. return groupRatioCopy
  61. }
  62. func ContainsGroupRatio(name string) bool {
  63. groupRatioMutex.RLock()
  64. defer groupRatioMutex.RUnlock()
  65. _, ok := groupRatio[name]
  66. return ok
  67. }
  68. func GroupRatio2JSONString() string {
  69. groupRatioMutex.RLock()
  70. defer groupRatioMutex.RUnlock()
  71. jsonBytes, err := json.Marshal(groupRatio)
  72. if err != nil {
  73. common.SysLog("error marshalling model ratio: " + err.Error())
  74. }
  75. return string(jsonBytes)
  76. }
  77. func UpdateGroupRatioByJSONString(jsonStr string) error {
  78. groupRatioMutex.Lock()
  79. defer groupRatioMutex.Unlock()
  80. groupRatio = make(map[string]float64)
  81. return json.Unmarshal([]byte(jsonStr), &groupRatio)
  82. }
  83. func GetGroupRatio(name string) float64 {
  84. groupRatioMutex.RLock()
  85. defer groupRatioMutex.RUnlock()
  86. ratio, ok := groupRatio[name]
  87. if !ok {
  88. common.SysLog("group ratio not found: " + name)
  89. return 1
  90. }
  91. return ratio
  92. }
  93. func GetGroupGroupRatio(userGroup, usingGroup string) (float64, bool) {
  94. groupGroupRatioMutex.RLock()
  95. defer groupGroupRatioMutex.RUnlock()
  96. gp, ok := GroupGroupRatio[userGroup]
  97. if !ok {
  98. return -1, false
  99. }
  100. ratio, ok := gp[usingGroup]
  101. if !ok {
  102. return -1, false
  103. }
  104. return ratio, true
  105. }
  106. func GroupGroupRatio2JSONString() string {
  107. groupGroupRatioMutex.RLock()
  108. defer groupGroupRatioMutex.RUnlock()
  109. jsonBytes, err := json.Marshal(GroupGroupRatio)
  110. if err != nil {
  111. common.SysLog("error marshalling group-group ratio: " + err.Error())
  112. }
  113. return string(jsonBytes)
  114. }
  115. func UpdateGroupGroupRatioByJSONString(jsonStr string) error {
  116. groupGroupRatioMutex.Lock()
  117. defer groupGroupRatioMutex.Unlock()
  118. GroupGroupRatio = make(map[string]map[string]float64)
  119. return json.Unmarshal([]byte(jsonStr), &GroupGroupRatio)
  120. }
  121. func CheckGroupRatio(jsonStr string) error {
  122. checkGroupRatio := make(map[string]float64)
  123. err := json.Unmarshal([]byte(jsonStr), &checkGroupRatio)
  124. if err != nil {
  125. return err
  126. }
  127. for name, ratio := range checkGroupRatio {
  128. if ratio < 0 {
  129. return errors.New("group ratio must be not less than 0: " + name)
  130. }
  131. }
  132. return nil
  133. }