vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--  Titan Panel [Mail]
--  tekkub is the original creator of this mod
--  Bugfixes and updates by Larholm

-- Version information
local TITAN_MAIL_VERSION = 1.15;
-- Constants
TITAN_MAIL_ID = "Mail";
TITAN_MAIL_ID_RIGHT = "MailRight";
TITAN_MAIL_ICON_NOMAIL = "Interface\\Cursor\\UnableMail";
TITAN_MAIL_ICON_NEW = "Interface\\Cursor\\Mail";
TITAN_MAIL_ICON_AH = "Interface\\Cursor\\LootAll";
TITAN_MAIL_ICON_AH_ALT = "Interface\\Icons\\Spell_Holy_RighteousFury";
TITAN_MAIL_SOUND = "Interface\\AddOns\\TitanMail\\mail.wav";

--/script TitanMail_TestIcon("Interface\\Icons\\Spell_Nature_ThunderClap");
--/script TitanMail_TestIcon("Interface\\Icons\\Spell_Holy_RighteousFury");
--/script TitanMail_TestIcon("Interface\\HelpFrame\\OpenTicketIcon");
--/script TitanMail_TestIcon("Interface\\Icons\\INV_Letter_16");
--/script TitanMail_TestIcon("Interface\\Cursor\\Inspect");

TITAN_FORMAT_COUNT_MAIL = "%u/%u";
TITAN_FORMAT_COUNT_NOMAIL = "0";
TITAN_FORMAT_TEXTCOUNT_MAIL = "%s (%u/%u)";

-- Local variables
local TPM_numNew = 0;
local TPM_numTotal = 0;
local TPM_ignorenext = false;
local TPM_lastclose = 0;
local TPM_closedelay = 5;
local TPM_checkedmail = false;
local TPM_player = GetCVar("RealmName").. UnitName("player");
local TPM_debug = false;

-- Events that don't fire UPDATE_PENDING_MAIL like they should
local TPM_brokenEvents = {
                [ERR_AUCTION_WON_S] = false,
                [ERR_AUCTION_SOLD_S] = false,
                [ERR_AUCTION_OUTBID_S] = true,
                [ERR_AUCTION_EXPIRED_S] = false,
                [ERR_AUCTION_REMOVED_S] = false,
};

----------------------------------------------------------------------------------

function TPM_Debug(str)
        if (TPM_debug) then
                DEFAULT_CHAT_FRAME:AddMessage("|cffff00ff<Mail> ".. str);
        end
end

function TitanPanelMailButton_OnLoad()
        this.registry = { 
                id = TITAN_MAIL_ID,
                menuText = TITAN_MAIL_MENU_TEXT, 
                buttonTextFunction = "TitanPanelMailButton_GetButtonText", 
                tooltipTitle = TITAN_MAIL_TOOLTIP,
                tooltipTextFunction = "TitanPanelMailButton_GetTooltipText", 
                icon = TITAN_MAIL_ICON_NEW,     
                category = "Information",
                version = TITAN_MAIL_VERSION,
                iconWidth = 16,
                savedVariables = {
                        ShowIcon = 1,
                        ShowIconAlt = 0,
                        ShowCount = 1,
                        NoIconNoMail = 0,
                        ShowText = 1,
                        compact = 1,
                        hidemm = 1,
                        new = 0,
                        total = 0,
                        sound = 1,
                        chat = 1,
                }
        };
        
        this:RegisterEvent("VARIABLES_LOADED");
        this:RegisterEvent("CHAT_MSG_SYSTEM");
        this:RegisterEvent("MAIL_SHOW");
        this:RegisterEvent("MAIL_CLOSED");
        this:RegisterEvent("MAIL_INBOX_UPDATE");
        this:RegisterEvent("UPDATE_PENDING_MAIL");
        this:RegisterEvent("PLAYER_ENTERING_WORLD");
        if( DEFAULT_CHAT_FRAME ) then
                DEFAULT_CHAT_FRAME:AddMessage("Titan Panel [Mail] v"..TITAN_MAIL_VERSION.." loaded");
        end
