diff --git a/Heimdall.lua b/Heimdall.lua index dac13f9..fc31d65 100644 --- a/Heimdall.lua +++ b/Heimdall.lua @@ -47,6 +47,7 @@ local function init() ---@field BonkDetector InitTable ---@field Noter InitTable ---@field Network InitTable + ---@field NetworkMessenger InitTable --- Config --- ---@class HeimdallConfig @@ -68,7 +69,9 @@ local function init() ---@field bonkDetector HeimdallBonkDetectorConfig ---@field noter HeimdallNoterConfig ---@field network HeimdallNetworkConfig + ---@field networkMessenger HeimdallNetworkMessengerConfig ---@field whisperNotify table + ---@field addonPrefix string ---@field stinkies table ---@field agents table ---@field scale number @@ -131,13 +134,11 @@ local function init() ---@field enabled boolean ---@field debug boolean - ---@class HeimdallAgentTrackerConfig ---@field enabled boolean ---@field debug boolean ---@field masterChannel string - ---@class HeimdallEmoterConfig ---@field enabled boolean ---@field debug boolean @@ -222,9 +223,12 @@ local function init() ---@field enabled boolean ---@field debug boolean ---@field members string[] - ---@field addonPrefix string ---@field updateInterval number + ---@class HeimdallNetworkMessengerConfig + ---@field enabled boolean + ---@field debug boolean + --- Data --- ---@class HeimdallMessengerData ---@field queue table @@ -445,9 +449,13 @@ local function init() enabled = shared.GetOrDefault(Heimdall_Data, { "config", "network", "enabled" }, false), debug = shared.GetOrDefault(Heimdall_Data, { "config", "network", "debug" }, false), members = shared.GetOrDefault(Heimdall_Data, { "config", "network", "members" }, {}), - addonPrefix = shared.GetOrDefault(Heimdall_Data, { "config", "network", "addonPrefix" }, "HEIMDALL_NETWORK"), updateInterval = shared.GetOrDefault(Heimdall_Data, { "config", "network", "updateInterval" }, 10), - } + }, + networkMessenger = { + enabled = shared.GetOrDefault(Heimdall_Data, { "config", "networkMessenger", "enabled" }, false), + debug = shared.GetOrDefault(Heimdall_Data, { "config", "networkMessenger", "debug" }, false), + }, + addonPrefix = shared.GetOrDefault(Heimdall_Data, { "config", "addonPrefix" }, "HEIMDALL"), } shared.raceMap = { diff --git a/Modules/Config.lua b/Modules/Config.lua index dd7aa25..7d9d779 100644 --- a/Modules/Config.lua +++ b/Modules/Config.lua @@ -1926,20 +1926,61 @@ function shared.Config.Init() enableButton:UpdateColor(Heimdall_Data.config.network.enabled) networkConfigFrame:Add(enableButton, 1, 12) - local addonPrefix = CreateBasicSmallEditBox("HeimdallNetworkConfigAddonPrefix", - networkConfigFrame.frame, shared.L[Heimdall_Data.config.locale].config.addonPrefix, - Heimdall_Data.config.network.addonPrefix, + local members = CreateBasicBigEditBox("HeimdallNetworkConfigMembers", + networkConfigFrame.frame, shared.L[Heimdall_Data.config.locale].config.members, + table.concat(Heimdall_Data.config.network.members, ","), function(self) local text = self:GetText() - if string.match(text, "%S+") then - Heimdall_Data.config.network.addonPrefix = text - print("Addon prefix set to", tostring(text)) + Heimdall_Data.config.network.members = StringToArray(text, ",") + print("Members set to", table.concat(Heimdall_Data.config.network.members, ",")) + self:SetText(table.concat(Heimdall_Data.config.network.members, ",")) + end) + networkConfigFrame:Add(members, 5, 6) + + local updateInterval = CreateBasicSmallEditBox("HeimdallNetworkConfigUpdateInterval", + networkConfigFrame.frame, shared.L[Heimdall_Data.config.locale].config.updateInterval, + tostring(Heimdall_Data.config.network.updateInterval), + function(self) + local text = self:GetText() + if string.match(text, "%d+") then + Heimdall_Data.config.network.updateInterval = tonumber(text) + print("Update interval set to", tostring(text)) else - print("Invalid addon prefix", tostring(text)) - self:SetText(Heimdall_Data.config.network.addonPrefix) + print("Invalid update interval", text) + self:SetText(tostring(Heimdall_Data.config.network.updateInterval)) end end) - networkConfigFrame:Add(addonPrefix, 2, 6) + networkConfigFrame:Add(updateInterval, 2, 6) + end + + -- NetworkMessenger + do + local r, g, b, a = GetNextColor() + local networkConfigFrame = GridFrame.new("HeimdallNetworkConfig", + UIParent, 12, 20) + networkConfigFrame.frame:SetBackdropColor(r, g, b, 0.3) + configFrame:Add(networkConfigFrame, 11, 3) + + local title = CreateFancyText("HeimdallNetworkConfigTitle", networkConfigFrame.frame, + shared.L[Heimdall_Data.config.locale].config.network, + { r, g, b, a }) + networkConfigFrame:Add(title, 1, 8) + + local debugButton = CreateBasicButton("HeimdallNetworkConfigDebugButton", + networkConfigFrame.frame, shared.L[Heimdall_Data.config.locale].config.debug, function() + Heimdall_Data.config.network.debug = not Heimdall_Data.config.network.debug + return Heimdall_Data.config.network.debug + end) + debugButton:UpdateColor(Heimdall_Data.config.network.debug) + networkConfigFrame:Add(debugButton, 1, 4) + + local enableButton = CreateBasicButton("HeimdallNetworkConfigEnableButton", + networkConfigFrame.frame, shared.L[Heimdall_Data.config.locale].config.enabled, function() + Heimdall_Data.config.network.enabled = not Heimdall_Data.config.network.enabled + return Heimdall_Data.config.network.enabled + end) + enableButton:UpdateColor(Heimdall_Data.config.network.enabled) + networkConfigFrame:Add(enableButton, 1, 12) local members = CreateBasicBigEditBox("HeimdallNetworkConfigMembers", networkConfigFrame.frame, shared.L[Heimdall_Data.config.locale].config.members, @@ -1968,6 +2009,29 @@ function shared.Config.Init() networkConfigFrame:Add(updateInterval, 2, 6) end + -- Addon prefix + do + local r, g, b, a = GetNextColor() + local addonPrefixConfigFrame = GridFrame.new("HeimdallAddonPrefixConfig", + UIParent, 12, 20) + addonPrefixConfigFrame.frame:SetBackdropColor(r, g, b, 0.3) + configFrame:Add(addonPrefixConfigFrame, 5, 1) + + local title = CreateFancyText("HeimdallAddonPrefixConfigTitle", addonPrefixConfigFrame.frame, + shared.L[Heimdall_Data.config.locale].config.addonPrefix, + { r, g, b, a }) + addonPrefixConfigFrame:Add(title, 1, 12) + + local addonPrefix = CreateBasicSmallEditBox("HeimdallAddonPrefixConfigAddonPrefix", + addonPrefixConfigFrame.frame, shared.L[Heimdall_Data.config.locale].config.addonPrefix, + Heimdall_Data.config.addonPrefix, + function(self) + local text = self:GetText() + Heimdall_Data.config.addonPrefix = text + end) + addonPrefixConfigFrame:Add(addonPrefix, 2, 12) + end + -- Whisper Notify do local r, g, b, a = GetNextColor() diff --git a/Modules/NetworkMessenger.lua b/Modules/NetworkMessenger.lua new file mode 100644 index 0000000..59a7064 --- /dev/null +++ b/Modules/NetworkMessenger.lua @@ -0,0 +1,66 @@ +local addonname, shared = ... +---@cast shared HeimdallShared +---@cast addonname string +local ModuleName = "NetworkMessenger" + +---@diagnostic disable-next-line: missing-fields +shared.NetworkMessenger = {} +function shared.NetworkMessenger.Init() + local updateTime = 0 + + local friendsFrame = CreateFrame("Frame") + friendsFrame:RegisterEvent("FRIENDLIST_UPDATE") + friendsFrame:SetScript("OnEvent", function(self, event, ...) + ---@type table + local friends = {} + for i = 1, GetNumFriends() do + local name, level, class, area, connected, status, note, RAF = GetFriendInfo(i) + friends[name] = connected + if Heimdall_Data.config.network.debug then + print(string.format("[%s] Friend %s is %s", ModuleName, name, connected and "online" or "offline")) + end + end + + for _, member in ipairs(Heimdall_Data.config.network.members) do + if friends[member] == nil then + if Heimdall_Data.config.network.debug then + print(string.format("[%s] Adding friend %s", ModuleName, member)) + end + AddFriend(member) + end + end + + shared.networkNodes = {} + for _, player in ipairs(Heimdall_Data.config.network.members) do + if friends[player] then + shared.networkNodes[player] = true + if Heimdall_Data.config.network.debug then + print(string.format("[%s] Adding network node %s", ModuleName, player)) + end + end + end + if Heimdall_Data.config.network.debug then + print(string.format("[%s] Network nodes:", ModuleName)) + shared.dumpTable(shared.networkNodes) + end + end) + + local function Update() + if not Heimdall_Data.config.network.enabled then return end + if Heimdall_Data.config.network.debug then + print("Network module is updating.") + end + ShowFriends() + end + + local networkFrame = CreateFrame("Frame") + networkFrame:SetScript("OnUpdate", function(self, elapsed) + if not Heimdall_Data.config.network.enabled then return end + updateTime = updateTime + elapsed + if updateTime >= Heimdall_Data.config.network.updateInterval then + Update() + updateTime = 0 + end + end) + print("[Heimdall] NetworkMessenger module loaded") +end