86 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
local _, shared = ...
 | 
						|
---@cast shared HeimdallShared
 | 
						|
local ModuleName = "Network"
 | 
						|
 | 
						|
---@class HeimdallNetworkConfig
 | 
						|
---@field enabled boolean
 | 
						|
---@field debug boolean
 | 
						|
---@field members string[]
 | 
						|
---@field updateInterval number
 | 
						|
 | 
						|
---@class HeimdallNetworkData
 | 
						|
---@field ticker Timer?
 | 
						|
 | 
						|
---@class Network
 | 
						|
shared.Network = {
 | 
						|
	Init = function()
 | 
						|
		if not shared.network then shared.network = {} end
 | 
						|
		local updatePending = false
 | 
						|
 | 
						|
		local function FriendListUpdate()
 | 
						|
			updatePending = false
 | 
						|
			if not Heimdall_Data.config.network.enabled then return end
 | 
						|
			---@type table<string, boolean>
 | 
						|
			local friends = {}
 | 
						|
			for i = 1, GetNumFriends() do
 | 
						|
				local name, _, _, _, connected, _, _, _ = GetFriendInfo(i)
 | 
						|
				if name then
 | 
						|
					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
 | 
						|
				else
 | 
						|
					if Heimdall_Data.config.network.debug then
 | 
						|
						print(string.format("[%s] Friend %s is nil", ModuleName, i))
 | 
						|
					end
 | 
						|
				end
 | 
						|
			end
 | 
						|
 | 
						|
			for _, member in ipairs(Heimdall_Data.config.network.members) do
 | 
						|
				if friends[member] == nil and member ~= UnitName("player") then
 | 
						|
					if Heimdall_Data.config.network.debug then
 | 
						|
						print(string.format("[%s] Adding friend %s", ModuleName, member))
 | 
						|
					end
 | 
						|
					AddFriend(member)
 | 
						|
				end
 | 
						|
			end
 | 
						|
			friends[UnitName("player")] = true
 | 
						|
 | 
						|
			shared.networkNodes = {}
 | 
						|
			-- Why are we skipping this again...?
 | 
						|
			-- if false then shared.networkNodes[#shared.networkNodes + 1] = UnitName("player") end
 | 
						|
			for _, player in ipairs(Heimdall_Data.config.network.members) do
 | 
						|
				if friends[player] then
 | 
						|
					shared.networkNodes[#shared.networkNodes + 1] = player
 | 
						|
					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 friendsFrame = CreateFrame("Frame")
 | 
						|
		friendsFrame:RegisterEvent("FRIENDLIST_UPDATE")
 | 
						|
		friendsFrame:SetScript("OnEvent", function(self, event, ...) end)
 | 
						|
 | 
						|
		local function NetworkTick()
 | 
						|
			if Heimdall_Data.config.network.debug then print("Network module is updating.") end
 | 
						|
			ShowFriends()
 | 
						|
			updatePending = true
 | 
						|
			C_Timer.After(1, function()
 | 
						|
				if updatePending then FriendListUpdate() end
 | 
						|
			end)
 | 
						|
			shared.network.ticker = C_Timer.NewTimer(Heimdall_Data.config.network.updateInterval, NetworkTick, 1)
 | 
						|
		end
 | 
						|
 | 
						|
		NetworkTick()
 | 
						|
		print("[Heimdall] Network module loaded")
 | 
						|
	end,
 | 
						|
}
 |