serverlist.go 30 KB

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