PGRData/Script/matrix/xmanager/XServerManager.lua

254 lines
No EOL
7.5 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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