You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

197 lines
6.7 KiB

local addonName, addonTable = ...
addonName = "Remix Mail Helper"
local XP_Calculation = _G.XP_Calculation
XP_Calculation:Initialize({
[224407] = "Normal",
[224408] = "Heroic",
[220763] = "Raid"
})
local InfoWindow = addonTable.InfoWindow
local threadsItemIDs = {
219264, 219273, 219282, 219261, 219270, 219279,
219258, 219267, 219276, 219263, 219272, 219281,
219260, 219269, 219278, 219257, 219266, 219275,
219262, 219271, 219280, 219259, 219268, 219277,
219256, 219265, 219274, 210989, 210985, 217722,
210983, 210982, 210990
}
local xpBonusItemIDs = {
[224407] = "Normal",
[224408] = "Heroic",
[220763] = "Raid"
}
function addonTable.CountItemsInMail()
local numItems = GetInboxNumItems()
local threadsCount = 0
local itemCount = 0
local xpCounts = { Normal = 0, Heroic = 0, Raid = 0 }
for mailIndex = 1, numItems do
for attachmentIndex = 1, ATTACHMENTS_MAX_RECEIVE do
local itemLink = GetInboxItemLink(mailIndex, attachmentIndex)
if itemLink then
local itemID = select(2, strsplit(":", itemLink))
itemID = tonumber(itemID)
local isThread = false
for _, id in ipairs(threadsItemIDs) do
if itemID == id then
isThread = true
break
end
end
local isXPItem = false
local quality = xpBonusItemIDs[itemID]
if quality then
xpCounts[quality] = xpCounts[quality] + 1
isXPItem = true
end
if isThread then
threadsCount = threadsCount + 1
elseif not isXPItem then
itemCount = itemCount + 1
end
end
end
end
return threadsCount, itemCount, xpCounts
end
local function RetrieveItemsFromMail(filterFunc)
local numItems = GetInboxNumItems()
local function ProcessNextMail(mailIndex, attachmentIndex)
if mailIndex > numItems then
InfoWindow:UpdateInfoText()
return
end
local itemLink = GetInboxItemLink(mailIndex, attachmentIndex)
if itemLink then
local itemID = select(2, strsplit(":", itemLink))
itemID = tonumber(itemID)
local isXPBonusItem = xpBonusItemIDs[itemID] ~= nil
if itemID and not isXPBonusItem and (not filterFunc or filterFunc(itemID)) then
TakeInboxItem(mailIndex, attachmentIndex)
end
end
attachmentIndex = attachmentIndex + 1
if attachmentIndex > ATTACHMENTS_MAX_RECEIVE then
mailIndex = mailIndex + 1
attachmentIndex = 1
end
C_Timer.After(0.1, function() ProcessNextMail(mailIndex, attachmentIndex) end)
end
ProcessNextMail(1, 1)
end
local function FilterThreads(itemID)
for _, id in ipairs(threadsItemIDs) do
if itemID == id then
return true
end
end
return false
end
local function SnapButtonFrameToMailFrame()
if MailFrame and ButtonFrame then
ButtonFrame:ClearAllPoints()
ButtonFrame:SetPoint("TOPLEFT", MailFrame, "TOPRIGHT", 10, 0)
end
end
local function CreateButtonFrame()
if not ButtonFrame then
ButtonFrame = CreateFrame("Frame", "ButtonFrame", MailFrame, "BasicFrameTemplateWithInset")
ButtonFrame:SetSize(150, 140)
ButtonFrame:SetPoint("TOPLEFT", MailFrame, "TOPRIGHT", 10, 0)
ButtonFrame:SetMovable(true)
ButtonFrame:EnableMouse(true)
ButtonFrame:RegisterForDrag("LeftButton")
ButtonFrame:SetScript("OnDragStart", ButtonFrame.StartMoving)
ButtonFrame:SetScript("OnDragStop", ButtonFrame.StopMovingOrSizing)
ButtonFrame.title = ButtonFrame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
ButtonFrame.title:SetPoint("CENTER", ButtonFrame.TitleBg, "CENTER", 0, 0)
ButtonFrame.title:SetText("Mail Helper")
end
end
local function ShowButtonFrame()
if ButtonFrame then
ButtonFrame:Show()
SnapButtonFrameToMailFrame()
end
end
local function HideButtonFrame()
if ButtonFrame then
ButtonFrame:Hide()
end
end
local function CreateButtons()
if not RetrieveItemsButton then
RetrieveItemsButton = CreateFrame("Button", "RetrieveItemsButton", ButtonFrame, "UIPanelButtonTemplate")
RetrieveItemsButton:SetSize(120, 30)
RetrieveItemsButton:SetPoint("TOP", ButtonFrame, "TOP", 0, -30)
RetrieveItemsButton:SetText("Retrieve Items")
RetrieveItemsButton:SetScript("OnClick", function() RetrieveItemsFromMail() end)
end
if not RetrieveThreadsButton then
RetrieveThreadsButton = CreateFrame("Button", "RetrieveThreadsButton", ButtonFrame, "UIPanelButtonTemplate")
RetrieveThreadsButton:SetSize(120, 30)
RetrieveThreadsButton:SetPoint("TOP", RetrieveItemsButton, "BOTTOM", 0, -5)
RetrieveThreadsButton:SetText("Retrieve Threads")
RetrieveThreadsButton:SetScript("OnClick", function() RetrieveItemsFromMail(FilterThreads) end)
end
if not InfoButton then
InfoButton = CreateFrame("Button", "InfoButton", ButtonFrame, "UIPanelButtonTemplate")
InfoButton:SetSize(120, 30)
InfoButton:SetPoint("TOP", RetrieveThreadsButton, "BOTTOM", 0, -5)
InfoButton:SetText("Show More Info")
InfoButton:SetScript("OnClick", function() InfoWindow:ToggleInfoText() end)
end
end
local mailFrameLastPos = { MailFrame:GetLeft(), MailFrame:GetTop() }
local function CheckMailFramePosition()
local currentPos = { MailFrame:GetLeft(), MailFrame:GetTop() }
if mailFrameLastPos[1] ~= currentPos[1] or mailFrameLastPos[2] ~= currentPos[2] then
SnapButtonFrameToMailFrame()
mailFrameLastPos = currentPos
end
end
local eventFrame = CreateFrame("Frame")
eventFrame:RegisterEvent("MAIL_SHOW")
eventFrame:RegisterEvent("MAIL_INBOX_UPDATE")
eventFrame:RegisterEvent("MAIL_CLOSED")
eventFrame:SetScript("OnEvent", function(self, event, ...)
if event == "MAIL_SHOW" then
CreateButtonFrame()
CreateButtons()
ShowButtonFrame()
InfoWindow:CreateInfoText()
InfoWindow:UpdateInfoText()
self:SetScript("OnUpdate", CheckMailFramePosition)
elseif event == "MAIL_INBOX_UPDATE" then
InfoWindow:UpdateInfoText()
elseif event == "MAIL_CLOSED" then
HideButtonFrame()
self:SetScript("OnUpdate", nil)
end
end)