vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
assert( oRA, "oRA not found!")

------------------------------
--      Are you local?      --
------------------------------

local L = AceLibrary("AceLocale-2.2"):new("oRAOResurrection")

----------------------------
--      Localization      --
----------------------------

L:RegisterTranslations("enUS", function() return {
        ["Resurrection Monitor"] = true,
        ["resurrection"] = true,
        ["resurrectionoptional"] = true,
        ["Optional/Resurrection"] = true,
        ["Options for resurrection."] = true,
        ["Toggle"] = true,
        ["toggle"] = true,
        ["Toggle the Resurrection Monitor."] = true,
} end )

L:RegisterTranslations("koKR", function() return {

        ["Resurrection Monitor"] = "부활상태 모니터",
        ["Optional/Resurrection"] = "부가/부활",
        ["Options for resurrection."] = "부활 모니터링 설정",
        ["Toggle"] = "토글",
        ["Toggle the Resurrection Monitor."] = "부활 상태 모니터를 토글합니다.",
} end )

L:RegisterTranslations("zhCN", function() return {
        ["Resurrection Monitor"] = "复活监视器",
        ["resurrection"] = "复活",
        ["resurrectionoptional"] = "resurrectionoptional",
        ["Optional/Resurrection"] = "Optional/Resurrection",
        ["Options for resurrection."] = "复活选项",
        ["Toggle"] = "激活",
        ["toggle"] = "激活",
        ["Toggle the Resurrection Monitor."] = "激活复活监视器",
} end )

L:RegisterTranslations("zhTW", function() return {
        ["Resurrection Monitor"] = "復活監視器",
        ["resurrection"] = "復活",
        ["resurrectionoptional"] = "resurrectionoptional",
        ["Optional/Resurrection"] = "可選/復活",
        ["Options for resurrection."] = "復活選項",
        ["Toggle"] = "顯示",
        ["toggle"] = "顯示",
        ["Toggle the Resurrection Monitor."] = "顯示復活監視器",
} end )

L:RegisterTranslations("frFR", function() return {
        ["Resurrection Monitor"] = "Surveillance des r\195\169surrections",
        --["resurrection"] = true,
        --["resurrectionoptional"] = true,
        ["Optional/Resurrection"] = "Optionnel/R\195\169surrection",
        ["Options for resurrection."] = "Options concernant les r\195\169surrections.",
        ["Toggle"] = "Afficher",
        --["toggle"] = true,
        ["Toggle the Resurrection Monitor."] = "Affiche ou non la surveillance des r\195\169surrections.",
} end )

----------------------------------
--      Module Declaration      --
----------------------------------

oRAOResurrection = oRA:NewModule(L["resurrectionoptional"])
oRAOResurrection.defaults = {
        hidden = true,
}
oRAOResurrection.optional = true
oRAOResurrection.name = L["Optional/Resurrection"]
oRAOResurrection.consoleCmd = L["resurrection"]
oRAOResurrection.consoleOptions = {
        type = "group",
        desc = L["Options for resurrection."],
        name = L["Resurrection Monitor"],
        args = {
                [L["toggle"]] = {
                        type = "toggle", name = L["Toggle"],
                        desc = L["Toggle the Resurrection Monitor."],
                        get = function() return not oRAOResurrection.db.profile.hidden end,
                        set = function(v)
                                oRAOResurrection:ToggleView()
                        end,
                }
        }
}

------------------------------
--      Initialization      --
------------------------------

function oRAOResurrection:OnEnable()
        self.ressers = {}
        self.enabled = nil

        self:RegisterEvent("oRA_LeftRaid")      
        self:RegisterEvent("oRA_JoinedRaid")
end

function oRAOResurrection:OnDisable()
        self:UnregisterAllEvents()
        self:DisableMonitor()
end


------------------------
--   Event Handlers   --
------------------------

function oRAOResurrection:oRA_JoinedRaid()
        if not self.enabled then
                self.enabled = true
                self.ressers = {}
                if not self.db.profile.hidden then
                        self:SetupFrames()
                        self.resframe:Show()
                        self:UpdateFrame()
                end
                self:RegisterCheck("RES", "oRA_ResurrectionStart")
                self:RegisterCheck("RESNO", "oRA_ResurrectionStop")
                self:RegisterCheck("CANRES", "oRA_PlayerCanResurrect")
                self:RegisterCheck("RESSED", "oRA_PlayerResurrected")
                self:RegisterCheck("NORESSED", "oRA_PlayerNotResurrected")
                self:RegisterEvent("RosterLib_RosterChanged", function() self:ScheduleEvent("oRACheckMonitor", self.CheckMonitor, 2, self) end )
        end
end

function oRAOResurrection:oRA_LeftRaid()
        self:DisableMonitor()
end

function oRAOResurrection:CheckMonitor()
        local u,v
        local update = false
        for key, val in pairs(self.ressers) do
                u = self.core.roster:GetUnitObjectFromName(key)
                v = self.core.roster:GetUnitObjectFromName(val)
                if not u or not v then
                        self.ressers[key] = nil
                        update = true
                end
        end
        if update and self.enabled and not self.db.profile.hidden then self:UpdateFrame() end
