serverlist.go 31 KB

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