Compare with Previous | Blame | View Log
--[[ Desc: Info: $Id: utility.lua 42 2009-05-20 22:32:24Z draake $ ]] local _G = _G local pairs, ipairs, type, select, tonumber, tostring = pairs, ipairs, type, select, tonumber, tostring local tinsert, tremove, tsort = table.insert, table.remove, table.sort local sformat = string.format local L = LibStub("AceLocale-3.0"):GetLocale("EasyDaily_Base") -------------------------------------------------------------------------------------------------- -- Colors -------------------------------------------------------------------------------------------------- -- string, red, green, blue function EasyDaily:Colorize(s, r, g, b) return string.format("|cff%02x%02x%02x%s|r", r*255, g*255, b*255, s) end --[[ -- string, capture1, red1, green1, blue1[, capture2][, red2, green2, blue2][, ...] function EasyDaily:ColorizePattern(s, ...) local offset = 0 for j = 1, select("#", ...), 4 do local i = j + offset local c, r, g, b = select(i, ...), select(i + 1, ...), select(i + 2, ...), select(i + 3, ...) local m if ( not b ) or ( type(b) ~= "number" ) then c, r, g, b = select(i - 4, ...), c, r, g offset = offset + 1 else m = 1 end s = string.gsub(s, c, function(w) return self:Colorize(w, r, g, b) end, m) end return s end ]] -- string, capture, red1, green1, blue1[, red2, green2, blue2][, ...] function EasyDaily:ColorizePattern(s, c, ...) local n = math.ceil( select("#", ...) / 3 ) local m for i = 1, n * 3, 3 do local r, g, b = select(i, ...), select(i + 1, ...), select(i + 2, ...) if ( i + 2 ) / 3 < n then m = 1 else m = nil end s = string.gsub(s, c, function(w) return self:Colorize(w, r, g, b) end, m) end return s end function EasyDaily:Concat(seperator, ...) local s = "" local n = select("#", ...) for i = 1, n, 1 do s = s .. tostring( select(i, ...) ) if i ~= n then s = s .. seperator end end return s end function EasyDaily:StripColors(s) local r = string.gsub(s, "|c%x+(.-)|r", "%1") return r end function EasyDaily:Pack(...) return { n = select("#", ...), ... } end function EasyDaily:Unpack(t) return unpack(t, 1, t.n or #t) end function toboolean(bool) return ( bool ~= nil ) and ( bool ~= false ) end -------------------------------------------------------------------------------------------------- -- Logic -------------------------------------------------------------------------------------------------- function EasyDaily:DeltaEqual(v1, v2, d) return math.abs(v1 - v2) <= d end function EasyDaily:ValidInterval(v1, v2, d) return math.abs(v1 - v2) <= (self:SelectOne(3, GetNetStats()) + d) end -------------------------------------------------------------------------------------------------- -- Tables -------------------------------------------------------------------------------------------------- function EasyDaily:TableLength(t) local c = 0 for _ in pairs(t) do c = c + 1 end return c end function EasyDaily:CopyTable(t) local r = {} for i, v in pairs(t) do if type(v) == "table" then r[i] = self:CopyTable(v) else r[i] = v end end return r end -- table t with table k values merged into it function EasyDaily:MergeTable(t, k) for i, v in pairs(k) do if type(v) == "table" and type(t[i]) == "table" then t[i] = self:MergeTable(t[i], v) else t[i] = v end end end function EasyDaily:InsertUnique(t, m) if self:TableCount(t, m) == 0 then table.insert(t, m) end end function EasyDaily:CleanTable(t, recursive) for i, v in pairs(t) do if type(t[i]) == "table" and recursive then self:CleanTable(t[i], true) else t[i] = nil end end return t end function EasyDaily:TableCount(t, m) local c = 0 for i, v in pairs(t) do if ( type(m) == "table" and type(v) == "table" and self:TableIsCopy(m, v) ) or m == v then c = c + 1 end end return c end function EasyDaily:RemoveTableDuplicates(t) local r = {} for i, v in pairs(t) do if self:TableCount(r, v) == 0 then if type == "table" then r[i] = self:RemoveTableDuplicates(v) else r[i] = v end end end return r end function EasyDaily:TableIsCopy(t, k) if self:TableLength(t) == self:TableLength(k) then for i, v in pairs(t) do if ( not k[i] ) then return false elseif type(v) == "table" then if type(k[i]) ~= "table" or ( not self:IsCopy(v, k[i]) ) then return false end elseif v ~= k[i] then return false end end return true end end -------------------------------------------------------------------------------------------------- -- System -------------------------------------------------------------------------------------------------- do local timeOffset function EasyDaily:GetTime() if ( not TimeOffset ) then local mo, d, y = select(2, CalendarGetDate()) local h, mi = GetGameTime() timeOffset = math.floor( time({ year = y, month = mo, day = d, hour = h, min = mi }) - GetTime() ) end return timeOffset + math.floor( GetTime() ) end end function EasyDaily:SelectOne(n, ...) if n > 0 then local r = select(n, ...); return r end end function EasyDaily:StrSplit(p, s) local r = {} for m in string.gmatch(s, string.format("([^%s]+)", p)) do table.insert(r, tonumber(m) or m) end return unpack(r) end function EasyDaily:GetNumArgs(...) return select("#", ...) end -------------------------------------------------------------------------------------------------- -- Debugging -------------------------------------------------------------------------------------------------- function EasyDaily:Debug(...) self:ChatDebug(0, ...) end function EasyDaily:Helpful(...) self:ChatDebug(1, ...) end function EasyDaily:Verbose(...) self:ChatDebug(2, ...) end function EasyDaily:Maintenance(...) self:ChatDebug(3, ...) end function EasyDaily:ChatDebug(level, ...) if self.db.profile.debug and ( self.db.profile.debuglevel >= level ) then if AceLibrary and AceLibrary:HasInstance("AceConsole-2.0") then AceLibrary("AceConsole-2.0").PrintLiteral(self, ...) else self:ChatPrint("EasyDaily-Debug", 1, .5, .5, nil, nil, nil, ...) end end end function EasyDaily:Print(...) self:ChatPrint(nil, 1, 1, .5, nil, nil, nil, ...) end function EasyDaily:Error(...) self:ChatPrint("EasyDaily-Error", 1, .5, .5, nil, nil, nil, ...) end function EasyDaily:Display(msg, ...) self:ChatPrint(msg, 1, 1, .5, nil, nil, nil, ...) end function EasyDaily:ChatPrint(info, r1, g1, b1, r2, g2, b2, ...) local text = string.format("|cff%02x%02x%02x%s|r|cff%02x%02x%02x: %s|r", (r1 or 1) * 255, (g1 or 1) * 255, (b1 or 1) * 255, info or "EasyDaily", (r2 or 1) * 255, (g2 or 1) * 255, (b2 or 1) * 255, self:Concat(", ", ...)) DEFAULT_CHAT_FRAME:AddMessage(text) end