Refactor AgentTracker and related modules to improve agent management and logging
This commit is contained in:
		
							
								
								
									
										17
									
								
								Heimdall.lua
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								Heimdall.lua
									
									
									
									
									
								
							@@ -18,7 +18,8 @@ local function init()
 | 
			
		||||
	---@field classColors table<string, string>
 | 
			
		||||
	---@field messenger HeimdallMessengerData
 | 
			
		||||
	---@field who HeimdallWhoData
 | 
			
		||||
	---@field stinkyTracker HeimdallStinkyTrackerData
 | 
			
		||||
	---@field stinkyTracker StinkyTrackerData
 | 
			
		||||
	---@field agentTracker AgentTrackerData
 | 
			
		||||
	---@field networkNodes string[]
 | 
			
		||||
	---@field network HeimdallNetworkData
 | 
			
		||||
	---@field networkMessenger HeimdallNetworkMessengerData
 | 
			
		||||
@@ -26,7 +27,7 @@ local function init()
 | 
			
		||||
	---@field _L fun(key: string, locale: string): string
 | 
			
		||||
	---@field _Locale Localization
 | 
			
		||||
	---@field VERSION string
 | 
			
		||||
	---@field dumpTable fun(table: any, depth?: number): nil
 | 
			
		||||
	---@field dumpTable fun(table: any, msg?: string, depth?: number): nil
 | 
			
		||||
	---@field utf8len fun(input: string): number
 | 
			
		||||
	---@field padString fun(input: string, targetLength: number, left?: boolean): string
 | 
			
		||||
	---@field GetOrDefault fun(table: table<any, any>, keys: string[], default: any): any
 | 
			
		||||
@@ -42,7 +43,7 @@ local function init()
 | 
			
		||||
	---@field Inviter InitTable
 | 
			
		||||
	---@field Dueler InitTable
 | 
			
		||||
	---@field Bully InitTable
 | 
			
		||||
	---@field AgentTracker InitTable
 | 
			
		||||
	---@field AgentTracker AgentTracker
 | 
			
		||||
	---@field Emoter InitTable
 | 
			
		||||
	---@field Echoer InitTable
 | 
			
		||||
	---@field Macroer InitTable
 | 
			
		||||
@@ -279,16 +280,12 @@ local function init()
 | 
			
		||||
	---@field ticker Timer?
 | 
			
		||||
 | 
			
		||||
	---@class HeimdallWhoData
 | 
			
		||||
	---@field updateTicker number?
 | 
			
		||||
	---@field whoTicker number?
 | 
			
		||||
	---@field updateTicker Timer?
 | 
			
		||||
	---@field whoTicker Timer?
 | 
			
		||||
	---@field ignored table<string, boolean>
 | 
			
		||||
 | 
			
		||||
	---@class HeimdallStinkyTrackerData
 | 
			
		||||
	---@field stinkies ReactiveValue<table<string, Stinky>>
 | 
			
		||||
	---@field ignored ReactiveValue<table<string, number>>
 | 
			
		||||
 | 
			
		||||
	---@class HeimdallNetworkData
 | 
			
		||||
	---@field ticker number?
 | 
			
		||||
	---@field ticker Timer?
 | 
			
		||||
 | 
			
		||||
	---@class HeimdallStinkyCacheData
 | 
			
		||||
	---@field stinkies table<string, {value: number, timestamp: number}>
 | 
			
		||||
 
 | 
			
		||||
@@ -2,9 +2,45 @@ local _, shared = ...
 | 
			
		||||
---@cast shared HeimdallShared
 | 
			
		||||
local ModuleName = "AgentTracker"
 | 
			
		||||
 | 
			
		||||
---@diagnostic disable-next-line: missing-fields
 | 
			
		||||
shared.AgentTracker = {}
 | 
			
		||||
function shared.AgentTracker.Init()
 | 
			
		||||
---@class AgentTracker
 | 
			
		||||
---@field Init fun(): nil
 | 
			
		||||
