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.

147 lines
5.1 KiB

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster_Mailing --
-- http://www.curse.com/addons/wow/tradeskillmaster_mailing --
-- --
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
-- All Rights Reserved* - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
local TSM = select(2, ...)
local Groups = TSM:NewModule("Groups", "AceEvent-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Mailing") -- loads the localization table
local private = {}
function Groups:CreateTab(parent)
local frame = CreateFrame("Frame", nil, parent)
frame:Hide()
frame:SetAllPoints()
frame:SetScript("OnHide", function()
TSMAPI:CancelFrame("mailingGroupsRepeat")
end)
local stContainer = CreateFrame("Frame", nil, frame)
stContainer:SetPoint("TOPLEFT", 5, -5)
stContainer:SetPoint("BOTTOMRIGHT", -5, 35)
TSMAPI.Design:SetFrameColor(stContainer)
frame.groupTree = TSMAPI:CreateGroupTree(stContainer, "Mailing", "Mailing_Send")
local function OnButtonClick(self)
if IsShiftKeyDown() then
TSMAPI:CreateTimeDelay("mailingResendDelay", 0.1, private.StartSending, TSM.db.global.resendDelay * 60)
else
private:StartSending()
end
end
Groups:RegisterEvent("MAIL_CLOSED", function() TSMAPI:CancelFrame("mailingResendDelay") end)
local button = TSMAPI.GUI:CreateButton(frame, 15)
button:SetPoint("BOTTOMLEFT", 5, 5)
button:SetPoint("BOTTOMRIGHT", -5, 5)
button:SetHeight(25)
button:SetText(L["Mail Selected Groups"])
button:SetScript("OnClick", OnButtonClick)
button.tooltip = L["Shift-Click to automatically re-send after the amount of time specified in the TSM_Mailing options."]
frame.button = button
private.frame = frame
return frame
end
local badOperations = {}
function private:ValidateOperation(operation, operationName)
if not operation then return end
if operation.target == "" then
-- operation is invalid (no target)
if not badOperations[operationName] then
TSM:Printf(L["Skipping operation '%s' because there is no target."], operationName)
badOperations[operationName] = true
end
return
end
return true
end
function private:StartSending()
if private.isSending then return end
-- get a table of how many of each item we have in our bags
local inventoryItems = {}
for bag, slot, itemString, quantity, locked in TSMAPI:GetBagIterator(true) do
inventoryItems[itemString] = (inventoryItems[itemString] or 0) + quantity
end
local badOperations = {}
local targets = {}
for _, data in pairs(private.frame.groupTree:GetSelectedGroupInfo()) do
for _, operationName in ipairs(data.operations) do
TSMAPI:UpdateOperation("Mailing", operationName)
local operation = TSM.operations[operationName]
if private:ValidateOperation(operation, operationName) then
-- operation is valid
for itemString in pairs(data.items) do
local numAvailable = (inventoryItems[itemString] or 0) - operation.keepQty
if numAvailable > 0 then
local quantity = 0
if operation.maxQtyEnabled then
if TSMAPI:IsPlayer(operation.target) or not operation.restock then
quantity = min(numAvailable, operation.maxQty)
else
local targetQty = private:GetTargetQuantity(operation.target, itemString, operation.restockGBank)
quantity = min(numAvailable, operation.maxQty - targetQty)
end
else
quantity = numAvailable
end
if quantity > 0 then
inventoryItems[itemString] = inventoryItems[itemString] - quantity
targets[operation.target] = targets[operation.target] or {}
targets[operation.target][itemString] = quantity
end
end
end
end
end
end
for target in pairs(targets) do
if TSMAPI:IsPlayer(target) then
targets[target] = nil
end
end
private.targets = targets
private:SendNextTarget()
end
function private:GetTargetQuantity(player, itemString, includeGBank)
local num = 0
num = num + ((TSMAPI:ModuleAPI("ItemTracker", "playerbags", player, true) or {})[itemString] or 0)
num = num + ((TSMAPI:ModuleAPI("ItemTracker", "playerbank", player, true) or {})[itemString] or 0)
num = num + ((TSMAPI:ModuleAPI("ItemTracker", "playermail", player, true) or {})[itemString] or 0)
num = num + ((TSMAPI:ModuleAPI("ItemTracker", "playerauctions", player, true) or {})[itemString] or 0)
if includeGBank then
num = num + (TSMAPI:ModuleAPI("ItemTracker", "playerguildtotal", itemString, player) or 0)
end
return num
end
function private:SendNextTarget()
local target, items = next(private.targets)
if not target then
private.frame.button:SetText(L["Mail Selected Groups"])
private.frame.button:Enable()
private.isSending = nil
TSM:Print(L["Done sending mail."])
return
end
private.isSending = true
private.targets[target] = nil
private.frame.button:SetText(L["Sending..."])
private.frame.button:Disable()
if not TSM.AutoMail:SendItems(items, target, private.SendNextTarget) then
private:SendNextTarget()
end
end