Fully implement who sniffer

This commit is contained in:
2024-10-18 15:33:11 +02:00
parent 9d2d289135
commit d12fa8ec92
7 changed files with 202 additions and 0 deletions

View File

@@ -0,0 +1,22 @@
---@meta
---[Source](https://github.com/WeakAuras/WeakAuras2/wiki/Trigger-State-Updater-%28TSU%29)
---@class state
---@field changed boolean Informs WeakAuras that the states values have changed. Always set this to true for states that were changed.
---@field show boolean Controls whether the display is visible. Note, that states that have show set to false are automatically removed.
---@field name string The name, returned by %n
---@field icon number|string IconID or TexturePath, used in icons and progress bars
---@field texture number|string IconID or TexturePath, used in textures
---@field stacks number The stack count, returned by %s
---@field index number|string Sets the order the output will display in a dynamic group (if sorting is set to "none" on the group). Strings or numbers are fine but DO NOT MIX TYPES!
---@field progressType string "timed" or "static"
---@field expirationTime number Use with "timed" progressType; relative to GetTime()
---@field duration number Use with "timed" progressType; total duration of the bar in seconds
---@field value number Use with "static" progressType
---@field maxValue number Use with "static" progressType
---@field autoHide boolean Set to true to make the display automatically hide at the end of the "timed" progress. autoHide can also be used along with the "static" progressType by defining a duration and expirationTime along with the static value and total. While the static values will be displayed, the timed values will set the Hide time for the clone.
---@field paused boolean Set to true (and set a remaining value) to pause a "timed" progress. Set to false (and recalculate the expirationTime value) to resume.
---@field remaining number Only used with paused, gives WA the info needed to show paused progress at the current point.
state = {}
---@alias allstates table<number, state>

View File

@@ -0,0 +1,18 @@
-- WHO_LIST_UPDATE
function()
for i = 1, GetNumWhoResults() do
local name, guild, level, race, class, zone = GetWhoInfo(i)
local faction = aura_env.raceMap[race]
if not faction then print("Unknown faction for race", race) end
if faction == "Alliance" then
local player = aura_env.alliance[name]
if not player then
player = Player.new(name, guild, race, class, zone)
end
player:Touch()
player.zone = zone
aura_env.alliance[name] = player
end
end
_G["FriendsFrameCloseButton"]:Click()
end

View File

@@ -0,0 +1,30 @@
-- TICKER_500
---@type allstates allstates
function(allstates)
local now = GetTime()
for k, v in pairs(aura_env.alliance) do
local ago = now - v.lastSeen
if ago > aura_env.ttl then
allstates[k] = { show = false, changed = true }
aura_env.alliance[k] = nil
else
if allstates[k] then
allstates[k].ago = string.format("%6.1fs", ago)
allstates[k].changed = true
else
allstates[k] = {
show = true,
changed = true,
name = v:ToString(),
progressType = "timed",
duration = aura_env.ttl,
expirationTime = GetTime() + aura_env.ttl,
autohide = true,
index = ago,
ago = string.format("%6.1fs", ago),
}
end
end
end
return true
end

View File

@@ -0,0 +1,5 @@
-- TICKER_5000
function()
SetWhoToUI(1)
SendWho(aura_env.whoQuery)
end

View File

@@ -0,0 +1 @@
!nRX(ZPno6)xYnDoyocJ5rasNYoxcbstAAsUyNn3SzlGITmOgJeRSDETB5V99tsw(fgtO3VClBBTL(037xswJBm2ASP)yZM1B0PERXMlgB6i(Fyue3(cmDwW8Xx2QJXyZhyChm)yK9JoC2YXMh7rE7ne3z1ulgZlGad9YvUU(4GXJ2VxRMDnA0RrNEh29aXYD3VDNXMVgbWLn7Dq9ETA1(Wogh2Q7bJnNXjowVUep28Mt00AaZJXbw5YgJV0awJ8VBj)72IbdgBYzpBUezJfVAISdimQVuKcq8a4baecLe9Kl8O)C5ZWBbCYSzyUVIawXdiE0b)qORRIF(8WlUE0TxaZlFffYrnbcSe75DMJVcZ(HpGFctdmHvrEzS5KbhzAnX06OBaKfkyaZLEOxbKhd61CSeuZRhEbGC5yaXWipqJBsrlW(AonKMWAbQHSzEHlOjIoHgG5uK3VcceOdaLfOTd9Xxqwae)bGT9iZOJnhm8sRH3i0BbOajGgsw6g8SivhGCpgs6baRFIThY3xGaqGTfdUieS1AotnB(r9jVHZpim8drUoPnRnKM1gsZAdPz1O(bcGruYcuawszBKNskD5GAbStOaK8DLBIag1tdDMbwiZ)ieXXRMok0ZB107Mta0yYLcOYI68kOEj2Z4SWL6LAk45lfgwg44yszuSWPK98yZtU6UlbeGCiH(aiggc1pf8WObJaxoqwmV5Oto7wtHssAqAQXQ2DVTWVjyoJF1YGe9CaZ(jT9QRrlbIjq03DZzMuIRlMFQgpNrLOPHko5oIJiQ8aHwYgq6iHArjAMdUz4qGB9XEUxZicxkRRUgmLceF4PZWp)hJU1S73LIGlzwKbx6LKGWOvQDwaqDiP4BLTrW2PI0IcpukohiiraWe1G(ybk8fRDbIqF)qhhX((GpqYoYifWVw4FghCZcd8iIfB95Zg8LRU16IZUCiqage0kn9nAxObXUuNvzoihIVi42c)c8YhORM(b0mwQCDgBqT(myAVJJaxWHEehCHUiVKcj2H(bSfcYC7shrSHoPbSoMWGyRCmmpcEFlzdnDytu4B8XAmp2C)93)FldPxnvKMBcM(0QZfd6sWEqIEo4D)v0Yvtdqp4H)KpKwIoR2QPQh(LmWI88iGyJxd4RLjcZcSKOY8c(VlK)8C2)jeZFvpBMjdcGWEA4IhW8vNRMzjccrwnLqxggKDnCCqiNMaVhdY2SAQBivQ(wnnmWTNhMwrU2QacNQ(fbim1QP9xn1yTziYXBS24k4)hkEjEYNNt8WYf9P(syCyjtMdd2smirWhF41aCfs11HL4kb8xK82ue1r(Qa5nA2fusZbgFTffVyffwn9FLrc0)WE(4u4VXHTZsHMnBTluO5wPqZM5PqRd3fk0A7uODoTuZ2T3fk0Uyk8ZRIbwzD7FKZM8FZUUmWRDQfWDUCMYdcIMbYsmdhOA6ljIifaEyxyLpaT7Hr0SXpA0Tw8ZsKJPCoveuTSKPMcPPJRK0OV(bghqgkJMmxK3McqfgxjmFkVKvSvvbVGMBXQR0F9JFQEDT4xNJxwzVvt3RwEsUVKxQUZojX069saj3Kl3sH(if6WeTq1CNRRbuxMrfyIogPgmjhC)vNV3B7)77Dfh6ozXce)3bwumWjHI(mLV2ObeFXHX(C4cevmI4LtEgXD1VCjz2Cqyh6fpYPu2cCmSCeMIj6xVJbIFmI(siWHweEkuJ4pUA6zCHpygY8RmItgQCHGUUc0bJNJkFfBphntXg7Ls4JRecAL)mrpEpOdS37BYH37ZIw3alvQzVL6GroLaGfqbmTma4mpVsM)ypgtjELa0PShGMHkbaPrsp)rrvYZcIuNwoijg0YHtAM3c1uMLYbs5suom)AO3smhvISl5AOTBkUeG(nOubYdXH83BZIK4AUfrmVd7weeTBC5GvKZD5RiXLFlWHM9pNJG0Zf5Y)dDNxIw03ClGXXtjDlkcOIxDuZOk4Z0KNydYf293SqI4FkygrmBHterLcM5ny)gfobSIatmovJJr8yUecPkEMLJlaGCCEbqKvckaGCssbqKvIsdGUgGwzRNJIFwkv6s6vecsTi2TMIPQfr6AkcuDJTUk2xQQEgoyboajDmQ8N)OwgTw(FtMqGeNVixyE2t)7hfqub1QR079JmafdtKQVV2iumuk1F)i7qXWezb6RTffdLYk0pYCSgmXnvj0wPRyNka0IfAppRHra(M0cjoSWkofhyrwGRuDZix1Z27c)rMww2ovGCoWEsRS3haTH6pIMws6gm22aJ2OJOFgEiU66GODZAkGr2jybajuJzHPAjA1Sm4FzpA0h8)G)FXfmyCgPuBj9(el73Qjf0Q56J6hzAxkZUzZ3GWDioNW4ImMj)e5oh05WJ7Cs2CSxd1yCuvQZc8O29gC8r5lAloeWSWgLa)OtA1TzwOVHnleNh4iKpAu7o9YXjCc2pOiKps(F5QLHrIMs)cvu9rxCyq7gdBLJNnNJI60ipAnm6ACYjRvYPawwbFRrd6o84CneG4GZ5JRR(61TxVHdZHCg9XnHCdJrJoSx(wscjoBsb2DGXr5vjlev2tmssdtRwgdouwWC3oGA1jFPp3Msp(5CNS8go)zfQMmxEqubqYbNOv6p28UpF1KlodW4TxFYrwdZF43jNE0QP5aD15XjpsfY4k2ux0XJutMn6YWf3nNDd2p0lWhaTSt)ix5hpGl9kUmKoxhG6ZOUScpMe9(vrrBxTFQuarn5FV4F)wXByKYcsTy5ghNUesVa5vUL(iL9mn10s5wGS9I43QByF(cmNWrzAbBB7onsEwM0nYA9yDVqd(Ts20PwU0iPCkQ)LIKQA01Hoh(5AwO0dbjl9(OSoyLQBdUTvYv)BtAlXkxUHwp28(QNC697ncYCsD8Lhs)apMp(4WGagKZ7Jd8i2pkyD5AIJbvX2rHTjFiOCFhPI(evf8TIUSzUmhPJwToBWxgEZKdmms3Soi5(qNzy)0pMeihp26hgk4VVP(lK((pcM8NeNYGOaoH7xznTD5H(OzmvNCc6a8)tjT1uymKe(FjLrvEqgL7ohlE3)43IQEp1FEKGj7Tq4)ohrL7OQVQVfO9ZDXLkcZuI3oFGqU55W3xWz61uxRgZ3PwN6nCLDPbauDhX5AAKnhuxQawIzyRRjUHxT5sWi1E)RlVmSdlnEtgp9rDVZvQUdRFjNnJJ99TKrGIm(YAW7TdOq)vXYM0h843bCGFzjrHfr8BUyzXjo)tIxXxOs0AXpJQnzRFGB5UqZ3Jx(7aF)yhRpT9tzvfFeL0pBNC6wUsYmVLU7SNJTFmUArMkiY4NWSFQWY7cSO6hTYv)yd9pUnXyRYrHLLmkUbstzpDwSBpRsJmdtDGXRS2ruRkXwCb2CkMc6dUaTI4B((DjJ9K472sFv95wFcBPa7Rmh51aii7fpiq(jIl8UA8DGUexapxmCKvMVF)XxzzD1xZF1aeBw4fS(Qa0TNX63oInE5a0jBatOnXxFlqsFHa()6VWFUBRI8QnC()9TZR(BDyTEy(63xb99z5)9RWI46cm2CeKJC1uy)IqcMVIDiHluZ(K4we0uCNag)3)

View File

@@ -0,0 +1,125 @@
---@class aura_env
---@field raceMap table<string, string>
---@field alliance table<string, Player>
---@field classColors table<string, string>
---@field whoQuery string
---@field ttl number
---@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.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<string, Player>
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",
}

View File

@@ -4,6 +4,7 @@ aura_env.Tickers = {
[200] = 0,
[500] = 0,
[1000] = 0,
[5000] = 0,
[10000] = 0,
[60000] = 0,
}