Files
wow-Heimdall/Modules/NetworkMessenger.lua
PhatPhuckDave d57b573683
Some checks failed
Release Workflow / release (push) Failing after 18s
Update
2025-05-05 00:58:16 +02:00

184 lines
6.3 KiB
Lua

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.dumpTable(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