---@field Track fun(name: string): boolean
 | 
			
		||||
---@field IsAgent fun(name: string): boolean
 | 
			
		||||
---@field OnChange fun(callback: fun(name: string)): nil
 | 
			
		||||
---@field ForEach fun(callback: fun(name: string)): nil
 | 
			
		||||
 | 
			
		||||
---@class AgentTrackerData
 | 
			
		||||
---@field agents ReactiveValue<table<string, string>>
 | 
			
		||||
 | 
			
		||||
shared.agentTracker.agents = ReactiveValue(Heimdall_Data.config.agents)
 | 
			
		||||
 | 
			
		||||
---@class AgentTracker
 | 
			
		||||
shared.AgentTracker = {
 | 
			
		||||
	Track = function(name)
 | 
			
		||||
		if not name then return false end
 | 
			
		||||
		local exists = shared.AgentTracker.IsAgent(name)
 | 
			
		||||
		if exists then return false end
 | 
			
		||||
		shared.agentTracker.agents[name] = date("%Y-%m-%dT%H:%M:%S")
 | 
			
		||||
		-- Heimdall_Data.config.agents[name] = date("%Y-%m-%dT%H:%M:%S")
 | 
			
		||||
		if Heimdall_Data.config.agentTracker.debug then
 | 
			
		||||
			print(string.format("[%s] Tracking new agent: %s", ModuleName, name))
 | 
			
		||||
			shared.dumpTable(shared.agentTracker.agents)
 | 
			
		||||
		end
 | 
			
		||||
		return true
 | 
			
		||||
	end,
 | 
			
		||||
	IsAgent = function(name)
 | 
			
		||||
		if not name then return false end
 | 
			
		||||
		return shared.agentTracker.agents[name] ~= nil
 | 
			
		||||
	end,
 | 
			
		||||
	OnChange = function(callback) shared.agentTracker.agents:onChange(callback) end,
 | 
			
		||||
	ForEach = function(callback)
 | 
			
		||||
		---@type table<string, string>
 | 
			
		||||
		local agents = shared.agentTracker.agents:get()
 | 
			
		||||
		for name, _ in pairs(agents) do
 | 
			
		||||
			callback(name)
 | 
			
		||||
		end
 | 
			
		||||
	end,
 | 
			
		||||
	Init = function()
 | 
			
		||||
		--/run Heimdall_Data.config.agents["Cyheuraeth"]=date("%Y-%m-%dT%H:%M:%S")
 | 
			
		||||
		---@type table<string, boolean>
 | 
			
		||||
		local channelRosterFrame = CreateFrame("Frame")
 | 
			
		||||
@@ -37,21 +73,7 @@ function shared.AgentTracker.Init()
 | 
			
		||||
			local newAgents = 0
 | 
			
		||||
			for i = 1, count do
 | 
			
		||||
				name = GetChannelRosterInfo(index, i)
 | 
			
		||||
			if name then
 | 
			
		||||
				local isNewAgent = not Heimdall_Data.config.agents[name]
 | 
			
		||||
				Heimdall_Data.config.agents[name] = date("%Y-%m-%dT%H:%M:%S")
 | 
			
		||||
				if isNewAgent then newAgents = newAgents + 1 end
 | 
			
		||||
				if Heimdall_Data.config.agentTracker.debug then
 | 
			
		||||
					print(
 | 
			
		||||
						string.format(
 | 
			
		||||
							"[%s] %s agent: %s",
 | 
			
		||||
							ModuleName,
 | 
			
		||||
							isNewAgent and "Added new" or "Updated existing",
 | 
			
		||||
							name
 | 
			
		||||
						)
 | 
			
		||||
					)
 | 
			
		||||
				end
 | 
			
		||||
			end
 | 
			
		||||
				shared.AgentTracker.Track(name)
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
			if Heimdall_Data.config.agentTracker.debug then
 | 
			
		||||
@@ -89,19 +111,17 @@ function shared.AgentTracker.Init()
 | 
			
		||||
			end
 | 
			
		||||
			if Heimdall_Data.config.agentTracker.debug then
 | 
			
		||||
				print(string.format("[%s] Processing message from master channel: %s", ModuleName, sender))
 | 
			
		||||
			shared.dumpTable(Heimdall_Data.config.agentTracker)
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
			sender = string.match(sender, "^[^-]+")
 | 
			
		||||
		local isNewAgent = not Heimdall_Data.config.agents[sender]
 | 
			
		||||
		Heimdall_Data.config.agents[sender] = date("%Y-%m-%dT%H:%M:%S")
 | 
			
		||||
			local new = shared.AgentTracker.Track(sender)
 | 
			
		||||
 | 
			
		||||
			if Heimdall_Data.config.agentTracker.debug then
 | 
			
		||||
				print(
 | 
			
		||||
					string.format(
 | 
			
		||||
						"[%s] %s agent from message: %s",
 | 
			
		||||
						ModuleName,
 | 
			
		||||
					isNewAgent and "Added new" or "Updated existing",
 | 
			
		||||
						new and "Added new" or "Updated existing",
 | 
			
		||||
						sender
 | 
			
		||||
					)
 | 
			
		||||
				)
 | 
			
		||||
@@ -109,11 +129,9 @@ function shared.AgentTracker.Init()
 | 
			
		||||
		end)
 | 
			
		||||
 | 
			
		||||
		if Heimdall_Data.config.agentTracker.debug then
 | 
			
		||||
		local count = 0
 | 
			
		||||
		for _ in pairs(Heimdall_Data.config.agents) do
 | 
			
		||||
			count = count + 1
 | 
			
		||||
		end
 | 
			
		||||
		print(string.format("[%s] Module initialized - Tracking %d agents", ModuleName, count))
 | 
			
		||||
			print(string.format("[%s] Module initialized", ModuleName))
 | 
			
		||||
			shared.dumpTable(shared.agentTracker.agents:get(), "Agents")
 | 
			
		||||
		end
 | 
			
		||||
		print("[Heimdall] AgentTracker loaded")
 | 
			
		||||
