serverlist.go 29 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022
  1. package model
  2. import (
  3. "encoding/base64"
  4. "encoding/json"
  5. "fmt"
  6. "github.com/gin-gonic/gin"
  7. "net/http"
  8. "rocommon/service"
  9. "rocommon/util"
  10. "strconv"
  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 GetServerListNew(c *gin.Context) {
  491. //util.InfoF("RequestURL=%v", c.Request.RequestURI)
  492. getType := c.DefaultQuery("type", "0") ///default 0
  493. serverListType, err := strconv.Atoi(getType)
  494. if err != nil {
  495. c.JSON(http.StatusOK, gin.H{
  496. "err": "type invalid!!!",
  497. })
  498. return
  499. }
  500. //maxServerId := 0
  501. //for idx := 0; idx < len(GetServiceConfig().serverNormalList); idx++ {
  502. // tmpItem := GetServiceConfig().serverNormalList[idx]
  503. //
  504. // tmpNode := &ServerNodJson{
  505. // ServerId: tmpItem.ServerId,
  506. // ServerName: tmpItem.ServerName,
  507. // Ip: tmpItem.Ip,
  508. // Port: tmpItem.Port,
  509. // STime: tmpItem.STime,
  510. // State: tmpItem.State,
  511. // Invisible: tmpItem.Invisible,
  512. // }
  513. //
  514. // tmpBytes, err := json.Marshal(tmpNode)
  515. // if err == nil {
  516. // msgStr := base64.StdEncoding.EncodeToString(tmpBytes)
  517. // service.GetRedis().HSet(ServerListDetailPrefix, strconv.Itoa(tmpNode.ServerId), string(msgStr))
  518. // }
  519. // if tmpItem.ServerId > maxServerId {
  520. // maxServerId = tmpItem.ServerId
  521. // }
  522. //}
  523. //service.GetRedis().HSet(ServerListDefault, "node", 3)
  524. //service.GetRedis().HSet(ServerListDefault, "maxnode", 4)
  525. //service.GetRedis().HSet(ServerListDefault, "wmaxnode", 11)
  526. //service.GetRedis().SAdd(ServerListWhiteListPrefix, "192.168.10.156")
  527. //redis中无数据直接使用配置文件数据
  528. if getServerListNum() <= 0 {
  529. GetServerList(c)
  530. return
  531. }
  532. //tmpNode := &ServerNodJson{
  533. // ServerId: 1,
  534. // ServerName: string("1服"),
  535. // Ip: "127.0.0.1",
  536. // Port: []int{21001, 21002, 21003, 21004},
  537. // STime: "2021-01-05 17:50:26",
  538. // State: 5,
  539. // Invisible: 1,
  540. //}
  541. //tmpNode.Invisible = 0
  542. //tmpBytes, err := json.Marshal(tmpNode)
  543. //service.GetRedis().HSet(ServerListDetailPrefix, "1", string(tmpBytes))
  544. //tmpNode.ServerId = 2
  545. //tmpNode.ServerName = "2服"
  546. //tmpBytes, err = json.Marshal(tmpNode)
  547. //service.GetRedis().HSet(ServerListDetailPrefix, "2", string(tmpBytes))
  548. //tmpNode.ServerId = 3
  549. //tmpNode.ServerName = "3服"
  550. //tmpBytes, err = json.Marshal(tmpNode)
  551. //service.GetRedis().HSet(ServerListDetailPrefix, "3", string(tmpBytes))
  552. //
  553. //service.GetRedis().SAdd(ServerListWhiteListPrefix, "127.0.0.1")
  554. //service.GetRedis().SAdd(ServerListWhiteListPrefix, "192.168.10.75")
  555. //
  556. //service.GetRedis().HSet(ServerListDefault, "node", "1")
  557. //
  558. //serverNodeId, err := service.GetRedis().HGet(ServerListDetailPrefix, "1").Result()
  559. //log.Printf("serverNodeId=%v", serverNodeId)
  560. var serviceNode *ServerNodJson = nil
  561. switch serverListType {
  562. case ServerByID: //21根据id获取对应服务器状态 http://127.0.0.1:8088/serverlist?type=21&id=1
  563. serviceNode = GetServerByIDFromRedis(c)
  564. case ServerRecommend: //22获取推荐服务器(玩家自己登录过的游戏,和最后一个服务器) serverlist?type=3&openid=abcd
  565. //openID登录的服务器信息
  566. errStr, ret := GetServerByOpenIdFromRedis(c)
  567. if !ret {
  568. c.JSON(http.StatusOK, gin.H{
  569. "err": errStr,
  570. })
  571. }
  572. return
  573. case ServerAll:
  574. c.JSON(http.StatusOK, GetServerListFromRedis(c))
  575. return
  576. case DefaultServer:
  577. GetDefaultServerFromRedis(c)
  578. return
  579. }
  580. if serviceNode != nil {
  581. c.JSON(http.StatusOK, serviceNode)
  582. } else {
  583. c.JSON(http.StatusOK, gin.H{
  584. "err": "no server node!!!",
  585. })
  586. }
  587. }
  588. func GetServerByIDFromRedis(c *gin.Context) *ServerNodJson {
  589. serviceId := c.DefaultQuery("id", "0")
  590. _, err := strconv.Atoi(serviceId)
  591. if err != nil {
  592. return nil
  593. }
  594. ip := c.ClientIP()
  595. bWhite := checkWhiteList(ip, "")
  596. serverNode := getServerByIDFromRedis(serviceId, bWhite)
  597. if serverNode == nil {
  598. return nil
  599. }
  600. return serverNode
  601. }
  602. //openID登录的服务器信息/推荐服务器
  603. func GetServerByOpenIdFromRedis(c *gin.Context) (string, bool) {
  604. var errStr = ""
  605. openId := c.DefaultQuery("openid", "") ///default ""
  606. platform := c.DefaultQuery("platform", "") ///default ""
  607. if openId == "" {
  608. errStr = "openid invalid!!!"
  609. util.InfoF(errStr)
  610. return errStr, false
  611. }
  612. openId = ConvertPlatform(openId, platform)
  613. keyStr := ServerListOpenIDPrefix + openId
  614. valList, err := service.GetRedis().HVals(keyStr).Result()
  615. if err != nil {
  616. errStr := "openid invalid!!!" + err.Error()
  617. util.InfoF(errStr)
  618. return errStr, false
  619. }
  620. ip := c.ClientIP()
  621. bWhite := checkWhiteList(ip, openId)
  622. recommendServerNode := getRecommendServer(false)
  623. bFindRecommend := false
  624. var selfNodeList []*SelfServerNodeDetailJson
  625. for idx := range valList {
  626. selfNode := &SelfServerNodeDetailJson{}
  627. err := json.Unmarshal([]byte(valList[idx]), selfNode)
  628. if err != nil {
  629. continue
  630. }
  631. tmpServerIdStr := strconv.Itoa(int(selfNode.ServerId))
  632. tmpServerNode := getServerByIDFromRedis(tmpServerIdStr, bWhite)
  633. if tmpServerNode == nil {
  634. continue
  635. }
  636. selfNode.ServerName = tmpServerNode.ServerName
  637. selfNode.Ip = tmpServerNode.Ip
  638. selfNode.Port = tmpServerNode.Port
  639. selfNode.Type = tmpServerNode.Type
  640. selfNode.STime = tmpServerNode.STime
  641. tmpSTime := util.GetTimeByStr(tmpServerNode.STime)
  642. selfNode.STimeStamp = uint64(tmpSTime.Unix())
  643. if !bWhite {
  644. selfNode.State = tmpServerNode.State
  645. }
  646. if recommendServerNode != nil && recommendServerNode.ServerId == int(selfNode.ServerId) {
  647. selfNode.New = true
  648. bFindRecommend = true
  649. }
  650. selfNodeList = append(selfNodeList, selfNode)
  651. }
  652. if !bFindRecommend && recommendServerNode != nil {
  653. selfNode := &SelfServerNodeDetailJson{}
  654. selfNode.ServerId = int32(recommendServerNode.ServerId)
  655. selfNode.ServerName = recommendServerNode.ServerName
  656. selfNode.Ip = recommendServerNode.Ip
  657. selfNode.Port = recommendServerNode.Port
  658. selfNode.Type = recommendServerNode.Type
  659. selfNode.STime = recommendServerNode.STime
  660. tmpSTime := util.GetTimeByStr(recommendServerNode.STime)
  661. selfNode.STimeStamp = uint64(tmpSTime.Unix())
  662. if !bWhite {
  663. selfNode.State = recommendServerNode.State
  664. }
  665. selfNode.New = true
  666. selfNodeList = append(selfNodeList, selfNode)
  667. }
  668. c.JSON(http.StatusOK, selfNodeList)
  669. return "", true
  670. }
  671. func GetServerListFromRedis(c *gin.Context) interface{} {
  672. pageIdStr := c.DefaultQuery("page", "0")
  673. pageId, err := strconv.Atoi(pageIdStr)
  674. if err != nil {
  675. return nil
  676. }
  677. ip := c.ClientIP()
  678. bWhite := checkWhiteList(ip, "")
  679. var allServer AllServerST
  680. serverNum := getServerListNum()
  681. allServer.ServerNum = serverNum
  682. allServer.Page = 10
  683. if !bWhite {
  684. maxServerIdStr, err := service.GetRedis().HGet(ServerListDefault, "maxnode").Result()
  685. if err == nil {
  686. allServer.MaxServerId, _ = strconv.Atoi(maxServerIdStr)
  687. }
  688. } else {
  689. maxServerIdStr, err := service.GetRedis().HGet(ServerListDefault, "wmaxnode").Result()
  690. if err == nil {
  691. allServer.MaxServerId, _ = strconv.Atoi(maxServerIdStr)
  692. }
  693. }
  694. if pageId <= 0 {
  695. pageId = allServer.MaxServerId / 10
  696. if allServer.MaxServerId%10 != 0 {
  697. pageId += 1
  698. }
  699. if pageId <= 0 {
  700. pageId = 1
  701. }
  702. }
  703. eIdx := pageId * 10
  704. sIdx := eIdx - 10
  705. if eIdx > allServer.MaxServerId {
  706. eIdx = allServer.MaxServerId
  707. }
  708. recommendServerNode := getRecommendServer(false)
  709. for idx := sIdx; idx < eIdx; idx++ {
  710. idxStr := strconv.Itoa(idx + 1)
  711. serverNode := getServerByIDFromRedis(idxStr, bWhite)
  712. if serverNode == nil {
  713. continue
  714. }
  715. if !bWhite && serverNode.Invisible > 0 {
  716. continue
  717. }
  718. if serverNode.ServerId == recommendServerNode.ServerId {
  719. serverNode.New = true
  720. }
  721. allServer.ServerList = append(allServer.ServerList, serverNode)
  722. }
  723. return allServer
  724. }
  725. func GetDefaultServerFromRedis(c *gin.Context) {
  726. recommendServerNode := getRecommendServer(false)
  727. openId := c.DefaultQuery("openid", "") ///default ""
  728. platform := c.DefaultQuery("platform", "") ///default ""
  729. openId = ConvertPlatform(openId, platform)
  730. ip := c.ClientIP()
  731. bWhite := checkWhiteList(ip, "")
  732. if openId == "" {
  733. //白名单中玩家,服务器不进入维护状态
  734. if bWhite && recommendServerNode != nil {
  735. recommendServerNode.State = 0
  736. recommendServerNode.Invisible = 0
  737. }
  738. c.JSON(http.StatusOK, recommendServerNode)
  739. return
  740. }
  741. if bWhite && recommendServerNode != nil {
  742. recommendServerNode.State = 0
  743. recommendServerNode.Invisible = 0
  744. }
  745. keyStr := ServerListOpenIDPrefix + openId
  746. valList, err := service.GetRedis().HVals(keyStr).Result()
  747. if err != nil {
  748. c.JSON(http.StatusOK, recommendServerNode)
  749. return
  750. }
  751. var selfNodeInfo *SelfServerNodeDetailJson = nil
  752. for idx := range valList {
  753. tmpNode := &SelfServerNodeDetailJson{}
  754. err := json.Unmarshal([]byte(valList[idx]), tmpNode)
  755. if err != nil {
  756. continue
  757. }
  758. if selfNodeInfo == nil || tmpNode.RecordTime > selfNodeInfo.RecordTime {
  759. selfNodeInfo = tmpNode
  760. }
  761. }
  762. if selfNodeInfo != nil {
  763. tmpServerIdStr := strconv.Itoa(int(selfNodeInfo.ServerId))
  764. tmpServerNode := getServerByIDFromRedis(tmpServerIdStr, bWhite)
  765. if tmpServerNode != nil {
  766. c.JSON(http.StatusOK, tmpServerNode)
  767. return
  768. }
  769. }
  770. c.JSON(http.StatusOK, recommendServerNode)
  771. }
  772. func SetServerInfo(c *gin.Context) {
  773. severDetailInfoJson := c.DefaultQuery("info", "") ///default ""
  774. serverNodId := c.DefaultQuery("id", "")
  775. recommendStr := c.DefaultQuery("recommend", "0")
  776. _, err := strconv.Atoi(serverNodId)
  777. if err != nil {
  778. c.JSON(http.StatusOK, gin.H{
  779. "err": "服务器id有误",
  780. })
  781. return
  782. }
  783. serverNode := &ServerNodJson{}
  784. err = json.Unmarshal([]byte(severDetailInfoJson), serverNode)
  785. if err != nil {
  786. c.JSON(http.StatusOK, gin.H{
  787. "err": "服务器信息有误",
  788. })
  789. return
  790. }
  791. msgStr := base64.StdEncoding.EncodeToString([]byte(severDetailInfoJson))
  792. _, err = service.GetRedis().HSet(ServerListDetailPrefix, serverNodId, msgStr).Result()
  793. if err != nil {
  794. c.JSON(http.StatusOK, gin.H{
  795. "err": "服务器信息保存出错",
  796. })
  797. return
  798. }
  799. //推荐服务器
  800. if recommendStr != "0" {
  801. _, err = service.GetRedis().HSet(ServerListDefault, "node", serverNodId).Result()
  802. if err != nil {
  803. c.JSON(http.StatusOK, gin.H{
  804. "err": "推荐服务器信息保存出错",
  805. })
  806. return
  807. }
  808. c.JSON(http.StatusOK, gin.H{
  809. "err": "服务器信息保存成功(并设置为推荐服务器)",
  810. })
  811. } else {
  812. c.JSON(http.StatusOK, gin.H{
  813. "err": "服务器信息保存成功",
  814. })
  815. }
  816. }
  817. func getServerListNum() int {
  818. serverNum, err := service.GetRedis().HLen(ServerListDetailPrefix).Result()
  819. //serverNum, err := service.GetRedis().LLen(SeverListPrefix).Result()
  820. if err != nil {
  821. return 0
  822. }
  823. return int(serverNum)
  824. }
  825. func getRecommendServer(bForce bool) *ServerNodJson {
  826. recommendNodeStr, err := service.GetRedis().HGet(ServerListDefault, "node").Result()
  827. if err != nil && err != service.NIL {
  828. return nil
  829. }
  830. serverNode := getServerByIDFromRedis(recommendNodeStr, false)
  831. if serverNode == nil {
  832. serverNode = getServerByIDFromRedis("1", false) //默认第一个服务器
  833. //maxNodeId, err := service.GetRedis().HGet(ServerListDefault, "maxnodeid").Result()
  834. //if err != nil {
  835. // return nil
  836. //}
  837. //serverNode = getServerByIDFromRedis(maxNodeId)
  838. }
  839. return serverNode
  840. }
  841. func getServerByIDFromRedis(nodeId string, bWhite bool) *ServerNodJson {
  842. msgStr, err := service.GetRedis().HGet(ServerListDetailPrefix, nodeId).Result()
  843. if err != nil {
  844. return nil
  845. }
  846. if err == service.NIL {
  847. return nil
  848. }
  849. serverDetail, _ := base64.StdEncoding.DecodeString(string(msgStr))
  850. serverNode := &ServerNodJson{}
  851. err = json.Unmarshal([]byte(serverDetail), serverNode)
  852. if err != nil {
  853. return nil
  854. }
  855. //白名单玩家状态修改
  856. //5维护 6待测试
  857. if bWhite {
  858. if serverNode.State != 6 {
  859. serverNode.State = 0
  860. }
  861. }
  862. serverNode.STimeStamp = uint64(util.GetTimeByStr(serverNode.STime).Unix())
  863. return serverNode
  864. }
  865. func checkWhiteList(clientIp string, openId string) bool {
  866. if clientIp != "" {
  867. bWhite, err := service.GetRedis().SIsMember(ServerListWhiteListPrefix, clientIp).Result()
  868. if err != nil {
  869. return false
  870. }
  871. if bWhite {
  872. return true
  873. }
  874. }
  875. if openId != "" {
  876. bWhite, err := service.GetRedis().SIsMember(ServerListWhiteListPrefix, openId).Result()
  877. if err != nil {
  878. return false
  879. }
  880. if bWhite {
  881. return true
  882. }
  883. }
  884. return false
  885. }
  886. /*
  887. #白名单列表
  888. whitelist:
  889. ip:
  890. - 192.168.1.10
  891. - 192.168.1.11
  892. openid:
  893. - 123123213
  894. - dfsdfdf
  895. #服务器列表
  896. #5 表示维护
  897. #1 ~ 4,分别表示服务器: 空闲、良好、繁忙、火爆 4种状态
  898. serverlist:
  899. - {serverid: 10001,servername: 内网服, ip: 172.16.13.111, port: [21001],type: 1, stime: 2019-12-02 12:00:00, state: 5}
  900. - {serverid: 10002,servername: 外网, ip: 120.55.48.172, port: [21001,21002],type: 2}
  901. - {serverid: 10003,servername: Tap服务器, ip: www.wtgame.cn, port: [21005,21006],type: 3}
  902. - {serverid: 10004,servername: 拥有测试功能的服务器, ip: www.wtgame.cn, port: [21011],type: 5}
  903. - {serverid: 1,servername: 陈海益服, ip: 192.168.10.213, port: [21001], stime: 2020-10-29 12:00:00}
  904. - {serverid: 2,servername: 内网服, ip: 192.168.10.213, port: [21001], stime: 2020-10-29 12:00:00}
  905. - {serverid: 3,servername: 王兆灿服, ip: 192.168.10.233, port: [21001], stime: 2020-10-29 12:00:00}
  906. - {serverid: 4,servername: 陈海益服状态测试, ip: 192.168.10.213, port: [21001,21003], stime: 2020-10-29 12:00:00, state: 4}
  907. - {serverid: 5,servername: 万里辉服, ip: 192.168.10.244, port: [21001], stime: 2020-10-29 12:00:00}
  908. - {serverid: 6,servername: 王亚兰服, ip: 192.168.10.137, port: [21001], stime: 2020-10-29 12:00:00}
  909. - {serverid: 7,servername: 黄瑾服, ip: 192.168.10.237, port: [21001], stime: 2020-10-29 12:00:00}
  910. - {serverid: 8,servername: 顾杰服, ip: 192.168.10.128, port: [21001], stime: 2020-10-29 12:00:00}
  911. - {serverid: 9,servername: 林江服, ip: 192.168.10.236, port: [21001], stime: 2020-10-29 12:00:00}
  912. - {serverid: 10,servername: 李嘉颖服, ip: 192.168.10.23, port: [21001], stime: 2020-10-29 12:00:00}
  913. - {serverid: 11,servername: 李慧勇服, ip: 192.168.10.235, port: [21001], stime: 2020-10-29 12:00:00}
  914. - {serverid: 12,servername: 徐晨服, ip: 192.168.10.125, port: [21001], stime: 2020-10-29 12:00:00}
  915. - {serverid: 13,servername: 陈一鸣服, ip: 192.168.10.168, port: [21001], stime: 2020-10-29 12:00:00}
  916. - {serverid: 14,servername: 刘亦周服, ip: 192.168.10.87, port: [21001], stime: 2020-10-29 12:00:00}
  917. - {serverid: 15,servername: 王子博服, ip: 192.168.10.222, port: [21001], stime: 2020-10-29 12:00:00}
  918. - {serverid: 16,servername: 张曦轶服, ip: 192.168.10.138, port: [21001], stime: 2020-10-29 12:00:00}
  919. - {serverid: 17,servername: 方世琪服, ip: 192.168.10.225, port: [21001], stime: 2020-10-29 12:00:00}
  920. - {serverid: 18,servername: 吴泽榕服, ip: 192.168.10.207, port: [21001], stime: 2020-10-29 12:00:00}
  921. - {serverid: 1000,servername: 内网服, ip: 192.168.10.213, port: [21001], stime: 2020-10-29 12:00:00}
  922. */