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.

297 lines
11 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, 210987, 210984, 210986
}
local xpBonusItemIDs = {
[224407] = "Normal",
[224408] = "Heroic",
[220763] = "Raid"
}
local gemItemIDs = {
221977, 218003, 219389, 220371, 219386, 216632, 219516, 220367,
220211, 218046, 216648, 210715, 220117, 218005, 216651, 210714,
216663, 218110, 216650, 211109, 216711, 218082, 212749, 210717,
216671, 216630, 212916, 210716, 220120, 218045, 217957, 210681,
219878, 218108, 216626, 221982, 218044, 212362, 216695, 217983,
216624, 216631, 212758, 217989, 216647, 218043, 212760, 216629,
216627, 218004, 216628, 218109, 217961, 219818, 219944, 217903,
219523, 216649, 219801, 217964, 219777, 212694, 219527, 212759,
217927, 212366, 219817, 219452, 216625, 212361, 212365, 217907
}
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 co
local function StartLootCoroutine()
co = coroutine.create(function()
local numItems = GetInboxNumItems()
local looted
repeat
looted = false
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 isXPBonusItem = xpBonusItemIDs[itemID] ~= nil
local isThreadItem = false
for _, threadID in ipairs(threadsItemIDs) do
if itemID == threadID then
isThreadItem = true
break
end
end
if itemID and ((filterFunc and filterFunc(itemID)) or (not filterFunc and not isXPBonusItem and not isThreadItem)) then
TakeInboxItem(mailIndex, attachmentIndex)
looted = true
coroutine.yield()
end
end
end
end
until not looted
InfoWindow:UpdateInfoText()
end)
local frame = CreateFrame("Frame")
frame:SetScript("OnUpdate", function()
if coroutine.status(co) ~= "dead" then
local success, result = coroutine.resume(co)
if not success then
print("Error in coroutine: " .. result)
end
else
frame:SetScript("OnUpdate", nil)
end
end)
end
StartLootCoroutine()
end
local function FilterThreads(itemID)
for _, id in ipairs(threadsItemIDs) do
if itemID == id then
return true
end
end
return false
end
local function FilterXPItems(itemID)
return xpBonusItemIDs[itemID] ~= nil
end
local function FilterGems(itemID)
for _, id in ipairs(gemItemIDs) 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, 210) -- Adjusted size to accommodate additional button
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 RetrieveThreadsButton then
RetrieveThreadsButton = CreateFrame("Button", "RetrieveThreadsButton", ButtonFrame, "UIPanelButtonTemplate")
RetrieveThreadsButton:SetSize(120, 30)
RetrieveThreadsButton:SetPoint("TOP", ButtonFrame, "TOP", 0, -30)
RetrieveThreadsButton:SetText("Retrieve Threads")
RetrieveThreadsButton:SetScript("OnClick", function() RetrieveItemsFromMail(FilterThreads) end)
end
if not RetrieveItemsButton then
RetrieveItemsButton = CreateFrame("Button", "RetrieveItemsButton", ButtonFrame, "UIPanelButtonTemplate")
RetrieveItemsButton:SetSize(120, 30)
RetrieveItemsButton:SetPoint("TOP", RetrieveThreadsButton, "BOTTOM", 0, -5)
RetrieveItemsButton:SetText("Retrieve Items")
RetrieveItemsButton:SetScript("OnClick", function() RetrieveItemsFromMail() end)
end
if not RetrieveXPButton then
RetrieveXPButton = CreateFrame("Button", "RetrieveXPButton", ButtonFrame, "UIPanelButtonTemplate")
RetrieveXPButton:SetSize(120, 30)
RetrieveXPButton:SetPoint("TOP", RetrieveItemsButton, "BOTTOM", 0, -5)
RetrieveXPButton:SetText("Retrieve XP")
RetrieveXPButton:SetScript("OnClick", function()
StaticPopupDialogs["CONFIRM_LOOT_XP_ITEMS"] = {
text = "Are you sure you want to loot all XP items?",
button1 = "Yes",
button2 = "No",
OnAccept = function()
RetrieveItemsFromMail(FilterXPItems)
end,
timeout = 0,
whileDead = true,
hideOnEscape = true,
preferredIndex = 3,
}
StaticPopup_Show("CONFIRM_LOOT_XP_ITEMS")
end)
end
if not RetrieveGemsButton then
RetrieveGemsButton = CreateFrame("Button", "RetrieveGemsButton", ButtonFrame, "UIPanelButtonTemplate")
RetrieveGemsButton:SetSize(120, 30)
RetrieveGemsButton:SetPoint("TOP", RetrieveXPButton, "BOTTOM", 0, -5)
RetrieveGemsButton:SetText("Retrieve Gems")
RetrieveGemsButton:SetScript("OnClick", function() RetrieveItemsFromMail(FilterGems) end)
end
if not InfoButton then
InfoButton = CreateFrame("Button", "InfoButton", ButtonFrame, "UIPanelButtonTemplate")
InfoButton:SetSize(120, 30)
InfoButton:SetPoint("TOP", RetrieveGemsButton, "BOTTOM", 0, -5)
InfoButton:SetText("XP Calculation")
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)
function InfoWindow:CreateInfoText()
if not InfoTextFrame then
InfoTextFrame = CreateFrame("Frame", "InfoTextFrame", MailFrame)
InfoTextFrame:SetSize(300, 100)
InfoTextFrame:SetPoint("TOPLEFT", ButtonFrame, "BOTTOMLEFT", 0, -10)
InfoTextFrame.mainInfoText = InfoTextFrame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
InfoTextFrame.mainInfoText:SetPoint("TOPLEFT", InfoTextFrame, "TOPLEFT", 10, -10)
InfoTextFrame.mainInfoText:SetJustifyH("LEFT")
InfoTextFrame.mainInfoText:SetJustifyV("TOP")
InfoTextFrame.mainInfoText:SetTextColor(1, 1, 1, 1)
InfoTextFrame.experimentalInfoText = InfoTextFrame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
InfoTextFrame.experimentalInfoText:SetPoint("TOPLEFT", InfoTextFrame.mainInfoText, "BOTTOMLEFT", 0, -10)
InfoTextFrame.experimentalInfoText:SetJustifyH("LEFT")
InfoTextFrame.experimentalInfoText:SetJustifyV("TOP")
InfoTextFrame.experimentalInfoText:SetTextColor(1, 1, 1, 1)
InfoTextFrame.experimentalInfoText:Hide()
end
end