Add chatkeyscanner

This commit is contained in:
2024-03-15 21:22:01 +01:00
parent b7d0a62bb0
commit ef94e7d3b2
4 changed files with 158 additions and 0 deletions

View File

@@ -0,0 +1,85 @@
---@diagnostic disable: undefined-field
-- CHAT_MSG_CHANNEL TICKER_1000
---@param allstates allstates
function(allstates, e, ...)
if e == "CHAT_MSG_CHANNEL" then
local message, author, _, channel = ...
if message == nil or author == nil then return end
if string.find(message, "Hkeystone") then
local keyid, level = string.match(message, "Hkeystone:(%d+):(%d+)")
if keyid == nil or level == nil then return end
keyid = tonumber(keyid)
level = tonumber(level)
---@cast keyid number
---@cast level number
author = string.gsub(author, "%-.+$", "")
local keyname = aura_env.KeystoneIdMap[keyid]
if keyname == nil then
DevTools_Dump({ keyid, level, message })
return
end
---@cast keyname string
local keykeyname = string.gsub(keyname, " ", "_")
keykeyname = string.gsub(keykeyname, "'", "")
keykeyname = string.gsub(keykeyname, ":", "")
local targetLevel = aura_env.config[keykeyname] or 15
local leveldelta = level - targetLevel
local color, _ = Colorer.Interpolate(leveldelta)
local r = math.floor(color.r * 255)
local g = math.floor(color.g * 255)
local b = math.floor(color.b * 255)
local hexColor = string.format("%02x%02x%02x", r, g, b)
-- For some reason Colorer.RGBToHex does not work with some strange lua error
-- It works when ran standalone with lua54 but not in a weakaura
-- Whatever...
local formattedName = string.format("|cFF%s%s|r", hexColor, keyname)
allstates[author .. keyid .. level] = {
show = true,
changed = true,
keyid = keyid,
level = level,
targetLevel = targetLevel,
leveldelta = leveldelta,
name = formattedName,
keyname = keyname,
color = color,
author = author,
channel = channel,
progressType = "timed",
duration = 60,
expirationTime = GetTime() + 60,
autohide = true,
index = GetTime(),
progress = "0s",
}
return true
end
else
if e == "TICKER_1000" then
for _, state in pairs(allstates) do
if state.progress then
local elapsedTime = GetTime() - state.index
local prettyTime = ""
local minutes = 0
while elapsedTime > 60 do
elapsedTime = elapsedTime - 60
minutes = minutes + 1
end
if minutes > 0 then
prettyTime = string.format("%s%dm", prettyTime, minutes)
end
if elapsedTime > 0 then
prettyTime = string.format("%s %ds", prettyTime, elapsedTime)
end
prettyTime = string.format("%ds", elapsedTime)
state.progress = prettyTime
end
end
end
return true
end
end

View File

View File

