serverlist.go 31 KB

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