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.
346 lines
11 KiB
346 lines
11 KiB
-- ------------------------------------------------------------------------------ -- |
|
-- TradeSkillMaster_ItemTracker -- |
|
-- http://www.curse.com/addons/wow/tradeskillmaster_itemtracker -- |
|
-- -- |
|
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) -- |
|
-- All Rights Reserved* - Detailed license information included with addon. -- |
|
-- ------------------------------------------------------------------------------ -- |
|
|
|
-- register this file with Ace Libraries |
|
local TSM = select(2, ...) |
|
TSM = LibStub("AceAddon-3.0"):NewAddon(TSM, "TSM_ItemTracker", "AceEvent-3.0", "AceConsole-3.0") |
|
local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_ItemTracker") |
|
|
|
-- default values for the savedDB |
|
local savedDBDefaults = { |
|
-- any global |
|
global = { |
|
tooltip = "simple", |
|
}, |
|
|
|
-- data that is stored per realm/faction combination |
|
realm = { |
|
characters = {}, |
|
guilds = {}, |
|
ignoreGuilds = {}, |
|
}, |
|
|
|
-- data that is stored per user profile |
|
profile = { |
|
marketValue = "DBMarket", |
|
}, |
|
} |
|
|
|
local characterDefaults = { |
|
-- anything added to the characters table will have these defaults |
|
bags = {}, |
|
bank = {}, |
|
auctions = {}, |
|
guild = nil, |
|
mail = {}, |
|
mailInbox = {}, |
|
lastUpdate = { bags = 0, bank = 0, auctions = 0, mail = 0, guild = 0 }, |
|
account = nil, |
|
} |
|
TSM.characterDefaults = characterDefaults |
|
local guildDefaults = { |
|
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 |
|
function TSM:OnInitialize() |
|
-- create shortcuts to all the modules |
|
for moduleName, module in pairs(TSM.modules) do |
|
TSM[moduleName] = module |
|
end |
|
|
|
-- 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 |
|
|
|
-- handle connected realms for characters |
|
local connectedRealms = TSMAPI.GetConnectedRealms and TSMAPI:GetConnectedRealms() or {} |
|
for _, realm in ipairs(connectedRealms) do |
|
local connectedRealmData = TSM.db.sv.realm[TSM.db.keys.faction.." - "..realm] |
|
if connectedRealmData and connectedRealmData.characters then |
|
for player, data in pairs(connectedRealmData.characters) do |
|
TSM.characters[player.."-"..realm] = data |
|
end |
|
end |
|
end |
|
|
|
-- register this module with TSM |
|
TSM:RegisterModule() |
|
|
|
-- conversion stuff |
|
for player, data in pairs(TSM.characters) do |
|
if type(data.lastUpdate) ~= "table" then |
|
data.lastUpdate = CopyTable(characterDefaults.lastUpdate) |
|
end |
|
data.mail = data.mail or {} |
|
end |
|
for guild, data in pairs(TSM.guilds) do |
|
data.lastUpdate = data.lastUpdate or guildDefaults.lastUpdate |
|
data.characters = nil |
|
end |
|
|
|
-- other init stuff |
|
local playerName, guildName = UnitName("player"), GetGuildInfo("player") |
|
if not TSM.characters[playerName] then |
|
TSM.characters[playerName] = characterDefaults |
|
end |
|
--TSM.characters[playerName].account = TSMAPI.Sync:GetAccountKey() |
|
if guildName and not TSM.guilds[guildName] then |
|
TSM.guilds[guildName] = guildDefaults |
|
end |
|
|
|
-- get rid of old itemIDs |
|
local function ClearItemIDs(tbl) |
|
if not tbl then return end |
|
for item in pairs(tbl) do |
|
if tonumber(item) then |
|
tbl[item] = nil |
|
end |
|
end |
|
end |
|
|
|
for _, playerData in pairs(TSM.characters) do |
|
ClearItemIDs(playerData.bags) |
|
ClearItemIDs(playerData.bank) |
|
ClearItemIDs(playerData.auctions) |
|
ClearItemIDs(playerData.mail) |
|
end |
|
for _, guildData in pairs(TSM.guilds) do |
|
ClearItemIDs(guildData.items) |
|
end |
|
|
|
TSM.Data:Initialize() |
|
TSM:UpdatePlayerLookup() |
|
|
|
local function RemoveOldAuctions() |
|
for player, data in pairs(TSM.characters) do |
|
local lastAuctionUpdate = data.auctions and data.auctions.time |
|
if lastAuctionUpdate and (time() - lastAuctionUpdate) > 48 * 60 * 60 then |
|
wipe(TSM.characters[player].auctions) |
|
end |
|
end |
|
end |
|
|
|
TSMAPI:CreateTimeDelay("itemTrackerDeleteOldAuctions", 0, RemoveOldAuctions, 60) |
|
end |
|
|
|
-- registers this module with TSM by first setting all fields and then calling TSMAPI:NewModule(). |
|
function TSM:RegisterModule() |
|
TSM.icons = { |
|
{ side = "module", desc = "ItemTracker", slashCommand = "itemtracker", callback = "Config:Load", icon = "Interface\\Icons\\INV_Misc_Gem_Variety_01" }, |
|
} |
|
TSM.moduleAPIs = { |
|
{ key = "playerlist", callback = "GetPlayers" }, |
|
{ key = "guildlist", callback = "GetGuilds" }, |
|
{ key = "playerbags", callback = "GetPlayerBags" }, |
|
{ key = "playerbank", callback = "GetPlayerBank" }, |
|
{ key = "playermail", callback = "GetPlayerMail" }, |
|
{ key = "guildbank", callback = "GetGuildBank" }, |
|
{ key = "playerauctions", callback = "GetPlayerAuctions" }, |
|
{ key = "auctionstotal", callback = "GetAuctionsTotal" }, |
|
{ key = "playertotal", callback = "GetPlayerTotal" }, |
|
{ key = "guildtotal", callback = "GetGuildTotal" }, |
|
{ key = "playerguildtotal", callback = "GetPlayerGuildTotal" }, |
|
{ key = "playerguild", callback = "GetPlayerGuild" }, |
|
} |
|
--TSM.sync = { callback = "Sync:Callback" } |
|
TSM.tooltipOptions = { callback = "Config:LoadTooltipOptions" } |
|
|
|
TSMAPI:NewModule(TSM) |
|
end |
|
|
|
function TSM:GetTooltip(itemString) |
|
if TSM.db.global.tooltip == "hide" then return end |
|
|
|
local itemString = TSMAPI:GetBaseItemString(itemString, true) |
|
local text = {} |
|
local grandTotal = 0 |
|
|
|
if TSM.db.global.tooltip == "simple" then |
|
local player, alts = TSM:GetPlayerTotal(itemString) |
|
local guild = TSM:GetGuildTotal(itemString) |
|
local auctions = TSM:GetAuctionsTotal(itemString) |
|
grandTotal = grandTotal + player + alts + guild + auctions |
|
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") }) |
|
end |
|
elseif TSM.db.global.tooltip == "full" then |
|
for name, data in pairs(TSM.characters) do |
|
local bags = data.bags[itemString] or 0 |
|
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 |
|
grandTotal = grandTotal + total |
|
|
|
local bagText = "|cffffffff" .. bags .. "|r" |
|
local bankText = "|cffffffff" .. bank .. "|r" |
|
local auctionText = "|cffffffff" .. auctions .. "|r" |
|
local mailText = "|cffffffff" .. mail .. "|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) }) |
|
end |
|
end |
|
|
|
for name, data in pairs(TSM.guilds) do |
|
if not TSM.db.realm.ignoreGuilds[name] then |
|
local gbank = data.items[itemString] or 0 |
|
grandTotal = grandTotal + gbank |
|
|
|
local gbankText = "|cffffffff" .. (gbank) .. "|r" |
|
|
|
if gbank > 0 then |
|
tinsert(text, { left = format(" %s:", name), right = format(L["%s in guild bank"], gbankText) }) |
|
end |
|
end |
|
end |
|
end |
|
|
|
if #text > 0 then |
|
tinsert(text, 1, { left = "|cffffff00" .. "TSM ItemTracker:", right = format(L["%s item(s) total"], "|cffffffff" .. grandTotal .. "|r") }) |
|
end |
|
|
|
return text |
|
end |
|
|
|
function TSM:OnTSMDBShutdown() |
|
TSM.db.realm.characters = {} |
|
local faction = TSM.db.keys.faction |
|
for name, playerData in pairs(TSM.characters) do |
|
local player, realm = ("-"):split(name) |
|
if realm and realm ~= "" then |
|
local realm = faction.." - "..realm |
|
for key, data in pairs(TSM.db.sv.realm) do |
|
if key == realm then |
|
data[player] = playerData |
|
break |
|
end |
|
end |
|
else |
|
TSM.db.realm.characters[player] = playerData |
|
end |
|
end |
|
|
|
-- not yet handling guilds for connected realms |
|
TSM.db.realm.guilds = TSM.guilds |
|
end |
|
|
|
function TSM:UpdatePlayerLookup() |
|
TSM.playerLookup = {} |
|
for name in pairs(TSM.characters) do |
|
TSM.playerLookup[strlower(name)] = name |
|
end |
|
end |
|
|
|
function TSM:GetPlayers() |
|
local temp = {} |
|
for name in pairs(TSM.characters) do |
|
tinsert(temp, name) |
|
end |
|
return temp |
|
end |
|
|
|
function TSM:GetGuilds() |
|
local temp = {} |
|
for name in pairs(TSM.guilds) do |
|
tinsert(temp, name) |
|
end |
|
return temp |
|
end |
|
|
|
function TSM:GetPlayerBags(player) |
|
player = player or TSM.CURRENT_PLAYER |
|
player = TSM.playerLookup[player] or player |
|
if not player or not TSM.characters[player] then return end |
|
return TSM.characters[player].bags |
|
end |
|
|
|
function TSM:GetPlayerBank(player) |
|
player = player or TSM.CURRENT_PLAYER |
|
player = TSM.playerLookup[player] or player |
|
if not player or not TSM.characters[player] then return end |
|
return TSM.characters[player].bank |
|
end |
|
|
|
function TSM:GetPlayerMail(player) |
|
player = player or TSM.CURRENT_PLAYER |
|
player = TSM.playerLookup[player] or player |
|
if not player or not TSM.characters[player] then return end |
|
return TSM.characters[player].mail |
|
end |
|
|
|
function TSM:GetGuildBank(guild) |
|
guild = guild or TSM.CURRENT_GUILD |
|
if not guild or not TSM.guilds[guild] or TSM.db.realm.ignoreGuilds[guild] then return end |
|
return TSM.guilds[guild].items |
|
end |
|
|
|
function TSM:GetPlayerAuctions(player) |
|
player = player or TSM.CURRENT_PLAYER |
|
player = TSM.playerLookup[player] or player |
|
if not TSM.characters[player] then return end |
|
return TSM.characters[player].auctions |
|
end |
|
|
|
function TSM:GetPlayerTotal(itemString) |
|
local playerTotal, altTotal = 0, 0 |
|
|
|
for name, data in pairs(TSM.characters) do |
|
if name == TSM.CURRENT_PLAYER then |
|
playerTotal = playerTotal + (data.bags[itemString] or 0) |
|
playerTotal = playerTotal + (data.bank[itemString] or 0) |
|
playerTotal = playerTotal + (data.mail[itemString] or 0) |
|
else |
|
altTotal = altTotal + (data.bags[itemString] or 0) |
|
altTotal = altTotal + (data.bank[itemString] or 0) |
|
altTotal = altTotal + (data.mail[itemString] or 0) |
|
end |
|
end |
|
|
|
return playerTotal, altTotal |
|
end |
|
|
|
function TSM:GetGuildTotal(itemString) |
|
local guildTotal = 0 |
|
for guild, data in pairs(TSM.guilds) do |
|
if not TSM.db.realm.ignoreGuilds[guild] then |
|
guildTotal = guildTotal + (data.items[itemString] or 0) |
|
end |
|
end |
|
return guildTotal |
|
end |
|
|
|
function TSM:GetAuctionsTotal(itemString) |
|
local auctionsTotal = 0 |
|
for _, data in pairs(TSM.characters) do |
|
auctionsTotal = auctionsTotal + (data.auctions[itemString] or 0) |
|
end |
|
return auctionsTotal |
|
end |
|
|
|
function TSM:GetPlayerGuildTotal(itemString, player) |
|
player = player or TSM.CURRENT_PLAYER |
|
player = TSM.playerLookup[player] or player |
|
if not player or not TSM.characters[player] then return end |
|
local guild = TSM.characters[player].guild |
|
if not guild or not TSM.guilds[guild] or TSM.db.realm.ignoreGuilds[guild] then return end |
|
|
|
return TSM.guilds[guild].items[itemString] |
|
end |
|
|
|
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 |