Gladdy-TBC/Util.lua
2022-07-31 06:04:50 +02:00

173 lines
5.7 KiB
Lua

local pairs, ipairs = pairs, ipairs
local floor = math.floor
local str_find, str_gsub, str_sub, tinsert = string.find, string.gsub, string.sub, table.insert
local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
local AuraUtil = AuraUtil
local GetSpellInfo = GetSpellInfo
local UnitIsUnit = UnitIsUnit
---------------------------
-- TAGS
---------------------------
local tags = {
["current"] = true,
["max"] = true,
["percent"] = true,
["race"] = "race",
["class"] = "class",
["arena"] = true,
["name"] = "name",
["status"] = true,
["spec"] = "spec",
}
local function str_extract(s, pattern)
local t = {} -- table to store the indices
local i, j = 0,0
while true do
i, j = str_find(s, pattern, i+1) -- find 'next' occurrence
if i == nil then break end
tinsert(t, str_sub(s, i, j))
end
return t
end
--TODO optimize this function as it's being called often!
local function getTagText(unit, tag, current, max, status)
local button = Gladdy.buttons[unit]
if not button then
return
end
if str_find(tag, "percent") then
return current and max and floor(current * 100 / max) .. "%%" or ""
elseif str_find(tag, "current") then
return current and max > 999 and ("%.1fk"):format(current / 1000) or current or ""
elseif str_find(tag, "max") then
return max and max > 999 and ("%.1fk"):format(max / 1000) or max or ""
elseif str_find(tag, "status") then
if str_find(tag, "%|") and status == nil then
return nil
else
return status or ""
end
elseif str_find(tag, "name") then
return button.name or ""
elseif str_find(tag, "class") then
return button.classLoc or ""
elseif str_find(tag, "race") then
return button.raceLoc or ""
elseif str_find(tag, "arena") then
local str,found = str_gsub(unit, "arena", "")
return found == 1 and str or ""
elseif str_find(tag, "spec") then
if str_find(tag, "%|") and button.spec == nil then
return nil
else
return button.spec or ""
end
end
end
function Gladdy:SetTag(unit, tagOption, current, max, status)
local button = self.buttons[unit]
if not button then
return
end
local returnStr = tagOption
local t = str_extract(returnStr, "%[[^%[].-%]")
for _, tag in ipairs(t) do
local replace
if str_find(tag, "|") then -- or operator
local indicators = str_extract(tag, "[%[|%|]%a+[%||%]]")
local replaces = {}
for _, indicator in ipairs(indicators) do
tinsert(replaces, getTagText(unit, indicator, current, max, status))
end
replace = replaces[#replaces]
else
replace = getTagText(unit, tag, current, max, status)
end
if replace then
local find = str_gsub(tag, "%[", "%%[")
find = str_gsub(find, "%]", "%%]")
find = str_gsub(find, "%|", "%%|")
returnStr = str_gsub(returnStr, find, replace)
end
end
return returnStr
end
function Gladdy:GetTagOption(name, order, enabledOption, func, toggle)
if toggle then
return func({
type = "toggle",
name = name,
order = order,
width = "full",
desc = L["Custom Tags:\n"..
"\n|cff1ac742[current]|r - Shows current\n" ..
"\n|cff1ac742[max]|r - Shows max\n" ..
"\n|cff1ac742[percent]|r - Shows percent\n" ..
"\n|cff1ac742[name]|r - Shows name\n" ..
"\n|cff1ac742[arena]|r - Shows arena number\n" ..
"\n|cff1ac742[status]|r - Shows status (eg DEATH)\n" ..
"\n|cff1ac742[race]|r - Shows race\n" ..
"\n|cff1ac742[class]|r - Shows class\n" ..
"\n|cff1ac742[spec]|r - Shows spec\n\n" ..
"Can be combined with OR operator like |cff1ac742[percent|status]|r. The last valid option will be used.\n"],
})
else
return func({
type = "input",
name = name,
order = order,
width = "full",
disabled = function() return not Gladdy.db[enabledOption] end,
desc = L["Custom Tags:\n"..
"\n|cff1ac742[current]|r - Shows current\n" ..
"\n|cff1ac742[max]|r - Shows max\n" ..
"\n|cff1ac742[percent]|r - Shows percent\n" ..
"\n|cff1ac742[name]|r - Shows name\n" ..
"\n|cff1ac742[arena]|r - Shows arena number\n" ..
"\n|cff1ac742[status]|r - Shows status (eg DEATH)\n" ..
"\n|cff1ac742[race]|r - Shows race\n" ..
"\n|cff1ac742[class]|r - Shows class\n" ..
"\n|cff1ac742[spec]|r - Shows spec\n\n" ..
"Can be combined with OR operator like |cff1ac742[percent|status]|r. The last valid option will be used.\n"],
})
end
end
function Gladdy:contains(entry, list)
for _,v in pairs(list) do
if entry == v then
return true
end
end
return false
end
local feignDeath = GetSpellInfo(5384)
function Gladdy:isFeignDeath(unit)
return AuraUtil.FindAuraByName(feignDeath, unit)
end
function Gladdy:GetArenaUnit(unitCaster)
if unitCaster then
for i=1,5 do
local arenaUnit = "arena" .. i
local arenaUnitPet = "arenapet" .. i
if unitCaster and (UnitIsUnit(arenaUnit, unitCaster) or UnitIsUnit(arenaUnitPet, unitCaster)) then
return arenaUnit
end
end
end
end