end

function oRAOResurrection:oRA_ResurrectionStart(msg, author)
        msg = self:CleanMessage(msg)
        local _,_,player = string.find(msg, "^RES (.+)$")
        if player and author then
                if not self.ressers then self.ressers = {} end
                self.ressers[author] = player
                self:UpdateFrame()
        end
end

function oRAOResurrection:oRA_ResurrectionStop(msg, author)
        msg = self:CleanMessage(msg)
        if not self.ressers then self.ressers = {} end
        if author and self.ressers[author] then
                self.ressers[author] = nil
                self:UpdateFrame()
        end
end

function oRAOResurrection:oRA_PlayerCanResurrect( msg, author)
        -- we do nothing with these atm.
end

function oRAOResurrection:oRA_PlayerResurrected( msg, author)
        -- we do nothing with these atm.
end

function oRAOResurrection:oRA_PlayerNotResurrected( msg, author)
        -- we do nothing with these atm.
end

-------------------------
--  Utility Functions  --
-------------------------

function oRAOResurrection:DisableMonitor()
        self.enabled = nil
        if self.resframe and self.resframe:IsVisible() then self.resframe:Hide() end
        if self:IsEventRegistered("RosterLib_RosterChanged") then self:UnregisterEvent("RosterLib_RosterChanged") end
        self:UnregisterCheck("RES")
        self:UnregisterCheck("RESNO")
        self:UnregisterCheck("CANRES")
        self:UnregisterCheck("RESSED")
        self:UnregisterCheck("NORESSED")
end

function oRAOResurrection:SavePosition()
        local f = self.resframe
        local x,y = f:GetLeft(), f:GetTop()
        local s = f:GetEffectiveScale()
                
        x,y = x*s,y*s

        self.db.profile.posx = x
        self.db.profile.posy = y                
end

function oRAOResurrection:RestorePosition()
        local x = self.db.profile.posx
        local y = self.db.profile.posy
                
        if not x or not y then return end
                                
        local f = self.resframe
        local s = f:GetEffectiveScale()

        x,y = x/s,y/s

        f:ClearAllPoints()
        f:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", x, y)
end

function oRAOResurrection:SetupFrames()
        if not self.resframe then
                local resframe = CreateFrame("Frame", "oRAResurrectionFrame", UIParent)
                resframe:EnableMouse(true)
                resframe:SetMovable(true)
                resframe:RegisterForDrag("LeftButton")
                resframe:SetScript("OnDragStart", function() if IsAltKeyDown() then self["resframe"]:StartMoving() end end)
                resframe:SetScript("OnDragStop", function() self["resframe"]:StopMovingOrSizing() self:SavePosition() end)
                resframe:SetWidth(175)
                resframe:SetHeight(50)
                --resframe:SetBackdrop({
                --      bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", tile = true, tileSize = 16,
                --      edgeFile = "Interface\Tooltips\UI-Tooltip-Border", edgeSize = 16,
                --      insets = {left = 0, right = 0, top = 0, bottom = 0},
                --})
                --resframe:SetBackdropColor(0,0,0,0.5)
                --resframe:SetBackdropBorderColor(1,1,1,.5)
                resframe:Hide()
                resframe:SetPoint("CENTER", UIParent, "CENTER", 0, 0)

                local title = resframe:CreateFontString(nil, "ARTWORK")
                title:SetFontObject(GameFontNormalSmall)
                title:SetText(L["Resurrection Monitor"])
                title:SetJustifyH("CENTER")
                title:SetWidth(160)
                title:SetHeight(12)
                title:Show()
                title:ClearAllPoints()
                title:SetPoint("TOP", resframe, "TOP", 0, -5)

                local text = resframe:CreateFontString(nil, "ARTWORK")
                text:SetFontObject(GameFontHighlightSmall)
                text:SetJustifyH("CENTER")
                text:SetJustifyV("TOP")
                text:SetWidth(160)
                --text:SetHeight(25)
                text:Show()
                text:ClearAllPoints()
                text:SetPoint("TOPLEFT", title, "BOTTOMLEFT", 0, -5)

                self.resframe = resframe
                self.title = title
                self.text = text
                
                self:RestorePosition()
        end
end


function oRAOResurrection:UpdateFrame()
        if self.resframe and self.resframe:IsVisible() then
                local text = ""
                for key, val in pairs(self.ressers) do
                        if ( strlen(text) > 0 ) then
                                text = text.."\n"
                        end
                        text = string.format("%s %s: %s",text, key, val)
                end
                self.text:SetText(text)
                self.resframe:SetWidth(max(self.text:GetWidth()+15, 175))
                self.resframe:SetHeight(max(self.text:GetHeight()+25, 50))
        end
end

-------------------------
--  Command Handlers   --
-------------------------

function oRAOResurrection:ToggleView()
        self.db.profile.hidden = not self.db.profile.hidden
        if self.resframe and self.resframe:IsVisible() then
                self.resframe:Hide()
        end
        if self.enabled and not self.db.profile.hidden then
                if not self.resframe then self:SetupFrames() end
                self.resframe:Show()
        end
end