serverlist.go 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173
  1. package model
  2. import (
  3. "bytes"
  4. "encoding/base64"
  5. "encoding/json"
  6. "fmt"
  7. "io/ioutil"
  8. "net/http"
  9. "rocommon/service"
  10. "rocommon/util"
  11. "strconv"
  12. "github.com/gin-gonic/gin"
  13. )
  14. const (
  15. DefaultServer = 0 //0默认获取最新服务
  16. InnerServer = 1 //1
  17. OuterServer = 2 //2
  18. TAPTAPServer = 3 //3 taptap
  19. CurServer = 4 //4 当前外网服务器 4 先锋测试服务器
  20. PayServer = 5 //5 拥有测试功能的服务器
  21. //SelfServerList = 6 //6
  22. //ServerListNum = 7 //7
  23. ServerByID = 21 //21根据id获取对应服务器状态 http://127.0.0.1:8088/serverlist?type=21&id=1
  24. ServerRecommend = 22 //22获取推荐服务器(玩家自己登录过的游戏,和最后一个服务器) serverlist?type=3&openid=abcd
  25. ServerAll = 23 //23所有服务器列表
  26. ServerGetIP = 24 //24获取访问时的IP
  27. )
  28. // 前20个特殊服务器type和id相同
  29. // /serverlist?type=1
  30. // /1 内网服务器
  31. // /2 外网服务器
  32. // /3 taptap
  33. // /4 当前外网服务器 4 先锋测试服务器
  34. // /5 拥有测试功能的服务器
  35. // /获取所有服务器列表
  36. func GetServerList(c *gin.Context) {
  37. getType := c.DefaultQuery("type", "0") ///default 0
  38. //param := c.DefaultQuery("buildTag", "0") ///default 0是否是审核服
  39. serverListType, err := strconv.Atoi(getType)
  40. if err != nil {
  41. c.JSON(http.StatusOK, gin.H{
  42. "err": "type invalid!!!",
  43. })
  44. return
  45. }
  46. ////检查是否是渠道黑名单
  47. //subplatform := c.DefaultQuery("subplatform", "") ///default 0
  48. //if subplatform != "" {
  49. // if GetServiceConfig().IsPlatformBlackList(subplatform) {
  50. // c.JSON(http.StatusOK, gin.H{
  51. // "err": "no server node!!!",
  52. // })
  53. // return
  54. // }
  55. //}
  56. //外网服务器
  57. var serviceNode *ServerNode = nil
  58. switch serverListType {
  59. case InnerServer:
  60. fallthrough //内网服务器 //固定ID
  61. case OuterServer:
  62. fallthrough //外网服务器
  63. case TAPTAPServer:
  64. fallthrough //外网TapTap服务器
  65. case CurServer:
  66. fallthrough
  67. case PayServer:
  68. serviceNode = GetServiceConfig().GetServerById(c, getType)
  69. case ServerByID: //21根据id获取对应服务器状态 http://127.0.0.1:8088/serverlist?type=21&id=1
  70. serviceId := c.DefaultQuery("id", "0")
  71. if serviceId != "0" {
  72. serviceNode = GetServiceConfig().GetServerById(c, serviceId)
  73. }
  74. case ServerRecommend: //22获取推荐服务器(玩家自己登录过的游戏,和最后一个服务器) serverlist?type=3&openid=abcd
  75. //openID登录的服务器信息
  76. errStr, ret := GetOpenIDServerList(c)
  77. if !ret {
  78. c.JSON(http.StatusOK, gin.H{
  79. "err": errStr,
  80. })
  81. }
  82. return
  83. case ServerAll: //获取所有服务器列表,根据页来获取,默认第一次返回最后一页数据
  84. //type=23&page=1
  85. pageId := c.DefaultQuery("page", "0")
  86. c.JSON(http.StatusOK, GetServiceConfig().GetServerList(c, pageId))
  87. return
  88. case ServerGetIP: //获取远端访问的IP
  89. remoteIp := c.ClientIP()
  90. c.JSON(http.StatusOK, gin.H{
  91. "RemoteIP": remoteIp,
  92. })
  93. return
  94. case DefaultServer: //获取最新服务器直接用来创建角色登录游戏(有角色就返回最近登录的服务器)
  95. GetDefaultServer(c)
  96. return
  97. }
  98. if serviceNode != nil {
  99. c.JSON(http.StatusOK, serviceNode)
  100. } else {
  101. c.JSON(http.StatusOK, gin.H{
  102. "err": "no server node!!!",
  103. })
  104. }
  105. }
  106. func ServerMaintain(c *gin.Context) {
  107. serverId := c.DefaultQuery("sid", "0") ///default 0
  108. stateStr := c.DefaultQuery("state", "0") ///default 0
  109. tmpConfig := GetServiceConfig()
  110. serverNode := tmpConfig.GetServerById(c, serverId)
  111. if serverNode == nil {
  112. c.JSON(http.StatusOK, gin.H{
  113. "err": "no server node!!!",
  114. })
  115. return
  116. }
  117. //#5 表示维护
  118. //#1 ~ 4,分别表示服务器: 空闲、良好、繁忙、火爆 4种状态
  119. state, _ := strconv.Atoi(stateStr)
  120. if state == 1 {
  121. if serverNode.State == 5 {
  122. c.JSON(http.StatusOK, gin.H{
  123. "err": "当前服务器已经处在维护中",
  124. })
  125. return
  126. }
  127. serverNode.State = 5
  128. tmpConfig.Save()
  129. c.JSON(http.StatusOK, gin.H{
  130. "err": "当前服务器添加维护成功",
  131. })
  132. } else {
  133. if serverNode.State == 0 {
  134. c.JSON(http.StatusOK, gin.H{
  135. "err": "当前服务器已经解除维护",
  136. })
  137. return
  138. }
  139. serverNode.State = 0
  140. tmpConfig.Save()
  141. c.JSON(http.StatusOK, gin.H{
  142. "err": "当前服务器解除维护成功",
  143. })
  144. }
  145. }
  146. func GetServerState(c *gin.Context) {
  147. serverId := c.DefaultQuery("sid", "0") ///default 0
  148. tmpConfig := GetServiceConfig()
  149. serverNode := tmpConfig.GetServerById(c, serverId)
  150. if serverNode != nil {
  151. c.JSON(http.StatusOK, *serverNode)
  152. return
  153. }
  154. c.JSON(http.StatusOK, gin.H{
  155. "err": "no server node!!!",
  156. })
  157. }
  158. func MyCardOrderRequest(c *gin.Context) {
  159. //cpOrderId := c.DefaultPostForm("cpOrderId ", "0") ///default 0
  160. order := &OrderInfo{}
  161. if err := c.ShouldBindJSON(order); err != nil {
  162. c.JSON(http.StatusOK, gin.H{
  163. "err": "order error!!!",
  164. })
  165. }
  166. // 定义要请求的URL
  167. url := codeUrl
  168. postData := &CodeRequest{
  169. FacServiceId: FacServiceId,
  170. FacTradeSeq: order.CpOrderId,
  171. }
  172. // 将结构体编码为JSON
  173. jsonData, err := json.Marshal(postData)
  174. if err != nil {
  175. fmt.Printf("JSON编码失败: %s\n", err)
  176. return
  177. }
  178. // 发送POST请求
  179. response, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
  180. if err != nil {
  181. fmt.Printf("请求失败: %s\n", err)
  182. return
  183. }
  184. defer response.Body.Close()
  185. // 读取响应体
  186. body, err := ioutil.ReadAll(response.Body)
  187. if err != nil {
  188. fmt.Printf("读取响应失败: %s\n", err)
  189. return
  190. }
  191. // 打印响应状态码和响应体
  192. fmt.Printf("状态码: %d\n", response.StatusCode)
  193. fmt.Printf("响应体: %s\n", body)
  194. c.JSON(http.StatusOK, gin.H{
  195. "err": "no server node!!!",
  196. })
  197. }
  198. type SelfServerNodeDetail struct {
  199. ServerId int32 `json:serverid`
  200. HeadFrameId int32 `json:headframeid`
  201. Level int32 `json:level`
  202. RecordTime uint32 `json:recordtime`
  203. JobCfgId int32 `json:jobcfgid`
  204. Gender int32 `json:gender` //1 female 2 male
  205. NickName string `json:nickname`
  206. ServerName string `yaml:servername`
  207. Ip string `yaml:ip`
  208. Port []int `yaml:port`
  209. Type int `yaml:type`
  210. STime string `yaml:stime`
  211. State int `yaml:state`
  212. New bool `yaml:new`
  213. }
  214. type SelfServerNode struct {
  215. ServerId int32 `json:serverid`
  216. HeadFrameId int32 `json:headframeid`
  217. Level int32 `json:level`
  218. RecordTime uint32 `json:recordtime`
  219. JobCfgId int32 `json:jobcfgid`
  220. Gender int32 `json:gender` //1 female 2 male
  221. NickName string `json:nickname`
  222. }
  223. func GetOpenIDServerList(c *gin.Context) (string, bool) {
  224. var errStr = ""
  225. openId := c.DefaultQuery("openid", "") ///default ""
  226. platform := c.DefaultQuery("platform", "") ///default ""
  227. resver := c.DefaultQuery("resver", "") ///default ""
  228. if openId == "" {
  229. errStr = "openid invalid!!!"
  230. util.InfoF(errStr)
  231. return errStr, false
  232. }
  233. openId = ConvertPlatform(openId, platform)
  234. //sl:abc
  235. keyStr := "sl:" + openId
  236. valList, err := service.GetRedis().HVals(keyStr).Result()
  237. if err != nil {
  238. errStr := "openid invalid!!!" + err.Error()
  239. util.InfoF(errStr)
  240. return errStr, false
  241. }
  242. tmpConfig := GetServiceConfig()
  243. ip := c.ClientIP()
  244. if c.DefaultQuery("buildTag", "") == serviceConfig.Tag {
  245. var selfNodeList2 []*SelfServerNodeDetail
  246. selfNode := &SelfServerNodeDetail{}
  247. for _, v := range tmpConfig.serverSpeList {
  248. selfNode.ServerId = int32(v.ServerId)
  249. selfNode.ServerName = v.ServerName
  250. selfNode.Ip = v.Ip
  251. selfNode.Port = v.Port
  252. selfNode.Type = v.Type
  253. selfNode.STime = v.STime
  254. selfNode.State = v.State
  255. selfNode.New = true
  256. }
  257. selfNodeList2 = append(selfNodeList2, selfNode)
  258. c.JSON(http.StatusOK, selfNodeList2)
  259. return "", true
  260. }
  261. //黑名单只看到特殊的IP列表
  262. bBlack := tmpConfig.IsBlackList(openId, ip, resver)
  263. if bBlack {
  264. var selfNodeList []*SelfServerNodeDetail
  265. if tmpConfig.BlackList.ServerList != nil {
  266. tmpNode := tmpConfig.BlackList.ServerList
  267. selfNode := &SelfServerNodeDetail{}
  268. selfNode.ServerId = int32(tmpNode.ServerId)
  269. selfNode.ServerName = (*tmpNode).ServerName
  270. selfNode.Ip = (*tmpNode).Ip
  271. selfNode.Port = (*tmpNode).Port
  272. selfNode.Type = (*tmpNode).Type
  273. selfNode.STime = (*tmpNode).STime
  274. selfNode.New = true
  275. selfNodeList = append(selfNodeList, selfNode)
  276. }
  277. c.JSON(http.StatusOK, selfNodeList)
  278. return "", true
  279. }
  280. subplatform := c.DefaultQuery("sub_platform", "") ///default 0
  281. bBlockPlatform := tmpConfig.IsPlatformBlackList(subplatform)
  282. bWhite := tmpConfig.IsWhiteList(openId, ip, resver)
  283. latestServerNode := tmpConfig.GetLatestServer(false)
  284. bFindLatest := false
  285. var selfNodeList []*SelfServerNodeDetail
  286. //var selfNodeList = make(map[int32]*SelfServerNodeDetail)
  287. for idx := range valList {
  288. selfNode := &SelfServerNodeDetail{}
  289. json.Unmarshal([]byte(valList[idx]), selfNode)
  290. serverNode := tmpConfig.GetServerById(c, strconv.Itoa(int(selfNode.ServerId)))
  291. if serverNode != nil {
  292. selfNode.ServerId = int32(serverNode.ServerId)
  293. selfNode.ServerName = (*serverNode).ServerName
  294. selfNode.Ip = (*serverNode).Ip
  295. selfNode.Port = (*serverNode).Port
  296. selfNode.Type = (*serverNode).Type
  297. selfNode.STime = (*serverNode).STime
  298. if bWhite {
  299. //白名单玩家状态修改
  300. //5维护 6待测试
  301. if selfNode.State != 6 {
  302. selfNode.State = 0
  303. }
  304. } else {
  305. selfNode.State = (*serverNode).State
  306. if bBlockPlatform {
  307. selfNode.State = 5
  308. }
  309. }
  310. selfNodeList = append(selfNodeList, selfNode)
  311. }
  312. //util.InfoF("node:%v", selfNode)
  313. if !bFindLatest && latestServerNode != nil && serverNode != nil && serverNode.ServerId == latestServerNode.ServerId {
  314. bFindLatest = true
  315. selfNode.New = true
  316. }
  317. }
  318. //添加最新服务器
  319. if latestServerNode != nil && !bFindLatest {
  320. selfNode := &SelfServerNodeDetail{}
  321. selfNode.ServerId = int32(latestServerNode.ServerId)
  322. selfNode.ServerName = (*latestServerNode).ServerName
  323. selfNode.Ip = (*latestServerNode).Ip
  324. selfNode.Port = (*latestServerNode).Port
  325. selfNode.Type = (*latestServerNode).Type
  326. selfNode.STime = (*latestServerNode).STime
  327. if bWhite {
  328. //白名单玩家状态修改
  329. //5维护 6待测试
  330. if selfNode.State != 6 {
  331. selfNode.State = 0
  332. }
  333. } else {
  334. selfNode.State = (*latestServerNode).State
  335. if bBlockPlatform {
  336. selfNode.State = 5
  337. }
  338. }
  339. selfNode.New = true
  340. selfNodeList = append(selfNodeList, selfNode)
  341. }
  342. c.JSON(http.StatusOK, selfNodeList)
  343. return "", true
  344. }
  345. func GetDefaultServer(c *gin.Context) {
  346. tmpConfig := GetServiceConfig()
  347. tmpNode := tmpConfig.GetLatestServer(false)
  348. var latestServerNode ServerNode
  349. if tmpNode != nil {
  350. latestServerNode = *tmpNode
  351. }
  352. if c.DefaultQuery("buildTag", "") == serviceConfig.Tag {
  353. var latestServerNode2 ServerNode
  354. for _, v := range tmpConfig.serverSpeList {
  355. latestServerNode2.ServerId = v.ServerId
  356. latestServerNode2.ServerName = v.ServerName
  357. latestServerNode2.Ip = v.Ip
  358. latestServerNode2.Port = v.Port
  359. latestServerNode2.Type = v.Type
  360. latestServerNode2.STime = v.STime
  361. latestServerNode2.State = v.State
  362. }
  363. c.JSON(http.StatusOK, latestServerNode2)
  364. return
  365. }
  366. ip := c.ClientIP()
  367. openId := c.DefaultQuery("openid", "") ///default ""
  368. platform := c.DefaultQuery("platform", "") ///default ""
  369. resver := c.DefaultQuery("resver", "") ///default ""
  370. openId = ConvertPlatform(openId, platform)
  371. //黑名单只看到特殊的IP列表
  372. bBlack := tmpConfig.IsBlackList(openId, ip, resver)
  373. if bBlack && tmpConfig.BlackList.ServerList != nil {
  374. latestServerNode = *tmpConfig.BlackList.ServerList
  375. }
  376. isWhiteList := tmpConfig.IsWhiteList(openId, ip, resver)
  377. if openId == "" {
  378. //白名单中玩家,服务器不进入维护状态
  379. if isWhiteList && !bBlack {
  380. tmpNode := tmpConfig.GetLatestServer(true)
  381. if tmpNode != nil {
  382. latestServerNode = *tmpNode
  383. }
  384. if latestServerNode.State > 0 {
  385. latestServerNode.State = 0
  386. }
  387. }
  388. c.JSON(http.StatusOK, latestServerNode)
  389. return
  390. }
  391. //白名单中玩家,服务器不进入维护状态
  392. if isWhiteList && !bBlack {
  393. tmpNode := tmpConfig.GetLatestServer(true)
  394. if tmpNode != nil {
  395. latestServerNode = *tmpNode
  396. }
  397. if latestServerNode.State > 0 {
  398. latestServerNode.State = 0
  399. }
  400. }
  401. subplatform := c.DefaultQuery("sub_platform", "") ///default 0
  402. bBlockPlatform := tmpConfig.IsPlatformBlackList(subplatform)
  403. if bBlockPlatform && latestServerNode.ServerId > 0 {
  404. latestServerNode.State = 5
  405. }
  406. //openId = ConvertPlatform(openId, platform)
  407. //sl:abc
  408. keyStr := "sl:" + openId
  409. valList, err := service.GetRedis().HVals(keyStr).Result()
  410. if err != nil {
  411. c.JSON(http.StatusOK, latestServerNode)
  412. return
  413. }
  414. var selfNodeInfo *SelfServerNodeDetail = nil
  415. for idx := range valList {
  416. tmpNode := &SelfServerNodeDetail{}
  417. err := json.Unmarshal([]byte(valList[idx]), tmpNode)
  418. if err != nil {
  419. continue
  420. }
  421. if selfNodeInfo == nil || tmpNode.RecordTime > selfNodeInfo.RecordTime {
  422. selfNodeInfo = tmpNode
  423. }
  424. }
  425. if selfNodeInfo != nil {
  426. serverNode := tmpConfig.GetServerById(c, strconv.Itoa(int(selfNodeInfo.ServerId)))
  427. if serverNode != nil {
  428. //白名单中玩家,服务器不进入维护状态
  429. tmpNode := *serverNode
  430. if tmpNode.State > 0 && isWhiteList {
  431. //白名单玩家状态修改
  432. //5维护 6待测试
  433. if tmpNode.State != 6 {
  434. tmpNode.State = 0
  435. }
  436. tmpNode.State = 0
  437. }
  438. if bBlockPlatform && tmpNode.ServerId > 0 {
  439. latestServerNode.State = 5
  440. }
  441. c.JSON(http.StatusOK, tmpNode)
  442. return
  443. }
  444. }
  445. c.JSON(http.StatusOK, latestServerNode)
  446. }
  447. func AddOpenIDServer(c *gin.Context) {
  448. var errStr = ""
  449. openId := c.DefaultQuery("openid", "") ///default ""
  450. if openId == "" {
  451. errStr = "openid invalid!!!"
  452. util.InfoF(errStr)
  453. c.JSON(http.StatusOK, gin.H{
  454. "err": errStr,
  455. })
  456. return
  457. }
  458. serverIdStr := c.PostForm("ServerId")
  459. serverId, err1 := strconv.Atoi(serverIdStr)
  460. headFrameId, err2 := strconv.Atoi(c.PostForm("HeadFrameId"))
  461. level, err3 := strconv.Atoi(c.PostForm("Level"))
  462. jobCfgId, err3 := strconv.Atoi(c.PostForm("JobCfgId"))
  463. gender, err3 := strconv.Atoi(c.PostForm("Gender"))
  464. nickName := c.PostForm("NickName")
  465. if err1 != nil || err2 != nil || err3 != nil || serverId == 0 || headFrameId == 0 || level == 0 {
  466. errStr = "param invalid!!!"
  467. c.JSON(http.StatusOK, gin.H{
  468. "err": errStr,
  469. })
  470. return
  471. }
  472. addServerNode, _ := json.Marshal(
  473. &SelfServerNode{
  474. ServerId: int32(serverId),
  475. HeadFrameId: int32(headFrameId),
  476. Level: int32(level),
  477. JobCfgId: int32(jobCfgId),
  478. Gender: int32(gender),
  479. RecordTime: uint32(util.GetTimeSeconds()),
  480. NickName: nickName,
  481. })
  482. util.InfoF("openid=%v content=%v", openId, string(addServerNode))
  483. //sl:abc
  484. keyStr := "sl:" + openId
  485. _, err := service.GetRedis().HSet(keyStr, serverIdStr, string(addServerNode)).Result()
  486. if err != nil {
  487. util.InfoF("AddOpenIDServer err:%v", err)
  488. }
  489. }
  490. func UploadFile(c *gin.Context) {
  491. battleRecordIdStr := c.DefaultPostForm("id", "") ///default ""
  492. _, err := strconv.ParseUint(battleRecordIdStr, 10, 64)
  493. if err != nil {
  494. c.String(http.StatusOK, fmt.Sprintf("upload failed!"))
  495. return
  496. }
  497. file, _ := c.FormFile("file")
  498. util.InfoF("filename=%v", file.Filename)
  499. err = c.SaveUploadedFile(file, service.GetServiceConfig().Node.RecordFile+"/"+file.Filename)
  500. if err != nil {
  501. c.String(http.StatusOK, fmt.Sprintf("'%s' upload failed!", file.Filename))
  502. } else {
  503. c.String(http.StatusOK, fmt.Sprintf("'%s' upload ok!", file.Filename))
  504. }
  505. }
  506. func DownloadFile(c *gin.Context) {
  507. //recordType := c.DefaultQuery("recordtype", "")
  508. //mapId := c.DefaultQuery("mapid", "")
  509. //mapLevel := c.DefaultQuery("maplevel", "")
  510. //uid := c.DefaultQuery("uid", "")
  511. //todo...
  512. fName := "READMEv2.md"
  513. c.Writer.Header().Add("Content-Disposition", fmt.Sprintf("attachment;filename=%s", fName))
  514. c.Writer.Header().Add("Content-Type", "application/octet-stream")
  515. c.File("./record/" + fName)
  516. }
  517. // serverlist redis
  518. const (
  519. ServerListWhiteListPrefix = "sl:whitelist" //白名单 ->map
  520. ServerListDetailPrefix = "sl:server" //服务器详情 json格式 ->map
  521. ServerListDefault = "sl:default" //推荐服务器 默认为最后一个开放服务器(需要后台设置) ->map
  522. ServerListOpenIDPrefix = "sl:" //玩家创建角色服务器列表
  523. )
  524. type ServerNodJson struct {
  525. ServerId int `json:"ServerId"`
  526. ServerName string `json:"ServerName"`
  527. Ip string `json:"Ip"`
  528. Port []int `json:"Port"`
  529. Type int `json:"Type"`
  530. STime string `json:"STime"`
  531. State int `json:"State"`
  532. Invisible int `json:"Invisible"`
  533. STimeStamp uint64
  534. New bool
  535. }
  536. type SelfServerNodeDetailJson struct {
  537. ServerId int32 `json:serverid`
  538. HeadFrameId int32 `json:headframeid`
  539. Level int32 `json:level`
  540. RecordTime uint32 `json:recordtime`
  541. JobCfgId int32 `json:jobcfgid`
  542. Gender int32 `json:gender` //1 female 2 male
  543. NickName string `json:nickname`
  544. ServerName string `yaml:servername`
  545. Ip string `yaml:ip`
  546. Port []int `yaml:port`
  547. Type int `yaml:type`
  548. STime string `yaml:stime`
  549. State int `yaml:state`
  550. New bool `yaml:new`
  551. STimeStamp uint64
  552. }
  553. type AllServerST struct {
  554. ServerList []*ServerNodJson
  555. ServerNum int
  556. Page int
  557. MaxServerId int
  558. }
  559. func GetHeadInfo(c *gin.Context) {
  560. c.JSON(http.StatusOK, gin.H{
  561. "err": "OK",
  562. })
  563. }
  564. func GetServerDownLoad(c *gin.Context) {
  565. platform := c.DefaultQuery("platform", "0")
  566. param := c.DefaultQuery("param", "0")
  567. if serviceConfig != nil {
  568. var url string
  569. //默认android中文版
  570. url = serviceConfig.DownLoadUrl.CdnUrl
  571. if param == "ru" {
  572. url = serviceConfig.DownLoadUrl.CdnUrlRu
  573. }
  574. if param == "en" {
  575. url = serviceConfig.DownLoadUrl.CdnUrlEn
  576. }
  577. if param == "dny" {
  578. url = serviceConfig.DownLoadUrl.CdnUrlDn
  579. }
  580. if param == "x7" {
  581. url = serviceConfig.DownLoadUrl.CdnUrlX7
  582. }
  583. if platform == "PC" {
  584. url = serviceConfig.DownLoadUrl.IpUrl
  585. }
  586. if platform == "IOS" {
  587. //默认中文版
  588. url = serviceConfig.DownLoadUrl.IosUrl
  589. if param == "ru" {
  590. url = serviceConfig.DownLoadUrl.IosUrlRu
  591. }
  592. if param == "en" {
  593. url = serviceConfig.DownLoadUrl.IosUrlEn
  594. }
  595. if param == "dny" {
  596. url = serviceConfig.DownLoadUrl.IosUrlDn
  597. }
  598. if param == "x7" {
  599. url = serviceConfig.DownLoadUrl.IosUrlX7
  600. }
  601. }
  602. c.JSON(http.StatusOK, url)
  603. } else {
  604. c.JSON(http.StatusOK, gin.H{
  605. "err": "config invalid!!!",
  606. })
  607. }
  608. }
  609. func GetServerState2(c *gin.Context) {
  610. platform := c.DefaultQuery("platform", "0")
  611. param := c.DefaultQuery("buildTag", "0")
  612. if serviceConfig != nil {
  613. var url int
  614. //默认android中文版
  615. url = serviceConfig.DownLoadUrl.AndroidState
  616. if platform == "IOS" && param == serviceConfig.Tag {
  617. //默认中文版
  618. url = serviceConfig.DownLoadUrl.IosState
  619. }
  620. c.JSON(http.StatusOK, url)
  621. } else {
  622. c.JSON(http.StatusOK, gin.H{
  623. "err": "config invalid!!!",
  624. })
  625. }
  626. }
  627. func GetServerListNew(c *gin.Context) {
  628. //util.InfoF("RequestURL=%v", c.Request.RequestURI)
  629. getType := c.DefaultQuery("type", "0") ///default 0
  630. serverListType, err := strconv.Atoi(getType)
  631. if err != nil {
  632. c.JSON(http.StatusOK, gin.H{
  633. "err": "type invalid!!!",
  634. })
  635. return
  636. }
  637. //maxServerId := 0
  638. //for idx := 0; idx < len(GetServiceConfig().serverNormalList); idx++ {
  639. // tmpItem := GetServiceConfig().serverNormalList[idx]
  640. //
  641. // tmpNode := &ServerNodJson{
  642. // ServerId: tmpItem.ServerId,
  643. // ServerName: tmpItem.ServerName,
  644. // Ip: tmpItem.Ip,
  645. // Port: tmpItem.Port,
  646. // STime: tmpItem.STime,
  647. // State: tmpItem.State,
  648. // Invisible: tmpItem.Invisible,
  649. // }
  650. //
  651. // tmpBytes, err := json.Marshal(tmpNode)
  652. // if err == nil {
  653. // msgStr := base64.StdEncoding.EncodeToString(tmpBytes)
  654. // service.GetRedis().HSet(ServerListDetailPrefix, strconv.Itoa(tmpNode.ServerId), string(msgStr))
  655. // }
  656. // if tmpItem.ServerId > maxServerId {
  657. // maxServerId = tmpItem.ServerId
  658. // }
  659. //}
  660. //service.GetRedis().HSet(ServerListDefault, "node", 3)
  661. //service.GetRedis().HSet(ServerListDefault, "maxnode", 4)
  662. //service.GetRedis().HSet(ServerListDefault, "wmaxnode", 11)
  663. //service.GetRedis().SAdd(ServerListWhiteListPrefix, "192.168.10.156")
  664. GetServerList(c)
  665. return
  666. //redis中无数据直接使用配置文件数据
  667. //if getServerListNum() <= 0 {
  668. // GetServerList(c)
  669. // return
  670. //}
  671. //tmpNode := &ServerNodJson{
  672. // ServerId: 1,
  673. // ServerName: string("1服"),
  674. // Ip: "127.0.0.1",
  675. // Port: []int{21001, 21002, 21003, 21004},
  676. // STime: "2021-01-05 17:50:26",
  677. // State: 5,
  678. // Invisible: 1,
  679. //}
  680. //tmpNode.Invisible = 0
  681. //tmpBytes, err := json.Marshal(tmpNode)
  682. //service.GetRedis().HSet(ServerListDetailPrefix, "1", string(tmpBytes))
  683. //tmpNode.ServerId = 2
  684. //tmpNode.ServerName = "2服"
  685. //tmpBytes, err = json.Marshal(tmpNode)
  686. //service.GetRedis().HSet(ServerListDetailPrefix, "2", string(tmpBytes))
  687. //tmpNode.ServerId = 3
  688. //tmpNode.ServerName = "3服"
  689. //tmpBytes, err = json.Marshal(tmpNode)
  690. //service.GetRedis().HSet(ServerListDetailPrefix, "3", string(tmpBytes))
  691. //
  692. //service.GetRedis().SAdd(ServerListWhiteListPrefix, "127.0.0.1")
  693. //service.GetRedis().SAdd(ServerListWhiteListPrefix, "192.168.10.75")
  694. //
  695. //service.GetRedis().HSet(ServerListDefault, "node", "1")
  696. //
  697. //serverNodeId, err := service.GetRedis().HGet(ServerListDetailPrefix, "1").Result()
  698. //log.Printf("serverNodeId=%v", serverNodeId)
  699. var serviceNode *ServerNodJson = nil
  700. switch serverListType {
  701. case ServerByID: //21根据id获取对应服务器状态 http://127.0.0.1:8088/serverlist?type=21&id=1
  702. serviceNode = GetServerByIDFromRedis(c)
  703. case ServerRecommend: //22获取推荐服务器(玩家自己登录过的游戏,和最后一个服务器) serverlist?type=3&openid=abcd
  704. //openID登录的服务器信息
  705. errStr, ret := GetServerByOpenIdFromRedis(c)
  706. if !ret {
  707. c.JSON(http.StatusOK, gin.H{
  708. "err": errStr,
  709. })
  710. }
  711. return
  712. case ServerAll:
  713. c.JSON(http.StatusOK, GetServerListFromRedis(c))
  714. return
  715. case DefaultServer:
  716. GetDefaultServerFromRedis(c)
  717. return
  718. }
  719. if serviceNode != nil {
  720. c.JSON(http.StatusOK, serviceNode)
  721. } else {
  722. c.JSON(http.StatusOK, gin.H{
  723. "err": "no server node!!!",
  724. })
  725. }
  726. }
  727. func GetServerByIDFromRedis(c *gin.Context) *ServerNodJson {
  728. serviceId := c.DefaultQuery("id", "0")
  729. _, err := strconv.Atoi(serviceId)
  730. if err != nil {
  731. return nil
  732. }
  733. ip := c.ClientIP()
  734. bWhite := checkWhiteList(ip, "")
  735. serverNode := getServerByIDFromRedis(serviceId, bWhite)
  736. if serverNode == nil {
  737. return nil
  738. }
  739. return serverNode
  740. }
  741. // openID登录的服务器信息/推荐服务器
  742. func GetServerByOpenIdFromRedis(c *gin.Context) (string, bool) {
  743. var errStr = ""
  744. openId := c.DefaultQuery("openid", "") ///default ""
  745. platform := c.DefaultQuery("platform", "") ///default ""
  746. if openId == "" {
  747. errStr = "openid invalid!!!"
  748. util.InfoF(errStr)
  749. return errStr, false
  750. }
  751. openId = ConvertPlatform(openId, platform)
  752. keyStr := ServerListOpenIDPrefix + openId
  753. valList, err := service.GetRedis().HVals(keyStr).Result()
  754. if err != nil {
  755. errStr := "openid invalid!!!" + err.Error()
  756. util.InfoF(errStr)
  757. return errStr, false
  758. }
  759. ip := c.ClientIP()
  760. bWhite := checkWhiteList(ip, openId)
  761. recommendServerNode := getRecommendServer(false)
  762. bFindRecommend := false
  763. var selfNodeList []*SelfServerNodeDetailJson
  764. for idx := range valList {
  765. selfNode := &SelfServerNodeDetailJson{}
  766. err := json.Unmarshal([]byte(valList[idx]), selfNode)
  767. if err != nil {
  768. continue
  769. }
  770. tmpServerIdStr := strconv.Itoa(int(selfNode.ServerId))
  771. tmpServerNode := getServerByIDFromRedis(tmpServerIdStr, bWhite)
  772. if tmpServerNode == nil {
  773. continue
  774. }
  775. selfNode.ServerName = tmpServerNode.ServerName
  776. selfNode.Ip = tmpServerNode.Ip
  777. selfNode.Port = tmpServerNode.Port
  778. selfNode.Type = tmpServerNode.Type
  779. selfNode.STime = tmpServerNode.STime
  780. tmpSTime := util.GetTimeByStr(tmpServerNode.STime)
  781. selfNode.STimeStamp = uint64(tmpSTime.Unix())
  782. if !bWhite {
  783. selfNode.State = tmpServerNode.State
  784. }
  785. if recommendServerNode != nil && recommendServerNode.ServerId == int(selfNode.ServerId) {
  786. selfNode.New = true
  787. bFindRecommend = true
  788. }
  789. selfNodeList = append(selfNodeList, selfNode)
  790. }
  791. if !bFindRecommend && recommendServerNode != nil {
  792. selfNode := &SelfServerNodeDetailJson{}
  793. selfNode.ServerId = int32(recommendServerNode.ServerId)
  794. selfNode.ServerName = recommendServerNode.ServerName
  795. selfNode.Ip = recommendServerNode.Ip
  796. selfNode.Port = recommendServerNode.Port
  797. selfNode.Type = recommendServerNode.Type
  798. selfNode.STime = recommendServerNode.STime
  799. tmpSTime := util.GetTimeByStr(recommendServerNode.STime)
  800. selfNode.STimeStamp = uint64(tmpSTime.Unix())
  801. if !bWhite {
  802. selfNode.State = recommendServerNode.State
  803. }
  804. selfNode.New = true
  805. selfNodeList = append(selfNodeList, selfNode)
  806. }
  807. c.JSON(http.StatusOK, selfNodeList)
  808. return "", true
  809. }
  810. func GetServerListFromRedis(c *gin.Context) interface{} {
  811. pageIdStr := c.DefaultQuery("page", "0")
  812. pageId, err := strconv.Atoi(pageIdStr)
  813. if err != nil {
  814. return nil
  815. }
  816. ip := c.ClientIP()
  817. bWhite := checkWhiteList(ip, "")
  818. var allServer AllServerST
  819. serverNum := getServerListNum()
  820. allServer.ServerNum = serverNum
  821. allServer.Page = 10
  822. if !bWhite {
  823. maxServerIdStr, err := service.GetRedis().HGet(ServerListDefault, "maxnode").Result()
  824. if err == nil {
  825. allServer.MaxServerId, _ = strconv.Atoi(maxServerIdStr)
  826. }
  827. } else {
  828. maxServerIdStr, err := service.GetRedis().HGet(ServerListDefault, "wmaxnode").Result()
  829. if err == nil {
  830. allServer.MaxServerId, _ = strconv.Atoi(maxServerIdStr)
  831. }
  832. }
  833. if pageId <= 0 {
  834. pageId = allServer.MaxServerId / 10
  835. if allServer.MaxServerId%10 != 0 {
  836. pageId += 1
  837. }
  838. if pageId <= 0 {
  839. pageId = 1
  840. }
  841. }
  842. eIdx := pageId * 10
  843. sIdx := eIdx - 10
  844. if eIdx > allServer.MaxServerId {
  845. eIdx = allServer.MaxServerId
  846. }
  847. recommendServerNode := getRecommendServer(false)
  848. for idx := sIdx; idx < eIdx; idx++ {
  849. idxStr := strconv.Itoa(idx + 1)
  850. serverNode := getServerByIDFromRedis(idxStr, bWhite)
  851. if serverNode == nil {
  852. continue
  853. }
  854. if !bWhite && serverNode.Invisible > 0 {
  855. continue
  856. }
  857. if serverNode.ServerId == recommendServerNode.ServerId {
  858. serverNode.New = true
  859. }
  860. allServer.ServerList = append(allServer.ServerList, serverNode)
  861. }
  862. return allServer
  863. }
  864. func GetDefaultServerFromRedis(c *gin.Context) {
  865. recommendServerNode := getRecommendServer(false)
  866. openId := c.DefaultQuery("openid", "") ///default ""
  867. platform := c.DefaultQuery("platform", "") ///default ""
  868. openId = ConvertPlatform(openId, platform)
  869. ip := c.ClientIP()
  870. bWhite := checkWhiteList(ip, "")
  871. if openId == "" {
  872. //白名单中玩家,服务器不进入维护状态
  873. if bWhite && recommendServerNode != nil {
  874. recommendServerNode.State = 0
  875. recommendServerNode.Invisible = 0
  876. }
  877. c.JSON(http.StatusOK, recommendServerNode)
  878. return
  879. }
  880. if bWhite && recommendServerNode != nil {
  881. recommendServerNode.State = 0
  882. recommendServerNode.Invisible = 0
  883. }
  884. keyStr := ServerListOpenIDPrefix + openId
  885. valList, err := service.GetRedis().HVals(keyStr).Result()
  886. if err != nil {
  887. c.JSON(http.StatusOK, recommendServerNode)
  888. return
  889. }
  890. var selfNodeInfo *SelfServerNodeDetailJson = nil
  891. for idx := range valList {
  892. tmpNode := &SelfServerNodeDetailJson{}
  893. err := json.Unmarshal([]byte(valList[idx]), tmpNode)
  894. if err != nil {
  895. continue
  896. }
  897. if selfNodeInfo == nil || tmpNode.RecordTime > selfNodeInfo.RecordTime {
  898. selfNodeInfo = tmpNode
  899. }
  900. }
  901. if selfNodeInfo != nil {
  902. tmpServerIdStr := strconv.Itoa(int(selfNodeInfo.ServerId))
  903. tmpServerNode := getServerByIDFromRedis(tmpServerIdStr, bWhite)
  904. if tmpServerNode != nil {
  905. c.JSON(http.StatusOK, tmpServerNode)
  906. return
  907. }
  908. }
  909. c.JSON(http.StatusOK, recommendServerNode)
  910. }
  911. func SetServerInfo(c *gin.Context) {
  912. severDetailInfoJson := c.DefaultQuery("info", "") ///default ""
  913. serverNodId := c.DefaultQuery("id", "")
  914. recommendStr := c.DefaultQuery("recommend", "0")
  915. _, err := strconv.Atoi(serverNodId)
  916. if err != nil {
  917. c.JSON(http.StatusOK, gin.H{
  918. "err": "服务器id有误",
  919. })
  920. return
  921. }
  922. serverNode := &ServerNodJson{}
  923. err = json.Unmarshal([]byte(severDetailInfoJson), serverNode)
  924. if err != nil {
  925. c.JSON(http.StatusOK, gin.H{
  926. "err": "服务器信息有误",
  927. })
  928. return
  929. }
  930. msgStr := base64.StdEncoding.EncodeToString([]byte(severDetailInfoJson))
  931. _, err = service.GetRedis().HSet(ServerListDetailPrefix, serverNodId, msgStr).Result()
  932. if err != nil {
  933. c.JSON(http.StatusOK, gin.H{
  934. "err": "服务器信息保存出错",
  935. })
  936. return
  937. }
  938. //推荐服务器
  939. if recommendStr != "0" {
  940. _, err = service.GetRedis().HSet(ServerListDefault, "node", serverNodId).Result()
  941. if err != nil {
  942. c.JSON(http.StatusOK, gin.H{
  943. "err": "推荐服务器信息保存出错",
  944. })
  945. return
  946. }
  947. c.JSON(http.StatusOK, gin.H{
  948. "err": "服务器信息保存成功(并设置为推荐服务器)",
  949. })
  950. } else {
  951. c.JSON(http.StatusOK, gin.H{
  952. "err": "服务器信息保存成功",
  953. })
  954. }
  955. }
  956. func getServerListNum() int {
  957. serverNum, err := service.GetRedis().HLen(ServerListDetailPrefix).Result()
  958. //serverNum, err := service.GetRedis().LLen(SeverListPrefix).Result()
  959. if err != nil {
  960. return 0
  961. }
  962. return int(serverNum)
  963. }
  964. func getRecommendServer(bForce bool) *ServerNodJson {
  965. recommendNodeStr, err := service.GetRedis().HGet(ServerListDefault, "node").Result()
  966. if err != nil && err != service.NIL {
  967. return nil
  968. }
  969. serverNode := getServerByIDFromRedis(recommendNodeStr, false)
  970. if serverNode == nil {
  971. serverNode = getServerByIDFromRedis("1", false) //默认第一个服务器
  972. //maxNodeId, err := service.GetRedis().HGet(ServerListDefault, "maxnodeid").Result()
  973. //if err != nil {
  974. // return nil
  975. //}
  976. //serverNode = getServerByIDFromRedis(maxNodeId)
  977. }
  978. return serverNode
  979. }
  980. func getServerByIDFromRedis(nodeId string, bWhite bool) *ServerNodJson {
  981. msgStr, err := service.GetRedis().HGet(ServerListDetailPrefix, nodeId).Result()
  982. if err != nil {
  983. return nil
  984. }
  985. if err == service.NIL {
  986. return nil
  987. }
  988. serverDetail, _ := base64.StdEncoding.DecodeString(string(msgStr))
  989. serverNode := &ServerNodJson{}
  990. err = json.Unmarshal([]byte(serverDetail), serverNode)
  991. if err != nil {
  992. return nil
  993. }
  994. //白名单玩家状态修改
  995. //5维护 6待测试
  996. if bWhite {
  997. if serverNode.State != 6 {
  998. serverNode.State = 0
  999. }
  1000. }
  1001. serverNode.STimeStamp = uint64(util.GetTimeByStr(serverNode.STime).Unix())
  1002. return serverNode
  1003. }
  1004. func checkWhiteList(clientIp string, openId string) bool {
  1005. if clientIp != "" {
  1006. bWhite, err := service.GetRedis().SIsMember(ServerListWhiteListPrefix, clientIp).Result()
  1007. if err != nil {
  1008. return false
  1009. }
  1010. if bWhite {
  1011. return true
  1012. }
  1013. }
  1014. if openId != "" {
  1015. bWhite, err := service.GetRedis().SIsMember(ServerListWhiteListPrefix, openId).Result()
  1016. if err != nil {
  1017. return false
  1018. }
  1019. if bWhite {
  1020. return true
  1021. }
  1022. }
  1023. return false
  1024. }
  1025. /*
  1026. #白名单列表
  1027. whitelist:
  1028. ip:
  1029. - 192.168.1.10
  1030. - 192.168.1.11
  1031. openid:
  1032. - 123123213
  1033. - dfsdfdf
  1034. #服务器列表
  1035. #5 表示维护
  1036. #1 ~ 4,分别表示服务器: 空闲、良好、繁忙、火爆 4种状态
  1037. serverlist:
  1038. - {serverid: 10001,servername: 内网服, ip: 172.16.13.111, port: [21001],type: 1, stime: 2019-12-02 12:00:00, state: 5}
  1039. - {serverid: 10002,servername: 外网, ip: 120.55.48.172, port: [21001,21002],type: 2}
  1040. - {serverid: 10003,servername: Tap服务器, ip: www.wtgame.cn, port: [21005,21006],type: 3}
  1041. - {serverid: 10004,servername: 拥有测试功能的服务器, ip: www.wtgame.cn, port: [21011],type: 5}
  1042. - {serverid: 1,servername: 陈海益服, ip: 192.168.10.213, port: [21001], stime: 2020-10-29 12:00:00}
  1043. - {serverid: 2,servername: 内网服, ip: 192.168.10.213, port: [21001], stime: 2020-10-29 12:00:00}
  1044. - {serverid: 3,servername: 王兆灿服, ip: 192.168.10.233, port: [21001], stime: 2020-10-29 12:00:00}
  1045. - {serverid: 4,servername: 陈海益服状态测试, ip: 192.168.10.213, port: [21001,21003], stime: 2020-10-29 12:00:00, state: 4}
  1046. - {serverid: 5,servername: 万里辉服, ip: 192.168.10.244, port: [21001], stime: 2020-10-29 12:00:00}
  1047. - {serverid: 6,servername: 王亚兰服, ip: 192.168.10.137, port: [21001], stime: 2020-10-29 12:00:00}
  1048. - {serverid: 7,servername: 黄瑾服, ip: 192.168.10.237, port: [21001], stime: 2020-10-29 12:00:00}
  1049. - {serverid: 8,servername: 顾杰服, ip: 192.168.10.128, port: [21001], stime: 2020-10-29 12:00:00}
  1050. - {serverid: 9,servername: 林江服, ip: 192.168.10.236, port: [21001], stime: 2020-10-29 12:00:00}
  1051. - {serverid: 10,servername: 李嘉颖服, ip: 192.168.10.23, port: [21001], stime: 2020-10-29 12:00:00}
  1052. - {serverid: 11,servername: 李慧勇服, ip: 192.168.10.235, port: [21001], stime: 2020-10-29 12:00:00}
  1053. - {serverid: 12,servername: 徐晨服, ip: 192.168.10.125, port: [21001], stime: 2020-10-29 12:00:00}
  1054. - {serverid: 13,servername: 陈一鸣服, ip: 192.168.10.168, port: [21001], stime: 2020-10-29 12:00:00}
  1055. - {serverid: 14,servername: 刘亦周服, ip: 192.168.10.87, port: [21001], stime: 2020-10-29 12:00:00}
  1056. - {serverid: 15,servername: 王子博服, ip: 192.168.10.222, port: [21001], stime: 2020-10-29 12:00:00}
  1057. - {serverid: 16,servername: 张曦轶服, ip: 192.168.10.138, port: [21001], stime: 2020-10-29 12:00:00}
  1058. - {serverid: 17,servername: 方世琪服, ip: 192.168.10.225, port: [21001], stime: 2020-10-29 12:00:00}
  1059. - {serverid: 18,servername: 吴泽榕服, ip: 192.168.10.207, port: [21001], stime: 2020-10-29 12:00:00}
  1060. - {serverid: 1000,servername: 内网服, ip: 192.168.10.213, port: [21001], stime: 2020-10-29 12:00:00}
  1061. */