From 9f3ddebcee7821cf2ecf5c5e78285db07294c336 Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Tue, 26 Nov 2024 22:09:58 +0100 Subject: [PATCH] Count how many times who visit orgrimmar and display in alert --- FreshShit/WhoSniffer/event.lua | 27 +-- FreshShit/WhoSniffer/event2.lua | 12 +- FreshShit/WhoSniffer/init.lua | 309 ++++++++++++++++++-------------- 3 files changed, 191 insertions(+), 157 deletions(-) diff --git a/FreshShit/WhoSniffer/event.lua b/FreshShit/WhoSniffer/event.lua index 370e8bc..37198f0 100644 --- a/FreshShit/WhoSniffer/event.lua +++ b/FreshShit/WhoSniffer/event.lua @@ -19,20 +19,21 @@ function() end end + local timestamp = date("%Y-%m-%dT%H:%M:%S") local player = aura_env.stinkies[name] if not player then player = Player.new(name, guild, race, class, zone) - local timestamp = date("%Y-%m-%dT%H:%M:%S") - if not WeakAurasSaved.Cyka.WhoSniffer[name] then - WeakAurasSaved.Cyka.WhoSniffer[name] = {} + local existing = WeakAurasSaved.Cyka.WhoSniffer[name] + + if not existing then WeakAurasSaved.Cyka.WhoSniffer[name] = {} + else + player.lastSeen = existing.lastSeen or "never" + player.firstSeen = existing.firstSeen or "never" + player.seenCount = existing.seenCount or 0 + if player.lastSeen == "never" then + player.firstSeen = timestamp + end end - WeakAurasSaved.Cyka.WhoSniffer[name][timestamp] = { - ["name"] = name, - ["guild"] = guild, - ["race"] = race, - ["class"] = class, - ["zone"] = zone - } local stinky = WeakAurasSaved.Cyka.stinkies[name] if stinky then @@ -42,9 +43,13 @@ function() end aura_env.Notify(player) + player.lastSeen = timestamp + player.seenCount = player.seenCount + 1 + WeakAurasSaved.Cyka.WhoSniffer[name] = player end - player:Touch() + player.lastSeenInternal = GetTime() player.zone = zone + player.lastSeen = timestamp aura_env.stinkies[name] = player end end diff --git a/FreshShit/WhoSniffer/event2.lua b/FreshShit/WhoSniffer/event2.lua index c4b84cd..f21e952 100644 --- a/FreshShit/WhoSniffer/event2.lua +++ b/FreshShit/WhoSniffer/event2.lua @@ -3,22 +3,12 @@ function(allstates) local now = GetTime() for k, v in pairs(aura_env.stinkies) do - local ago = now - v.lastSeen + local ago = now - v.lastSeenInternal if ago > aura_env.ttl then allstates[k] = { show = false, changed = true } aura_env.stinkies[k] = nil PlaySoundFile("Interface\\Sounds\\Uncloak.ogg", "Master") aura_env.NotifyGone(v) - - local timestamp = date("%Y-%m-%dT%H:%M:%S") - WeakAurasSaved.Cyka.WhoSniffer[v.name][timestamp] = { - ["name"] = v.name, - ["guild"] = v.guild, - ["race"] = v.race, - ["class"] = v.class, - ["zone"] = v.zone, - ["left"] = true, - } else if allstates[k] then allstates[k].ago = string.format("%6.1fs", ago) diff --git a/FreshShit/WhoSniffer/init.lua b/FreshShit/WhoSniffer/init.lua index 3bc543e..1496e89 100644 --- a/FreshShit/WhoSniffer/init.lua +++ b/FreshShit/WhoSniffer/init.lua @@ -1,7 +1,12 @@ -if not WeakAurasSaved.Cyka then WeakAurasSaved.Cyka = {} end -if not WeakAurasSaved.Cyka.WhoSniffer then WeakAurasSaved.Cyka.WhoSniffer = {} end +if not WeakAurasSaved.Cyka then + WeakAurasSaved.Cyka = {} +end +if not WeakAurasSaved.Cyka.WhoSniffer then + WeakAurasSaved.Cyka.WhoSniffer = {} +end -aura_env.ignored = { "Maritza", "Goodbones" } +aura_env.ttl = 6 +aura_env.ignored = {"Maritza", "Goodbones"} ---@class aura_env ---@field raceMap table @@ -23,108 +28,118 @@ aura_env.ignored = { "Maritza", "Goodbones" } ---@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 + if not input then + return 0 + end + 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 + 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 ---@class WHOQuery ---@field query string ---@field filters WHOFilter[] WHOQuery = { - ---@param query string - ---@param filters WHOFilter[] - ---@return WHOQuery - new = function(query, filters) - local self = setmetatable({}, { __index = WHOQuery }) - self.query = query - self.filters = filters - return self - end + ---@param query string + ---@param filters WHOFilter[] + ---@return WHOQuery + new = function(query, filters) + local self = setmetatable({}, { + __index = WHOQuery + }) + self.query = query + self.filters = filters + return self + end } ---@alias WHOFilter fun(name: string, guild: string, level: number, race: string, class: string, zone: string): boolean ---@type WHOFilter local NotSiegeOfOrgrimmarFilter = function(name, guild, level, race, class, zone) - if not zone then return false end - return zone ~= "Siege of Orgrimmar" + if not zone then + return false + end + return zone ~= "Siege of Orgrimmar" end ---@type WHOFilter local AllianceFilter = function(name, guild, level, race, class, zone) - if not race then return false end - if not aura_env.raceMap[race] then return false end - return aura_env.raceMap[race] == "Alliance" + if not race then + return false + end + if not aura_env.raceMap[race] then + return false + end + return aura_env.raceMap[race] == "Alliance" end aura_env.messageQueue = {} -aura_env.ttl = 6 aura_env.whoQueryIdx = 1 ---@type table aura_env.whoQueries = {} aura_env.whoQueries[1] = WHOQuery.new("g-\"БеспредеЛ\"", {}) aura_env.whoQueries[2] = WHOQuery.new( - "z-\"Orgrimmar\" z-\"Durotar\" r-\"Human\" r-\"Dwarf\" r-\"Night Elf\" r-\"Gnome\"", - { NotSiegeOfOrgrimmarFilter, AllianceFilter }) + "z-\"Orgrimmar\" z-\"Durotar\" r-\"Human\" r-\"Dwarf\" r-\"Night Elf\" r-\"Gnome\"", + {NotSiegeOfOrgrimmarFilter, AllianceFilter}) aura_env.whoQueries[3] = WHOQuery.new( - "z-\"Orgrimmar\" z-\"Durotar\" r-\"Draenei\" r-\"Worgen\" r-\"Kul Tiran\" r-\"Dark Iron Dwarf\" r-\"Void Elf\" r-\"Lightforged Draenei\" r-\"Mechagnome\"", - { NotSiegeOfOrgrimmarFilter, AllianceFilter }) + "z-\"Orgrimmar\" z-\"Durotar\" r-\"Draenei\" r-\"Worgen\" r-\"Kul Tiran\" r-\"Dark Iron Dwarf\" r-\"Void Elf\" r-\"Lightforged Draenei\" r-\"Mechagnome\"", + {NotSiegeOfOrgrimmarFilter, AllianceFilter}) aura_env.queryPending = false aura_env.lastQuery = nil 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" + ["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 @@ -136,94 +151,118 @@ aura_env.stinkies = {} ---@field race string ---@field class string ---@field zone string ----@field lastSeen number +---@field lastSeenInternal number +---@field lastSeen string +---@field firstSeen string +---@field seenCount 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 + ---@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 + self.lastSeenInternal = GetTime() + self.lastSeen = "never" + self.firstSeen = "never" + self.seenCount = 0 + return self + end, + ToString = function(self) + local out = string.format("%s %s %s\nFirst: %s Last: %s Seen: %3d", padString(self.name, 16, true), + padString(self.guild, 26, false), padString(self.zone, 26, false), padString(self.firstSeen, 10, true), + padString(self.lastSeen, 10, true), self.seenCount) + 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" + ["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.stinkies) do - table.insert(body, string.format("/tar %s", v.name)) - end - EditMacro("tar", nil, nil, string.join("\n", body)) + local body = {} + for k, v in pairs(aura_env.stinkies) 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 + 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 +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 +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 + if not notifyFor[player.zone] then + return + end + local msg = string.format("%s of class %s and guild %s in %s, first seen: %s, last seen: %s, times seen: %d", + player.name, player.class, player.guild, player.zone, player.firstSeen, player.lastSeen, player.seenCount) + for _, rec in ipairs(toNotify) do + table.insert(aura_env.messageQueue, { + to = rec, + message = msg + }) + end end ---@param player Player aura_env.NotifyGone = function(player) - if not notifyFor[player.zone] then return end - local msg = string.format("%s of class %s and guild %s left %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 + if not notifyFor[player.zone] then + return + end + local msg = string.format("%s of class %s and guild %s left %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