serverlist.go 31 KB

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