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