end

function TitanPanelMailRightButton_OnLoad()
        this.registry = { 
                id = TITAN_MAIL_ID_RIGHT,
                menuText = TITAN_MAILRIGHT_MENU_TEXT, 
                buttonTextFunction = "TitanPanelMailButton_GetButtonText", 
                tooltipTitle = TITAN_MAIL_TOOLTIP,
                tooltipTextFunction = "TitanPanelMailButton_GetTooltipText", 
                icon = TITAN_MAIL_ICON_NEW,     
                version = TITAN_MAIL_VERSION,
                iconWidth = 16,
                category = "Information",
        };
end

function TitanPanelMailButton_UpdateIcon(forceAH)
        local hidemm = TitanGetVar(TITAN_MAIL_ID, "hidemm");
        local total = TitanGetVar(TITAN_MAIL_ID, "total");
        local iconshown = TitanGetVar(TITAN_MAIL_ID, "ShowIcon");
        local alticon = TitanGetVar(TITAN_MAIL_ID, "ShowIconAlt");
        local noiconnomail = TitanGetVar(TITAN_MAIL_ID, "NoIconNoMail");

        MiniMapMailFrame:Show();
        
        if (hidemm and MiniMapMailFrame:IsVisible()) then 
                MiniMapMailFrame:Hide(); 
        end

        local button = TitanUtils_GetButton(TITAN_MAIL_ID, true);
        local buttonR = TitanUtils_GetButton(TITAN_MAIL_ID_RIGHT, true);

        if (iconshown) then
--              TPM_Debug("Icon is shown");
        else
--              TPM_Debug("Icon is hidden");
        end

        
        if TITAN_MAIL_SETTINGS[TPM_player].ahalerts then
                if (alticon) then
                        button.registry.icon = TITAN_MAIL_ICON_AH_ALT;
                        buttonR.registry.icon = TITAN_MAIL_ICON_AH_ALT;
                else
                        button.registry.icon = TITAN_MAIL_ICON_AH;
                        buttonR.registry.icon = TITAN_MAIL_ICON_AH;
                end
        elseif ((total and (total > 0)) or (HasNewMail() and (not TPM_checkedmail))) then
                button.registry.icon = TITAN_MAIL_ICON_NEW;
                buttonR.registry.icon = TITAN_MAIL_ICON_NEW;
        elseif (noiconnomail) then
                button.registry.icon = "";
                buttonR.registry.icon = "";
        else
                button.registry.icon = TITAN_MAIL_ICON_NOMAIL;
                buttonR.registry.icon = TITAN_MAIL_ICON_NOMAIL;
        end
        if (forceAH) then
                if (alticon) then
                        button.registry.icon = TITAN_MAIL_ICON_AH_ALT;
                        buttonR.registry.icon = TITAN_MAIL_ICON_AH_ALT;
                else
                        button.registry.icon = TITAN_MAIL_ICON_AH;
                        buttonR.registry.icon = TITAN_MAIL_ICON_AH;
                end
        end
        TitanPanelButton_UpdateButton(TITAN_MAIL_ID);
        TitanPanelButton_UpdateButton(TITAN_MAIL_ID_RIGHT);
end

