116 lines
4.0 KiB
Lua
116 lines
4.0 KiB
Lua
-- ------------------------------------------------------------------------------ --
|
|
-- TradeSkillMaster --
|
|
-- https://tradeskillmaster.com --
|
|
-- All Rights Reserved - Detailed license information included with addon. --
|
|
-- ------------------------------------------------------------------------------ --
|
|
|
|
local _, TSM = ...
|
|
local Util = TSM.Banking:NewPackage("Util")
|
|
local TempTable = TSM.Include("Util.TempTable")
|
|
local BagTracking = TSM.Include("Service.BagTracking")
|
|
local GuildTracking = TSM.Include("Service.GuildTracking")
|
|
local private = {}
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- Module Functions
|
|
-- ============================================================================
|
|
|
|
function Util.BagIterator(autoBaseItems)
|
|
local query = BagTracking.CreateQueryBags()
|
|
:OrderBy("slotId", true)
|
|
if autoBaseItems then
|
|
query:VirtualField("autoBaseItemString", "string", TSM.Groups.TranslateItemString, "itemString")
|
|
:Select("bag", "slot", "autoBaseItemString", "quantity")
|
|
else
|
|
query:Select("bag", "slot", "itemString", "quantity")
|
|
end
|
|
if TSM.Banking.IsGuildBankOpen() then
|
|
query:Equal("isBoP", false)
|
|
:Equal("isBoA", false)
|
|
end
|
|
return query:IteratorAndRelease()
|
|
end
|
|
|
|
function Util.OpenBankIterator(autoBaseItems)
|
|
if TSM.Banking.IsGuildBankOpen() then
|
|
local query = GuildTracking.CreateQuery()
|
|
if autoBaseItems then
|
|
query:VirtualField("autoBaseItemString", "string", TSM.Groups.TranslateItemString, "itemString")
|
|
:Select("tab", "slot", "autoBaseItemString", "quantity")
|
|
else
|
|
query:Select("tab", "slot", "itemString", "quantity")
|
|
end
|
|
return query:IteratorAndRelease()
|
|
else
|
|
local query = BagTracking.CreateQueryBank()
|
|
:OrderBy("slotId", true)
|
|
if autoBaseItems then
|
|
query:VirtualField("autoBaseItemString", "string", TSM.Groups.TranslateItemString, "itemString")
|
|
:Select("bag", "slot", "autoBaseItemString", "quantity")
|
|
else
|
|
query:Select("bag", "slot", "itemString", "quantity")
|
|
end
|
|
return query:IteratorAndRelease()
|
|
end
|
|
end
|
|
|
|
function Util.PopulateGroupItemsFromBags(items, groups, getNumFunc, ...)
|
|
local itemQuantity = TempTable.Acquire()
|
|
for _, _, _, itemString, quantity in Util.BagIterator(true) do
|
|
if private.InGroups(itemString, groups) then
|
|
itemQuantity[itemString] = (itemQuantity[itemString] or 0) + quantity
|
|
end
|
|
end
|
|
for itemString, numHave in pairs(itemQuantity) do
|
|
local numToMove = getNumFunc(itemString, numHave, ...)
|
|
if numToMove > 0 then
|
|
items[itemString] = numToMove
|
|
end
|
|
end
|
|
TempTable.Release(itemQuantity)
|
|
end
|
|
|
|
function Util.PopulateGroupItemsFromOpenBank(items, groups, getNumFunc, ...)
|
|
local itemQuantity = TempTable.Acquire()
|
|
for _, _, _, itemString, quantity in Util.OpenBankIterator(true) do
|
|
if private.InGroups(itemString, groups) then
|
|
itemQuantity[itemString] = (itemQuantity[itemString] or 0) + quantity
|
|
end
|
|
end
|
|
for itemString, numHave in pairs(itemQuantity) do
|
|
local numToMove = getNumFunc(itemString, numHave, ...)
|
|
if numToMove > 0 then
|
|
items[itemString] = numToMove
|
|
end
|
|
end
|
|
TempTable.Release(itemQuantity)
|
|
end
|
|
|
|
function Util.PopulateItemsFromBags(items, getNumFunc, ...)
|
|
local itemQuantity = TempTable.Acquire()
|
|
for _, _, _, itemString, quantity in Util.BagIterator(true) do
|
|
itemQuantity[itemString] = (itemQuantity[itemString] or 0) + quantity
|
|
end
|
|
for itemString, numHave in pairs(itemQuantity) do
|
|
local numToMove = getNumFunc(itemString, numHave, ...)
|
|
if numToMove > 0 then
|
|
items[itemString] = numToMove
|
|
end
|
|
end
|
|
TempTable.Release(itemQuantity)
|
|
end
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- Private Helper Functions
|
|
-- ============================================================================
|
|
|
|
function private.InGroups(itemString, groups)
|
|
local groupPath = TSM.Groups.GetPathByItem(itemString)
|
|
-- TODO: support the base group
|
|
return groupPath and groupPath ~= TSM.CONST.ROOT_GROUP_PATH and groups[groupPath]
|
|
end
|