gameshield.go 6.5 KB

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