@@ -0,0 +1 @@
!nRXIsTnsYVLZ3rTMn2ETnpsyRnPwcycqadfYzPUIcln2AS8Cil5tpWqYU6B)6Uhn6LLLnzjvDL5H0m90V7E6E8mSZWbd18hQ1TvN9BTZqTzd1mXFGrT8Cxmu74RUT)qTrUEMCVpYg)GPN78HAF0w81VY8mJmg46AhiGHE6Qjt85bd73C39Apu7z1R7cVWCgp117AxHtWqTJ61FqVBu48ixBxpGC97mSF7H97s)Dh6V7Idcli0NFOebCVV4icgocW44aHRJpX9bmVa4baYjchH)u5Zces8j45apHLf3ZxsNbjdGpAYhfozYGNNZhQDAVlU(KVCbmp9kl0J1fiWCUT9zM(s86hoI)i3jqdwL4PHA6hDO2aDTbhEdGSqKOAZTzpdixZHnJhVkAjab4m7GPPi5ApoHeTR7DXfKS6KYAbsMFSRD4mhT5SXCK718yMIqFqv1M0SIzmuvKvtOzcmooOUuo85JDDa(pwSCCD4iINXeoBo0j62ndEyfmBHLZqTl6DIK3iXcmSO0Fd3k2(baA7YipoWqRp2M57JwyqRpghCwi4FPmKYzloQV4R8Idcdpk2DnRlwhYfRd5I1HCXA3ApIzjfjF4hb2qaHah(0cZBftMQ9wKaJz2sLV0Pf5p5t9mTazw7)gY84rgNeABhzC7ubGinpseLowMpd(cIXqiv4C1s1qUUp6F5cwnWp0Fm3Xu4yHMCNjclPYXYtykrYnhJAfYnOlbdOtDcobcfaXt7Mdp(SVObK1DrQVIKsjHIGQwmd8q7VhyTCh)iesGUo9FB7DqNjuUpAkl4Z8N1gZCC4EFsYW(C7jXrVdU6APbDIh4DdbsSagrkzm(j4Os2v7OB61RVuaUvycU9izLC0zoedHllmaw2vZdsDhyEJVG7yHlyN9BJsuG0fh9DqFnrgGbMI75WS)dLS0DFYr6csqhronjH9UHb2cW9u7QVm4IZ63dKcxiswAiAxQozCLopu(jtHpgXpG)e8YwsbkYOzKXworgVzlBis3(x2cInT4bxGVaZm3Z1YJ77hzWSCZKTCvjljFYtRF9aN51FW8STxwXfNytgdgoBeMac0dhdUvO76m2tG(hd(c4Zjn)cPnbEAgKha)pMVAOwVNbpz3jrgh(v)Pmpg6AoHbHwKB3d8Njq0DNORaGM51H4hZ8EykhsJb7Smvm(bqNijzYe6jJNHTcqBYRdh8rBiTrKXnUUWFp112Se5NGrhbrNGGITEDi)PmBBFP()pyORNKI0WOopEW8Y(EVseVph2DI5bEu)eWdxWeELi8Pa5RtGaZT)Red8hiPKsFWuWn8wOgdo4ElPmnlQeG50tMkVQ4TVsCYLSfs(asAy7xIAaaazf50W4V7vIWdq5(qVXlyphtjyeD1a5f2dELO5rUHEXQDnipvzIlbcjWeayY72Vsu)gEqOhKQmWnY4Zq(KVoL58RG7N7cUY9xcIEGRUca94PZRq68ALe8ig4Jz6XSLALEYnzIm6lSMguM6rbpQIIHwxcmYwD)XQQ(Y85vPQINUGQ61kHPgNLnKDGNiC2JcpSyQL1tiWQi4SqkRUl0pWDgUp6xMBsRpUSzyVoxSm3XY6i0oeE)f0dGMPRUe3y5DXpP1SzZFNQNmYGQqK7fDoo2eb3gASH24hMlGnYM)BsnuJyq)qoih5Xzpmh3VUa4aykmB8(iJVfDEKH8dS6iJlzpa6l)qSYrf1yofriZgc8H)pL9ipwf7d69idjnKAEo22a3)FaBA07M)DKXzxE9v3m4W(d(h5O5VJM7vkskav8sEww95BrgsXPDR97cR2k7lJsEjY4VAG0mY4tE8NRanDAOgYQW7sK1jftuH1vYrDs5OI4PDooI7ufEkWsTBT7UzeU392uu9r7WQ5O93nJoQBNmO5GDsrZ1HEZT5VaTe01sJsLTR8yowvZsh0ilEExw80AVumDbM9cuwqboViDvwe2Pv7S6k1HgKxRbZN8CoxFYb0O5bhGCCZoiPAIIDt0kJ)IVqddGeJNCU7ZHmGZImEKH0tfWKdcV4eQumaGihH9F6dXsowPWDg2IXCxBiJeXttcDOmp1j8U9YkhB3X4EfuCKsks1wwjpLA8YY4RnETWRX5A(Wk5JrEmSGzfN8njXJnmFt6BHrzs(OaoMGIGiXh8FgNqRvodLP7Ylu9rmjXa8BjzAZU87e3t51Cwnos9oij5UU3RegrJvJZ)AtqiSKvdg0p(QNuXmD(Ezgj2RWUt4ALMvApVJs8XuewM9(UuUd(5(VFQam5APrxfnwfsM4j3RMqs9yVHMzvHao2oY4xGzZGu0mVmuNVcN0haT)JGraOYCOTe)6PkOTR2fLeN7E4(CYOneZx)XgPAaaGgPIY2BS9uLIzCAkMuGG1SQSwSYZyfp7OkNnO6SDfNdL18P2yy6jmxZ2RwGag8NbdwhYibaA8gIT(zK8NNtPao)(8Gz8agL7QESowM(rxx4yYFkRYhcxi7mEaS6CNhB9z(ZqrBo8ZmVKnVyLj315G3kTD1kE2f1AKdS3fdwMtziqEAcfa8Gyax6WaYbx32TJHRyx7faB)yWwU)6caQKJv0hCbOvIt(EvlaKsuY0xzEi6OeIIDbMhSUkERQ21YVKD2rH5Q6MQWA2TAYq9YuyjkrC1DIuJ8bx)xgGSDivhcY)RoMBW5Lhg3xsPFPbB0z8V6VIGS9LykywoU(qhpqMlHpg0aYEieNaT3WnBk784CSQQJo9Wb6xQ9jD4H(97Dbi3ND0N7DJEN2TBl7trLqb8rrHWp7JNNgYRgdZ5b)2QvRmb)424y5pK5SajRTQ9VJt)dIOpZcXP8qlHh0HFhpfpJzBY2beB5LJ0mETskJPonWC9QdznzqI(jzMkDFBeBYs7AbkrZ6PCvTtFio)sTTxxPiXIeSabK52WwEEUVpb1qBQJNwkU)16Bz(MTL)T22vxWeH(cYSIuVarw9rHomAsM7VonufCrQGLSeAOkwc1qnZpiHEf3Mz1liMARBbjM9e1TfeLvpXRQ2wnB9M)vn8PALwOWYwrhQx63J4US9AUJeL7xR1kgn5SnRT6ZJ5pIF9P(6hhoBE9VvWRQrgN))A71JTypHVVIzZz7KctsBqBGwmRImRLjEC0Ga)G)tVkx)QXugK9tP24)UO6xxlQIfZCFbozDyKFBD3LI27LbSD2BT4Km0MqvbmcLXHbnZtS1BbuLwQNRc2m9TwpLqRxqLbyqISPTMy766vNqFlpQ0UU7T36XGv5yWAZXWOYXWOnhdt5pL24IkVVRhGY612QD3Nu)IMFu3zHv8wz2TiJtq057I(uq7D(UoPk7B(0hh4EkwgRPlUdRJlelTW1dQBCHiyQAzaJqNpJHDiyY5EEUEvtYZIrdGYfYe(mhQ3phtOqthUc9a(2BxqccdIPTqwH(cOnu0tTAQC7uWj5rqmkBB4InZrkXaUz)cbxkT7Fo(Kt2YFl))eRtlXo0ij1sfk5KAqUtLQhyi12j4JKF89R6Sjl(XFQ7c5EyEH8gRhESIelU5lzjPBTgN8ETRiDN1408RDffZ8K59nLEfYXqVUbRnj)zoJ(MPwswBsY21R)tcyJZOT2vKPIavvaBKvwv3z8ZBWQuFJ9dOdnbldoqmJNRHWv9rDHzOLTF7nyf8NMlKRzGiwl(jEa(CDzF2BewWV2KPct(lXFoTx8ec(cuosftB)Q0kvCSCQIzrEDvNVI6fBFE514R6sjtBq1wxfz0biH9KqzFYEisjzKwZziLVldybTs1jBw1Gfp4nB2CFUzz2)MksinwVumphuZbpNG4A1QQcJv1sNWjK6KKoa7nE1lMkS5fKTpGEZBMYDjpIc6OCV3KW7lgNzLSKNFdEc5BmQQSs7sBYvrNpqNl)lZFjngmNzTyjp(Bzod3pofSgjeE7FGYwrB9pm5lYylt)LKWmK)hLuUggtYuFF8rXmjVph1o)VLyu6KLoy5PLjqP)SMlf74P8XpKC8y5VnT0G(d1Q8uSsojoCZSHA0(ULDzzPBeWJ8bYbV0faUFZoTXzYEzmdOlQxPxCW)dqhXKNvxA1)F(21U8L1C5lh5gFhntUWPR(6JqxqYsVbw0m5Uou972TK7jw)U7T0vhSF3Dw(60rMIvDtriSu46WrCWkVJq0SvCbD63TZs3VjAnzU4vevx(oiICAG8wKcI2tZXOu6EA9uMl0zXR7CMBt7hVAWGRUen)pXvxsw6EDRUs0LElOP7jT7Srm6QW)IUt0qRKM36XMpu7w1t04pc(h72fVoRd)Fd

View File

@@ -0,0 +1,72 @@
---@class Colorer
---@field colors table<number, Color>
---@field breakpoints table<number>
Colorer = {
--- Make sure colors and breakpoints always have the same number of entries! VERY IMPORTANT!
---@type table<number, Color>
colors = {
{ r = 0.62, g = 0.62, b = 0.62 }, -- Grey
{ r = 1, g = 1, b = 1 }, -- White
{ r = 0.12, g = 1, b = 0 }, -- Green
{ r = 0, g = 0.44, b = 0.87 }, -- Blue
{ r = 0.64, g = 0.21, b = 0.93 }, -- Purple
{ r = 1, g = 0.5, b = 0 }, -- Orange
{ r = 0.9, g = 0.8, b = 0.5 }, -- Light Gold
{ r = 0, g = 0.8, b = 1.0 }, -- Blizzard Blue
},
breakpoints = { -999, -10, -5, -2, 2, 5, 10, 999 },
---@param value number
---@return Color, nil|string
Interpolate = function(value)
local color = { r = 0, g = 0, b = 0 }
---@type table<number, table<number, number>>
local bracket = { { 0, 0 }, { 1, 1 } }
for i = 1, #Colorer.breakpoints do
if value < Colorer.breakpoints[i] then
bracket[2] = { i, Colorer.breakpoints[i] }
break
end
bracket[1] = { i, Colorer.breakpoints[i] }
end
---@type Color
local startColor = Colorer.colors[bracket[1][1]]
---@type Color
local endColor = Colorer.colors[bracket[2][1]]
local fraction = (value - bracket[1][2]) / (bracket[2][2] - bracket[1][2])
for k, v in pairs(startColor) do
color[k] = Colorer.lerp(v, endColor[k], fraction)
end
return color, nil
end,
---@param a number
---@param b number
---@param t number
---@return number
lerp = function(a, b, t)
return a * (1 - t) + b * t
end
}
setmetatable(Colorer, { __index = Colorer })
aura_env.KeystoneIdMap = {
[197] = "Eye of Azshara",
[198] = "Darkheart Thicket",
[199] = "Black Rook Hold",
[200] = "Halls of Valor",
[206] = "Neltharion's Lair",
[207] = "Vault of the Wardens",
[208] = "Maw of Souls",
[209] = "The Arcway",
[210] = "Court of Stars",
[227] = "Return to Karazhan: Lower",
[233] = "Cathedral of Eternal Night",
[234] = "Return to Karazhan: Upper",
[239] = "Seat of the Triumvirate"
}