serverlist.go 29 KB

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