Files
tianrunCRM/Assets/trCRM/upgradeRes4Dev/priority/lua/toolkit/CLLVerManager.lua
2020-07-04 14:41:25 +08:00

520 lines
17 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.

-- 资源更新器
--//TODO:1可能考虑把共公部分路径抽取出来以减少配置文件的容量2语言文件考虑增量更新的方式避免改一点点更新整个文件语言文件还是挺大的
-- 服务器
local csSelf = CLVerManager.self
local baseUrl = CLVerManager.self.baseUrl --"http://gamesres.ultralisk.cn/cdn/test";
local platform = ""
local newestVerPath = "newestVers"
local resVer = "resVer"
local versPath = "VerCtl"
local fverVer = "VerCtl.ver" --本地所有版本的版本信息
---@type System.Collections.Hashtable
local localverVer = Hashtable()
---@type System.Collections.Hashtable
local serververVer = Hashtable()
--========================
local verPriority = "priority.ver"
---@type System.Collections.Hashtable
local localPriorityVer = Hashtable() --本地优先更新资源
---@type System.Collections.Hashtable
local serverPriorityVer = Hashtable() --服务器优先更新资源
local verOthers = "other.ver"
---@type System.Collections.Hashtable
local otherResVerOld = Hashtable() --所有资源的版本管理
---@type System.Collections.Hashtable
local otherResVerNew = Hashtable() --所有资源的版本管理
local tmpUpgradePirorityPath = "tmpUpgrade4Pirority"
local haveUpgrade = false
local is2GNetUpgrade = CLVerManager.self.is2GNetUpgrade
local is3GNetUpgrade = CLVerManager.self.is3GNetUpgrade
local is4GNetUpgrade = CLVerManager.self.is4GNetUpgrade
local onFinishInit = nil
local progressCallback = nil
local mVerverPath = ""
local mVerPrioriPath = ""
local mVerOtherPath = ""
---@type System.Collections.Hashtable
local needUpgradeVerver = Hashtable()
local progress = 0
local isNeedUpgradePriority = false
local needUpgradePrioritis = Queue()
local isSucessUpgraded = false
local verVerMD5 = ""
CLLVerManager = {}
-- 更新初始化
--[[
iprogressCallback: 进度回调,回调有两个参数
ifinishCallback: 完成回调
isdoUpgrade: 是否做更新处理
--]]
function CLLVerManager.init(iprogressCallback, ifinishCallback, isdoUpgrade, _verVerMD5)
haveUpgrade = false
verVerMD5 = _verVerMD5
CLVerManager.self.haveUpgrade = false
isNeedUpgradePriority = false
localverVer:Clear()
serververVer:Clear()
localPriorityVer:Clear()
serverPriorityVer:Clear()
otherResVerOld:Clear()
otherResVerNew:Clear()
platform = CLPathCfg.self.platform
CLVerManager.self.platform = platform
mVerverPath = PStr.begin():a(CLPathCfg.self.basePath):a("/"):a(resVer):a("/"):a(platform):a("/"):a(fverVer):e()
mVerPrioriPath =
PStr.begin():a(CLPathCfg.self.basePath):a("/"):a(resVer):a("/"):a(platform):a("/"):a(versPath):a("/"):a(
verPriority
):e()
mVerOtherPath =
PStr.begin():a(CLPathCfg.self.basePath):a("/"):a(resVer):a("/"):a(platform):a("/"):a(versPath):a("/"):a(
verOthers
):e()
CLVerManager.self.mVerverPath = mVerverPath
CLVerManager.self.mVerPrioriPath = mVerPrioriPath
CLVerManager.self.mVerOtherPath = mVerOtherPath
progressCallback = iprogressCallback
onFinishInit = ifinishCallback
if (not isdoUpgrade) then
CLLVerManager.loadPriorityVer()
-- 后面会调用onFinish的回调
CLLVerManager.loadOtherResVer(true)
return
end
--[[*
/// None 无网络
/// WiFi
/// 2G
/// 3G
/// 4G
/// Unknown
*/
--]]
local netState = Utl.getNetState()
local netActived = true
if (netState == "None") then
netActived = false
elseif (netState == "2G") then
if (not is2GNetUpgrade) then
netActived = false
end
elseif (netState == "3G") then
if (not is3GNetUpgrade) then
netActived = false
end
elseif (netState == "4G") then
if (not is4GNetUpgrade) then
netActived = false
end
elseif (netState == "WiFi") then
netActived = true
elseif (netState == "Unknown") then
netActived = true
end
local canDoUpgrade = false
if (platform == "Android") then
if (not CLCfgBase.self.isEditMode and netActived) then
canDoUpgrade = true
end
else
if (not CLCfgBase.self.isEditMode and Utl.netIsActived()) then
canDoUpgrade = true
end
end
if (canDoUpgrade) then
canDoUpgrade = CLLVerManager.checkChannel()
if (canDoUpgrade) then
CLLVerManager.netWorkActived()
else
CLLVerManager.loadPriorityVer()
-- 后面会调用onFinish的回调
CLLVerManager.loadOtherResVer(true)
end
else
-- 说明是编辑器环境
Utl.doCallback(onFinishInit, true)
end
end
-- 验证渠道是否需要更新
function CLLVerManager.checkChannel()
local defaultReuslt = false
-- 先判断是否已经取得取渠道
local fpath = "channels.json"
-- 得渠道控制醘数据
local content = FileEx.readNewAllText(fpath)
local channels = nil
if (content ~= nil) then
channels = JSON.DecodeMap(content)
else
return defaultReuslt
end
-- 取得当前版本的渠道数据
fpath = "chnCfg.json" -- 该文在打包时会自动放在streamingAssetsPath目录下详细参见打包工具
content = FileEx.readNewAllText(fpath)
local chnCfg = nil
if (content ~= nil) then
chnCfg = JSON.DecodeMap(content)
else
return defaultReuslt
end
-- 取得当前包的渠道在渠道配置文件中是否有配置可更新
if (MapEx.getBool(channels, MapEx.getString(chnCfg, "SubChannel"))) then
return true
else
return false
end
return defaultReuslt
end
-- 验证网络是否可用
function CLLVerManager.netWorkActived()
local onCheckNetSateSuc = function(...)
CLVerManager.self:StartCoroutine(FileEx.readNewAllBytesAsyn(mVerverPath, CLLVerManager.onGetlcalVerverMap))
end
local onCheckNetSateFail = function(...)
printw("Cannot connect Server or Net !!!")
CLLVerManager.loadPriorityVer()
-- 后面会调用onFinish的回调
CLLVerManager.loadOtherResVer(false)
end
local url = Utl.urlAddTimes(PStr.b():a(baseUrl):a("/netState.txt"):e())
WWWEx.get(url, CLAssetType.text, onCheckNetSateSuc, onCheckNetSateFail, nil, true, 2)
end
--[[
/// <summary>
/// Ons the get verver map.取得本地版本文件的版本信息
/// </summary>
/// <param name='buff'>
/// Buff.
/// </param>
--]]
function CLLVerManager.onGetlcalVerverMap(buff)
if (buff ~= nil) then
localverVer = CLVerManager.self:toMap(buff)
else
localverVer = Hashtable()
end
CLLVerManager.getServerVerverMap()
end
--[[
/// <summary>
/// Gets the server verver map.取得服务器版本文件的版本信息
/// </summary>
--]]
function CLLVerManager.getServerVerverMap(...)
local url = ""
if CLCfgBase.self.hotUpgrade4EachServer then
-- 说明是每个服务器单独处理更新控制
url = PStr.begin():a(baseUrl):a("/"):a(mVerverPath):a("."):a(verVerMD5):e()
else
url = PStr.begin():a(baseUrl):a("/"):a(mVerverPath):e()
end
WWWEx.get(
Utl.urlAddTimes(url),
CLAssetType.bytes,
CLLVerManager.onGetServerVerverBuff,
CLLVerManager.onGetServerVerverBuff,
nil,
true,
2
)
end
function CLLVerManager.onGetServerVerverBuff(content, orgs)
if (content ~= nil) then
serververVer = CLVerManager.self:toMap(content)
else
serververVer = Hashtable()
end
--判断哪些版本控制信息需要更新
CLLVerManager.checkVervers()
end
function CLLVerManager.checkVervers()
progress = 0
needUpgradeVerver:Clear()
isNeedUpgradePriority = false
local ver = nil
local keysList = MapEx.keys2List(serververVer)
local count = keysList.Count
local key = ""
for i = 0, count - 1 do
key = keysList[i]
ver = MapEx.getString(localverVer, key)
if (ver == nil or ver ~= MapEx.getString(serververVer, key)) then
MapEx.set(needUpgradeVerver, key, false)
end
end
keysList:Clear()
keysList = nil
if (needUpgradeVerver.Count > 0) then
if (progressCallback ~= nil) then
progressCallback(needUpgradeVerver.Count, 0)
end
keysList = MapEx.keys2List(needUpgradeVerver)
count = keysList.Count
key = ""
for i = 0, count - 1 do
key = keysList[i]
CLLVerManager.getVerinfor(key, MapEx.getString(serververVer, key))
end
keysList:Clear()
keysList = nil
else
CLLVerManager.loadPriorityVer()
CLLVerManager.loadOtherResVer(true)
end
end
-- 取得版本文件
function CLLVerManager.getVerinfor(fPath, verVal)
local url = PStr.b():a(baseUrl):a("/"):a(fPath):a("."):a(verVal):e() -- 注意是加了版本号的可以使用cdn
WWWEx.get(url, CLAssetType.bytes, CLLVerManager.onGetVerinfor, CLLVerManager.onGetVerinfor, fPath, true, 2)
end
function CLLVerManager.onGetVerinfor(content, orgs)
if (content ~= nil) then
local fPath = orgs
progress = progress + 1
MapEx.set(localverVer, fPath, MapEx.getString(serververVer, fPath))
local fName = PStr.b():a(CLPathCfg.persistentDataPath):a("/"):a(newestVerPath):a("/"):a(fPath):e()
if (Path.GetFileName(fName) == "priority.ver") then
-- 优先更新需要把所有资源更新完后才记录
isNeedUpgradePriority = true
serverPriorityVer = CLVerManager.self:toMap(content)
else
FileEx.CreateDirectory(Path.GetDirectoryName(fName))
File.WriteAllBytes(fName, content)
end
MapEx.set(needUpgradeVerver, fPath, true)
if (progressCallback ~= nil) then
progressCallback(needUpgradeVerver.Count, progress)
end
-- if (isFinishAllGet ()) then
if (needUpgradeVerver.Count == progress) then
if (not isNeedUpgradePriority) then
-- 说明没有优先资源需要更新,可以不做其它处理了
--同步到本地
local ms = MemoryStream()
B2OutputStream.writeMap(ms, localverVer)
local vpath = PStr.b():a(CLPathCfg.persistentDataPath):a("/"):a(mVerverPath):e()
FileEx.CreateDirectory(Path.GetDirectoryName(vpath))
File.WriteAllBytes(vpath, ms:ToArray())
CLLVerManager.loadPriorityVer()
CLLVerManager.loadOtherResVer(true)
else
CLLVerManager.checkPriority() --处理优先资源更新
end
end
else
CLLVerManager.initFailed()
end
end
function CLLVerManager.checkPriority()
--取得本地优先更新资源版本信息
CLVerManager.self:StartCoroutine(FileEx.readNewAllBytesAsyn(mVerPrioriPath, CLLVerManager.onGetNewPriorityMap))
end
function CLLVerManager.onGetNewPriorityMap(buff)
if (buff ~= nil) then
localPriorityVer = CLVerManager.self:toMap(buff)
else
localPriorityVer = Hashtable()
end
CLVerManager.self.localPriorityVer = localPriorityVer -- 同步到c#
progress = 0
needUpgradeVerver:Clear()
needUpgradePrioritis:Clear()
local ver = nil
local keysList = MapEx.keys2List(serverPriorityVer)
local key = nil
local count = keysList.Count
for i = 0, count - 1 do
key = keysList[i]
ver = MapEx.getString(localPriorityVer, key)
if (ver == nil or ver ~= MapEx.getString(serverPriorityVer, key)) then
MapEx.set(needUpgradeVerver, key, false)
needUpgradePrioritis:Enqueue(key)
end
end
keysList:Clear()
keysList = nil
if (needUpgradePrioritis.Count > 0) then
haveUpgrade = true
CLVerManager.self.haveUpgrade = true
if (progressCallback ~= nil) then
progressCallback(needUpgradeVerver.Count, 0)
end
CLLVerManager.getPriorityFiles(needUpgradePrioritis:Dequeue())
else
--同步总的版本管理文件到本地
local ms = MemoryStream()
B2OutputStream.writeMap(ms, localverVer)
local vpath = PStr.b():a(CLPathCfg.persistentDataPath):a("/"):a(mVerverPath):e()
FileEx.CreateDirectory(Path.GetDirectoryName(vpath))
File.WriteAllBytes(vpath, ms:ToArray())
CLLVerManager.loadOtherResVer(true)
end
end
-- 取得优先更新的资源
function CLLVerManager.getPriorityFiles(fPath)
local Url = ""
local verVal = MapEx.getString(serverPriorityVer, fPath)
Url = PStr.begin():a(baseUrl):a("/"):a(fPath):a("."):a(verVal):e() -- 把版本号拼在后面
-- print("Url==" .. Url);
WWWEx.get(Url, CLAssetType.bytes, CLLVerManager.onGetPriorityFiles, CLLVerManager.initFailed, fPath, true, 2)
if (progressCallback ~= nil) then
progressCallback(needUpgradeVerver.Count, progress, WWWEx.getWwwByUrl(Url))
end
end
function CLLVerManager.onGetPriorityFiles(content, orgs)
if (content == nil) then
CLLVerManager.initFailed()
return
end
local fPath = orgs
progress = progress + 1
-- 先把文件放在tmp目录等全部下载好后再移到正式目录
local fName = PStr.b():a(CLPathCfg.persistentDataPath):a("/"):a(tmpUpgradePirorityPath):a("/"):a(fPath):e()
FileEx.CreateDirectory(Path.GetDirectoryName(fName))
File.WriteAllBytes(fName, content)
--同步到本地
MapEx.set(localPriorityVer, fPath, MapEx.getString(serverPriorityVer, fPath))
MapEx.set(needUpgradeVerver, fPath, true)
CLVerManager.self.localPriorityVer = localPriorityVer
if (progressCallback ~= nil) then
progressCallback(needUpgradeVerver.Count, progress)
end
if (needUpgradePrioritis.Count > 0) then
CLLVerManager.getPriorityFiles(needUpgradePrioritis:Dequeue())
else
--已经把所有资源取得完成
-- 先把文件放在tmp目录等全部下载好后再移到正式目录
local keysList = MapEx.keys2List(needUpgradeVerver)
local count = keysList.Count
local key = nil
local fromFile = ""
local toFile = ""
for i = 0, count - 1 do
key = keysList[i]
fromFile = PStr.b():a(CLPathCfg.persistentDataPath):a("/"):a(tmpUpgradePirorityPath):a("/"):a(key):e()
toFile = PStr.begin():a(CLPathCfg.persistentDataPath):a("/"):a(key):e()
FileEx.CreateDirectory(Path.GetDirectoryName(toFile))
File.Copy(fromFile, toFile, true)
end
Directory.Delete(PStr.b():a(CLPathCfg.persistentDataPath):a("/"):a(tmpUpgradePirorityPath):e(), true)
keysList:Clear()
keysList = nil
--同步优先资源更新的版本管理文件到本地
local ms = MemoryStream()
B2OutputStream.writeMap(ms, localPriorityVer)
local vpath = PStr.b():a(CLPathCfg.persistentDataPath):a("/"):a(mVerPrioriPath):e()
FileEx.CreateDirectory(Path.GetDirectoryName(vpath))
File.WriteAllBytes(vpath, ms:ToArray())
--同步总的版本管理文件到本地
ms = MemoryStream()
B2OutputStream.writeMap(ms, localverVer)
vpath = PStr.b():a(CLPathCfg.persistentDataPath):a("/"):a(mVerverPath):e()
FileEx.CreateDirectory(Path.GetDirectoryName(vpath))
File.WriteAllBytes(vpath, ms:ToArray())
CLLVerManager.loadOtherResVer(true)
end
end
function CLLVerManager.loadPriorityVer()
CLVerManager.self:StartCoroutine(FileEx.readNewAllBytesAsyn(mVerPrioriPath, CLLVerManager.onGetVerPriority))
end
function CLLVerManager.onGetVerPriority(buff)
if (buff ~= nil) then
localPriorityVer = CLVerManager.self:toMap(buff)
else
localPriorityVer = Hashtable()
end
CLVerManager.self.localPriorityVer = localPriorityVer
end
function CLLVerManager.loadOtherResVer(sucessProcUpgrade)
isSucessUpgraded = sucessProcUpgrade
CLVerManager.self:StartCoroutine(FileEx.readNewAllBytesAsyn(mVerOtherPath, CLLVerManager.onGetVerOther))
end
function CLLVerManager.onGetVerOther(buff)
if (buff ~= nil) then
otherResVerOld = CLVerManager.self:toMap(buff)
else
otherResVerOld = Hashtable()
end
CLVerManager.self.otherResVerOld = otherResVerOld
local path = PStr.b():a(newestVerPath):a("/"):a(mVerOtherPath):e()
CLVerManager.self:StartCoroutine(FileEx.readNewAllBytesAsyn(path, CLLVerManager.onGetNewVerOthers))
end
function CLLVerManager.onGetNewVerOthers(buff)
if (buff ~= nil) then
otherResVerNew = CLVerManager.self:toMap(buff)
else
otherResVerNew = Hashtable()
end
CLVerManager.self.otherResVerNew = otherResVerNew
progressCallback = nil
Utl.doCallback(onFinishInit, isSucessUpgraded)
end
function CLLVerManager.initFailed(...)
if (progressCallback ~= nil) then
progressCallback(needUpgradeVerver.Count, progress, nil)
end
CLLVerManager.loadPriorityVer()
CLLVerManager.loadOtherResVer(false)
printw("initFailed")
end
function CLLVerManager.isHaveUpgrade(...)
return haveUpgrade
end
return CLLVerManager