vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
local Tablet = AceLibrary("Tablet-2.0")
local L = AceLibrary("AceLocale-2.0"):new("FuBar_ClockFu")

ClockFu = AceLibrary("AceAddon-2.0"):new("AceEvent-2.0", "AceConsole-2.0", "AceDB-2.0", "FuBarPlugin-2.0")

ClockFu:RegisterDB("ClockFuDB")
ClockFu:RegisterDefaults('profile', {
        twentyFour = false,
        showSeconds = false,
        localTime = false,
        bothTimes = false,
        bubble = false,
        r = 1,
        g = 1,
        b = 1,
})

ClockFu.version = "2.0." .. string.sub("$Revision: 9785 $", 12, -3)
ClockFu.date = string.sub("$Date: 2006-09-01 15:25:39 -1000 (Fri, 01 Sep 2006) $", 8, 17)
ClockFu.hasIcon = false
ClockFu.defaultPosition = 'RIGHT'
ClockFu.hideWithoutStandby = true
ClockFu.independantProfile = true

function ClockFu:OnInitialize()
        if GroupCalendar_OnLoad then
                self.db.profile.bubble = true
        end
end

function ClockFu:OnEnable()
        self.timeSinceLastUpdate = 0
        self.secondsDifference = 0
        _,self.lastMinute = GetGameTime()
        if not self:IsShowingBubble() then
                self.db.profile.bubble = true
                self:ToggleShowingBubble()
        end
        self:ScheduleRepeatingEvent(self.Update, 1, self)
end

function ClockFu:OnDisable()
        if not self:IsShowingBubble() then
                self:ToggleShowingBubble()
                self.db.profile.bubble = not self.db.profile.bubble
        end
end

function ClockFu:GetColor()
        return self.db.profile.r, self.db.profile.g, self.db.profile.b
end

function ClockFu:GetHexColor()
        return string.format("%02x%02x%02x", self.db.profile.r * 255, self.db.profile.g * 255, self.db.profile.b * 255)
end

function ClockFu:SetColor(r, g, b)
        self.db.profile.r = r
        self.db.profile.g = g
        self.db.profile.b = b
        self:UpdateText()
end

function ClockFu:IsTwentyFour()
        return self.db.profile.twentyFour
end

function ClockFu:ToggleTwentyFour()
        self.db.profile.twentyFour = not self.db.profile.twentyFour
        self:Update()
        return self.db.profile.twentyFour
end

function ClockFu:IsShowingSeconds()
        return self.db.profile.showSeconds
end

function ClockFu:ToggleShowingSeconds()
        self.db.profile.showSeconds = not self.db.profile.showSeconds
        self:Update()
        return self.db.profile.showSeconds
end

function ClockFu:IsLocalTime()
        return self.db.profile.localTime
end

function ClockFu:ToggleLocalTime()
        self.db.profile.localTime = not self.db.profile.localTime
        self:Update()
        return self.db.profile.localTime
end

function ClockFu:IsBothTimes()
        return self.db.profile.bothTimes
end

function ClockFu:ToggleBothTimes()
        self.db.profile.bothTimes = not self.db.profile.bothTimes
        self:Update()
        return self.db.profile.bothTimes
end

function ClockFu:IsShowingBubble()
        return self.db.profile.bubble
end

function ClockFu:ToggleShowingBubble()
        self.db.profile.bubble = not self.db.profile.bubble
        if not self.db.profile.bubble then
                GameTimeFrame:Hide()
        else
                GameTimeFrame:Show()
        end
        return self.db.profile.bubble
end

function ClockFu:GetLocalOffset()
        if self.localOffset ~= nil then
                return self.localOffset
        end
        local localHour = tonumber(date("%H"))
        local localMinute = tonumber(date("%M"))
        local utcHour = tonumber(date("!%H"))
        local utcMinute = tonumber(date("!%M"))
        local loc = localHour + localMinute / 60
        local utc = utcHour + utcMinute / 60
        self.localOffset = floor((loc - utc) * 2 + 0.5) / 2
        if self.localOffset >= 12 then
                self.localOffset = self.localOffset - 24
        end
        return self.localOffset
end

function ClockFu:GetServerOffset()
        if self.serverOffset ~= nil then
                return self.serverOffset
        end
        local serverHour, serverMinute = GetGameTime()
        local utcHour = tonumber(date("!%H"))
        local utcMinute = tonumber(date("!%M"))
        local ser = serverHour + serverMinute / 60
        local utc = utcHour + utcMinute / 60
        self.serverOffset = floor((ser - utc) * 2 + 0.5) / 2
        if self.serverOffset >= 12 then
                self.serverOffset = self.serverOffset - 24
        elseif self.serverOffset < -12 then
                self.serverOffset = self.serverOffset + 24
        end
        return self.serverOffset
end

