local addonname, shared = ... ---@cast shared HeimdallShared ---@cast addonname string ---@diagnostic disable-next-line: missing-fields shared.Macroer = {} function shared.Macroer.Init() ---@class stinky ---@field name string ---@field class string ---@field seenAt number ---@type table local recentStinkies = {} local function FindOrCreateMacro(macroName) local idx = GetMacroIndexByName(macroName) if idx == 0 then CreateMacro(macroName, "INV_Misc_QuestionMark", "") end idx = GetMacroIndexByName(macroName) return idx end ---@param stinkies table local function FixMacro(stinkies) local priorityMap = {} for priority, className in ipairs(Heimdall_Data.config.macroer.priority) do priorityMap[className] = priority end local minPriority = #Heimdall_Data.config.macroer.priority + 1 local sortedStinkies = {} for _, stinky in pairs(stinkies) do table.insert(sortedStinkies, stinky) end table.sort(sortedStinkies, function(a, b) local aPriority = priorityMap[a.class] or minPriority local bPriority = priorityMap[b.class] or minPriority return aPriority < bPriority end) local lines = {} for _, stinky in pairs(sortedStinkies) do if stinky.seenAt > GetTime() - 600 then print(string.format("Macroing %s", stinky.name)) lines[#lines + 1] = string.format("/tar %s", stinky.name) end end local idx = FindOrCreateMacro("HeimdallTarget") local body = strjoin("\n", unpack(lines)) EditMacro(idx, "HeimdallTarget", "INV_Misc_QuestionMark", body) end local frame = CreateFrame("Frame") frame:RegisterEvent("CHAT_MSG_CHANNEL") frame:SetScript("OnEvent", function(self, event, msg, sender, ...) if not Heimdall_Data.config.macroer.enabled then return end local doUpdate = false if string.find(msg, "^who:") then for name, class in string.gmatch(msg, "([^ -/]+)-?%w*/(%w+)") do recentStinkies[name] = { name = name, class = class, seenAt = GetTime(), } doUpdate = true end end local name, class = string.match(msg, "I see (Hostile) ([^ -/]+)-?%w*/(%w+) of") if not name then name, class = string.match(msg, "^([^ -/]+)-?%w* of class (%w+)") end if name then name = strtrim(name) name = string.match(name, "^(.*)-?") recentStinkies[name] = { name = name, class = class, seenAt = GetTime(), } doUpdate = true end if doUpdate then FixMacro(recentStinkies) end end) print("Heimdall - Macroer loaded") end