from retail
This commit is contained in:
@@ -5,6 +5,9 @@ local WeakAuras = WeakAuras
|
||||
local L = WeakAuras.L
|
||||
local prettyPrint = WeakAuras.prettyPrint
|
||||
|
||||
local LibSerialize = LibStub("LibSerialize")
|
||||
local LibDeflate = LibStub:GetLibrary("LibDeflate")
|
||||
|
||||
local UnitAura = UnitAura
|
||||
-- Unit Aura functions that return info about the first Aura matching the spellName or spellID given on the unit.
|
||||
local WA_GetUnitAura = function(unit, spell, filter)
|
||||
@@ -154,6 +157,7 @@ local blockedTables = {
|
||||
SendMailMoneyGold = true,
|
||||
MailFrameTab2 = true,
|
||||
ChatFrame1 = true,
|
||||
--WeakAurasSaved = true,
|
||||
WeakAurasOptions = true,
|
||||
WeakAurasOptionsSaved = true
|
||||
}
|
||||
@@ -163,6 +167,7 @@ local aura_environments = {}
|
||||
-- 1 == config initialized
|
||||
-- 2 == fully initialized
|
||||
local environment_initialized = {}
|
||||
local getDataCallCounts = {}
|
||||
|
||||
function Private.IsEnvironmentInitialized(id)
|
||||
return environment_initialized[id] == 2
|
||||
@@ -171,11 +176,13 @@ end
|
||||
function Private.DeleteAuraEnvironment(id)
|
||||
aura_environments[id] = nil
|
||||
environment_initialized[id] = nil
|
||||
getDataCallCounts[id] = nil
|
||||
end
|
||||
|
||||
function Private.RenameAuraEnvironment(oldid, newid)
|
||||
aura_environments[oldid], aura_environments[newid] = nil, aura_environments[oldid]
|
||||
environment_initialized[oldid], environment_initialized[newid] = nil, environment_initialized[oldid]
|
||||
getDataCallCounts[oldid], getDataCallCounts[newid] = nil, getDataCallCounts[oldid]
|
||||
end
|
||||
|
||||
local current_uid = nil
|
||||
@@ -183,8 +190,71 @@ local current_aura_env = nil
|
||||
-- Stack of of aura environments/uids, allows use of recursive aura activations through calls to WeakAuras.ScanEvents().
|
||||
local aura_env_stack = {}
|
||||
|
||||
local function UpdateSavedDataWarning(uid, size)
|
||||
local savedDataWarning = 16 * 1024 * 1024 -- 16 KB, but it's only a warning
|
||||
if size > savedDataWarning then
|
||||
Private.AuraWarnings.UpdateWarning(uid, "CustomSavedData", "warning",
|
||||
L["This aura is saving %s KB of data"]:format(ceil(size / 1024)))
|
||||
else
|
||||
Private.AuraWarnings.UpdateWarning(uid, "CustomSavedData")
|
||||
end
|
||||
end
|
||||
|
||||
function Private.SaveAuraEnvironment(id)
|
||||
local data = WeakAuras.GetData(id)
|
||||
if not data then
|
||||
return
|
||||
end
|
||||
|
||||
local input = aura_environments[id] and aura_environments[id].saved
|
||||
if input then
|
||||
local serialized = LibSerialize:SerializeEx({errorOnUnserializableType = false}, input)
|
||||
-- We use minimal compression, since that already achieves a reasonable compression ratio,
|
||||
-- but takes significant less time
|
||||
local compressed = LibDeflate:CompressDeflate(serialized, {level = 1})
|
||||
local encoded = LibDeflate:EncodeForPrint(compressed)
|
||||
UpdateSavedDataWarning(data.uid, #encoded)
|
||||
data.information.saved = encoded
|
||||
else
|
||||
data.information.saved = nil
|
||||
end
|
||||
end
|
||||
|
||||
function Private.RestoreAuraEnvironment(id)
|
||||
local data = WeakAuras.GetData(id)
|
||||
if not data then
|
||||
return
|
||||
end
|
||||
|
||||
local input = data.information.saved
|
||||
if input then
|
||||
local decoded = LibDeflate:DecodeForPrint(input)
|
||||
local decompressed = LibDeflate:DecompressDeflate(decoded)
|
||||
local success, deserialized = LibSerialize:Deserialize(decompressed)
|
||||
if success then
|
||||
aura_environments[id].saved = deserialized
|
||||
else
|
||||
aura_environments[id].saved = nil
|
||||
end
|
||||
UpdateSavedDataWarning(data.uid, #input)
|
||||
else
|
||||
aura_environments[id].saved = nil
|
||||
end
|
||||
end
|
||||
|
||||
function Private.ClearAuraEnvironmentSavedData(id)
|
||||
if environment_initialized[id] then
|
||||
aura_environments[id].saved = nil
|
||||
end
|
||||
end
|
||||
|
||||
function Private.ClearAuraEnvironment(id)
|
||||
environment_initialized[id] = nil;
|
||||
if environment_initialized[id] then
|
||||
Private.SaveAuraEnvironment(id)
|
||||
environment_initialized[id] = nil
|
||||
aura_environments[id] = nil
|
||||
getDataCallCounts[id] = nil
|
||||
end
|
||||
end
|
||||
|
||||
function Private.ActivateAuraEnvironmentForRegion(region, onlyConfig)
|
||||
@@ -219,6 +289,7 @@ function Private.ActivateAuraEnvironment(id, cloneId, state, states, onlyConfig)
|
||||
elseif onlyConfig then
|
||||
environment_initialized[id] = 1
|
||||
aura_environments[id] = {}
|
||||
getDataCallCounts[id] = 0
|
||||
current_uid = data.uid
|
||||
current_aura_env = aura_environments[id]
|
||||
current_aura_env.id = id
|
||||
@@ -235,6 +306,7 @@ function Private.ActivateAuraEnvironment(id, cloneId, state, states, onlyConfig)
|
||||
-- Either this aura environment has not yet been initialized, or it was reset via an edit in WeakaurasOptions
|
||||
environment_initialized[id] = 2
|
||||
aura_environments[id] = aura_environments[id] or {}
|
||||
getDataCallCounts[id] = getDataCallCounts[id] or 0
|
||||
current_uid = data.uid
|
||||
current_aura_env = aura_environments[id]
|
||||
current_aura_env.id = id
|
||||
@@ -242,6 +314,7 @@ function Private.ActivateAuraEnvironment(id, cloneId, state, states, onlyConfig)
|
||||
current_aura_env.state = state
|
||||
current_aura_env.states = states
|
||||
current_aura_env.region = region
|
||||
Private.RestoreAuraEnvironment(id)
|
||||
-- push new environment onto the stack
|
||||
tinsert(aura_env_stack, {current_aura_env, data.uid})
|
||||
|
||||
@@ -363,7 +436,16 @@ local FakeWeakAurasMixin = {
|
||||
},
|
||||
override = {
|
||||
me = UnitName("player"),
|
||||
myGUID = UnitGUID("player")
|
||||
myGUID = UnitGUID("player"),
|
||||
GetData = function(id)
|
||||
local currentId = Private.UIDtoID(current_uid)
|
||||
getDataCallCounts[currentId] = getDataCallCounts[currentId] + 1
|
||||
if getDataCallCounts[currentId] > 99 then
|
||||
Private.AuraWarnings.UpdateWarning(current_uid, "FakeWeakAurasGetData", "warning",
|
||||
L["This aura calls GetData a lot, which is a slow function."])
|
||||
end
|
||||
return CopyTable(WeakAuras.GetData(id))
|
||||
end
|
||||
},
|
||||
blocked = blocked,
|
||||
setBlocked = function()
|
||||
|
||||
Reference in New Issue
Block a user