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
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
|
|
|