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

103 строки
2.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 KlingAssetChannelType = constant.ChannelTypeKlingAiping
  11. func ResolveKlingAssetChannel(userId int, tokenGroup string) (*model.Channel, error) {
  12. channel, err := GetBoundKlingAssetChannel(userId, tokenGroup)
  13. if err != nil {
  14. return nil, err
  15. }
  16. if channel != nil {
  17. return channel, nil
  18. }
  19. channel, err = AutoMatchKlingAssetChannel(tokenGroup)
  20. if err != nil {
  21. return nil, err
  22. }
  23. if channel == nil {
  24. return nil, nil
  25. }
  26. if err = model.BindUserAssetChannel(userId, KlingAssetChannelType, tokenGroup, channel.Id); err != nil {
  27. return nil, err
  28. }
  29. return channel, nil
  30. }
  31. func GetBoundKlingAssetChannel(userId int, tokenGroup string) (*model.Channel, error) {
  32. binding, err := model.GetUserAssetChannel(userId, KlingAssetChannelType, tokenGroup)
  33. if err != nil {
  34. return nil, err
  35. }
  36. if binding == nil {
  37. return nil, nil
  38. }
  39. channel, err := model.CacheGetChannel(binding.ChannelId)
  40. if err != nil {
  41. if errors.Is(err, gorm.ErrRecordNotFound) || common.MemoryCacheEnabled {
  42. return nil, nil
  43. }
  44. return nil, err
  45. }
  46. if !IsUsableKlingAssetChannel(channel, tokenGroup) {
  47. return nil, nil
  48. }
  49. return channel, nil
  50. }
  51. func AutoMatchKlingAssetChannel(tokenGroup string) (*model.Channel, error) {
  52. for startIdx := 0; ; startIdx += DoubaoAssetChannelPageSize {
  53. candidates, err := model.GetChannelsByType(startIdx, DoubaoAssetChannelPageSize, true, KlingAssetChannelType)
  54. if err != nil {
  55. return nil, err
  56. }
  57. for _, candidate := range candidates {
  58. if candidate == nil || !MatchDoubaoAssetGroup(candidate.GetGroups(), tokenGroup) {
  59. continue
  60. }
  61. channel, err := model.CacheGetChannel(candidate.Id)
  62. if err != nil {
  63. if errors.Is(err, gorm.ErrRecordNotFound) || common.MemoryCacheEnabled {
  64. continue
  65. }
  66. return nil, err
  67. }
  68. if IsUsableKlingAssetChannel(channel, tokenGroup) {
  69. return channel, nil
  70. }
  71. }
  72. if len(candidates) < DoubaoAssetChannelPageSize {
  73. return nil, nil
  74. }
  75. }
  76. }
  77. func IsUsableKlingAssetChannel(channel *model.Channel, tokenGroup string) bool {
  78. if channel == nil {
  79. return false
  80. }
  81. if channel.Type != KlingAssetChannelType {
  82. return false
  83. }
  84. if channel.Status != common.ChannelStatusEnabled {
  85. return false
  86. }
  87. if strings.TrimSpace(channel.Key) == "" || len(channel.GetKeys()) == 0 {
  88. return false
  89. }
  90. return MatchDoubaoAssetGroup(channel.GetGroups(), tokenGroup)
  91. }