function TitanPanelMailButton_GetButtonText(id)
        local showt = TitanGetVar(TITAN_MAIL_ID, "ShowText");
        local showc = TitanGetVar(TITAN_MAIL_ID, "ShowCount");
        local new = TitanGetVar(TITAN_MAIL_ID, "new");
        local total = TitanGetVar(TITAN_MAIL_ID, "total");

        if (not total) then return; end

        local buttonRichText = "";
        
        if (showt and (not showc)) then
                if TITAN_MAIL_SETTINGS[TPM_player].ahalerts then
                        buttonRichText = TitanUtils_GetRedText(TITAN_MAIL_BUTTON_TEXT_ALERT);
                elseif ((total > 0) or (HasNewMail() and (not TPM_checkedmail))) then
                        buttonRichText = TitanUtils_GetGreenText(TITAN_MAIL_BUTTON_TEXT_MAIL);  
                else
                        buttonRichText = TitanUtils_GetNormalText(TITAN_MAIL_BUTTON_TEXT_NOMAIL);
                end
        elseif (showc and showt) then
                if TITAN_MAIL_SETTINGS[TPM_player].ahalerts then
                        buttonRichText = TitanUtils_GetRedText(string.format(TITAN_FORMAT_TEXTCOUNT_MAIL, TITAN_MAIL_BUTTON_TEXT_ALERT, new, total));
                elseif ((total > 0) or (HasNewMail() and (not TPM_checkedmail))) then
                        buttonRichText = TitanUtils_GetGreenText(string.format(TITAN_FORMAT_TEXTCOUNT_MAIL, TITAN_MAIL_BUTTON_TEXT_MAIL, new, total));  
                else
                        buttonRichText = TitanUtils_GetNormalText(TITAN_MAIL_BUTTON_TEXT_NOMAIL);
                end
        else
                if TITAN_MAIL_SETTINGS[TPM_player].ahalerts then
                        buttonRichText = TitanUtils_GetRedText(string.format(TITAN_FORMAT_COUNT_MAIL, new, total));
                elseif ((total > 0) or (HasNewMail() and (not TPM_checkedmail))) then
                        buttonRichText = TitanUtils_GetGreenText(string.format(TITAN_FORMAT_COUNT_MAIL, new, total));   
                else
                        buttonRichText = TitanUtils_GetNormalText(TITAN_FORMAT_COUNT_NOMAIL);
                end
        end
        return buttonRichText;
end

function TitanPanelMailButton_GetTooltipText()
        local retstr = "";
        local new = TitanGetVar(TITAN_MAIL_ID, "new");
        local total = TitanGetVar(TITAN_MAIL_ID, "total");
        
        if (total > 0) or (HasNewMail()) then
                retstr = retstr.. TITAN_MAIL_BUTTON_TEXT_MAIL.. "\n\n"; 
                retstr = retstr.. TitanUtils_GetGreenText(new.. TITAN_MAIL_TOOLTIP_NEW);
                retstr = retstr.. TitanUtils_GetNormalText(total.. TITAN_MAIL_TOOLTIP_TOTAL)
                
        else
                retstr = TITAN_MAIL_BUTTON_TEXT_NOMAIL; 
        end

        if TITAN_MAIL_SETTINGS[TPM_player].ahalerts then
                retstr = retstr.. "\n";
                for i=1,table.getn(TITAN_MAIL_SETTINGS[TPM_player].ahalerts) do
                        retstr = retstr.. "\n".. TITAN_MAIL_SETTINGS[TPM_player].ahalerts[i];
                end
        end
        
        return retstr;  
end

function TitanPanelMailButton_OnEvent()
        TPM_Debug(time().. " ".. event);
        if (event == "VARIABLES_LOADED") then
                if (not TITAN_MAIL_SETTINGS) then TITAN_MAIL_SETTINGS = {}; end
                if (not TITAN_MAIL_SETTINGS[TPM_player]) then TITAN_MAIL_SETTINGS[TPM_player] = {}; end
                TitanPanelMailButton_UpdateIcon(false);
        end
        if (event == "PLAYER_ENTERING_WORLD") then
                TPM_Debug("Ignoring next pending");
                TPM_ignorenext = true;
        end
        if (event == "CHAT_MSG_SYSTEM") then
                TitanMail_ReadAHMsg(arg1);
                TitanPanelMailButton_UpdateIcon(false);
        end
        if (event == "MAIL_SHOW") then
                TPM_checkedmail = true;
                TITAN_MAIL_SETTINGS[TPM_player].ahalerts = nil;
                TitanPanelMailButton_UpdateIcon(false);
        end
        if (event == "MAIL_CLOSED") then
                TPM_lastclose = time()
        end
        if ( event == "MAIL_INBOX_UPDATE" ) then
                TPM_Debug("Inbox: ".. GetInboxNumItems());
                TitanSetVar(TITAN_MAIL_ID, "new", 0);
                TitanSetVar(TITAN_MAIL_ID, "total", GetInboxNumItems());
                TitanPanelMailButton_UpdateIcon(false);
        end
        if ( event == "UPDATE_PENDING_MAIL" ) then
                if ((TPM_lastclose + TPM_closedelay) > time()) then 
                        TPM_Debug("Ignoring this pending");
                        TPM_ignorenext = true
                end
                if (HasNewMail()) then TPM_Debug("Has mail"); end
                TitanMail_IncNew()
                TitanPanelMailButton_UpdateIcon(false);
        end
