179 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			179 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
 |