Files
coa-tsm/TradeSkillMaster/Util/Util.lua
T

140 lines
4.6 KiB
Lua

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- http://www.curse.com/addons/wow/tradeskillmaster_warehousing --
-- --
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
-- All Rights Reserved* - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
-- This file contains various utility APIs
local TSM = select(2, ...)
local private = {}
TSMAPI:RegisterForTracing(private, "TradeSkillMaster.Util_private")
-- Locals to speed up function access.
local CopyTable = CopyTable
local error = error
local floor = floor
local format = format
local GetRealmName = GetRealmName
local gsub = gsub
local ipairs = ipairs
local select = select
local StaticPopup_Show = StaticPopup_Show
local strfind = strfind
local strlower = strlower
local strsub = strsub
local tinsert = tinsert
local tremove = tremove
local type = type
local UnitName = UnitName
--- Shows a popup dialog with the given name and ensures it's visible over the TSM frame by setting the frame strata to TOOLTIP.
-- @param name The name of the static popup dialog to be shown.
function TSMAPI:ShowStaticPopupDialog(name)
StaticPopupDialogs[name].preferredIndex = 3
StaticPopup_Show(name)
for i=1, 100 do
if _G["StaticPopup" .. i] and _G["StaticPopup" .. i].which == name then
_G["StaticPopup" .. i]:SetFrameStrata("TOOLTIP")
break
end
end
end
function TSMAPI:GetCharacters()
return CopyTable(TSM.db.factionrealm.characters)
end
local orig = ChatFrame_OnEvent
function ChatFrame_OnEvent(self, event, ...)
local msg = select(1, ...)
if (event == "CHAT_MSG_SYSTEM") then
if (msg == ERR_AUCTION_STARTED) then -- absorb the Auction Created message
return
end
if (msg == ERR_AUCTION_REMOVED) then -- absorb the Auction Cancelled message
return
end
end
return orig(self, event, ...)
end
-- A more versitile replacement for lua's select() function
-- If a list of indices is passed as the first parameter, only
-- those values will be returned, otherwise, the default select()
-- behavior will be followed.
function private:SelectHelper(positions, ...)
if #positions == 0 then return end
return select(tremove(positions), ...), private:SelectHelper(positions, ...)
end
function TSMAPI:Select(positions, ...)
if type(positions) == "number" then
return select(positions, ...)
elseif type(positions) == "table" then
-- reverse the list and make a copy of it
local newPositions = {}
for i=#positions, 1, -1 do
tinsert(newPositions, positions[i])
end
return private:SelectHelper(newPositions, ...)
else
error(format("Bad argument #1. Expected number or table, got %s", type(positions)))
end
end
-- custom string splitting function that doesn't stack overflow
function TSMAPI:SafeStrSplit(str, sep)
local parts = {}
local s = 1
while true do
local e = strfind(str, sep, s)
if not e then
tinsert(parts, strsub(str, s))
break
end
tinsert(parts, strsub(str, s, e-1))
s = e + 1
end
return parts
end
local MAGIC_CHARACTERS = {'[', ']', '(', ')', '.', '+', '-', '*', '?', '^', '$'}
function TSMAPI:StrEscape(str)
str = gsub(str, "%%", "\001")
for _, char in ipairs(MAGIC_CHARACTERS) do
str = gsub(str, "%"..char, "%%"..char)
end
str = gsub(str, "\001", "%%%%")
return str
end
function TSMAPI:IsPlayer(target)
return strlower(target) == strlower(UnitName("player")) or (strfind(target, "-") and strlower(target) == strlower(UnitName("player").."-"..GetRealmName()))
end
--- Converts seconds into hours, minutes and seconds.
-- @param seconds Number of seconds. Can be a float (will automatically be rounded down to whole seconds).
-- NOTE: The return values of this function can be wrapped directly by a call to "TSMAPI:FormatHMS()".
function TSMAPI:SecondsToHMS(seconds)
-- NOTE: This code can be shorter, but was written this way for efficiency.
local hours = floor(seconds / 3600)
seconds = seconds - (hours * 3600)
local minutes = floor(seconds / 60)
seconds = floor(seconds - (minutes * 60))
return hours, minutes, seconds
end
--- Converts hours, minutes and seconds into a human-readable string.
-- @param hours Hours. Must be a whole number without decimals.
-- @param minutes Minutes. Must be a whole number without decimals.
-- @param seconds Seconds. Must be a whole number without decimals.
function TSMAPI:FormatHMS(hours, minutes, seconds)
return format("%d:%02d:%02d", hours, minutes, seconds)
end