MiddleManager.lua 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. local InnerMsg = require("core.InnerMsg")
  2. local Util = require("common.Util")
  3. -- 负责管理logic到middle的连接
  4. FD_2_SVRINDEX = FD_2_SVRINDEX or {}
  5. SVRINDEX_2_FD = SVRINDEX_2_FD or {}
  6. FD_2_SVRINDEX_MERGE = FD_2_SVRINDEX_MERGE or {} -- 合服之后一个物理服的serverindex其实可能有多个服
  7. SVRINDEX_2_FD_MERGE = SVRINDEX_2_FD_MERGE or {}
  8. SVRINDEX_2_OPENDAY = SVRINDEX_2_OPENDAY or {} -- 服务器对应开服天数
  9. -- 根据svrIndex找对应的fd
  10. function getFDBySvrIndex(svrIndex)
  11. local fd = SVRINDEX_2_FD[svrIndex]
  12. if fd then
  13. return fd
  14. end
  15. return SVRINDEX_2_FD_MERGE[svrIndex]
  16. end
  17. -- 根据初始svrIndex找当前svrIndex
  18. function getLastSvrIndex(srcSvrIndex)
  19. local fd = getFDBySvrIndex(srcSvrIndex)
  20. if not fd then
  21. return
  22. end
  23. return FD_2_SVRINDEX[fd]
  24. end
  25. -- 找一个随机连上了跨服的svrIndex
  26. function getRandomSvrIndex(exceptFD)
  27. local cnt = Util.getTableCount(FD_2_SVRINDEX)
  28. if cnt == 0 then
  29. return
  30. end
  31. if cnt == 1 then
  32. for k, v in pairs(FD_2_SVRINDEX) do
  33. if k ~= exceptFD then
  34. return v
  35. end
  36. end
  37. return
  38. end
  39. local tempRet = nil
  40. local randomIndex = math.random(1, cnt)
  41. for k, v in pairs(FD_2_SVRINDEX) do
  42. if k ~= exceptFD then
  43. tempRet = v
  44. end
  45. randomIndex = randomIndex - 1
  46. if randomIndex <= 0 then
  47. return tempRet
  48. end
  49. end
  50. end
  51. function addLogicServer(fd, svrIndex)
  52. if fd == nil or svrIndex == nil then
  53. assert(nil)
  54. end
  55. local oldSvrIndex = FD_2_SVRINDEX[fd]
  56. local oldFd = SVRINDEX_2_FD[svrIndex]
  57. if oldSvrIndex == svrIndex then return end
  58. FD_2_SVRINDEX[fd] = svrIndex
  59. SVRINDEX_2_FD[svrIndex] = fd
  60. if oldSvrIndex and svrIndex ~= oldSvrIndex then
  61. SVRINDEX_2_FD[oldSvrIndex] = nil
  62. SVRINDEX_2_OPENDAY[oldSvrIndex] = nil
  63. end
  64. if oldFd and fd ~= oldFd then
  65. FD_2_SVRINDEX[oldFd] = nil
  66. end
  67. print("addLogicServer", fd, svrIndex)
  68. end
  69. function setServerOpenDay(fd,svrIndex,openTime)
  70. if fd == nil or svrIndex == nil or openTime == nil then
  71. assert(nil)
  72. end
  73. SVRINDEX_2_OPENDAY[svrIndex] = openTime
  74. print("setServerOpenDay",svrIndex,openTime)
  75. end
  76. function delLogicServer(fd)
  77. if fd == nil then
  78. assert(nil)
  79. end
  80. local svrIndex = FD_2_SVRINDEX[fd]
  81. FD_2_SVRINDEX[fd] = nil
  82. if svrIndex then
  83. SVRINDEX_2_FD[svrIndex] = nil
  84. end
  85. local svrMerge = FD_2_SVRINDEX_MERGE[fd]
  86. FD_2_SVRINDEX_MERGE[fd] = nil
  87. if svrMerge then
  88. for i = 1, #svrMerge do
  89. local tempSvrIndex = svrMerge[i]
  90. SVRINDEX_2_FD_MERGE[tempSvrIndex] = nil
  91. end
  92. end
  93. print("delLogicServer", fd, svrIndex)
  94. end
  95. function onHeartbeat(fd, svrIndexData)
  96. if #svrIndexData == 0 then
  97. return
  98. end
  99. FD_2_SVRINDEX_MERGE[fd] = FD_2_SVRINDEX_MERGE[fd] or {}
  100. for i = 1, #svrIndexData do
  101. local tempSvrIndex = svrIndexData[i]
  102. FD_2_SVRINDEX_MERGE[fd][i] = tempSvrIndex
  103. SVRINDEX_2_FD_MERGE[tempSvrIndex] = fd
  104. end
  105. end
  106. --
  107. function cleanData(fd)
  108. local svrIndex = FD_2_SVRINDEX[fd]
  109. if svrIndex == nil then return end
  110. -- 根据svrIndex 清除各个模块的数据 注意兼容不报错
  111. end
  112. function getOpenDaySvrCnt(openDay,actDay)
  113. for k,v in pairs(SVRINDEX_2_OPENDAY) do
  114. if v == 0 then
  115. return 0
  116. end
  117. local startTime = Util.getDayStartTime(v)
  118. local now = os.time()
  119. local openTime = math.ceil((now - startTime + 1) / 24 / 3600)
  120. local actOpenDay = openTime - actDay
  121. if actOpenDay < openDay and actOpenDay >= 0 then
  122. return 0
  123. end
  124. end
  125. return 1
  126. end
  127. function LW_ABS_ACT_IS_OPEN(fd,msg)
  128. local isOpen = getOpenDaySvrCnt(msg.openDay,msg.actDay)
  129. local msgRet = InnerMsg.wl.WL_ABS_ACT_IS_OPEN
  130. msgRet.funcID = msg.funcID
  131. msgRet.isOpen = isOpen
  132. InnerMsg.sendMsg(fd, msgRet)
  133. end