gameshield.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. package service
  2. import (
  3. "context"
  4. "fmt"
  5. v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
  6. "github.com/go-nunu/nunu-layout-advanced/internal/model"
  7. "github.com/go-nunu/nunu-layout-advanced/internal/repository"
  8. "github.com/spf13/viper"
  9. "strconv"
  10. "time"
  11. )
  12. type GameShieldService interface {
  13. SubmitGameShield(ctx context.Context, req *v1.GameShieldSubmitRequest) (string, error)
  14. EditGameShield(ctx context.Context, req *v1.GameShieldSubmitRequest) (string, error)
  15. DeleteGameShield(ctx context.Context, req int) (string, error)
  16. GetGameShieldKey(ctx context.Context, id int) (string, error)
  17. GetKeyAndEditGameShield(ctx context.Context, hostId int, dunName string) (string, error)
  18. GetGameShieldOnlineList(ctx context.Context, hostId int) ([]v1.SDKInfo, error)
  19. }
  20. func NewGameShieldService(
  21. service *Service,
  22. gameShieldRepository repository.GameShieldRepository,
  23. crawlerService CrawlerService,
  24. gameShieldPublicIpService GameShieldPublicIpService,
  25. duedate DuedateService,
  26. formatter FormatterService,
  27. parser ParserService,
  28. required RequiredService,
  29. conf *viper.Viper,
  30. gameShieldSdkIp GameShieldSdkIpService,
  31. ) GameShieldService {
  32. return &gameShieldService{
  33. Service: service,
  34. gameShieldRepository: gameShieldRepository,
  35. crawlerService: crawlerService,
  36. gameShieldPublicIpService: gameShieldPublicIpService,
  37. duedate: duedate,
  38. formatter: formatter,
  39. parser: parser,
  40. required: required,
  41. Url: conf.GetString("crawler.Url"),
  42. gameShieldSdkIp: gameShieldSdkIp,
  43. }
  44. }
  45. type gameShieldService struct {
  46. *Service
  47. config *viper.Viper
  48. crawlerService CrawlerService
  49. gameShieldRepository repository.GameShieldRepository
  50. gameShieldPublicIpService GameShieldPublicIpService
  51. duedate DuedateService
  52. formatter FormatterService
  53. Url string
  54. parser ParserService
  55. required RequiredService
  56. gameShieldSdkIp GameShieldSdkIpService
  57. }
  58. func (service *gameShieldService) SubmitGameShield(ctx context.Context, req *v1.GameShieldSubmitRequest) (string, error) {
  59. nameCount, err := service.gameShieldRepository.GetGameShieldDuplicateName(ctx, req.AppName, req.Uid)
  60. if err != nil {
  61. return "", err
  62. }
  63. if nameCount > 0 {
  64. return "", fmt.Errorf("应用名称已存在")
  65. }
  66. // 调用IP生成服务
  67. if err := service.gameShieldSdkIp.GenerateMultipleLoopbackIps(ctx, req.Uid, req.HostId); err != nil {
  68. return "", fmt.Errorf("生成IP地址失败: %w", err)
  69. }
  70. dunName := strconv.Itoa(req.Uid) + "_hostId" + strconv.Itoa(req.HostId) + "_" + req.Domain
  71. formData := map[string]interface{}{
  72. "app_name": dunName,
  73. "gateway_group_id": 4,
  74. "backend": "{}",
  75. "expired_at": "",
  76. "max_device_count": 0,
  77. }
  78. respBody, err := service.required.SendForm(ctx, "admin/info/rule/new", "admin/new/rule", formData)
  79. if err != nil {
  80. return "", err
  81. }
  82. // 解析响应内容中的 alert 消息
  83. res, err := service.parser.ParseAlert(string(respBody))
  84. if err != nil {
  85. return "", err
  86. }
  87. if res != "" {
  88. return "", fmt.Errorf(res)
  89. }
  90. KeyAndField, err := service.required.GetKeyAndField(ctx, dunName, "rule_id")
  91. if err != nil {
  92. return "", err
  93. }
  94. if err := service.gameShieldRepository.AddGameShield(ctx, &model.GameShield{
  95. AppName: req.AppName,
  96. GatewayGroupId: 4,
  97. AddTime: time.Now(),
  98. Uid: req.Uid,
  99. HostId: req.HostId,
  100. DunName: dunName,
  101. RuleId: KeyAndField.FieldId,
  102. }); err != nil {
  103. return "", err
  104. }
  105. return "", nil
  106. }
  107. func (service *gameShieldService) EditGameShield(ctx context.Context, req *v1.GameShieldSubmitRequest) (string, error) {
  108. if err := service.gameShieldRepository.UpdateGameShield(ctx, &model.GameShield{
  109. HostId: req.HostId,
  110. AppName: req.AppName,
  111. }); err != nil {
  112. return "", err
  113. }
  114. return "", nil
  115. }
  116. func (service *gameShieldService) DeleteGameShield(ctx context.Context, id int) (string, error) {
  117. shieldInfo, err := service.gameShieldRepository.GetGameShieldById(ctx, int64(id))
  118. if err != nil {
  119. return "", err
  120. }
  121. if err := service.gameShieldRepository.DeleteGameShield(ctx, shieldInfo.RuleId); err != nil {
  122. return "", err
  123. }
  124. res, err := service.crawlerService.DeleteRule(ctx, shieldInfo.RuleId, "admin/delete/rule?page=1&__pageSize=10&__sort=rule_id&__sort_type=desc")
  125. if err != nil {
  126. return "", err
  127. }
  128. return res, nil
  129. }
  130. func (service *gameShieldService) GetGameShieldKey(ctx context.Context, hostId int) (string, error) {
  131. dunName, err := service.gameShieldRepository.GetGameShieldHostIdByDunName(ctx, strconv.Itoa(hostId))
  132. if err != nil {
  133. return "", err
  134. }
  135. if dunName == "" {
  136. return "", fmt.Errorf("暂无数据")
  137. }
  138. res, err := service.crawlerService.GetKey(ctx, dunName)
  139. if err != nil {
  140. return "", err
  141. }
  142. return res, nil
  143. }
  144. func (service *gameShieldService) GetKeyAndEditGameShield(ctx context.Context, hostId int, dunName string) (string, error) {
  145. key, err := service.crawlerService.GetKey(ctx, dunName)
  146. if err != nil {
  147. return "", err
  148. }
  149. if err := service.gameShieldRepository.UpdateGameShield(ctx, &model.GameShield{
  150. HostId: hostId,
  151. Key: key,
  152. }); err != nil {
  153. return "", err
  154. }
  155. return "", nil
  156. }
  157. func (service *gameShieldService) GetGameShieldOnlineList(ctx context.Context, hostId int) ([]v1.SDKInfo, error) {
  158. strHostId := strconv.Itoa(hostId)
  159. cookie, err := service.required.Required(ctx)
  160. if err != nil {
  161. return nil, err
  162. }
  163. respBody, err := service.crawlerService.FetchPageContent(ctx, "admin/sdk/online?rule_id="+strHostId, cookie)
  164. if err != nil {
  165. return nil, err
  166. }
  167. res, err := service.parser.ParseSDKOnlineHTMLTable(string(respBody))
  168. if err != nil {
  169. return nil, err
  170. }
  171. if len(res) == 0 {
  172. return nil, fmt.Errorf("暂无数据")
  173. }
  174. return res, nil
  175. }