drainage_server.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. package service
  2. import (
  3. "encoding/json"
  4. "gadmin/config"
  5. "gadmin/internal/admin/forms"
  6. "gadmin/internal/gorm/model"
  7. "gadmin/internal/gorm/query"
  8. "gadmin/utility/serializer"
  9. "strconv"
  10. "strings"
  11. "github.com/gin-gonic/gin"
  12. "github.com/sirupsen/logrus"
  13. "github.com/spf13/cast"
  14. clientv3 "go.etcd.io/etcd/client/v3"
  15. )
  16. var DrainageServer = &sDrainageServer{
  17. key: "covenant/servers/loginparams/defaultGates", // 引流服务器key
  18. newerServersKey: "covenant/servers/loginparams/newerServers", // 新服务器key
  19. maxOpendServerIdKey: "covenant/servers/loginparams/maxOpendServerId", // 最大开放服务器ID
  20. whiteListKey: "covenant/servers/loginparams/serverWhiteList", // 登录白名单
  21. maxDeployServerId: "covenant/servers/loginparams/maxDeployServerId", // 最大部署服务器
  22. }
  23. type sDrainageServer struct {
  24. key string
  25. newerServersKey string
  26. maxOpendServerIdKey string
  27. whiteListKey string
  28. maxDeployServerId string
  29. }
  30. func (s *sDrainageServer) Get(ctx *gin.Context, req forms.GetDrainageServerReq) serializer.Response {
  31. logrus.Warnf("sDrainageServer Get")
  32. kv := clientv3.NewKV(config.Etcd)
  33. getResp, err := kv.Get(ctx, s.key)
  34. if err != nil {
  35. return serializer.DBErr(err.Error(), err)
  36. }
  37. if len(getResp.Kvs) == 0 {
  38. return serializer.Suc([]int32{})
  39. }
  40. var serverIds []int32
  41. if err = json.Unmarshal(getResp.Kvs[0].Value, &serverIds); err != nil {
  42. return serializer.DBErr(err.Error(), err)
  43. }
  44. return serializer.Suc(serverIds)
  45. }
  46. func (s *sDrainageServer) Edit(ctx *gin.Context, req forms.EditDrainageServerReq) serializer.Response {
  47. marshal, err := json.Marshal(req.ServerIds)
  48. if err != nil {
  49. return serializer.DBErr(err.Error(), err)
  50. }
  51. logrus.Warnf("sDrainageServer ServerIds:%v", string(marshal))
  52. kv := clientv3.NewKV(config.Etcd)
  53. putResp, err := kv.Put(ctx, s.key, string(marshal), clientv3.WithPrevKV())
  54. if err != nil {
  55. return serializer.DBErr(err.Error(), err)
  56. }
  57. logrus.Warnf("Revision:%v", putResp.Header.Revision)
  58. if putResp.PrevKv != nil {
  59. logrus.Warnf("key:%v", string(putResp.PrevKv.Key))
  60. logrus.Warnf("Value:%v", string(putResp.PrevKv.Value))
  61. logrus.Warnf("Version:%v", strconv.FormatInt(putResp.PrevKv.Version, 10))
  62. }
  63. return serializer.Suc(nil)
  64. }
  65. // 服务器显示控制参数设置
  66. func (s *sDrainageServer) EditDisplay(ctx *gin.Context, req forms.EditDisplayServerReq) serializer.Response {
  67. marshal, err := json.Marshal(req.ServerIds)
  68. if err != nil {
  69. return serializer.DBErr(err.Error(), err)
  70. }
  71. if string(marshal) == `[""]` || string(marshal) == "null" {
  72. marshal = []byte("[]")
  73. }
  74. logrus.Warnf("sDrainageServer EditDisplay ServerIds:%v", string(marshal))
  75. // 新服务器
  76. kv := clientv3.NewKV(config.Etcd)
  77. putResp, err := kv.Put(ctx, s.newerServersKey, string(marshal), clientv3.WithPrevKV())
  78. if err != nil {
  79. return serializer.DBErr(err.Error(), err)
  80. }
  81. logrus.Warnf("Revision newerServersKey:%v", putResp.Header.Revision)
  82. if putResp.PrevKv != nil {
  83. logrus.Warnf("key:%v", string(putResp.PrevKv.Key))
  84. logrus.Warnf("Value:%v", string(putResp.PrevKv.Value))
  85. logrus.Warnf("Version:%v", strconv.FormatInt(putResp.PrevKv.Version, 10))
  86. }
  87. // 最大开放服务器ID
  88. putResp, err = kv.Put(ctx, s.maxOpendServerIdKey, cast.ToString(req.MaxOpendServerId), clientv3.WithPrevKV())
  89. if err != nil {
  90. return serializer.DBErr(err.Error(), err)
  91. }
  92. logrus.Warnf("Revision maxOpendServerIdKey:%v, MaxOpendServerId:%v", putResp.Header.Revision, cast.ToString(req.MaxOpendServerId))
  93. if putResp.PrevKv != nil {
  94. logrus.Warnf("key:%v", string(putResp.PrevKv.Key))
  95. logrus.Warnf("Value:%v", string(putResp.PrevKv.Value))
  96. logrus.Warnf("Version:%v", strconv.FormatInt(putResp.PrevKv.Version, 10))
  97. }
  98. // 最大部署服务器ID
  99. putResp, err = kv.Put(ctx, s.maxDeployServerId, cast.ToString(req.MaxDeployServerId), clientv3.WithPrevKV())
  100. if err != nil {
  101. return serializer.DBErr(err.Error(), err)
  102. }
  103. logrus.Warnf("Revision maxDeployServerId:%v, MaxDeployServerId:%v", putResp.Header.Revision, cast.ToString(req.MaxDeployServerId))
  104. if putResp.PrevKv != nil {
  105. logrus.Warnf("key:%v", string(putResp.PrevKv.Key))
  106. logrus.Warnf("Value:%v", string(putResp.PrevKv.Value))
  107. logrus.Warnf("Version:%v", strconv.FormatInt(putResp.PrevKv.Version, 10))
  108. }
  109. return serializer.Suc(nil)
  110. }
  111. // 服务器显示控制参数获取
  112. func (s *sDrainageServer) GetDisplay(ctx *gin.Context, req forms.GetDisplayServerReq) serializer.Response {
  113. var (
  114. serverIds []int32
  115. maxOpendServerId int32
  116. maxDeployServerId int32
  117. )
  118. // 新服
  119. kv := clientv3.NewKV(config.Etcd)
  120. getResp, err := kv.Get(ctx, s.newerServersKey)
  121. if err != nil {
  122. return serializer.DBErr(err.Error(), err)
  123. }
  124. if len(getResp.Kvs) > 0 {
  125. if err = json.Unmarshal(getResp.Kvs[0].Value, &serverIds); err != nil {
  126. return serializer.DBErr(err.Error(), err)
  127. }
  128. }
  129. // 最大开放
  130. getResp, err = kv.Get(ctx, s.maxOpendServerIdKey)
  131. if err != nil {
  132. return serializer.DBErr(err.Error(), err)
  133. }
  134. if len(getResp.Kvs) > 0 {
  135. maxOpendServerId = cast.ToInt32(string(getResp.Kvs[0].Value))
  136. }
  137. // 最大部署
  138. getResp, err = kv.Get(ctx, s.maxDeployServerId)
  139. if err != nil {
  140. return serializer.DBErr(err.Error(), err)
  141. }
  142. if len(getResp.Kvs) > 0 {
  143. maxDeployServerId = cast.ToInt32(string(getResp.Kvs[0].Value))
  144. }
  145. return serializer.Suc(forms.GetDisplayServerRes{
  146. ServerIds: serverIds,
  147. MaxOpendServerId: maxOpendServerId,
  148. MaxDeployServerId: maxDeployServerId,
  149. })
  150. }
  151. func (s *sDrainageServer) GetWhiteList(ctx *gin.Context, req forms.GetWhiteListServerReq) serializer.Response {
  152. kv := clientv3.NewKV(config.Etcd)
  153. getResp, err := kv.Get(ctx, s.whiteListKey)
  154. if err != nil {
  155. return serializer.DBErr(err.Error(), err)
  156. }
  157. if len(getResp.Kvs) == 0 {
  158. return serializer.Suc([]int64{})
  159. }
  160. var params map[string][]int64
  161. if err = json.Unmarshal(getResp.Kvs[0].Value, &params); err != nil {
  162. return serializer.DBErr(err.Error(), err)
  163. }
  164. type result struct {
  165. ServerIds []int64 `json:"server_ids"`
  166. PlayerIds string `json:"player_ids"`
  167. }
  168. resp := &result{}
  169. playerIdMap := make(map[int64]struct{})
  170. //服务器的值都一样 放外边
  171. var ids []string
  172. for svrId, playerIds := range params {
  173. if svrId == "all" {
  174. resp.ServerIds = append(resp.ServerIds, 0)
  175. for _, playerId := range playerIds {
  176. ids = append(ids, strconv.FormatInt(playerId, 10))
  177. }
  178. resp.PlayerIds = strings.Join(ids, ",")
  179. break
  180. }
  181. for _, playerId := range playerIds {
  182. if _, ok := playerIdMap[playerId]; ok {
  183. continue
  184. }
  185. playerIdMap[playerId] = struct{}{}
  186. ids = append(ids, strconv.FormatInt(playerId, 10))
  187. }
  188. parseInt, _ := strconv.ParseInt(svrId, 10, 64)
  189. resp.ServerIds = append(resp.ServerIds, parseInt)
  190. }
  191. resp.PlayerIds = strings.Join(ids, ",")
  192. logrus.Infof("resp:%+v", resp)
  193. return serializer.Suc(resp)
  194. }
  195. func (s *sDrainageServer) EditWhiteList(ctx *gin.Context, req forms.EditWhiteListServerReq) serializer.Response {
  196. orgPlayerIds := strings.Split(req.PlayerIds, `,`)
  197. var playerIds []int64
  198. if len(orgPlayerIds) > 0 {
  199. for _, id := range orgPlayerIds {
  200. if cast.ToInt64(id) > 0 {
  201. playerIds = append(playerIds, cast.ToInt64(id))
  202. }
  203. }
  204. }
  205. params := make(map[string][]int64)
  206. //是否全选游戏服
  207. for _, svrId := range req.ServerIds {
  208. if svrId == 0 {
  209. //清空并设置
  210. params = make(map[string][]int64)
  211. params["all"] = make([]int64, 0)
  212. break
  213. }
  214. params[strconv.Itoa(svrId)] = make([]int64, 0)
  215. }
  216. //获取server_option
  217. var lists []*model.ServerOption
  218. err := query.Use(config.DB).ServerOption.WithContext(ctx).Scan(&lists)
  219. if err != nil {
  220. return serializer.DBErr(err.Error(), err)
  221. }
  222. if len(req.ServerIds) == len(lists) {
  223. params = make(map[string][]int64)
  224. params["all"] = make([]int64, 0)
  225. }
  226. if len(playerIds) != 0 {
  227. for svrId, _ := range params {
  228. params[svrId] = playerIds
  229. }
  230. }
  231. marshal, err := json.Marshal(params)
  232. if err != nil {
  233. return serializer.DBErr(err.Error(), err)
  234. }
  235. logrus.Infof("marshal:%v", string(marshal))
  236. kv := clientv3.NewKV(config.Etcd)
  237. putResp, err := kv.Put(ctx, s.whiteListKey, string(marshal), clientv3.WithPrevKV())
  238. if err != nil {
  239. return serializer.DBErr(err.Error(), err)
  240. }
  241. logrus.Infof("Revision:%+v", putResp)
  242. if putResp.PrevKv != nil {
  243. logrus.Warnf("key:%v", string(putResp.PrevKv.Key))
  244. logrus.Warnf("Value:%v", string(putResp.PrevKv.Value))
  245. logrus.Warnf("Version:%v", strconv.FormatInt(putResp.PrevKv.Version, 10))
  246. }
  247. return serializer.Suc(nil)
  248. }