if not WeakAurasSaved.Cyka then WeakAurasSaved.Cyka = {} end if not WeakAurasSaved.Cyka.WhoSniffer then WeakAurasSaved.Cyka.WhoSniffer = {} end ---@class aura_env ---@field raceMap table ---@field alliance table ---@field classColors table ---@field whoQuery string ---@field ttl number ---@field messageQueue WHOMessage[] ---@field UpdateMacro fun() ---@field Notify fun(string) ---@class WHOMessage ---@field message string ---@field to string ---@param input string ---@return number local function utf8len(input) local len = 0 local i = 1 local n = #input while i <= n do local c = input:byte(i) if c >= 0 and c <= 127 then i = i + 1 elseif c >= 194 and c <= 223 then i = i + 2 elseif c >= 224 and c <= 239 then i = i + 3 elseif c >= 240 and c <= 244 then i = i + 4 else i = i + 1 end len = len + 1 end return len end ---@param input string ---@param targetLength number ---@param left boolean ---@return string local function padString(input, targetLength, left) left = left or false local len = utf8len(input) if len < targetLength then if left then input = input .. string.rep(" ", targetLength - len) else input = string.rep(" ", targetLength - len) .. input end end return input end aura_env.messageQueue = {} aura_env.ttl = 60 aura_env.whoQuery = "z-\"Orgrimmar\" z-\"Durotar\" 110 r-\"Human\" r-\"Dwarf\" r-\"Night Elf\" r-\"Gnome\" r-\"Draenei\" r-\"Worgen\" r-\"Kul Tiran\" r-\"Dark Iron Dwarf\" r-\"Void Elf\" r-\"Lightforged Draenei\" r-\"Mechagnome\"" aura_env.raceMap = { ["Orc"] = "Horde", ["Undead"] = "Horde", ["Tauren"] = "Horde", ["Troll"] = "Horde", ["Blood Elf"] = "Horde", ["Goblin"] = "Horde", ["Human"] = "Alliance", ["Dwarf"] = "Alliance", ["Night Elf"] = "Alliance", ["Gnome"] = "Alliance", ["Draenei"] = "Alliance", ["Worgen"] = "Alliance", ["Vulpera"] = "Horde", ["Nightborne"] = "Horde", ["Zandalari Troll"] = "Horde", ["Kul Tiran"] = "Alliance", ["Dark Iron Dwarf"] = "Alliance", ["Void Elf"] = "Alliance", ["Lightforged Draenei"] = "Alliance", ["Mechagnome"] = "Alliance", ["Mag'har Orc"] = "Horde", } ---@type table aura_env.alliance = {} ---@class Player ---@field name string ---@field guild string ---@field race string ---@field class string ---@field zone string ---@field lastSeen number Player = { ---@param name string ---@param guild string ---@param race string ---@param class string ---@param zone string ---@return Player new = function(name, guild, race, class, zone) local self = setmetatable({}, { __index = Player }) self.name = name self.guild = guild self.race = race self.class = class self.zone = zone return self end, Touch = function(self) self.lastSeen = GetTime() end, ToString = function(self) local out = string.format("%s %s %s", padString(self.name, 16, true), padString(self.guild, 26, false), padString(self.zone, 26, false)) return string.format("|cFF%s%s|r", aura_env.classColors[self.class], out) end } aura_env.classColors = { ["Warrior"] = "C69B6D", ["Paladin"] = "F48CBA", ["Hunter"] = "AAD372", ["Rogue"] = "FFF468", ["Priest"] = "FFFFFF", ["Death Knight"] = "C41E3A", ["Shaman"] = "0070DD", ["Mage"] = "3FC7EB", ["Warlock"] = "8788EE", ["Monk"] = "00FF98", ["Druid"] = "FF7C0A", ["Demon Hunter"] = "A330C9", } aura_env.UpdateMacro = function() local body = {} for k, v in pairs(aura_env.alliance) do table.insert(body, string.format("/tar %s", v.name)) end EditMacro("tar", nil, nil, string.join("\n", body)) end ---@param input string ---@param deliminer string ---@return string[], string|nil local function StrSplit(input, deliminer) if not deliminer then return {}, "deliminer is nil" end if not input then return {}, "input is nil" end local parts = {} for part in string.gmatch(input, "([^" .. deliminer .. "]+)") do table.insert(parts, strtrim(part)) end return parts, nil end ---@type string[] local toNotify = StrSplit(aura_env.config.notify, ",") for i, part in ipairs(toNotify) do toNotify[i] = strtrim(part) end ---@type table local notifyFor = {} local notifyForD = StrSplit(aura_env.config.notifyFor, ",") for i, part in ipairs(notifyForD) do notifyFor[part] = true end ---@param player Player aura_env.Notify = function(player) if not notifyFor[player.zone] then return end local msg = string.format("%s of class %s and guild %s in %s", player.name, player.class, player.guild, player.zone) for _, rec in ipairs(toNotify) do table.insert(aura_env.messageQueue, {to = rec, message = msg}) end end