Added personal and realm bank implementations (#27)

* added personal and realm bank implementations

* fix gathering from personal and realm banks

* faster gathering from personal and realm banks

* Fix Profession Multiselect on Gathering window

* cleaner GetAscensionBankType function

* craft queue update
This commit is contained in:
Kian Soltani
2026-02-16 16:12:24 +01:00
committed by GitHub
parent 8a6c8fd3a2
commit 4a03ece3d3
10 changed files with 688 additions and 387 deletions
@@ -14,9 +14,13 @@ local L = LibStub("AceLocale-3.0"):NewLocale("TradeSkillMaster_ItemTracker", "en
if not L then return end
L["%s (%s bags, %s bank, %s AH, %s mail)"] = true
L["%s (%s bags, %s bank, %s AH, %s mail, %s personal)"] = true
L["%s in guild bank"] = true
L["%s in realm bank"] = true
L["%s item(s) total"] = true
L["(%s player, %s alts, %s guild banks, %s AH)"] = true
L["(%s player, %s alts, %s guild, %s AH, %s personal, %s realm)"] = true
L["Realm Bank"] = true
L["AH"] = true
L["Bags"] = true
L["Bank"] = true
+94 -16
View File
@@ -78,12 +78,32 @@ function Data:ThrottleEvent(event)
throttleFrames[event]:Show()
end
local BANK_TYPE_PERSONAL = "personal"
local BANK_TYPE_REALM = "realm"
local BANK_TYPE_GUILD = "guild"
local function GetCurrentBankType()
if GuildBankFrame and GuildBankFrame.IsPersonalBank then
return BANK_TYPE_PERSONAL
elseif GuildBankFrame and GuildBankFrame.IsRealmBank then
return BANK_TYPE_REALM
else
return BANK_TYPE_GUILD
end
end
-- Store the current bank type when opened (persists until next open)
local currentOpenBankType = nil
function Data:EventHandler(event, fire)
if isScanning then return end
if fire ~= "FIRE" then
Data:ThrottleEvent(event)
else
if event == "GUILDBANKFRAME_OPENED" then
-- Detect and store the bank type
currentOpenBankType = GetCurrentBankType()
-- Query all tabs of the gbank to ensure all tabs will be scanned.
local initialTab = GetCurrentGuildBankTab()
for tab = 1, GetNumGuildBankTabs() do
@@ -93,7 +113,14 @@ function Data:EventHandler(event, fire)
end
QueryGuildBankTab(initialTab)
elseif event == "GUILDBANKBAGSLOTS_CHANGED" then
Data:GetGuildBankData()
-- Route to the appropriate handler based on bank type
if currentOpenBankType == BANK_TYPE_PERSONAL then
Data:GetPersonalBankData()
elseif currentOpenBankType == BANK_TYPE_REALM then
Data:GetRealmBankData()
else
Data:GetGuildBankData()
end
elseif event == "AUCTION_OWNED_LIST_UPDATE" then
Data:ScanPlayerAuctions()
end
@@ -128,7 +155,32 @@ function Data:GetBankData(state)
TSM.Sync:BroadcastUpdateRequest()
end
-- scan the guild bank
-- Helper function to scan all guild bank slots and return items table
local function ScanGuildBankSlots()
local items = {}
local numTabs = GetNumGuildBankTabs()
for tab = 1, numTabs do
local name, icon, isViewable, canDeposit, numWithdrawals = GetGuildBankTabInfo(tab)
-- Ascension WoW: For Personal/Realm banks, always scan (numWithdrawals check may not apply)
local canAccess = (numWithdrawals and numWithdrawals > 0) or IsGuildLeader(UnitName("player")) or (name == "Personal Bank") or (name == "Realm Bank")
if canAccess then
for slot = 1, MAX_GUILDBANK_SLOTS_PER_TAB or 98 do
local itemString = TSMAPI:GetItemString(GetGuildBankItemLink(tab, slot))
local baseItemString = TSMAPI:GetBaseItemString(GetGuildBankItemLink(tab, slot))
if itemString then
local quantity = select(2, GetGuildBankItemInfo(tab, slot))
items[itemString] = (items[itemString] or 0) + quantity
if itemString ~= baseItemString then
items[baseItemString] = (items[baseItemString] or 0) + quantity
end
end
end
end
end
return items
end
-- scan the guild bank (real guild bank only)
function Data:GetGuildBankData()
if not TSM.CURRENT_GUILD then
Data:StoreCurrentGuildInfo(true)
@@ -136,27 +188,53 @@ function Data:GetGuildBankData()
end
wipe(TSM.guilds[TSM.CURRENT_GUILD].items)
for tab = 1, GetNumGuildBankTabs() do
if select(5, GetGuildBankTabInfo(tab)) > 0 or IsGuildLeader(UnitName("player")) then
for slot = 1, MAX_GUILDBANK_SLOTS_PER_TAB or 98 do
local itemString = TSMAPI:GetItemString(GetGuildBankItemLink(tab, slot))
local baseItemString = TSMAPI:GetBaseItemString(GetGuildBankItemLink(tab, slot))
if itemString then
local quantity = select(2, GetGuildBankItemInfo(tab, slot))
TSM.guilds[TSM.CURRENT_GUILD].items[itemString] = (TSM.guilds[TSM.CURRENT_GUILD].items[itemString] or 0) + quantity
if itemString ~= baseItemString then
TSM.guilds[TSM.CURRENT_GUILD].items[baseItemString] = (TSM.guilds[TSM.CURRENT_GUILD].items[baseItemString] or 0) + quantity
end
end
end
end
local items = ScanGuildBankSlots()
for itemString, quantity in pairs(items) do
TSM.guilds[TSM.CURRENT_GUILD].items[itemString] = quantity
end
if GuildBankFrame and GuildBankFrame:IsVisible() then
TSM.guilds[TSM.CURRENT_GUILD].lastUpdate = time()
end
TSM.Sync:BroadcastUpdateRequest()
end
-- Ascension WoW: scan the personal bank (per character)
function Data:GetPersonalBankData()
-- Initialize personal bank for current player if needed
if not TSM.personalBanks[TSM.CURRENT_PLAYER] then
TSM.personalBanks[TSM.CURRENT_PLAYER] = { items = {}, lastUpdate = 0 }
end
wipe(TSM.personalBanks[TSM.CURRENT_PLAYER].items)
local items = ScanGuildBankSlots()
for itemString, quantity in pairs(items) do
TSM.personalBanks[TSM.CURRENT_PLAYER].items[itemString] = quantity
end
TSM.personalBanks[TSM.CURRENT_PLAYER].lastUpdate = time()
TSM.Sync:BroadcastUpdateRequest()
end
-- Ascension WoW: scan the realm bank (shared across realm)
function Data:GetRealmBankData()
-- Initialize realm bank if needed
if not TSM.realmBank.items then
TSM.realmBank.items = {}
end
wipe(TSM.realmBank.items)
local items = ScanGuildBankSlots()
for itemString, quantity in pairs(items) do
TSM.realmBank.items[itemString] = quantity
end
if GuildBankFrame and GuildBankFrame:IsVisible() then
TSM.realmBank.lastUpdate = time()
end
TSM.Sync:BroadcastUpdateRequest()
end
function Data:ScanPlayerAuctions()
wipe(TSM.characters[TSM.CURRENT_PLAYER].auctions)
TSM.characters[TSM.CURRENT_PLAYER].auctions.time = time()
@@ -13,7 +13,7 @@ local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_ItemTracker")
-- default values for the savedDB
local savedDBDefaults = {
-- any global
-- any global
global = {
tooltip = "simple",
},
@@ -23,6 +23,10 @@ local savedDBDefaults = {
characters = {},
guilds = {},
ignoreGuilds = {},
-- Ascension WoW: Personal banks (per character, stored by character name)
personalBanks = {},
-- Ascension WoW: Realm bank (shared across all characters on realm)
realmBank = { items = {}, lastUpdate = 0 },
},
-- data that is stored per user profile
@@ -47,6 +51,11 @@ local guildDefaults = {
items = {},
lastUpdate = 0,
}
-- Ascension WoW: Personal bank defaults (same structure as guild)
local personalBankDefaults = {
items = {},
lastUpdate = 0,
}
-- Called once the player has loaded into the game
-- Anything that needs to be done in order to initialize the addon should go here
@@ -58,9 +67,12 @@ function TSM:OnInitialize()
-- load the saved variables table into TSM.db
TSM.db = LibStub:GetLibrary("AceDB-3.0"):New("AscensionTSM_ItemTrackerDB", savedDBDefaults, true)
TSM.characters = TSM.db.realm.characters
TSM.guilds = TSM.db.realm.guilds
-- Ascension WoW: Personal banks and realm bank
TSM.personalBanks = TSM.db.realm.personalBanks
TSM.realmBank = TSM.db.realm.realmBank
-- handle connected realms for characters
local connectedRealms = TSMAPI.GetConnectedRealms and TSMAPI:GetConnectedRealms() or {}
@@ -117,6 +129,11 @@ function TSM:OnInitialize()
for _, guildData in pairs(TSM.guilds) do
ClearItemIDs(guildData.items)
end
-- Ascension WoW: Clean up personal banks and realm bank
for _, personalBankData in pairs(TSM.personalBanks) do
ClearItemIDs(personalBankData.items)
end
ClearItemIDs(TSM.realmBank.items)
TSM.Data:Initialize()
TSM:UpdatePlayerLookup()
@@ -151,6 +168,11 @@ function TSM:RegisterModule()
{ key = "guildtotal", callback = "GetGuildTotal" },
{ key = "playerguildtotal", callback = "GetPlayerGuildTotal" },
{ key = "playerguild", callback = "GetPlayerGuild" },
-- Ascension WoW: Personal banks and realm bank APIs
{ key = "personalbank", callback = "GetPersonalBank" },
{ key = "realmbank", callback = "GetRealmBank" },
{ key = "personalbankstotal", callback = "GetPersonalBanksTotal" },
{ key = "realmbanktotal", callback = "GetRealmBankTotal" },
}
--TSM.sync = { callback = "Sync:Callback" }
TSM.tooltipOptions = { callback = "Config:LoadTooltipOptions" }
@@ -169,9 +191,18 @@ function TSM:GetTooltip(itemString)
local player, alts = TSM:GetPlayerTotal(itemString)
local guild = TSM:GetGuildTotal(itemString)
local auctions = TSM:GetAuctionsTotal(itemString)
grandTotal = grandTotal + player + alts + guild + auctions
-- Ascension WoW: Add personal banks and realm bank
local personalBanks = TSM:GetPersonalBanksTotal(itemString)
local realmBank = TSM:GetRealmBankTotal(itemString)
grandTotal = grandTotal + player + alts + guild + auctions + personalBanks + realmBank
if grandTotal > 0 then
tinsert(text, { left = " " .. "ItemTracker:", right = format(L["(%s player, %s alts, %s guild banks, %s AH)"], "|cffffffff" .. player .. "|r", "|cffffffff" .. alts .. "|r", "|cffffffff" .. guild .. "|r", "|cffffffff" .. auctions .. "|r") })
tinsert(text, { left = " " .. "ItemTracker:", right = format(L["(%s player, %s alts, %s guild, %s AH, %s personal, %s realm)"],
"|cffffffff" .. player .. "|r",
"|cffffffff" .. alts .. "|r",
"|cffffffff" .. guild .. "|r",
"|cffffffff" .. auctions .. "|r",
"|cffffffff" .. personalBanks .. "|r",
"|cffffffff" .. realmBank .. "|r") })
end
elseif TSM.db.global.tooltip == "full" then
for name, data in pairs(TSM.characters) do
@@ -179,17 +210,26 @@ function TSM:GetTooltip(itemString)
local bank = data.bank[itemString] or 0
local auctions = data.auctions[itemString] or 0
local mail = data.mail[itemString] or 0
local total = bags + bank + auctions + mail
-- Ascension WoW: Add personal bank for this character
local personalBank = TSM.personalBanks[name] and TSM.personalBanks[name].items[itemString] or 0
local total = bags + bank + auctions + mail + personalBank
grandTotal = grandTotal + total
local bagText = "|cffffffff" .. bags .. "|r"
local bankText = "|cffffffff" .. bank .. "|r"
local auctionText = "|cffffffff" .. auctions .. "|r"
local mailText = "|cffffffff" .. mail .. "|r"
local personalBankText = "|cffffffff" .. personalBank .. "|r"
local totalText = "|cffffffff" .. total .. "|r"
if total > 0 then
tinsert(text, { left = format(" %s:", name), right = format(L["%s (%s bags, %s bank, %s AH, %s mail)"], "|cffffffff" .. totalText, "|cffffffff" .. bagText, "|cffffffff" .. bankText, "|cffffffff" .. auctionText, "|cffffffff" .. mailText) })
tinsert(text, { left = format(" %s:", name), right = format(L["%s (%s bags, %s bank, %s AH, %s mail, %s personal)"],
"|cffffffff" .. totalText,
"|cffffffff" .. bagText,
"|cffffffff" .. bankText,
"|cffffffff" .. auctionText,
"|cffffffff" .. mailText,
"|cffffffff" .. personalBankText) })
end
end
@@ -205,6 +245,14 @@ function TSM:GetTooltip(itemString)
end
end
end
-- Ascension WoW: Show realm bank
local realmBank = TSM:GetRealmBankTotal(itemString)
if realmBank > 0 then
grandTotal = grandTotal + realmBank
local realmBankText = "|cffffffff" .. realmBank .. "|r"
tinsert(text, { left = " " .. L["Realm Bank"] .. ":", right = format(L["%s in realm bank"], realmBankText) })
end
end
if #text > 0 then
@@ -343,4 +391,31 @@ function TSM:GetPlayerGuild(player)
player = TSM.playerLookup[player] or player
if not player or not TSM.characters[player] then return end
return TSM.characters[player].guild
end
-- Ascension WoW: Get personal bank data for a player
function TSM:GetPersonalBank(player)
player = player or TSM.CURRENT_PLAYER
player = TSM.playerLookup[player] or player
if not player or not TSM.personalBanks[player] then return end
return TSM.personalBanks[player].items
end
-- Ascension WoW: Get realm bank data
function TSM:GetRealmBank()
return TSM.realmBank.items
end
-- Ascension WoW: Get total items across all personal banks
function TSM:GetPersonalBanksTotal(itemString)
local total = 0
for _, data in pairs(TSM.personalBanks) do
total = total + (data.items[itemString] or 0)
end
return total
end
-- Ascension WoW: Get realm bank total for an item
function TSM:GetRealmBankTotal(itemString)
return TSM.realmBank.items[itemString] or 0
end