end
 | 
			
		||||
	end,
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ function shared.Dueler.Init()
 | 
			
		||||
			print(string.format("[%s] Checking if sender '%s' is in agents list", ModuleName, sender))
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		local allow = Heimdall_Data.config.agents[sender]
 | 
			
		||||
		local allow = shared.AgentTracker.IsAgent(sender)
 | 
			
		||||
		if allow then
 | 
			
		||||
			if Heimdall_Data.config.dueler.debug then
 | 
			
		||||
				print(string.format("[%s] Accepting duel from trusted agent: %s", ModuleName, sender))
 | 
			
		||||
 
 | 
			
		||||
@@ -35,29 +35,25 @@ function shared.Inviter.Init()
 | 
			
		||||
 | 
			
		||||
		if Heimdall_Data.config.inviter.agentsAssist then
 | 
			
		||||
			if Heimdall_Data.config.inviter.debug then
 | 
			
		||||
				local agentCount = 0
 | 
			
		||||
				for _ in pairs(Heimdall_Data.config.agents) do
 | 
			
		||||
					agentCount = agentCount + 1
 | 
			
		||||
				end
 | 
			
		||||
				print(string.format("[%s] Processing %d agents for assistant promotion", ModuleName, agentCount))
 | 
			
		||||
				print(string.format("[%s] Processing agents for assistant promotion", ModuleName))
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
			for name, _ in pairs(Heimdall_Data.config.agents) do
 | 
			
		||||
				if UnitInParty(name) and not UnitIsGroupLeader(name) and not UnitIsRaidOfficer(name) then
 | 
			
		||||
			shared.AgentTracker.ForEach(function(agent)
 | 
			
		||||
				if UnitInParty(agent) and not UnitIsGroupLeader(agent) and not UnitIsRaidOfficer(agent) then
 | 
			
		||||
					if Heimdall_Data.config.inviter.debug then
 | 
			
		||||
						print(string.format("[%s] Promoting agent to assistant: %s", ModuleName, name))
 | 
			
		||||
						print(string.format("[%s] Promoting agent to assistant: %s", ModuleName, agent))
 | 
			
		||||
					end
 | 
			
		||||
					PromoteToAssistant(name, true)
 | 
			
		||||
					PromoteToAssistant(agent, true)
 | 
			
		||||
				elseif Heimdall_Data.config.inviter.debug then
 | 
			
		||||
					if not UnitInParty(name) then
 | 
			
		||||
						print(string.format("[%s] Agent not in party: %s", ModuleName, name))
 | 
			
		||||
					elseif UnitIsGroupLeader(name) then
 | 
			
		||||
						print(string.format("[%s] Agent is already leader: %s", ModuleName, name))
 | 
			
		||||
					elseif UnitIsRaidOfficer(name) then
 | 
			
		||||
						print(string.format("[%s] Agent is already assistant: %s", ModuleName, name))
 | 
			
		||||
					end
 | 
			
		||||
					if not UnitInParty(agent) then
 | 
			
		||||
						print(string.format("[%s] Agent not in party: %s", ModuleName, agent))
 | 
			
		||||
					elseif UnitIsGroupLeader(agent) then
 | 
			
		||||
						print(string.format("[%s] Agent is already leader: %s", ModuleName, agent))
 | 
			
		||||
					elseif UnitIsRaidOfficer(agent) then
 | 
			
		||||
						print(string.format("[%s] Agent is already assistant: %s", ModuleName, agent))
 | 
			
		||||
					end
 | 
			
		||||
				end
 | 
			
		||||
			end)
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		if Heimdall_Data.config.inviter.debug then
 | 
			
		||||
 
 | 
			
		||||