local optionsTable = {
        handler = ClockFu,
        type = 'group',
        args = {
                twentyFour = {
                        type = 'toggle',
                        name = L["24-hour format"],
                        desc = L["Toggle between 12-hour and 24-hour format"],
                        get = "IsTwentyFour",
                        set = "ToggleTwentyFour",
                },
                seconds = {
                        type = 'toggle',
                        name = L["Show seconds"],
                        desc = L["Show seconds"],
                        get = "IsShowingSeconds",
                        set = "ToggleShowingSeconds",
                },
                ["local"] = {
                        type = 'toggle',
                        name = L["Local time"],
                        desc = L["Toggle between local time and server time"],
                        get = "IsLocalTime",
                        set = "ToggleLocalTime",
                },
                both = {
                        type = 'toggle',
                        name = L["Both times"],
                        desc = L["Toggle between showing two times or just one"],
                        get = "IsBothTimes",
                        set = "ToggleBothTimes",
                },
                bubble = {
                        type = 'toggle',
                        name = L["Show day/night bubble"],
                        desc = L["Show the day/night bubble on the upper-right corner of the minimap"],
                        get = "IsShowingBubble",
                        set = "ToggleShowingBubble",
                },
                color = {
                        type = 'color',
                        name = COLOR,
                        desc = L["Set the color of the text"],
                        get = "GetColor",
                        set = "SetColor",
                        disabled = function()
                                return not ClockFu:IsTextColored()
                        end
                }
        }
}
ClockFu:RegisterChatCommand(L:GetTable("AceConsole-commands"), optionsTable)
ClockFu.OnMenuRequest = optionsTable

function ClockFu:FormatTime(hour, minute, second, colorize)
        if self:IsTwentyFour() then
                if not colorize then
                        if self:IsShowingSeconds() then
                                return string.format("%d:%02d:%02d", hour, minute, second)
                        else
                                return string.format("%d:%02d", hour, minute)
                        end
                else
                        local color = self:GetHexColor()
                        if self:IsShowingSeconds() then
                                return string.format("|cff%s%d|r:|cff%s%02d|r:|cff%s%02d|r", color, hour, color, minute, color, second)
                        else
                                return string.format("|cff%s%d|r:|cff%s%02d|r", color, hour, color, minute)
                        end
                end
        else
                pm = floor(hour / 12) == 1
                hour = mod(hour, 12)
                if hour == 0 then
                        hour = 12
                end
                if not colorize then
                        if self:IsShowingSeconds() then
                                return string.format("%d:%02d:%02d %s", hour, minute, second, pm and " PM" or " AM")
                        else
                                return string.format("%d:%02d %s", hour, minute, pm and " PM" or " AM")
                        end
                else
                        local color = self:GetHexColor()
                        if self:IsShowingSeconds() then
                                return string.format("|cff%s%d|r:|cff%s%02d|r:|cff%s%02d|r %s", color, hour, color, minute, color, second, pm and " PM" or " AM")
                        else
                                return string.format("|cff%s%d|r:|cff%s%02d|r %s", color, hour, color, minute, pm and " PM" or " AM")
                        end
                end
        end
end

function ClockFu:GetServerTime(colorize)
        local hour, minute = GetGameTime()
        if self.lastMinute ~= minute then
                _,self.lastMinute = GetGameTime()
                self.secondsDifference = mod(time(), 60)
        end
        local second = mod(time() - self.secondsDifference, 60)
        return self:FormatTime(hour, minute, second, colorize)
end

function ClockFu:GetLocalTime(colorize)
        local hour = tonumber(date("%H"))
        local minute = tonumber(date("%M"))
        local second = tonumber(date("%S"))
        return self:FormatTime(hour, minute, second, colorize)
end

function ClockFu:GetUtcTime()
        local hour = tonumber(date("!%H"))
        local minute = tonumber(date("!%M"))
        local second = tonumber(date("!%S"))
        return self:FormatTime(hour, minute, second)
end

function ClockFu:OnTextUpdate()
        local hour, minute = GetGameTime()
        if self.lastMinute ~= minute then
                _,self.lastMinute = GetGameTime()
                self.secondsDifference = mod(time(), 60)
        end
        if self:IsBothTimes() then
                if self:IsLocalTime() then
                        self:SetText(string.format("%s || %s", self:GetLocalTime(true), self:GetServerTime(true)))
                else
                        self:SetText(string.format("%s || %s", self:GetServerTime(true), self:GetLocalTime(true)))
                end
        elseif self:IsLocalTime() then
                self:SetText(self:GetLocalTime(true))
        else
                self:SetText(self:GetServerTime(true))
        end
end

function ClockFu:OnTooltipUpdate()
        local s = self:GetServerOffset()
        local l = self:GetLocalOffset()
        
        local cat = Tablet:AddCategory(
                'columns', 2,
                'child_textR', 1,
                'child_textG', 1,
                'child_textB', 0,
                'child_text2R', 1,
                'child_text2G', 1,
                'child_text2B', 1
        )
        cat:AddLine(
                'text', string.format(L["Local time"] .. " (%+03d:%02d)", l, mod(l * 60, 60)),
                'text2', self:GetLocalTime()
        )
        cat:AddLine(
                'text', string.format(L["Server time"] .. " (%+03d:%02d)", s, mod(s * 60, 60)),
                'text2', self:GetServerTime()
        )
        cat:AddLine(
                'text', L["UTC"],
                'text2', self:GetUtcTime()
        )
        
        Tablet:AddCategory():AddLine(
                'text', date("%A, %B %d, %Y"),
                'textR', 1,
                'textG', 1,
                'textB', 1,
                'justify', "CENTER"
        )
end

Generated by GNU Enscript 1.6.5.90.