Add chatkeyscanner
This commit is contained in:
85
FreshShit/ChatKeyScanner/event.lua
Normal file
85
FreshShit/ChatKeyScanner/event.lua
Normal 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
|
||||||
0
FreshShit/ChatKeyScanner/event2.lua
Normal file
0
FreshShit/ChatKeyScanner/event2.lua
Normal file
1
FreshShit/ChatKeyScanner/export
Normal file
1
FreshShit/ChatKeyScanner/export
Normal 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
|
||||||
72
FreshShit/ChatKeyScanner/init.lua
Normal file
72
FreshShit/ChatKeyScanner/init.lua
Normal 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"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user