You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
215 lines
5.5 KiB
215 lines
5.5 KiB
-- ----------------------------------------------------------------------------
|
|
-- A persistent timer for World Bosses.
|
|
-- ----------------------------------------------------------------------------
|
|
|
|
-- addonName, addonTable = ...;
|
|
local _, WBT = ...;
|
|
|
|
local Util = {};
|
|
|
|
if type(WBT) == "table" then
|
|
WBT.Util = Util;
|
|
end
|
|
|
|
Util.COLOR_DEFAULT = "|cffffffff";
|
|
Util.COLOR_RED = "|cffff0000";
|
|
Util.COLOR_GREEN = "|cff00ff00";
|
|
Util.COLOR_ORANGE = "|cffffdd1e";
|
|
Util.COLOR_LIGHTGREEN = "|cff35e059";
|
|
Util.COLOR_DARKGREEN = "|cff50c41f";
|
|
Util.COLOR_YELLOW = "|cfff2e532";
|
|
Util.COLOR_BLUE = "|cff0394fc";
|
|
Util.COLOR_PURPLE = "|cffbf00ff";
|
|
|
|
|
|
-- Lua 5.2 "import" from table.pack:
|
|
function TablePack(...)
|
|
return { n = select("#", ...), ... }
|
|
end
|
|
|
|
function Util.StringTrim(s)
|
|
return s:match("^%s*(.-)%s*$"); -- Note: '-' is lazy '*' matching.
|
|
end
|
|
|
|
function Util.MessageFromVarargs(...)
|
|
local args = TablePack(...);
|
|
local msg = "";
|
|
for i=1, args.n do
|
|
local arg = args[i];
|
|
if arg == nil then
|
|
msg = msg .. "nil" .. " ";
|
|
else
|
|
msg = msg .. args[i] .. " ";
|
|
end
|
|
end
|
|
msg = Util.StringTrim(msg);
|
|
return msg;
|
|
end
|
|
|
|
function Util.ReverseColor(color)
|
|
local t_color_rev = { };
|
|
t_color_rev[Util.COLOR_DEFAULT] = Util.COLOR_RED;
|
|
t_color_rev[Util.COLOR_GREEN] = Util.COLOR_RED;
|
|
t_color_rev[Util.COLOR_LIGHTGREEN] = Util.COLOR_RED;
|
|
t_color_rev[Util.COLOR_DARKGREEN] = Util.COLOR_RED;
|
|
t_color_rev[Util.COLOR_YELLOW] = Util.COLOR_LIGHTGREEN;
|
|
t_color_rev[Util.COLOR_RED] = Util.COLOR_LIGHTGREEN;
|
|
return t_color_rev[color] or Util.COLOR_DEFAULT;
|
|
end
|
|
|
|
function Util.ColoredString(color, ...)
|
|
return color .. Util.MessageFromVarargs(...) .. Util.COLOR_DEFAULT;
|
|
end
|
|
|
|
function Util.TableIsEmpty(tbl)
|
|
return next(tbl) == nil
|
|
end
|
|
|
|
function Util.TableLength(tbl)
|
|
local cnt = 0;
|
|
for _ in pairs(tbl) do
|
|
cnt = cnt + 1;
|
|
end
|
|
return cnt;
|
|
end
|
|
|
|
function Util.IsTable(obj)
|
|
return type(obj) == "table";
|
|
end
|
|
|
|
function Util.SetContainsKey(set, key)
|
|
return set[key] ~= nil;
|
|
end
|
|
|
|
-- The sets contain very few values, so for now I won't implement
|
|
-- any better algorithms here.
|
|
function Util.SetElementKey(set, value)
|
|
for k, v in pairs(set) do
|
|
if v == value then
|
|
return k;
|
|
end
|
|
end
|
|
return nil;
|
|
end
|
|
|
|
function Util.SetContainsValue(set, value)
|
|
return Util.SetElementKey(set, value) and true;
|
|
end
|
|
|
|
function Util.RemoveFromSet(set, value)
|
|
local k = Util.SetElementKey(set, value);
|
|
if k then
|
|
table.remove(set, k, value);
|
|
return true;
|
|
end
|
|
return false;
|
|
end
|
|
|
|
function Util.FormatTimeSeconds(seconds)
|
|
local mins = math.floor(seconds / 60);
|
|
local secs = math.floor(seconds % 60);
|
|
if mins > 0 then
|
|
return mins .. "m " .. secs .. "s";
|
|
else
|
|
return secs .. "s";
|
|
end
|
|
end
|
|
|
|
function Util.PlaySoundAlert(soundfile)
|
|
if soundfile == nil or not WBT.db.global.sound_enabled then
|
|
return;
|
|
end
|
|
|
|
PlaySoundFile(soundfile, "Master");
|
|
end
|
|
|
|
-- Credits: The spairs function is copied from:
|
|
-- https://stackoverflow.com/questions/15706270/sort-a-table-in-lua
|
|
-- by user "Michael Kottman"
|
|
--
|
|
-- Note: I really should use a better data structure instead,
|
|
-- such as ordered map, but this is a fast solution, and the computational
|
|
-- overhead will be small since the table is small.
|
|
function Util.spairs(t, order)
|
|
-- collect the keys
|
|
local keys = {}
|
|
for k in pairs(t) do keys[#keys+1] = k end
|
|
|
|
-- if order function given, sort by it by passing the table and keys a, b,
|
|
-- otherwise just sort the keys
|
|
if order then
|
|
table.sort(keys, function(a,b) return order(t, a, b) end)
|
|
else
|
|
table.sort(keys)
|
|
end
|
|
|
|
-- return the iterator function
|
|
local i = 0
|
|
return function()
|
|
i = i + 1
|
|
if keys[i] then
|
|
return keys[i], t[keys[i]]
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Function content is copied from first entry at 'http://lua-users.org/wiki/StringTrim'
|
|
function Util.strtrim(s)
|
|
return (s:gsub("^%s*(.-)%s*$", "%1"));
|
|
end
|
|
|
|
--[[
|
|
Table with the following structure: unnamed entries, where each entry is a table.
|
|
This table's key-value relation must be unique in respect to all other entries
|
|
in the MultiKeyTable. Ex:
|
|
local t = {
|
|
{ k = 1, v = 2 },
|
|
{ k = 2, v = 3 },
|
|
{ k = 1, v = 4 }, -- Invalid, because 'k = 1' is already used,
|
|
};
|
|
]]--
|
|
Util.MultiKeyTable = {};
|
|
|
|
function Util.MultiKeyTable:New(tbl)
|
|
local obj = {};
|
|
obj.tbl = tbl;
|
|
|
|
setmetatable(obj, self);
|
|
self.__index = self;
|
|
|
|
return obj;
|
|
end
|
|
|
|
--[[
|
|
Returns the subtable for which 'k = v' is true.
|
|
]]--
|
|
function Util.MultiKeyTable:GetSubtbl(k, v)
|
|
for _, subtbl in ipairs(self.tbl) do
|
|
for k_subtbl, v_subtbl in pairs(subtbl) do
|
|
if k_subtbl == k and v_subtbl == v then
|
|
return subtbl;
|
|
end
|
|
end
|
|
end
|
|
|
|
return nil;
|
|
end
|
|
|
|
|
|
--[[
|
|
Returns the values for each subtable with a key 'k' as a named table.
|
|
The table's key and value are the same. For example: ret_val[x] = x
|
|
]]--
|
|
function Util.MultiKeyTable:GetAllSubVals(k)
|
|
local subvals = {};
|
|
for _, subtbl in ipairs(self.tbl) do
|
|
local val = subtbl[k];
|
|
if val then
|
|
subvals[val] = val;
|
|
end
|
|
end
|
|
|
|
return subvals;
|
|
end
|
|
|
|
return Util;
|