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.

345 lines
11 KiB

4 years ago
-- ------------------------------------------------------------------------------ --
-- 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 = {
4 years ago
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.factionrealm.characters
TSM.guilds = TSM.db.factionrealm.guilds
4 years ago
-- 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]
4 years ago
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
4 years ago
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 = {}
4 years ago
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
4 years ago
data[player] = playerData
break
end
end
else
TSM.db.realm.characters[player] = playerData
4 years ago
end
end
-- not yet handling guilds for connected realms
TSM.db.realm.guilds = TSM.guilds
4 years ago
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
4 years ago
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
4 years ago
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
4 years ago
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