serverlist.go 33 KB

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