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.
148 lines
5.1 KiB
148 lines
5.1 KiB
|
4 years ago
|
-- ------------------------------------------------------------------------------ --
|
||
|
|
-- 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
|