Fully implement who sniffer
This commit is contained in:
22
FreshShit/WhoSniffer/allstates.lua
Normal file
22
FreshShit/WhoSniffer/allstates.lua
Normal 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>
|
18
FreshShit/WhoSniffer/event.lua
Normal file
18
FreshShit/WhoSniffer/event.lua
Normal 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
|
30
FreshShit/WhoSniffer/event2.lua
Normal file
30
FreshShit/WhoSniffer/event2.lua
Normal 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
|
5
FreshShit/WhoSniffer/event3.lua
Normal file
5
FreshShit/WhoSniffer/event3.lua
Normal file
@@ -0,0 +1,5 @@
|
||||
-- TICKER_5000
|
||||
function()
|
||||
SetWhoToUI(1)
|
||||
SendWho(aura_env.whoQuery)
|
||||
end
|
1
FreshShit/WhoSniffer/export
Normal file
1
FreshShit/WhoSniffer/export
Normal 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)
|
125
FreshShit/WhoSniffer/init.lua
Normal file
125
FreshShit/WhoSniffer/init.lua
Normal 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",
|
||||
}
|
@@ -4,6 +4,7 @@ aura_env.Tickers = {
|
||||
[200] = 0,
|
||||
[500] = 0,
|
||||
[1000] = 0,
|
||||
[5000] = 0,
|
||||
[10000] = 0,
|
||||
[60000] = 0,
|
||||
}
|
||||
|
Reference in New Issue
Block a user