@@ -5,12 +5,6 @@ local ModuleName = "Macroer"
 | 
			
		||||
---@diagnostic disable-next-line: missing-fields
 | 
			
		||||
shared.Macroer = {}
 | 
			
		||||
function shared.Macroer.Init()
 | 
			
		||||
	---@class stinky
 | 
			
		||||
	---@field name string
 | 
			
		||||
	---@field class string
 | 
			
		||||
	---@field seenAt number
 | 
			
		||||
	---@field hostile boolean
 | 
			
		||||
 | 
			
		||||
	local function FindOrCreateMacro(macroName)
 | 
			
		||||
		if Heimdall_Data.config.macroer.debug then
 | 
			
		||||
			print(string.format("[%s] Finding or creating macro: %s", ModuleName, macroName))
 | 
			
		||||
@@ -27,7 +21,7 @@ function shared.Macroer.Init()
 | 
			
		||||
		return idx
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	---@param stinkies table<string, stinky>
 | 
			
		||||
	---@param stinkies table<string, Stinky>
 | 
			
		||||
	local function FixMacro(stinkies)
 | 
			
		||||
		if Heimdall_Data.config.macroer.debug then
 | 
			
		||||
			print(string.format("[%s] Fixing macro with %d stinkies", ModuleName, #stinkies))
 | 
			
		||||
@@ -53,7 +47,7 @@ function shared.Macroer.Init()
 | 
			
		||||
 | 
			
		||||
		local sortedStinkies = {}
 | 
			
		||||
		for _, stinky in pairs(stinkies) do
 | 
			
		||||
			if not Heimdall_Data.config.agents[stinky.name] then sortedStinkies[#sortedStinkies + 1] = stinky end
 | 
			
		||||
			if not shared.AgentTracker.IsAgent(stinky.name) then sortedStinkies[#sortedStinkies + 1] = stinky end
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		if Heimdall_Data.config.macroer.debug then
 | 
			
		||||
@@ -89,12 +83,12 @@ function shared.Macroer.Init()
 | 
			
		||||
		EditMacro(idx, "HeimdallTarget", "INV_Misc_QuestionMark", body)
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	shared.stinkyTracker.stinkies:onChange(function(value)
 | 
			
		||||
	shared.StinkyTracker.OnChange(function(stinkies)
 | 
			
		||||
		if Heimdall_Data.config.macroer.debug then
 | 
			
		||||
			print(string.format("[%s] Stinkies changed, updating macro", ModuleName))
 | 
			
		||||
			shared.dumpTable(value)
 | 
			
		||||
			shared.dumpTable(stinkies)
 | 
			
		||||
		end
 | 
			
		||||
		FixMacro(value)
 | 
			
		||||
		FixMacro(stinkies)
 | 
			
		||||
	end)
 | 
			
		||||
 | 
			
		||||
	if Heimdall_Data.config.macroer.debug then print(string.format("[%s] Module initialized", ModuleName)) end
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ function shared.Spotter.Init()
 | 
			
		||||
			print(string.format("[%s] Checking notification criteria for %s (%s)", ModuleName, name, faction))
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		if Heimdall_Data.config.agents[name] then
 | 
			
		||||
		if shared.AgentTracker.IsAgent(name) then
 | 
			
		||||
			if Heimdall_Data.config.spotter.debug then
 | 
			
		||||
				print(string.format("[%s] Skipping agent: %s", ModuleName, name))
 | 
			
		||||
			end
 | 
			
		||||
 
 | 
			
		||||
@@ -2,13 +2,16 @@ local _, shared = ...
 | 
			
		||||
---@cast shared HeimdallShared
 | 
			
		||||
local ModuleName = "StinkyTracker"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
---@class Stinky
 | 
			
		||||
---@field name string
 | 
			
		||||
---@field class string
 | 
			
		||||
---@field seenAt number
 | 
			
		||||
---@field hostile boolean
 | 
			
		||||
 | 
			
		||||
---@class StinkyTrackerData
 | 
			
		||||
---@field stinkies ReactiveValue<table<string, Stinky>>
 | 
			
		||||
---@field ignored ReactiveValue<table<string, number>>
 | 
			
		||||
 | 
			
		||||
---@class StinkyTracker
 | 
			
		||||
shared.StinkyTracker = {
 | 
			
		||||
	---@param stinky Stinky
 | 
			
		||||
@@ -68,6 +71,20 @@ shared.StinkyTracker = {
 | 
			
		||||
		return true
 | 
			
		||||
	end,
 | 
			
		||||
 | 
			
		||||
	---@param callback fun(stinkies: table<string, Stinky>)
 | 
			
		||||
	---@return nil
 | 
			
		||||
	OnChange = function(callback) shared.stinkyTracker.stinkies:onChange(callback) end,
 | 
			
		||||
 | 
			
		||||
	---@param callback fun(name: string, stinky: Stinky)
 | 
			
		||||
	---@return nil
 | 
			
		||||
	ForEach = function(callback)
 | 
			
		||||
		---@type table<string, Stinky>
 | 
			
		||||
		local stinkies = shared.stinkyTracker.stinkies:get()
 | 
			
		||||
		for name, stinky in pairs(stinkies) do
 | 
			
		||||
			callback(name, stinky)
 | 
			
		||||
		end
 | 
			
		||||
	end,
 | 
			
		||||
 | 
			
		||||
	Init = function()
 | 
			
		||||
		shared.stinkyTracker = {
 | 
			
		||||
			stinkies = ReactiveValue.new({}),
 | 
			
		||||
@@ -273,7 +290,7 @@ shared.StinkyTracker = {
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
			for name, stinky in pairs(shared.stinkyTracker.stinkies) do
 | 
			
		||||
				if Heimdall_Data.config.agents[name] then
 | 
			
		||||
				if shared.AgentTracker.IsAgent(name) then
 | 
			
		||||
					shared.stinkyTracker.stinkies[name] = nil
 | 
			
		||||
					if Heimdall_Data.config.stinkyTracker.debug then
 | 
			
		||||
						print(string.format("[%s] Removed agent from stinkies: %s", ModuleName, name))
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user