TradeSkillMaster/LibTSM/Service/Inventory.lua

150 lines
5.9 KiB
Lua

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
local _, TSM = ...
local Inventory = TSM.Init("Service.Inventory")
local ItemString = TSM.Include("Util.ItemString")
local Settings = TSM.Include("Service.Settings")
local CustomPrice = TSM.Include("Service.CustomPrice")
local BagTracking = TSM.Include("Service.BagTracking")
local AuctionTracking = TSM.Include("Service.AuctionTracking")
local MailTracking = TSM.Include("Service.MailTracking")
local Sync = TSM.Include("Service.Sync")
local private = {
settings = nil,
callbacks = {},
}
local PLAYER_NAME = UnitName("player")
-- ============================================================================
-- Module Loading
-- ============================================================================
Inventory:OnSettingsLoad(function()
private.settings = Settings.NewView()
:AddKey("factionrealm", "internalData", "pendingMail")
:AddKey("factionrealm", "coreOptions", "ignoreGuilds")
:AddKey("factionrealm", "internalData", "guildVaults")
BagTracking.RegisterCallback(private.QuantityChangedCallback)
AuctionTracking.RegisterCallback(private.QuantityChangedCallback)
MailTracking.RegisterCallback(private.QuantityChangedCallback)
Sync.RegisterMirrorCallback(private.QuantityChangedCallback)
end)
-- ============================================================================
-- Module Functions
-- ============================================================================
function Inventory.RegisterCallback(callback)
tinsert(private.callbacks, callback)
end
function Inventory.GetBagQuantity(itemString, character, factionrealm)
return private.InventoryQuantityHelper(itemString, "bagQuantity", character, factionrealm)
end
function Inventory.GetBankQuantity(itemString, character, factionrealm)
return private.InventoryQuantityHelper(itemString, "bankQuantity", character, factionrealm)
end
function Inventory.GetReagentBankQuantity(itemString, character, factionrealm)
return private.InventoryQuantityHelper(itemString, "reagentBankQuantity", character, factionrealm)
end
function Inventory.GetAuctionQuantity(itemString, character, factionrealm)
return private.InventoryQuantityHelper(itemString, "auctionQuantity", character, factionrealm)
end
function Inventory.GetMailQuantity(itemString, character, factionrealm)
itemString = ItemString.GetBaseFast(itemString)
character = character or PLAYER_NAME
local pendingQuantity = itemString and private.settings.pendingMail[character] and private.settings.pendingMail[character][itemString] or 0
return private.InventoryQuantityHelper(itemString, "mailQuantity", character, factionrealm) + pendingQuantity
end
function Inventory.GetGuildQuantity(itemString, guild)
itemString = ItemString.GetBase(itemString)
if not itemString then
return 0
end
guild = guild or (IsInGuild() and GetGuildInfo("player") or nil)
if not guild or private.settings.ignoreGuilds[guild] then
return 0
end
return private.settings.guildVaults[guild] and private.settings.guildVaults[guild][itemString] or 0
end
function Inventory.GetPlayerTotals(itemString)
itemString = ItemString.GetBaseFast(itemString)
local numPlayer, numAlts, numAuctions, numAltAuctions = 0, 0, 0, 0
numPlayer = numPlayer + Inventory.GetBagQuantity(itemString)
numPlayer = numPlayer + Inventory.GetBankQuantity(itemString)
numPlayer = numPlayer + Inventory.GetReagentBankQuantity(itemString)
numPlayer = numPlayer + Inventory.GetMailQuantity(itemString)
numAuctions = numAuctions + Inventory.GetAuctionQuantity(itemString)
for _, factionrealm, character in Settings.ConnectedFactionrealmAltCharacterIterator() do
numAlts = numAlts + Inventory.GetBagQuantity(itemString, character, factionrealm)
numAlts = numAlts + Inventory.GetBankQuantity(itemString, character, factionrealm)
numAlts = numAlts + Inventory.GetReagentBankQuantity(itemString, character, factionrealm)
numAlts = numAlts + Inventory.GetMailQuantity(itemString, character, factionrealm)
local auctionQuantity = Inventory.GetAuctionQuantity(itemString, character, factionrealm)
numAltAuctions = numAltAuctions + auctionQuantity
numAuctions = numAuctions + auctionQuantity
end
return numPlayer, numAlts, numAuctions, numAltAuctions
end
function Inventory.GetGuildTotal(itemString)
itemString = ItemString.GetBaseFast(itemString)
if not itemString then
return 0
end
local numGuild = 0
for guild, data in pairs(private.settings.guildVaults) do
if not private.settings.ignoreGuilds[guild] then
numGuild = numGuild + (data[itemString] or 0)
end
end
return numGuild
end
function Inventory.GetTotalQuantity(itemString)
local numPlayer, numAlts, numAuctions = Inventory.GetPlayerTotals(itemString)
local numGuild = Inventory.GetGuildTotal(itemString)
return numPlayer + numAlts + numAuctions + numGuild
end
-- ============================================================================
-- Private Helper Functions
-- ============================================================================
function private.GetCharacterInventoryData(settingKey, character, factionrealm)
local scopeKey = character and Settings.GetSyncScopeKeyByCharacter(character, factionrealm) or nil
return Settings.Get("sync", scopeKey, "internalData", settingKey)
end
function private.InventoryQuantityHelper(itemString, settingKey, character, factionrealm)
itemString = ItemString.GetBase(itemString)
if not itemString then
return 0
end
local tbl = private.GetCharacterInventoryData(settingKey, character, factionrealm)
return tbl and tbl[itemString] or 0
end
function private.QuantityChangedCallback()
CustomPrice.OnSourceChange("NumInventory")
for _, callback in ipairs(private.callbacks) do
callback()
end
end