group_ratio.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package ratio_setting
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "one-api/common"
  6. "sync"
  7. )
  8. var groupRatio = map[string]float64{
  9. "default": 1,
  10. "vip": 1,
  11. "svip": 1,
  12. }
  13. var groupRatioMutex sync.RWMutex
  14. var (
  15. GroupGroupRatio = map[string]map[string]float64{
  16. "vip": {
  17. "edit_this": 0.9,
  18. },
  19. }
  20. groupGroupRatioMutex sync.RWMutex
  21. )
  22. func GetGroupRatioCopy() map[string]float64 {
  23. groupRatioMutex.RLock()
  24. defer groupRatioMutex.RUnlock()
  25. groupRatioCopy := make(map[string]float64)
  26. for k, v := range groupRatio {
  27. groupRatioCopy[k] = v
  28. }
  29. return groupRatioCopy
  30. }
  31. func ContainsGroupRatio(name string) bool {
  32. groupRatioMutex.RLock()
  33. defer groupRatioMutex.RUnlock()
  34. _, ok := groupRatio[name]
  35. return ok
  36. }
  37. func GroupRatio2JSONString() string {
  38. groupRatioMutex.RLock()
  39. defer groupRatioMutex.RUnlock()
  40. jsonBytes, err := json.Marshal(groupRatio)
  41. if err != nil {
  42. common.SysError("error marshalling model ratio: " + err.Error())
  43. }
  44. return string(jsonBytes)
  45. }
  46. func UpdateGroupRatioByJSONString(jsonStr string) error {
  47. groupRatioMutex.Lock()
  48. defer groupRatioMutex.Unlock()
  49. groupRatio = make(map[string]float64)
  50. return json.Unmarshal([]byte(jsonStr), &groupRatio)
  51. }
  52. func GetGroupRatio(name string) float64 {
  53. groupRatioMutex.RLock()
  54. defer groupRatioMutex.RUnlock()
  55. ratio, ok := groupRatio[name]
  56. if !ok {
  57. common.SysError("group ratio not found: " + name)
  58. return 1
  59. }
  60. return ratio
  61. }
  62. func GetGroupGroupRatio(userGroup, usingGroup string) (float64, bool) {
  63. groupGroupRatioMutex.RLock()
  64. defer groupGroupRatioMutex.RUnlock()
  65. gp, ok := GroupGroupRatio[userGroup]
  66. if !ok {
  67. return -1, false
  68. }
  69. ratio, ok := gp[usingGroup]
  70. if !ok {
  71. return -1, false
  72. }
  73. return ratio, true
  74. }
  75. func GroupGroupRatio2JSONString() string {
  76. groupGroupRatioMutex.RLock()
  77. defer groupGroupRatioMutex.RUnlock()
  78. jsonBytes, err := json.Marshal(GroupGroupRatio)
  79. if err != nil {
  80. common.SysError("error marshalling group-group ratio: " + err.Error())
  81. }
  82. return string(jsonBytes)
  83. }
  84. func UpdateGroupGroupRatioByJSONString(jsonStr string) error {
  85. groupGroupRatioMutex.Lock()
  86. defer groupGroupRatioMutex.Unlock()
  87. GroupGroupRatio = make(map[string]map[string]float64)
  88. return json.Unmarshal([]byte(jsonStr), &GroupGroupRatio)
  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. }