183 lines
6.3 KiB
Lua
183 lines
6.3 KiB
Lua
local addonname, shared = ...
|
|
---@cast shared HeimdallShared
|
|
---@cast addonname string
|
|
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 message = strtrim(tostring(parts[2]))
|
|
local channel = 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, message, channel, target))
|
|
end
|
|
---@type Message
|
|
local msg = {
|
|
channel = channel,
|
|
message = message,
|
|
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 message = 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, message, recipient))
|
|
end
|
|
SendAddonMessage(Heimdall_Data.config.addonPrefix, message, "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
|