Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

141 строка
3.5 KiB

  1. package service
  2. import (
  3. "errors"
  4. "strings"
  5. "github.com/QuantumNous/new-api/common"
  6. "github.com/QuantumNous/new-api/constant"
  7. "github.com/QuantumNous/new-api/model"
  8. "gorm.io/gorm"
  9. )
  10. const DoubaoAssetChannelPageSize = 50
  11. const DoubaoAssetChannelType = constant.ChannelTypeDoubaoVideoCompatibleAiping
  12. func ResolveDoubaoAssetChannel(userId int, tokenGroup string) (*model.Channel, error) {
  13. channel, err := GetBoundDoubaoAssetChannel(userId, tokenGroup)
  14. if err != nil {
  15. return nil, err
  16. }
  17. if channel != nil {
  18. return channel, nil
  19. }
  20. channel, err = AutoMatchDoubaoAssetChannel(tokenGroup)
  21. if err != nil {
  22. return nil, err
  23. }
  24. if channel == nil {
  25. return nil, nil
  26. }
  27. if err = model.BindUserAssetChannel(userId, DoubaoAssetChannelType, tokenGroup, channel.Id); err != nil {
  28. return nil, err
  29. }
  30. return channel, nil
  31. }
  32. func GetBoundDoubaoAssetChannel(userId int, tokenGroup string) (*model.Channel, error) {
  33. binding, err := model.GetUserAssetChannel(userId, DoubaoAssetChannelType, tokenGroup)
  34. if err != nil {
  35. return nil, err
  36. }
  37. if binding == nil {
  38. return nil, nil
  39. }
  40. channel, err := model.CacheGetChannel(binding.ChannelId)
  41. if err != nil {
  42. if errors.Is(err, gorm.ErrRecordNotFound) || common.MemoryCacheEnabled {
  43. return nil, nil
  44. }
  45. return nil, err
  46. }
  47. if !IsUsableDoubaoAssetChannel(channel, tokenGroup) {
  48. return nil, nil
  49. }
  50. return channel, nil
  51. }
  52. func HasDoubaoVideoChannelForGroupModel(tokenGroup string, modelName string) bool {
  53. if tokenGroup == "" || modelName == "" {
  54. return false
  55. }
  56. for startIdx := 0; ; startIdx += DoubaoAssetChannelPageSize {
  57. candidates, err := model.GetChannelsByType(startIdx, DoubaoAssetChannelPageSize, true, DoubaoAssetChannelType)
  58. if err != nil {
  59. return false
  60. }
  61. for _, candidate := range candidates {
  62. if candidate == nil || !MatchDoubaoAssetGroup(candidate.GetGroups(), tokenGroup) {
  63. continue
  64. }
  65. if model.IsChannelEnabledForGroupModel(tokenGroup, modelName, candidate.Id) {
  66. return true
  67. }
  68. }
  69. if len(candidates) < DoubaoAssetChannelPageSize {
  70. return false
  71. }
  72. }
  73. }
  74. func AutoMatchDoubaoAssetChannel(tokenGroup string) (*model.Channel, error) {
  75. for startIdx := 0; ; startIdx += DoubaoAssetChannelPageSize {
  76. candidates, err := model.GetChannelsByType(startIdx, DoubaoAssetChannelPageSize, true, DoubaoAssetChannelType)
  77. if err != nil {
  78. return nil, err
  79. }
  80. for _, candidate := range candidates {
  81. if candidate == nil || !MatchDoubaoAssetGroup(candidate.GetGroups(), tokenGroup) {
  82. continue
  83. }
  84. channel, err := model.CacheGetChannel(candidate.Id)
  85. if err != nil {
  86. if errors.Is(err, gorm.ErrRecordNotFound) || common.MemoryCacheEnabled {
  87. continue
  88. }
  89. return nil, err
  90. }
  91. if IsUsableDoubaoAssetChannel(channel, tokenGroup) {
  92. return channel, nil
  93. }
  94. }
  95. if len(candidates) < DoubaoAssetChannelPageSize {
  96. return nil, nil
  97. }
  98. }
  99. }
  100. func IsUsableDoubaoAssetChannel(channel *model.Channel, tokenGroup string) bool {
  101. if channel == nil {
  102. return false
  103. }
  104. if channel.Type != DoubaoAssetChannelType {
  105. return false
  106. }
  107. if channel.Status != common.ChannelStatusEnabled {
  108. return false
  109. }
  110. if strings.TrimSpace(channel.Key) == "" || len(channel.GetKeys()) == 0 {
  111. return false
  112. }
  113. return MatchDoubaoAssetGroup(channel.GetGroups(), tokenGroup)
  114. }
  115. func MatchDoubaoAssetGroup(channelGroups []string, tokenGroup string) bool {
  116. tokenGroup = strings.TrimSpace(tokenGroup)
  117. if tokenGroup == "" {
  118. return false
  119. }
  120. for _, group := range channelGroups {
  121. if strings.TrimSpace(group) == tokenGroup {
  122. return true
  123. }
  124. }
  125. return false
  126. }