Update whosniffer with more advanced queries

This commit is contained in:
2024-11-11 09:20:42 +01:00
parent d00a21266a
commit 43fe972ee3
5 changed files with 212 additions and 163 deletions

View File

@@ -2,21 +2,35 @@
function() function()
for i = 1, GetNumWhoResults() do for i = 1, GetNumWhoResults() do
local name, guild, level, race, class, zone = GetWhoInfo(i) local name, guild, level, race, class, zone = GetWhoInfo(i)
if zone ~= "Siege of Orgrimmar" then ---@type WHOQuery
local faction = aura_env.raceMap[race] local query = aura_env.lastQuery
if not faction then print("Unknown faction for race", race) end if not query then
if faction == "Alliance" then print("No query wtf?")
local player = aura_env.alliance[name] return
end
---@type WHOFilter[]
local filters = query.filters
for _, filter in pairs(filters) do
if not filter(name, guild, level, race, class, zone) then
--print("Filter failed", filter, name, guild, level, race, class,
-- zone)
return
end
end
local player = aura_env.stinkies[name]
if not player then if not player then
player = Player.new(name, guild, race, class, zone) player = Player.new(name, guild, race, class, zone)
local timestamp = date("%Y-%m-%dT%H:%M:%S") local timestamp = date("%Y-%m-%dT%H:%M:%S")
if not WeakAurasSaved.Cyka.WhoSniffer[name] then WeakAurasSaved.Cyka.WhoSniffer[name] = {} end if not WeakAurasSaved.Cyka.WhoSniffer[name] then
WeakAurasSaved.Cyka.WhoSniffer[name] = {}
end
WeakAurasSaved.Cyka.WhoSniffer[name][timestamp] = { WeakAurasSaved.Cyka.WhoSniffer[name][timestamp] = {
["name"] = name, ["name"] = name,
["guild"] = guild, ["guild"] = guild,
["race"] = race, ["race"] = race,
["class"] = class, ["class"] = class,
["zone"] = zone, ["zone"] = zone
} }
local stinky = WeakAurasSaved.Cyka.stinkies[name] local stinky = WeakAurasSaved.Cyka.stinkies[name]
@@ -30,9 +44,7 @@ function()
end end
player:Touch() player:Touch()
player.zone = zone player.zone = zone
aura_env.alliance[name] = player aura_env.stinkies[name] = player
end
end
end end
-- Turns out WA cannot do this ( -- Turns out WA cannot do this (
-- aura_env.UpdateMacro() -- aura_env.UpdateMacro()

View File

@@ -2,11 +2,11 @@
---@type allstates allstates ---@type allstates allstates
function(allstates) function(allstates)
local now = GetTime() local now = GetTime()
for k, v in pairs(aura_env.alliance) do for k, v in pairs(aura_env.stinkies) do
local ago = now - v.lastSeen local ago = now - v.lastSeen
if ago > aura_env.ttl then if ago > aura_env.ttl then
allstates[k] = { show = false, changed = true } allstates[k] = { show = false, changed = true }
aura_env.alliance[k] = nil aura_env.stinkies[k] = nil
PlaySoundFile("Interface\\Sounds\\Uncloak.ogg", "Master") PlaySoundFile("Interface\\Sounds\\Uncloak.ogg", "Master")
aura_env.NotifyGone(v) aura_env.NotifyGone(v)

View File

@@ -1,8 +1,11 @@
-- TICKER_1000 -- TICKER_1000
function() function()
if aura_env.queryPending then return end
SetWhoToUI(1) SetWhoToUI(1)
---@type WHOQuery
local query = aura_env.whoQueries[aura_env.whoQueryIdx] local query = aura_env.whoQueries[aura_env.whoQueryIdx]
SendWho(query) aura_env.lastQuery = query
SendWho(query.query)
aura_env.whoQueryIdx = aura_env.whoQueryIdx + 1 aura_env.whoQueryIdx = aura_env.whoQueryIdx + 1
if aura_env.whoQueryIdx > #aura_env.whoQueries then if aura_env.whoQueryIdx > #aura_env.whoQueries then
aura_env.whoQueryIdx = 1 aura_env.whoQueryIdx = 1

File diff suppressed because one or more lines are too long

View File

@@ -3,14 +3,16 @@ if not WeakAurasSaved.Cyka.WhoSniffer then WeakAurasSaved.Cyka.WhoSniffer = {} e
---@class aura_env ---@class aura_env
---@field raceMap table<string, string> ---@field raceMap table<string, string>
---@field alliance table<string, Player> ---@field stinkies table<string, Player>
---@field classColors table<string, string> ---@field classColors table<string, string>
---@field whoQuery string ---@field whoQueries table<number, WHOQuery>
---@field ttl number ---@field ttl number
---@field messageQueue WHOMessage[] ---@field messageQueue WHOMessage[]
---@field UpdateMacro fun() ---@field UpdateMacro fun()
---@field Notify fun(Player) ---@field Notify fun(Player)
---@field NotifyGone fun(Player) ---@field NotifyGone fun(Player)
---@field queryPending boolean
---@field lastQuery WHOQuery
---@class WHOMessage ---@class WHOMessage
---@field message string ---@field message string
@@ -56,14 +58,49 @@ local function padString(input, targetLength, left)
return input return input
end 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
}
---@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"
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"
end
aura_env.messageQueue = {} aura_env.messageQueue = {}
aura_env.ttl = 6 aura_env.ttl = 6
aura_env.whoQueryIdx = 1 aura_env.whoQueryIdx = 1
aura_env.whoQueries = { ---@type table<number, WHOQuery>
"g-\"БеспредеЛ\"", 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\"", "z-\"Orgrimmar\" z-\"Durotar\" r-\"Human\" r-\"Dwarf\" r-\"Night Elf\" r-\"Gnome\"",
"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.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})
aura_env.queryPending = false
aura_env.lastQuery = nil
aura_env.raceMap = { aura_env.raceMap = {
["Orc"] = "Horde", ["Orc"] = "Horde",
["Undead"] = "Horde", ["Undead"] = "Horde",
@@ -85,11 +122,11 @@ aura_env.raceMap = {
["Void Elf"] = "Alliance", ["Void Elf"] = "Alliance",
["Lightforged Draenei"] = "Alliance", ["Lightforged Draenei"] = "Alliance",
["Mechagnome"] = "Alliance", ["Mechagnome"] = "Alliance",
["Mag'har Orc"] = "Horde", ["Mag'har Orc"] = "Horde"
} }
---@type table<string, Player> ---@type table<string, Player>
aura_env.alliance = {} aura_env.stinkies = {}
---@class Player ---@class Player
---@field name string ---@field name string
@@ -106,9 +143,7 @@ Player = {
---@param zone string ---@param zone string
---@return Player ---@return Player
new = function(name, guild, race, class, zone) new = function(name, guild, race, class, zone)
local self = setmetatable({}, { local self = setmetatable({}, {__index = Player})
__index = Player
})
self.name = name self.name = name
self.guild = guild self.guild = guild
self.race = race self.race = race
@@ -116,13 +151,13 @@ Player = {
self.zone = zone self.zone = zone
return self return self
end, end,
Touch = function(self) Touch = function(self) self.lastSeen = GetTime() end,
self.lastSeen = GetTime()
end,
ToString = function(self) ToString = function(self)
local out = string.format("%s %s %s", padString(self.name, 16, true), padString(self.guild, 26, false), local out = string.format("%s %s %s", padString(self.name, 16, true),
padString(self.guild, 26, false),
padString(self.zone, 26, false)) padString(self.zone, 26, false))
return string.format("|cFF%s%s|r", aura_env.classColors[self.class], out) return
string.format("|cFF%s%s|r", aura_env.classColors[self.class], out)
end end
} }
@@ -138,12 +173,12 @@ aura_env.classColors = {
["Warlock"] = "8788EE", ["Warlock"] = "8788EE",
["Monk"] = "00FF98", ["Monk"] = "00FF98",
["Druid"] = "FF7C0A", ["Druid"] = "FF7C0A",
["Demon Hunter"] = "A330C9", ["Demon Hunter"] = "A330C9"
} }
aura_env.UpdateMacro = function() aura_env.UpdateMacro = function()
local body = {} local body = {}
for k, v in pairs(aura_env.alliance) do for k, v in pairs(aura_env.stinkies) do
table.insert(body, string.format("/tar %s", v.name)) table.insert(body, string.format("/tar %s", v.name))
end end
EditMacro("tar", nil, nil, string.join("\n", body)) EditMacro("tar", nil, nil, string.join("\n", body))
@@ -164,20 +199,17 @@ end
---@type string[] ---@type string[]
local toNotify = StrSplit(aura_env.config.notify, ",") local toNotify = StrSplit(aura_env.config.notify, ",")
for i, part in ipairs(toNotify) do for i, part in ipairs(toNotify) do toNotify[i] = strtrim(part) end
toNotify[i] = strtrim(part)
end
---@type table<string, boolean> ---@type table<string, boolean>
local notifyFor = {} local notifyFor = {}
local notifyForD = StrSplit(aura_env.config.notifyFor, ",") local notifyForD = StrSplit(aura_env.config.notifyFor, ",")
for i, part in ipairs(notifyForD) do for i, part in ipairs(notifyForD) do notifyFor[part] = true end
notifyFor[part] = true
end
---@param player Player ---@param player Player
aura_env.Notify = function(player) aura_env.Notify = function(player)
if not notifyFor[player.zone] then return end 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) 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 for _, rec in ipairs(toNotify) do
table.insert(aura_env.messageQueue, {to = rec, message = msg}) table.insert(aura_env.messageQueue, {to = rec, message = msg})
end end
@@ -186,7 +218,9 @@ end
---@param player Player ---@param player Player
aura_env.NotifyGone = function(player) aura_env.NotifyGone = function(player)
if not notifyFor[player.zone] then return 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) 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 for _, rec in ipairs(toNotify) do
table.insert(aura_env.messageQueue, {to = rec, message = msg}) table.insert(aura_env.messageQueue, {to = rec, message = msg})
end end