gameshieldbackend.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  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. "strings"
  11. )
  12. type GameShieldBackendService interface {
  13. GetGameShieldBackend(ctx context.Context, id int64) (*model.GameShieldBackend, error)
  14. GameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, int, error)
  15. AddGameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, error)
  16. EditGameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, error)
  17. DeleteGameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, error)
  18. GetGameShieldRequired(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (*v1.GetGameShieldRequiredResponse, int, error)
  19. }
  20. func NewGameShieldBackendService(
  21. service *Service,
  22. gameShieldBackendRepository repository.GameShieldBackendRepository,
  23. gameShieldRepository repository.GameShieldRepository,
  24. crawlerService CrawlerService,
  25. gameShieldPublicIpService GameShieldPublicIpService,
  26. duedate DuedateService,
  27. formatter FormatterService,
  28. parser ParserService,
  29. required RequiredService,
  30. conf *viper.Viper,
  31. shieldService GameShieldService,
  32. ) GameShieldBackendService {
  33. return &gameShieldBackendService{
  34. Service: service,
  35. gameShieldBackendRepository: gameShieldBackendRepository,
  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. shieldService: shieldService,
  45. }
  46. }
  47. type gameShieldBackendService struct {
  48. *Service
  49. gameShieldBackendRepository repository.GameShieldBackendRepository
  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. shieldService GameShieldService
  59. }
  60. func (s *gameShieldBackendService) GetGameShieldRequired(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (*v1.GetGameShieldRequiredResponse, int, error) {
  61. var res v1.GetGameShieldRequiredResponse
  62. var err error
  63. var count int
  64. if req.Uid == 0 {
  65. return nil, 0, fmt.Errorf("uid is required")
  66. }
  67. res.ExpiredAt, err = s.duedate.NextDueDate(ctx, req.Uid, strconv.Itoa(req.HostId))
  68. if err != nil {
  69. return nil, 0, err
  70. }
  71. gameShield, err := s.gameShieldRepository.GetGameShieldByHostId(ctx, req.HostId)
  72. if err != nil {
  73. return nil, 0, err
  74. }
  75. res.RuleId = gameShield.RuleId
  76. oldBackend, err := s.gameShieldBackendRepository.GetGameShieldBackendByHostId(ctx, req.HostId)
  77. if err != nil {
  78. return nil, 0, err
  79. }
  80. if len(oldBackend) != 0 {
  81. count = oldBackend[0].KeySort
  82. }
  83. OldBackend, err := s.formatter.OldFormat(ctx, &oldBackend)
  84. res.Backend, err = s.formatter.FormatBackendData(ctx, req, OldBackend, count)
  85. if err != nil {
  86. return nil, 0, err
  87. }
  88. res.Cookie, err = s.crawlerService.GetLoginCookie(ctx)
  89. if err != nil {
  90. return nil, 0, err
  91. }
  92. res.DunName = gameShield.DunName
  93. return &res, count, nil
  94. }
  95. func (s *gameShieldBackendService) GetGameShieldBackend(ctx context.Context, id int64) (*model.GameShieldBackend, error) {
  96. res, err := s.gameShieldBackendRepository.GetGameShieldBackendById(ctx, id)
  97. if err != nil {
  98. return nil, err
  99. }
  100. return res, nil
  101. }
  102. func (s *gameShieldBackendService) GameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, int, error) {
  103. require, count, err := s.GetGameShieldRequired(ctx, req)
  104. if err != nil {
  105. return "", 0, err
  106. }
  107. tokenUrl := s.Url + "admin/info/rule/edit?&__goadmin_edit_pk=" + strconv.Itoa(require.RuleId) + "_" + require.DunName
  108. tokens, err := s.crawlerService.GetFormTokens(ctx, tokenUrl, require.Cookie)
  109. if err != nil {
  110. return "", 0, err
  111. }
  112. formData := map[string]interface{}{
  113. "app_name": require.DunName,
  114. "gateway_group_id": 4,
  115. "backend": require.Backend,
  116. "rule_id": require.RuleId,
  117. "expired_at": require.ExpiredAt,
  118. "max_device_count": 0,
  119. "__go_admin_previous_": tokens["previous"],
  120. "__go_admin_t_": tokens["t"],
  121. }
  122. sendUrl := s.Url + "admin/edit/rule"
  123. respBody, err := s.crawlerService.SendFormData(ctx, sendUrl, require.Cookie, formData)
  124. if err != nil {
  125. return "", 0, err
  126. }
  127. // 解析响应内容中的 alert 消息
  128. res, err := s.parser.ParseAlert(string(respBody))
  129. if err != nil {
  130. return "", 0, err
  131. }
  132. if res != "" {
  133. return "", 0, fmt.Errorf(res)
  134. }
  135. KeyAndField, err := s.required.GetKeyAndField(ctx, require.DunName, "rule_id")
  136. if err != nil {
  137. return "", 0, err
  138. }
  139. timeBase, err := s.gameShieldRepository.GetGameShieldNextduedate(ctx, int64(req.Uid), strconv.Itoa(req.HostId))
  140. if err != nil {
  141. return "", 0, err
  142. }
  143. timestampSec, err := strconv.ParseInt(timeBase, 10, 64)
  144. if err != nil {
  145. return "", 0, err
  146. }
  147. if err := s.gameShieldRepository.UpdateGameShieldByHostId(ctx, &model.GameShield{HostId: strconv.Itoa(req.HostId), Key: KeyAndField.Key, ExpireTime: timestampSec}); err != nil {
  148. return "", 0, err
  149. }
  150. return res, count, nil
  151. }
  152. func (s *gameShieldBackendService) AddGameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, error) {
  153. res, count, err := s.GameShieldBackend(ctx, req)
  154. if err != nil {
  155. return "", err
  156. }
  157. saveData, err := s.formatter.TidyFormatBackendData(ctx, req, count)
  158. if err != nil {
  159. return "", err
  160. }
  161. if err := s.SaveGameShieldBackend(ctx, saveData, req.HostId); err != nil {
  162. return "", err
  163. }
  164. return res, nil
  165. }
  166. func (s *gameShieldBackendService) EditGameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, error) {
  167. for _, v := range req.Items {
  168. if v.Id == 0 {
  169. return "", fmt.Errorf("id 不能为空")
  170. }
  171. if err := s.gameShieldBackendRepository.EditGameShieldBackend(ctx, &v); err != nil {
  172. return "", err
  173. }
  174. }
  175. res, _, err := s.GameShieldBackend(ctx, req)
  176. if err != nil {
  177. return "", err
  178. }
  179. return res, nil
  180. }
  181. func (s *gameShieldBackendService) DeleteGameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, error) {
  182. for _, v := range req.Items {
  183. if err := s.gameShieldBackendRepository.DeleteGameShieldBackend(ctx, int64(v.Id)); err != nil {
  184. return "", err
  185. }
  186. }
  187. res, _, err := s.GameShieldBackend(ctx, &v1.GameShieldBackendArrayRequest{HostId: req.HostId, Uid: req.Uid, Items: nil})
  188. if err != nil {
  189. return "", err
  190. }
  191. return res, nil
  192. }
  193. func (s *gameShieldBackendService) SaveGameShieldBackend(ctx context.Context, req map[string]v1.SendGameShieldBackend, hostId int) error {
  194. for k, v := range req {
  195. parts := strings.Split(v.Addr[0], ":")
  196. keyName := strings.Split(k, "key")[1]
  197. key, err := strconv.Atoi(keyName)
  198. if err != nil {
  199. return err
  200. }
  201. if v.Type != "pc" {
  202. v.SdkIp = "127.0.0.1"
  203. }
  204. if err := s.gameShieldBackendRepository.AddGameShieldBackend(ctx,
  205. &model.GameShieldBackend{
  206. HostId: hostId,
  207. KeySort: key,
  208. SourceMachineIP: parts[0],
  209. Protocol: v.Protocol,
  210. ProxyAddr: v.ProxyAddr,
  211. ConnectPort: parts[1],
  212. SdkIp: v.SdkIp,
  213. SdkPort: strconv.Itoa(v.SdkPort),
  214. Type: v.Type,
  215. // 可以添加其他字段
  216. }); err != nil {
  217. return err
  218. }
  219. }
  220. return nil
  221. }