PGRData/Script/matrix/xmanager/XServerManager.lua

254 lines
7.5 KiB
Lua
Raw Normal View History

local Platform = CS.UnityEngine.Application.platform
local RuntimePlatform = CS.UnityEngine.RuntimePlatform
XServerManager = XServerManager or {}
local Json = require("XCommon/Json")
local LoginTimeOutSecond = CS.XGame.Config:GetInt("LoginTimeOutInterval")
local SERVER_CONNECT_TIME_KEY = "SERVER_CONNECT_TIME_KEY"
local RECENT_TIME_PERIOD = 3600 * 24 * 7
local GetTime = os.time
XServerManager.SERVER_STATE = {
MAINTAIN = 0, -- 维护
LOW = 1, -- 畅通
HIGH = 2, -- 爆满
CHECK = 3, -- 检测中
FAIL = 4, -- 失败
}
local ServerList = {}
local SortedList = {}
local TempServerDic = {}
local LastServerCheckTime = {}
local LastServerConnectTime = {}
local AndroidPayCallList = {}
local IosPayCallList = {}
local PcPayCallList = {}
function XServerManager.SplitPayCallList(list, str)
if str == "" or str == nil then
return
end
local strs = string.Split(str, '#')
local i = 1
for _, value in ipairs(strs) do
list[i] = value
i = i + 1
end
end
XServerManager.Id = nil
XServerManager.ServerName = nil
function XServerManager.GetLoginUrl()
local server = ServerList[XServerManager.Id]
if not server then
return nil
end
if XMain.IsDebug then
server.LastTime = GetTime()
LastServerConnectTime[server.Name] = server.LastTime
XSaveTool.SaveData(SERVER_CONNECT_TIME_KEY, LastServerConnectTime)
end
return server.LoginUrl
end
function XServerManager.Init(cb)
XServerManager.Id = CS.UnityEngine.PlayerPrefs.GetInt(XPrefs.ServerId, 1)
ServerList = {}
local i = 1
local strs = string.Split(CS.XRemoteConfig.ServerListStr, "|")
for _, value in ipairs(strs) do
local item = string.Split(value, "#")
if #item >= 2 then
local server = {}
server.Id = i
server.Name = item[1]
server.LoginUrl = item[2]
ServerList[server.Id] = server
i = i + 1
end
end
if not ServerList or #ServerList <= 0 then
XLog.Error("Get ServerList error. content = " .. CS.XRemoteConfig.ServerListStr)
return
end
local androidCallbackListStr = CS.XRemoteConfig.AndroidPayCallbackList
local iosCallbackListStr = CS.XRemoteConfig.IosPayCallbackList
local pcCallbackListStr = CS.XRemoteConfig.PcPayCallbackList
XServerManager.SplitPayCallList(AndroidPayCallList, androidCallbackListStr)
XServerManager.SplitPayCallList(IosPayCallList, iosCallbackListStr)
XServerManager.SplitPayCallList(PcPayCallList, pcCallbackListStr)
if XServerManager.Id and ServerList[XServerManager.Id] then
XServerManager.Select(ServerList[XServerManager.Id])
else
XServerManager.Select(ServerList[1])
end
XServerManager.UpdateSortedServer()
if cb then
cb()
end
end
function XServerManager.UpdateSortedServer()
if XMain.IsDebug then
SortedList = {}
LastServerConnectTime = XSaveTool.GetData(SERVER_CONNECT_TIME_KEY) or {}
for _, v in pairs(ServerList) do
v.LastTime = LastServerConnectTime[v.Name] or 0
table.insert(SortedList, v)
end
end
end
function XServerManager.InsertTempServer(ip)
if not XMain.IsDebug then
return false, "该功能仅Debug模式下可使用"
end
local ipValid, ipStr = string.IsIp(ip)
if not ipValid then
return false, "请输入合法Ip地址"
end
if TempServerDic[ipStr] then
return false, "该临时服已存在"
end
local tempServer = {
Id = #ServerList + 1,
Name = "临时服: " .. ipStr,
LastTime = 0,
LoginUrl = string.format("http://%s:2333/api/Login/Login", ipStr),
IsTempServer = true,
}
table.insert(ServerList, tempServer)
TempServerDic[ipStr] = true
XServerManager.UpdateSortedServer()
CsXGameEventManager.Instance:Notify(XEventId.EVENT_SERVER_LIST_CHANGE)
return true
end
function XServerManager.Select(server)
if not server then
XLog.Error("Selected Server is nil.")
return
end
XServerManager.Id = server.Id
XServerManager.ServerName = server.Name
CS.UnityEngine.PlayerPrefs.SetInt(XPrefs.ServerId, server.Id)
if XUserManager.UserId then -- 海外修改
XSaveTool.SaveData(XPrefs.User_ServerId..XUserManager.UserId, tostring(server.Id))
end
if Platform == RuntimePlatform.Android then
if server.Id > #AndroidPayCallList then
XLog.Error("支付服务器地址数量与服务器数量不匹配")
return
end
XHgSdkManager.SetCallBackUrl(AndroidPayCallList[server.Id])
elseif Platform == RuntimePlatform.IPhonePlayer then
if server.Id > #IosPayCallList then
XLog.Error("支付服务器地址数量与服务器数量不匹配")
return
end
XHgSdkManager.SetCallBackUrl(IosPayCallList[server.Id])
elseif Platform == RuntimePlatform.WindowsPlayer then
if server.Id > #PcPayCallList then
XLog.Error("支付服务器地址数量与服务器数量不匹配")
end
XHgSdkManager.SetCallBackUrl(PcPayCallList[server.Id])
else
XLog.Debug("其他平台无需设置支付回调地址")
end
end
function XServerManager.CheckOpenSelect()
return ServerList and #ServerList > 1
end
function XServerManager.GetServerList(needSort)
if not XMain.IsDebug or not needSort then
return ServerList
end
table.sort(SortedList, function(a, b)
if a.IsTempServer ~= b.IsTempServer then
return a.IsTempServer
end
if GetTime() - a.LastTime < RECENT_TIME_PERIOD
or GetTime() - b.LastTime < RECENT_TIME_PERIOD then
return a.LastTime > b.LastTime
else
return a.Id < b.Id
end
end)
return SortedList
end
function XServerManager.GetCurServerName()
return XServerManager.ServerName
end
function XServerManager.TestConnectivity(server, gridCb)
if not server or not gridCb then return end
local id = server.Id
if LastServerCheckTime[id]
and LastServerCheckTime[id] + LoginTimeOutSecond > GetTime() then
gridCb()
return
end
ServerList[id].State = XServerManager.SERVER_STATE.CHECK
LastServerCheckTime[id] = GetTime()
gridCb()
local loginUrl = server.LoginUrl
if not XUserManager.IsNeedLogin() then
loginUrl = server.LoginUrl ..
"?loginType=" .. XUserManager.Channel ..
"&userId=" .. XUserManager.UserId ..
"&projectId=" .. CS.XHgSdkAgent.GetAppProjectId() ..
"&token=" .. (XUserManager.Token or "")
end
local request = CS.UnityEngine.Networking.UnityWebRequest.Get(loginUrl)
request.timeout = LoginTimeOutSecond
CS.XTool.WaitNativeCoroutine(request:SendWebRequest(), function()
LastServerCheckTime[id] = GetTime()
if request.isDone and not string.IsNilOrEmpty(request.error) then
ServerList[id].State = XServerManager.SERVER_STATE.FAIL
request:Dispose()
gridCb()
return
end
local result = Json.decode(request.downloadHandler.text)
if result.code == 1 -- 服务器暂未开放
or result.code == 8 -- 服务器未开放
or result.code == 9 -- 服务器已满员
or result.code == 10 then
-- 服务器内部错误
ServerList[id].State = XServerManager.SERVER_STATE.MAINTAIN
gridCb()
return
end
ServerList[id].State = XServerManager.SERVER_STATE.LOW
gridCb()
end)
end