local addonname, shared = ... ---@cast shared HeimdallShared ---@cast addonname string ---@diagnostic disable-next-line: missing-fields shared.StinkyTracker = {} function shared.StinkyTracker.Init() shared.stinkyTracker = { stinkies = ReactiveValue.new({}) } local whoRegex = "([^ -/]+)-?%w*/(%w+)" ---@param msg string ---@return table local function ParseWho(msg) local stinkies = {} for name, class in string.gmatch(msg, whoRegex) do stinkies[name] = { name = name, class = class, seenAt = GetTime(), hostile = true } end return stinkies end local seeRegex = "I see %((%w+)%) ([^ -/]+)-?%w*/(%w+)" ---@param msg string ---@return table local function ParseSee(msg) local stinkies = {} local aggression, name, class = string.match(msg, seeRegex) if not name or not class then return stinkies end local stinky = { name = name, class = class, seenAt = GetTime(), hostile = aggression == "Hostile" } stinkies[name] = stinky return stinkies end local arrivedRegex = "([^ -/]+)-?%w* of class (%w+)" local arrivedRegexAlt = "([^ -/]+)-?%w* %(!!!!%) of class (%w+)" ---@param msg string ---@return table local function ParseArrived(msg) local stinkies = {} local name, class = string.match(msg, arrivedRegex) if not name or not class then name, class = string.match(msg, arrivedRegexAlt) end if not name or not class then return stinkies end local stinky = { name = name, class = class, seenAt = GetTime(), hostile = true } stinkies[name] = stinky return stinkies end local frame = CreateFrame("Frame") frame:RegisterEvent("CHAT_MSG_CHANNEL") frame:SetScript("OnEvent", function(self, event, msg, sender, ...) if not Heimdall_Data.config.stinkyTracker.enabled then return end local channelId = select(6, ...) local _, channelname = GetChannelName(channelId) if channelname ~= Heimdall_Data.config.stinkyTracker.masterChannel then return end if string.find(msg, "^who:") then local whoStinkies = ParseWho(msg) for name, stinky in pairs(whoStinkies) do if stinky.hostile then shared.stinkyTracker.stinkies[name] = stinky end end end if string.find(msg, "^I see") then local seeStinkies = ParseSee(msg) for name, stinky in pairs(seeStinkies) do if stinky.hostile then shared.stinkyTracker.stinkies[name] = stinky end if not stinky.hostile then shared.stinkyTracker.stinkies[name] = nil end end end if string.find(msg, " and guild ") then local arrivedStinkies = ParseArrived(msg) for name, stinky in pairs(arrivedStinkies) do shared.stinkyTracker.stinkies[name] = stinky end end for name, stinky in pairs(shared.stinkyTracker.stinkies) do if Heimdall_Data.config.agents[name] then shared.stinkyTracker.stinkies[name] = nil end end end) print("Heimdall - StinkyTracker loaded") end