end

function TitanMail_Debug(state)
        TPM_debug = state
end

function TitanMail_TestIcon(icon)
        local button = TitanUtils_GetButton(TITAN_MAIL_ID, true);
        button.registry.icon = icon;
        TitanPanelButton_UpdateButton(TITAN_MAIL_ID);
end

function TitanMail_TestInc(isAH)
        TitanMail_IncNew()
        if (isAH) then
                TitanPanelMailButton_UpdateIcon(true);
                PlaySound("AuctionWindowOpen");
        else
                TitanPanelMailButton_UpdateIcon(false);
                PlaySoundFile(TITAN_MAIL_SOUND);
        end
end

function TitanMail_IncNew()             
        if (TPM_ignorenext) then
                TPM_Debug("Ignoring that one");
                TPM_ignorenext = false;
        else
                local new = TitanGetVar(TITAN_MAIL_ID, "new") + 1;
                local total = TitanGetVar(TITAN_MAIL_ID, "total") + 1;
                
                if (TPM_checkedmail) then
                        total = GetInboxNumItems() + new;
                end
                        
                TitanSetVar(TITAN_MAIL_ID, "new", new)
                TitanSetVar(TITAN_MAIL_ID, "total", total)
                
                if (TitanGetVar(TITAN_MAIL_ID, "chat")) then
                        DEFAULT_CHAT_FRAME:AddMessage(TITAN_MAIL_CHAT_NEW.."("..new.."/"..total..")");
                end
                if (TitanGetVar(TITAN_MAIL_ID, "sound")) then 
                        PlaySoundFile(TITAN_MAIL_SOUND); 
                        TPM_Debug("Play Sound");
                end
                
        end
end

function TitanMail_ReadAHMsg(msg)
        local foundAH = false;
        local strset = {
                {ERR_AUCTION_WON_S, TITAN_MAIL_TOOLTIP_WON},
                {ERR_AUCTION_SOLD_S, TITAN_MAIL_TOOLTIP_SOLD},
                {ERR_AUCTION_OUTBID_S, TITAN_MAIL_TOOLTIP_OUTBID},
                {ERR_AUCTION_EXPIRED_S, TITAN_MAIL_TOOLTIP_EXPIRED},
                {ERR_AUCTION_REMOVED_S, TITAN_MAIL_TOOLTIP_CANCELLED},
        };
        
        for i,arr in strset do
                local searchstr = string.gsub(arr[1], "%%[^%s]+", "(.+)")
                local _, _, item = string.find(msg, searchstr)
                if (item) then 
                        if (not TITAN_MAIL_SETTINGS[TPM_player].ahalerts) then
                                TITAN_MAIL_SETTINGS[TPM_player].ahalerts = {};
                        end
                        tinsert(TITAN_MAIL_SETTINGS[TPM_player].ahalerts, arr[2].. item);
                        -- Increment our count if this is a bugged event
                        if (TPM_brokenEvents[arr[1]]) then
                                TitanMail_IncNew();
                                brokenevent = true;
                        end
                        foundAH = true;
                end
        end

        if (foundAH) then
                TPM_Debug("AH Mail");
                if (TitanGetVar(TITAN_MAIL_ID, "sound")) then 
                        --PlaySound("AuctionWindowOpen"); 
                        --TPM_Debug("Play Sound AH");
                end
        else
                TPM_Debug("Not an AH message.");
        end

end

function TitanPanelRightClickMenu_PrepareMailRightMenu()
        TitanMail_PrepareMenu(true)
