254 lines
No EOL
7.5 KiB
Lua
254 lines
No EOL
7.5 KiB
Lua
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 |