------------------------------------------------ -- 作者: gzg -- 日期: 2021-02-25 -- 文件: ServerDataInfo.lua -- 模块: ServerDataInfo -- 描述: 服务器数据的信息 ------------------------------------------------ local L_INT_MAX = 2147483648 local ServerDataInfo = { --服务器ID ServerId = 0, --真实服务器ID,如果有合服,表示当前服务器登录真实服务器ID. ReallyServerId = 0, --展示的服务器ID, ShowServerId = 0, --服务名字 Name = "", --分组类型 GroupType = 0, --支付回调 PayCallURL = "", --服务器的顺序号 ,用于排序 ShowOrder = 0, --服务器的IP地址 Ip = "", --服务器端口 Port = 0, --当前服务器的标签 Labels = List:New(), --当前服务器状态 Status = 0, --当前服务器的玩家数量 PlayerNum = L_INT_MAX, --当前服务器总角色的列表 CharacterList = List:New(), --当前服务器中是否有玩家的角色 HasRole = false, --是否位登录服务器 IsLoginServer = false, --隐藏 IsHideServer = false, --维护状态 IsMaintainServer = false, --是否新服 IsNewServer = false, --当前服务器是否爆满 IsFullServer = false, --是否推荐服 IsRecommendServer = false, } function ServerDataInfo:New() local _m = Utils.DeepCopy(self); return _m; end --解析游戏服务器的json --{"data":{"servers":[{"group_type":1,"svr_host":"127.0.0.1","svr_id":"20017","svr_idx":"20017","svr_label":"3","svr_name":"本地服务器","svr_pay_callback":"xxx","svr_port":8587,"svr_sort":3,"svr_status":1}]},"state":1} function ServerDataInfo:ParseGameServerListJson(jsonStr) Debug.Log("服务器列表字符串:" .. jsonStr); local _result = List:New(); local _jsonTable = Json.decode(jsonStr); if _jsonTable and _jsonTable.data then local _serArray = _jsonTable.data.servers; if _serArray and #_serArray > 0 then for _, value in ipairs(_serArray) do if value then _result:Add(ServerDataInfo:New():ParseGameServerNode(value)) end end else Debug.LogError("游戏服务器为空!" .. tostring(jsonStr)); end else Debug.LogError("获取的游戏服务器Json串没有数据:" .. tostring(jsonStr)); end --根据ShowOder进行排序 -- 从小往大排序 _result:Sort(function(a,b) return a.ShowOrder < b.ShowOrder end ); return _result; end --解析服务器列表的Json字符串 --{"data":{"lg_server":[{"svr_host":"10.0.0.59","svr_name":"内网登陆服","svr_port":8888}],"servers":[{"svr_sort":0,"svr_host":"10.0.0.60","svr_name":"客户端测试服","svr_id":20016,"group_type":1,"svr_label":"0","svr_status":1,"svr_port":8586}]}} function ServerDataInfo:ParseServersJsonNew(jsonStr) Debug.Log("服务器列表字符串:" .. jsonStr); local _serverList; local _lgServer; local _jsonTable = Json.decode(jsonStr); if _jsonTable and _jsonTable.data then _serverList = ServerDataInfo:ParseGameServerListNode(_jsonTable.data.servers); _lgServer = ServerDataInfo:New():ParseAgentServerListNode(_jsonTable.data.lg_server) else Debug.LogError("获取的游戏服务器Json串没有数据:" .. tostring(jsonStr)); end return _serverList,_lgServer; end --解析网关服务器的列表节点 --"lg_server":[{"svr_host":"10.0.0.59","svr_name":"内网登陆服","svr_port":8888},{"svr_host":"10.0.0.66","svr_name":"内网登陆服2","svr_port":8888}] function ServerDataInfo:ParseAgentServerListNode(servers) local _result = List:New(); local _serArray = servers; if _serArray and next(_serArray) then if type(_serArray[1]) == "table" then for _, value in ipairs(_serArray) do if value then _result:Add(ServerDataInfo:New():ParseAgentServerNode(value)) end end else _result:Add(ServerDataInfo:New():ParseAgentServerNode(_serArray)) end else Debug.LogError("网关服务器列表为空!"); end return _result; end --解析网关服务器的节点 --"lg_server":{"svr_host":"10.0.0.59","svr_name":"内网登陆服","svr_port":8888} function ServerDataInfo:ParseAgentServerNode(node) if node then --初始化一些变量 self.IsLoginServer = true; self.ServerId = 0; self.GroupType = 0; self.PlayerNum = 0; self.ShowOrder = 0; self.Status = 0; self.Labels = List:New(); self.ReallyServerId = 0; self.ShowServerId = 0; self.IsHideServer = false; self.IsMaintainServer = false; self.IsNewServer = false; self.IsFullServer = false; self.IsRecommendServer = false; --开始从节点中填充数据 self.Name = node.svr_name; math.randomseed(os.time()); if type(node.svr_host) == "table" then self.Ip = node.svr_host[math.random(1,_arr:Count())]; else self.Ip = node.svr_host; end if type(node.svr_port) == "table" then self.Port = tonumber(node.svr_port[math.random(1,_arr:Count())]); else self.Port = tonumber(node.svr_port); end else Debug.LogError("登录服务器为空!"); end return self; end --解析游戏服务器的数组列表 --"servers":[{"group_type":1,"svr_host":"127.0.0.1","svr_id":"20017","svr_idx":"20017","svr_label":"3","svr_name":"本地服务器","svr_pay_callback":"xxx","svr_port":8587,"svr_sort":3,"svr_status":1}]} function ServerDataInfo:ParseGameServerListNode(servers) local _result = List:New(); local _serArray = servers; if _serArray and next(_serArray) then if type(_serArray[1]) == "table" then for _, value in ipairs(_serArray) do if value then _result:Add(ServerDataInfo:New():ParseGameServerNode(value)) end end else _result:Add(ServerDataInfo:New():ParseGameServerNode(_serArray)) end else Debug.LogError("游戏服务器为空!"); end --根据ShowOder进行排序 -- 从小往大排序 _result:Sort(function(a,b) return a.ShowOrder < b.ShowOrder end ); return _result; end --解析一个游戏服务器节点 --{"group_type":1,"svr_host":"127.0.0.1","svr_id":"20017","svr_idx":"20017","svr_label":"3","svr_name":"本地服务器","svr_pay_callback":"xxx","svr_port":8587,"svr_sort":3,"svr_status":1} function ServerDataInfo:ParseGameServerNode(node) self.ServerId = tonumber(node.svr_id); self.GroupType = tonumber(node.group_type); self.ShowOrder = tonumber(node.svr_sort); self.Name = UIUtils.StripLanSymbol(node.svr_name,FLanguage.Default); self.PayCallURL = node.svr_pay_callback; self.PlayerNum = tonumber(node.register_num); self.Status = tonumber(node.svr_status); if node.svr_label then self.Labels = Utils.SplitNumber(node.svr_label,","); else self.Labels = List:New(); end self.Ip = node.svr_host; self.Port = tonumber(node.svr_port); self.ReallyServerId = self.ServerId; self.ShowServerId = self.ShowOrder; self.IsLoginServer = false; self.IsHideServer = (self.Status == 0); self.IsMaintainServer = (self.Status == 2); self.IsNewServer = (self.Labels:IndexOf(3) > 0); self.IsFullServer = (self.Labels:IndexOf(1) > 0); self.IsRecommendServer = (self.Labels:IndexOf(2) > 0); return self; end --[[ -解析x8的服务器列表--被抛弃了--2021-08-06. --解析登录服务器 --{data:{extParams:{svr_private_chids:73|74,svr_port:8888,svr_host:10.0.0.59|212.64.100.197,svr_name:网关服务器}},state:1} function ServerDataInfo:ParserLoginServerListJson(jsonStr,chnId) Debug.Log("登录服务器字符串:" .. jsonStr .. ";通道:" .. tostring(chnId)); local _jsonTable = Json.decode(jsonStr); if _jsonTable and _jsonTable.data then local _extParams = _jsonTable.data.extParams; if _extParams then return ServerDataInfo:New():ParseLoginServerNode(_extParams,chnId); else Debug.LogError("登录服务器为空!" .. tostring(jsonStr)); end else Debug.LogError("获取的登录服务器Json串没有数据:" .. tostring(jsonStr)); end return nil; end --解析一个登陆服服务器的节点 --{svr_private_chids:73|74,svr_port:8888,svr_host:10.0.0.59|212.64.100.197,svr_name:网关服务器} function ServerDataInfo:ParseLoginServerNode(node,chnId) --初始化一些变量 self.IsLoginServer = true; self.ServerId = 0; self.GroupType = 0; self.ShowOrder = 0; self.Status = 0; self.Labels = List:New(); self.ReallyServerId = 0; self.ShowServerId = 0; self.IsHideServer = false; self.IsMaintainServer = false; self.IsNewServer = false; self.IsFullServer = false; self.IsRecommendServer = false; --开始从节点中填充数据 self.Name = node.svr_name; self.Port = tonumber(node.svr_port); --ip地址列表 local _ips = Utils.SplitStr(node.svr_host,'|'); --私有渠道列表 local _chns = Utils.SplitStr(node.svr_private_chids,'|'); --在私有渠道列表中 local _findIdx = nil; if chnId then _findIdx = _chns:IndexOf(chnId); else _findIdx = 1; end if _findIdx == nil or _findIdx <= 0 or _findIdx > _ips:Count() then _findIdx = _ips:Count(); end self.Ip = _ips[_findIdx]; return self; end ]] return ServerDataInfo;