end

function TitanPanelRightClickMenu_PrepareMailMenu()
        TitanMail_PrepareMenu()
end

function TitanMail_PrepareMenu(isright)
        local info;
        
        TitanPanelRightClickMenu_AddTitle(TitanPlugins[TITAN_MAIL_ID].menuText);
        TitanPanelRightClickMenu_AddSpacer();           

        info = {};
        info.text = TITAN_MAIL_MENU_HIDEMM;
        info.value = "hidemm";
        info.keepShownOnClick = 1;
        info.func = TitanMail_Toggle;
        info.checked = TitanGetVar(TITAN_MAIL_ID, "hidemm");
        UIDropDownMenu_AddButton(info);

        info = {};
        info.text = TITAN_MAIL_MENU_SOUND;
        info.value = "sound";
        info.func = TitanMail_Toggle;
        info.keepShownOnClick = 1;
        info.checked = TitanGetVar(TITAN_MAIL_ID, "sound");
        UIDropDownMenu_AddButton(info);

        info = {};
        info.text = TITAN_MAIL_MENU_CHAT;
        info.value = "chat";
        info.func = TitanMail_Toggle;
        info.keepShownOnClick = 1;
        info.checked = TitanGetVar(TITAN_MAIL_ID, "chat");
        UIDropDownMenu_AddButton(info);

        if (not isright) then
                TitanPanelRightClickMenu_AddSpacer();           
                local info = {};
                info.text = TITAN_PANEL_MENU_SHOW_ICON;
                info.value = "ShowIcon";
                info.func = TitanMail_Toggle;
                info.checked = TitanGetVar(TITAN_MAIL_ID, "ShowIcon");
                info.keepShownOnClick = 1;
                UIDropDownMenu_AddButton(info);

                info = {};
                info.text = TITAN_MAIL_MENU_STEXT;
                info.value = "ShowText";
                info.func = TitanMail_Toggle;
                info.checked = TitanGetVar(TITAN_MAIL_ID, "ShowText");
                info.keepShownOnClick = 1;
                UIDropDownMenu_AddButton(info);

                info = {};
                info.text = TITAN_MAIL_MENU_COUNT;
                info.value = "ShowCount";
                info.func = TitanMail_Toggle;
                info.keepShownOnClick = 1;
                info.checked = TitanGetVar(TITAN_MAIL_ID, "ShowCount");
                UIDropDownMenu_AddButton(info);
        end
        
        TitanPanelRightClickMenu_AddSpacer();           

        info = {};
        info.text = TITAN_MAIL_MENU_ALTICON;
        info.value = "ShowIconAlt";
        info.func = TitanMail_Toggle;
        info.keepShownOnClick = 1;
        info.checked = TitanGetVar(TITAN_MAIL_ID, "ShowIconAlt");
        UIDropDownMenu_AddButton(info);

        info = {};
        info.text = TITAN_MAIL_MENU_NOICONNOMAIL;
        info.value = "NoIconNoMail";
        info.func = TitanMail_Toggle;
        info.keepShownOnClick = 1;
        info.checked = TitanGetVar(TITAN_MAIL_ID, "NoIconNoMail");
        UIDropDownMenu_AddButton(info);

        TitanPanelRightClickMenu_AddSpacer();           

        if (isright) then
                TitanPanelRightClickMenu_AddCommand(TITAN_PANEL_MENU_HIDE, TITAN_MAIL_ID_RIGHT, TITAN_PANEL_MENU_FUNC_HIDE);
        else
                TitanPanelRightClickMenu_AddCommand(TITAN_PANEL_MENU_HIDE, TITAN_MAIL_ID, TITAN_PANEL_MENU_FUNC_HIDE);
        end

end

function TitanMail_Toggle()
        TitanToggleVar(TITAN_MAIL_ID, this.value);
        TitanPanelMailButton_UpdateIcon(false);
end

local function sorted_index(table)
    local index = {}
    for key in table do tinsert(index,key); end
    sort(index)
    return index
end