WoWInterface SVN EasyDaily

[/] [trunk/] [EasyDaily/] [utility.lua] - Rev 158

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

Compare with Previous | Blame