TradeSkillMaster/Core/Service/Banking/Util.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