ESOUI SVN TaosGroupTools

[/] [trunk/] [TaosGroupTools/] [util/] [DebugLogger.lua] - Rev 124

Compare with Previous | Blame | View Log

--[[
        Addon: util
        Author: TProg Taonnor
        Created by @Taonnor
]]--

-- Version Control
local VERSION = 6

--[[
        Local variables
]]--
local LIBMW = LibStub("LibMsgWin-1.0", true)
if(not LIBMW) then
        error("Cannot load without LibMsgWin-1.0")
end

--[[
        Class definition
]]--
-- A table in hole lua workspace must be unique
-- The debug logger is global util table, used in several of my addons
if (TaosDebugLogger == nil or TaosDebugLogger.Version == nil or TaosDebugLogger.Version < VERSION) then
        TaosDebugLogger = {}
        TaosDebugLogger.__index = TaosDebugLogger
    TaosDebugLogger.Version = VERSION

        setmetatable(TaosDebugLogger, {
                __call = function (cls, ...)
                        return cls.new(...)
                end,
        })

        --[[
                Class constructor
        ]]--
        function TaosDebugLogger.new(name, command, traceActive, debugActive, errorActive, directPrint, catchLuaErrors, logFile)
                local self = setmetatable({}, TaosDebugLogger)
                
                -- class members
                self.name = name
        self.logFileName = logFile
                self.buffer = {}
        self.lastTraceTimestamp = GetGameTimeMilliseconds()

        self.loggerMessageWindow = LIBMW:CreateMsgWindow(name .. "LogWindow", name .. " Log Window")
        self.loggerMessageWindow:SetDimensions(768, 256)
        self.loggerMessageWindow.WindowFrame = _G[name .. "LogWindow"]
        self.loggerMessageWindow.WindowFrame:SetHidden(true)
        self.loggerMessageWindow.buffer = _G[name .. "LogWindow" .. "Buffer"]
        self.loggerMessageWindow.buffer:SetMaxHistoryLines(1000)

                self.TRACE_ACTIVE = traceActive
                self.DEBUG_ACTIVE = debugActive
                self.ERROR_ACTIVE = errorActive
                self.DIRECT_PRINT = directPrint
                self.CATCH_LUA_ERRORS = catchLuaErrors

                EVENT_MANAGER:RegisterForEvent(self.name, EVENT_PLAYER_ACTIVATED, function(eventCode) self:OnPlayerActivated(eventCode) end)
                EVENT_MANAGER:RegisterForEvent(self.name, EVENT_LUA_ERROR, function(eventCode, errorOutput) self:OnLuaError(eventCode, errorOutput) end)
                
                return self
        end
    
        --[[
                Initializes LogFile
        ]]--
    function TaosDebugLogger:InitLogFile()
        if (self.logFile == nil and self.logFileName ~= nil) then
            self.logFile = ZO_SavedVars:NewAccountWide(self.logFileName, VERSION, nil, { ["Logs"] = {}})
        else
            self.logFile = nil
        end
    end

        --[[
                Trace
        ]]--
        function TaosDebugLogger:logTrace(functionName, functionElapsed)
                if (self.TRACE_ACTIVE == false) then return end

        local elapsed = GetGameTimeMilliseconds() - self.lastTraceTimestamp

        if (functionElapsed ~= nil) then
            local formatMessage = "[%s - %s ms - Function %s ms - TRACE] %s"
            self:logMessage(formatMessage:format(GetTimeString(), tostring(elapsed), tostring(functionElapsed), functionName))
        else
            local formatMessage = "[%s - %s ms - TRACE] %s"
            self:logMessage(formatMessage:format(GetTimeString(), tostring(elapsed), functionName))
        end

        self.lastTraceTimestamp = GetGameTimeMilliseconds()
        end

        --[[
                Debug
        ]]--
        function TaosDebugLogger:logDebug(...)
                if (self.DEBUG_ACTIVE == false) then return end

                local formatMessage = "[%s - DEBUG] %s"
                local msg = ""
                
                for i = 1, select("#", ...) do
                        if (i == 1) then
                                msg = tostring(select(i, ...))
                        else
                                msg = msg .. "; " .. tostring(select(i, ...))
                        end
                end
                
                self:logMessage(formatMessage:format(GetTimeString(), msg))
        end

        --[[
                Error
        ]]--
        function TaosDebugLogger:logError(...)
                if (self.ERROR_ACTIVE == false) then return end

                local formatMessage = "[%s - ERROR] %s"
                local msg = ""
                
                for i = 1, select("#", ...) do
                        if (i == 1) then
                                msg = tostring(select(i, ...))
                        else
                                msg = msg .. "; " .. tostring(select(i, ...))
                        end
                end
                
                self:logMessage(formatMessage:format(GetTimeString(), msg))
        end

        --[[
                Log
        ]]--
        function TaosDebugLogger:logMessage(msg)
                self:AddMessage(msg)

                if (self.DIRECT_PRINT) then
                        d(msg)
                else
            if (self.loggerMessageWindow.WindowFrame:IsHidden() == false) then
                self.loggerMessageWindow:AddText(msg, 1, 1, 1)
            end
        end
        end

        --[[
                Adds messages to buffer
        ]]--
        function TaosDebugLogger:AddMessage(msg)
                if(not msg or self.buffer == nil) then return end

                local buf = self.buffer
                buf[#buf + 1] = msg
        
        if(self.logFile ~= nil) then
            if (self.logFile.Logs[os.date("%x")] == nil) then
                self.logFile.Logs[os.date("%x")] = {}
            end

                    local logs = self.logFile.Logs[os.date("%x")]
            logs[#logs + 1] = msg

            if (#logs > 100) then
                table.remove(logs, 1)
            end
        end
        end

        --[[
                Print buffered messages
        ]]--
        function TaosDebugLogger:PrintMessages()
                if(self.buffer == nil) then return end
                
        for i,msg in ipairs(self.buffer) do
                    d(msg)
                end

        -- Clear buffer
        for i = #self.buffer, 1, -1 do
            table.remove(self.buffer, i)
        end
        end
    
        --[[
                Print buffered messages into log window and/or shows/hide it
        ]]--
    function TaosDebugLogger:ToggleLogWindow()
        if(self.buffer == nil) then return end

        if (self.loggerMessageWindow.WindowFrame:IsHidden()) then
            self.loggerMessageWindow.WindowFrame:SetHidden(false)

            for i,msg in ipairs(self.buffer) do
                        self.loggerMessageWindow:AddText(msg, 1, 1, 1)
                    end
            
            -- Clear buffer
            for i = #self.buffer, 1, -1 do
                table.remove(self.buffer, i)
            end
        else
            self.loggerMessageWindow.WindowFrame:SetHidden(true)
            self.loggerMessageWindow.buffer:Clear()
        end
    end

        --[[
                Prints buffered outputs
        ]]--
        function TaosDebugLogger:OnPlayerActivated(eventCode)
        if (self.DIRECT_PRINT) then
                    self:PrintMessages()
        end
        
                EVENT_MANAGER:UnregisterForEvent(self.name, EVENT_PLAYER_ACTIVATED)
        end

        --[[
                Catches lua errors
        ]]--
        function TaosDebugLogger:OnLuaError(eventCode, errorOutput)
                if (self.CATCH_LUA_ERRORS == false) then return end
                
                self:logMessage(errorOutput)
                ZO_UIErrors_HideCurrent()
        end

        --[[
                Shows logs on different ways
        ]]--
        function TaosDebugLogger:ShowLogs()
        if (self.DIRECT_PRINT) then
            self:PrintMessages()
        else
            self:ToggleLogWindow()
        end
        end
end

Compare with Previous | Blame