local _, shared = ... ---@cast shared HeimdallShared local ModuleName = "NetworkMessenger" ---@diagnostic disable-next-line: missing-fields shared.NetworkMessenger = {} function shared.NetworkMessenger.Init() RegisterAddonMessagePrefix(Heimdall_Data.config.addonPrefix) if not shared.networkMessenger then shared.networkMessenger = {} end if not shared.networkMessenger.queue then shared.networkMessenger.queue = {} end if not shared.networkMessenger.ticker then local function DoMessage() --if Heimdall_Data.config.networkMessenger.debug then -- print(string.format("[%s] Processing network message queue", ModuleName)) --end if not Heimdall_Data.config.networkMessenger.enabled then --if Heimdall_Data.config.networkMessenger.debug then -- print(string.format("[%s] Module disabled, skipping network message processing", ModuleName)) --end return end ---@type Message local message = shared.networkMessenger.queue[1] if not message then --if Heimdall_Data.config.networkMessenger.debug then -- print(string.format("[%s] Network message queue empty", ModuleName)) --end return end if not message.message or message.message == "" then if Heimdall_Data.config.networkMessenger.debug then print(string.format("[%s] Invalid network message: empty content", ModuleName)) end return end if not message.channel or message.channel == "" then if Heimdall_Data.config.networkMessenger.debug then print(string.format("[%s] Invalid network message: no channel specified", ModuleName)) end return end table.remove(shared.networkMessenger.queue, 1) if not message.message or message.message == "" then if Heimdall_Data.config.networkMessenger.debug then print(string.format("[%s] Skipping empty network message", ModuleName)) end return end if not message.channel or message.channel == "" then if Heimdall_Data.config.networkMessenger.debug then print(string.format("[%s] Skipping network message with no channel", ModuleName)) end return end if not message.data or message.data == "" then if Heimdall_Data.config.networkMessenger.debug then print(string.format("[%s] Skipping network message with no data", ModuleName)) end return end if Heimdall_Data.config.networkMessenger.debug then print( string.format( "[%s] Sending network message: '%s' to %s:%s", ModuleName, message.message, message.channel, message.data ) ) end local payload = string.format("dmessage|%s|%s|%s", message.message, message.channel, message.data) if Heimdall_Data.config.networkMessenger.debug then print(string.format("[%s] Payload: %s", ModuleName, payload)) end if not shared.networkNodes or #shared.networkNodes == 0 then if Heimdall_Data.config.networkMessenger.debug then print(string.format("[%s] No network nodes found, wtf????", ModuleName)) end return end local target = shared.networkNodes[1] SendAddonMessage(Heimdall_Data.config.addonPrefix, payload, "WHISPER", target) end local function Tick() --if Heimdall_Data.config.networkMessenger.debug then -- local queueSize = #shared.networkMessenger.queue -- print(string.format("[%s] Queue check - Network messages pending: %d", ModuleName, queueSize)) --end DoMessage() shared.networkMessenger.ticker = C_Timer.NewTimer(Heimdall_Data.config.networkMessenger.interval, Tick, 1) end Tick() end -- If we are the leader then we delegate messages (dmessage) -- If we get a "message" command from leader then we send the message local nextIdx = 1 local addonMsgFrame = CreateFrame("Frame") addonMsgFrame:RegisterEvent("CHAT_MSG_ADDON") addonMsgFrame:SetScript("OnEvent", function(self, event, prefix, message, channel, source) if not Heimdall_Data.config.networkMessenger.enabled then return end if prefix ~= Heimdall_Data.config.addonPrefix then return end source = string.match(source, "[^%-]+") if Heimdall_Data.config.networkMessenger.debug then print(string.format("[%s] Received message from %s: %s", ModuleName, source, message)) end if #shared.networkNodes == 0 then if Heimdall_Data.config.networkMessenger.debug then print(string.format("[%s] No network nodes found, wtf????", ModuleName)) end return end -- There should always be at least one network node ergo should always exist a leader -- Because the us, the player, is also a node --local networkLeader = shared.networkNodes[1] --if source ~= networkLeader then -- if Heimdall_Data.config.networkMessenger.debug then -- print(string.format("[%s] Message from %s is not from the network leader (%s)", ModuleName, source, -- networkLeader)) -- end -- return --end local parts = shared.Split(message, "|") if Heimdall_Data.config.networkMessenger.debug then print(string.format("[%s] Received message parts:", ModuleName)) shared.dump(parts) end local command = strtrim(parts[1]) if command == "message" then local content = strtrim(tostring(parts[2])) local targetchannel = strtrim(tostring(parts[3])) local target = strtrim(tostring(parts[4])) if Heimdall_Data.config.networkMessenger.debug then print( string.format("[%s] Received message command: %s %s %s", ModuleName, content, targetchannel, target) ) end ---@type Message local msg = { channel = targetchannel, message = content, data = target, } table.insert(shared.messenger.queue, msg) elseif command == "dmessage" then if Heimdall_Data.config.networkMessenger.debug then print(string.format("[%s] Received dmessage command", ModuleName)) end parts[1] = "message" local content = table.concat(parts, "|") if nextIdx > #shared.networkNodes then nextIdx = 1 end local recipient = shared.networkNodes[nextIdx] nextIdx = nextIdx + 1 if Heimdall_Data.config.networkMessenger.debug then print(string.format("[%s] Sending message %s to %s", ModuleName, content, recipient)) end SendAddonMessage(Heimdall_Data.config.addonPrefix, content, "WHISPER", recipient) end end) --/run Heimdall_Data.Test() Heimdall_Data.Test = function() local testmsg = { channel = "W", message = "Hi, mom!", data = "Secundus", } for i = 1, 36 do table.insert(shared.networkMessenger.queue, testmsg) end end print("[Heimdall] NetworkMessenger module loaded") end