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.

167 lines
6.4 KiB

local Postal = LibStub("AceAddon-3.0"):GetAddon("Postal")
local Postal_Forward = Postal:NewModule("Forward", "AceHook-3.0", "AceEvent-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("Postal")
Postal_Forward.description = L["Allows you to forward the contents of a mail."]
Postal_Forward.description2 = L[ [[|cFFFFCC00*|r Feature is not supported for mail sent with money attached or sent COD.
|cFFFFCC00*|r Feature is not supported for mail sent with stackable items attached.
|cFFFFCC00*|r Forward button will be disabled in these cases.]] ]
local PostalForwardTable = {}
function Postal_Forward:Postal_Forward_ForwardMailItemsEvent(event,...)
Postal_Forward_ForwardMailItems(2)
end
-- Create Forward button and hook OnClick event
function Postal_Forward:OnEnable()
if not PostalForwardButton then
PostalForwardButton = CreateFrame("Button", "OpenMailForwardButton", OpenMailFrame, "UIPanelButtonTemplate")
PostalForwardButton:SetWidth(82)
PostalForwardButton:SetHeight(22)
PostalForwardButton:SetPoint("RIGHT", "OpenMailReplyButton", "LEFT", 0, 0)
PostalForwardButton:SetText(L["Forward"])
PostalForwardButton:SetScript("OnClick", function() Postal_Forward_OpenMail_Forward() end)
PostalForwardButton:SetFrameLevel(PostalForwardButton:GetFrameLevel() + 1)
end
if OpenMailForwardButton then OpenMailForwardButton:Show() end
self:SecureHook("InboxFrame_OnClick", Postal_Forward_OpenMailFrameUpdated)
end
-- Disabling modules unregisters all events/hook automatically
function Postal_Forward:OnDisable()
Postal_Forward:UnregisterAllEvents()
if OpenMailForwardButton then OpenMailForwardButton:Hide() end
end
-- Check if table contains a specific value
local function contains(table, val)
for i=1,#table do
if table[i] == val then
return true
end
end
return false
end
-- Check if a mail message contains any stackable item attachments
local function ContainsStackableItem(messageindex)
local hasItem, itemID, itemIndex, itemStackCount
hasItem = select(8, GetInboxHeaderInfo(messageindex))
if hasItem == nil then return false end
for itemIndex = 1, ATTACHMENTS_MAX_SEND do
itemID = select(2, GetInboxItem(messageindex, itemIndex))
if itemID ~= nil then
itemStackCount = select(8,GetItemInfo(itemID))
if itemStackCount > 1 then return true end
end
end
return false
end
-- Calculate current bag free space
local function FreeBagSpace()
local bagID
local FreeSpace = 0
for bagID = 0, 4, 1 do
local numberOfFreeSlots, bagType
if Postal.WOWClassic or Postal.WOWBCClassic or Postal.WOWWotLKClassic then
numberOfFreeSlots, bagType = GetContainerNumFreeSlots(bagID)
else
numberOfFreeSlots, bagType = C_Container.GetContainerNumFreeSlots(bagID)
end
FreeSpace = FreeSpace + numberOfFreeSlots
end
return FreeSpace
end
-- Uses Containers free space tables to find and return location of latest item added to inventory
local function Postal_Inventory_Change(action)
local bagID, Key
local TempTable = {}
if action == 1 then -- take snap shot of current container free space tables and store
wipe(PostalForwardTable)
for bagID = 0, 4, 1 do
if Postal.WOWClassic or Postal.WOWBCClassic or Postal.WOWWotLKClassic then
table.insert(PostalForwardTable, GetContainerFreeSlots(bagID))
else
table.insert(PostalForwardTable, C_Container.GetContainerFreeSlots(bagID))
end
end
return 0, 0
end
if action == 2 then -- take new snap shot of current container free space tables and compared with stored one
wipe(TempTable)
for bagID = 0, 4, 1 do
if Postal.WOWClassic or Postal.WOWBCClassic or Postal.WOWWotLKClassic then
TempTable = GetContainerFreeSlots(bagID)
else
TempTable = C_Container.GetContainerFreeSlots(bagID)
end
for Key = 1, #PostalForwardTable[bagID + 1], 1 do
if not contains(TempTable, PostalForwardTable[bagID + 1][Key]) then
return bagID, PostalForwardTable[bagID + 1][Key]
end
end
end
end
end
-- Enable/Disable Forward button as appropriate for current selected mail
function Postal_Forward_OpenMailFrameUpdated()
if not OpenMailFrame:IsVisible() then return end
OpenMailForwardButton:Enable()
local packageIcon, stationeryIcon, sender, subject, money, CODAmount, daysLeft, hasItem, wasRead, wasReturned, textCreated, canReply, isGM = GetInboxHeaderInfo(InboxFrame.openMailID)
if hasItem == nil then hasItem = 0 end
-- Disable if mail contains money or was sent COD
if money > 0 or CODAmount > 0 then OpenMailForwardButton:Disable() end
-- Disable if mail attachments exceed current free bag space
if FreeBagSpace() - hasItem < 0 then OpenMailForwardButton:Disable() end
-- Disable if mail attachments are of stackable items
if ContainsStackableItem(InboxFrame.openMailID) then OpenMailForwardButton:Disable() end
end
-- Generate Forward mail
function Postal_Forward_OpenMail_Forward()
MailFrameTab_OnClick(nil, 2)
SendMailNameEditBox:SetText("")
local subject = OpenMailSubject:GetText()
local bodyText, stationeryID1, stationeryID2, isTakeable, isInvoice = GetInboxText(InboxFrame.openMailID);
local prefix = "FW: "
if (strsub(subject, 1, strlen(prefix)) ~= prefix) then
subject = prefix..subject
end
if subject then SendMailSubjectEditBox:SetText(subject) end
if bodyText then SendMailBodyEditBox:SetText(bodyText) end
SendMailNameEditBox:SetFocus()
Postal_Forward_ForwardMailItems(1)
end
-- Deal with attachments that need forwarded
function Postal_Forward_ForwardMailItems(action)
local bagID, itemID, itemIndex, hasItem
hasItem = select(8, GetInboxHeaderInfo(InboxFrame.openMailID))
if action == 1 then
if hasItem == nil then return end
for itemIndex = 1, ATTACHMENTS_MAX_SEND do
itemID = select(2, GetInboxItem(InboxFrame.openMailID, itemIndex))
if itemID then
Postal_Inventory_Change(1)
Postal_Forward:RegisterEvent("BAG_UPDATE_DELAYED","Postal_Forward_ForwardMailItemsEvent")
TakeInboxItem(InboxFrame.openMailID, itemIndex)
return
end
end
end
if action == 2 then
Postal_Forward:UnregisterEvent("BAG_UPDATE_DELAYED","Postal_Forward_ForwardMailItemsEvent")
bagID, itemIndex = Postal_Inventory_Change(2)
if Postal.WOWClassic or Postal.WOWBCClassic or Postal.WOWWotLKClassic then
PickupContainerItem(bagID, itemIndex)
else
C_Container.PickupContainerItem(bagID, itemIndex)
end
ClickSendMailItemButton()
Postal_Forward_ForwardMailItems(1)
return
end
end