diff --git a/Heimdall.lua b/Heimdall.lua index 80a3035..5a33771 100644 --- a/Heimdall.lua +++ b/Heimdall.lua @@ -245,6 +245,8 @@ local function init() ---@class HeimdallStinkyCacheConfig ---@field enabled boolean ---@field debug boolean + ---@field commander string + ---@field ttl number --- Data --- ---@class HeimdallMessengerData @@ -267,7 +269,7 @@ local function init() ---@field ticker number? ---@class HeimdallStinkyCacheData - ---@field stinkies table + ---@field stinkies table shared.GetOrDefault = function(table, keys, default) local value = default @@ -490,6 +492,8 @@ local function init() stinkyCache = { enabled = shared.GetOrDefault(Heimdall_Data, { "config", "stinkyCache", "enabled" }, false), debug = shared.GetOrDefault(Heimdall_Data, { "config", "stinkyCache", "debug" }, false), + commander = shared.GetOrDefault(Heimdall_Data, { "config", "stinkyCache", "commander" }, "Heimdállr"), + ttl = shared.GetOrDefault(Heimdall_Data, { "config", "stinkyCache", "ttl" }, 10), }, addonPrefix = shared.GetOrDefault(Heimdall_Data, { "config", "addonPrefix" }, "HEIMDALL"), } diff --git a/Modules/StinkyCache.lua b/Modules/StinkyCache.lua index 0dfa387..816ac41 100644 --- a/Modules/StinkyCache.lua +++ b/Modules/StinkyCache.lua @@ -6,5 +6,53 @@ local ModuleName = "StinkyCache" ---@diagnostic disable-next-line: missing-fields shared.StinkyCache = {} function shared.StinkyCache.Init() + shared.stinkyCache.stinkies = {} + + ---@param name string + local function AskCommander(name) + if Heimdall_Data.config.stinkyCache.debug then + print(string.format("[%s] Asking commander %s about %s", ModuleName, + Heimdall_Data.config.stinkyCache.commander, name)) + end + local messageParts = { "isstinky", name } + local message = table.concat(messageParts, "|") + SendAddonMessage(Heimdall_Data.config.addonPrefix, + message, "WHISPER", + Heimdall_Data.config.stinkyCache.commander) + return + end + + local addonMessageFrame = CreateFrame("Frame") + addonMessageFrame:RegisterEvent("CHAT_MSG_ADDON") + addonMessageFrame:SetScript("OnEvent", function(self, event, msg, sender, ...) + if sender == Heimdall_Data.config.stinkyCache.commander then + if Heimdall_Data.config.stinkyCache.debug then + print(string.format("[%s] Received stinky from commander %s: %s", ModuleName, + Heimdall_Data.config.stinkyCache.commander, msg)) + end + local name, value = {strsplit("|", msg)} + shared.stinkyCache.stinkies[name] = { value = value, timestamp = time() } + else + if Heimdall_Data.config.stinkyCache.debug then + print(string.format("[%s] Received stinky from non-commander %s: %s", ModuleName, sender, msg)) + end + local parts = {strsplit("|", msg)} + local command, name = parts[1], parts[2] + if parts[1] == "isstinky" then + local res = Heimdall_Data.config.stinkies[parts[2]] + end + end + end) + + setmetatable(shared.stinkyCache.stinkies, { + __index = function(self, key) + local value = rawget(self, key) + local now = GetTime() + if value == nil or now - value.timestamp > Heimdall_Data.config.stinkyCache.ttl then + AskCommander(key) + end + return rawget(self, key) + end + }) print("[Heimdall] StinkyCache module loaded") end