---@diagnostic disable: duplicate-set-field
--[[
-- **************************************************************************
-- * TitanGold.lua
-- *
-- * By: The Titan Panel Development Team
-- **************************************************************************
--]]
-- WoW method to get addon name
local addonName = ...
-- ******************************** Constants *******************************
local TITAN_GOLD_ID = "Gold";
local TITAN_BUTTON = "TitanPanel" .. TITAN_GOLD_ID .. "Button"
local TITAN_GOLD_VERSION = TITAN_VERSION;
local TITAN_GOLD_SPACERBAR = "-----------------------";
local updateTable = { TITAN_GOLD_ID, TITAN_PANEL_UPDATE_TOOLTIP };
-- ******************************** Variables *******************************
GoldSave = {} -- saved vars in TOC
local GOLD_INITIALIZED = false;
local GOLD_INDEX = "";
local GOLD_STARTINGGOLD;
local GOLD_SESSIONSTART;
local AceTimer = LibStub("AceTimer-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale(TITAN_ID, true)
local GoldTimer = {};
local GoldTimerRunning = false
local _G = getfenv(0);
local realmName = "" -- fill on PEW
local realmNames = {} -- fill on PEW
local merged_realms = {} -- fill on PEW
-- English faction for indexing and sorting and coloring
local TITAN_ALLIANCE = "Alliance"
local TITAN_HORDE = "Horde"
local player_faction, player_faction_locale = UnitFactionGroup("Player")
local player_name = GetUnitName("Player")
--[[ debug
local FACTION_ALLIANCE = "Alliance_debug"
local FACTION_HORDE = "Horde_debug"
--]]
-- ******************************** Functions *******************************
-- A bit overkill but make a class for the Warbank bank functions
local Warband = {
bank_sum = 0,
active = false,
label = "",
}
---local Warband Bank debug
function Warband.debug(reason)
print("WB " .. reason
.. " " .. tostring(Warband.active)
.. " " .. tostring(Warband.label)
.. " " .. tostring(Warband.bank_sum)
)
end
---local Update Warband Bank info - sum
function Warband.SetSum()
Warband.bank_sum = C_Bank.FetchDepositedMoney(Enum.BankType.Account)
-- Warband.debug("SetSum")
end
---local Set Warband Bank info
function Warband.Init()
-- check for func even though it does not work atm... 2024 Aug (Added 11.0.0)
Warband.active = (C_Bank and C_Bank.CanUseBank) and true or false
if Warband.active then
Warband.label = L["TITAN_WARBAND_BANK"]
Warband.SetSum()
else
-- Likely Classic version
end
-- Warband.debug("Init")
end
---local Check if Warband Bank is in this version and user requested
---@return boolean
function Warband.Use()
local res = false
if Warband.active then
if TitanGetVar(TITAN_GOLD_ID, "ShowWarband") then
res = true
else
-- Not requested by user
end
else
-- Likely Classic version
end
return res
end
---local Return Warband Bank info
---@return number
function Warband.GetSum()
-- Warband.debug("GetSum")
return Warband.bank_sum
end
---local Return Warband Bank info
---@return string
function Warband.GetName()
-- Warband.debug("GetName")
return Warband.label
end
--===
---Helper to safely encapsulate WoW API (returns number in form ggsscc)
---@return number
local function Get_Money()
local money = GetMoney()
-- Do safety check to prevent errors
if type(money) == "number" then
-- assume it is good
else
-- Not accurate but safe
money = 0
end
return money
end
local function GetConnectedRealms()
local realms = GetAutoCompleteRealms()
if #realms == 0 then
realms[1] = GetRealmName()
end
return realms
end
---Take a table of indexes to sort GoldSave
---@param gold_table table
---@return table sorted May not be need but it is explicit
local function SortByIndex(gold_table)
local by_realm = TitanGetVar(TITAN_GOLD_ID, "GroupByRealm")
local by_name = TitanGetVar(TITAN_GOLD_ID, "SortByName")
-- This section will sort the array based on user preference
-- * by name or by gold amount descending
-- * grouping by realm if selected
if by_name then
table.sort(gold_table, function(key1, key2)
if by_realm then
if GoldSave[key1].realm ~= GoldSave[key2].realm then
return GoldSave[key1].realm < GoldSave[key2].realm
end
end
return GoldSave[key1].name < GoldSave[key2].name
end)
else
table.sort(gold_table, function(key1, key2)
if by_realm then
if GoldSave[key1].realm ~= GoldSave[key2].realm then
return GoldSave[key1].realm < GoldSave[key2].realm
end
end
return GoldSave[key1].gold > GoldSave[key2].gold
end)
end
return gold_table
end
---local Create Gold index <character>_<server>::<faction>and see if the toon is in the table.
---@param character string
---@param charserver string
---@param char_faction string
local function CreateIndex(character, charserver, char_faction)
local index = character .. "_" .. charserver .. "::" .. char_faction
-- See if this is a new toon to Gold;
-- There may be a timing issue on some systems where Gold is told to 'Show'
-- by Titan before Gold processes PEW event.
if (GoldSave[GOLD_INDEX] == nil) then
GoldSave[GOLD_INDEX] = {}
GoldSave[GOLD_INDEX] = { gold = 0, name = player_name }
end
return index
end
---local Break apart Gold index
---@param info string
---@return string
---@return string
---@return string
local function GetIndexInfo(info)
local character, charserver, char_faction = string.match(info, '(.*)_(.*)::(.*)')
return character, charserver, char_faction
end
---@class IndexInfo Index flags
---@field valid boolean Saved toon is valid
---@field char_name string Saved toon name
---@field server string Saved toon server
---@field faction string Saved toon faction
---@field same_faction boolean Saved toon faction is same as player
---@field ignore_faction boolean User selection to ignore faction or not
---@field same_realm boolean Saved realm is same as this server
---@field merge_realm boolean Saved realm is in mergerd server list (connected servers)
---@field show_toon boolean Show server - simple test
---local Take Gold index and return parts plus various flags
---@param index string
---@return IndexInfo
local function EvalIndexInfo(index)
local res = { valid = false }
local character, charserver, char_faction = GetIndexInfo(index)
if character then
res.valid = true
res.char_name = character
res.server = charserver
res.faction = char_faction
res.ignore_faction = TitanGetVar(TITAN_GOLD_ID, "IgnoreFaction")
if (char_faction == player_faction) then
res.same_faction = true
else
res.same_faction = false
end
if (charserver == realmName) then
res.same_realm = true
else
res.same_realm = false
end
local saved_server = string.gsub(charserver, "%s", "") -- GetAutoCompleteRealms removes spaces, idk why...
if merged_realms[saved_server] then
res.merge_realm = true
else
res.merge_realm = false
end
if (res.ignore_faction or res.same_faction)
and GoldSave[index].show then
res.show_toon = true
else
res.show_toon = false
end
else
-- do not fill in
end
return res
end
---local Take the total cash and make it into a nice, colorful string of g s c (gold silver copper)
---@param value number
---@param show_zero boolean
---@param show_neg boolean
---@return string outstr Formatted cash for output
---@return integer gold part of value
---@return integer silver part of value
---@return integer copper part of value
local function NiceCash(value, show_zero, show_neg)
local sep = ""
local dec = ""
if (TitanGetVar(TITAN_GOLD_ID, "UseSeperatorComma")) then
sep = ","
dec = "."
elseif (TitanGetVar(TITAN_GOLD_ID, "UseSeperatorPeriod")) then
sep = "."
dec = ","
elseif (TitanGetVar(TITAN_GOLD_ID, "UseSeperatorSpace")) then
sep = " "
dec = "."
end
local outstr, gold, silver, copper =
TitanUtils_CashToString(value, sep, dec,
TitanGetVar(TITAN_GOLD_ID, "ShowGoldOnly"),
TitanGetVar(TITAN_GOLD_ID, "ShowCoinLabels"),
TitanGetVar(TITAN_GOLD_ID, "ShowCoinIcons"),
TitanGetVar(TITAN_GOLD_ID, "ShowColoredText"))
return outstr, gold, silver, copper
end
---local Take the total cash and make it into a nice, colorful string of g s c (gold silver copper)
---@param value number
---@return string outstr Formatted cash for output
---@return integer gold part of value
---@return integer silver part of value
---@return integer copper part of value
local function NiceTextCash(value)
local sep = ""
local dec = ""
if (TitanGetVar(TITAN_GOLD_ID, "UseSeperatorComma")) then
sep = ","
dec = "."
elseif (TitanGetVar(TITAN_GOLD_ID, "UseSeperatorPeriod")) then
sep = "."
dec = ","
elseif (TitanGetVar(TITAN_GOLD_ID, "UseSeperatorSpace")) then
sep = " "
dec = "."
end
local outstr, gold, silver, copper =
TitanUtils_CashToString(value, sep, dec,
TitanGetVar(TITAN_GOLD_ID, "ShowGoldOnly"),
true, --TitanGetVar(TITAN_GOLD_ID, "ShowCoinLabels"),
false, --TitanGetVar(TITAN_GOLD_ID, "ShowCoinIcons"),
TitanGetVar(TITAN_GOLD_ID, "ShowColoredText"))
return outstr, gold, silver, copper
end
---local Create Show menu - list of characters in same faction
---@param faction string
---@param level number
local function ShowMenuButtons(faction, level)
TitanPanelRightClickMenu_AddTitle(L["TITAN_GOLD_SHOW_PLAYER"], level)
local info = {};
-- Sort names for the menu list
local GoldSorted = {};
for index, money in pairs(GoldSave) do
table.insert(GoldSorted, index)
end
GoldSorted = SortByIndex(GoldSorted)
for i = 1, #GoldSorted do
local index = GoldSorted[i]
local character, charserver, char_faction = GetIndexInfo(index)
if character and (char_faction == faction) then
info.text = character .. " - " .. charserver.." "..NiceTextCash(GoldSave[index].gold).."";
info.value = character;
info.keepShownOnClick = true;
info.checked = function()
return GoldSave[index].show
end
info.func = function()
GoldSave[index].show = not GoldSave[index].show;
TitanPanelButton_UpdateButton(TITAN_GOLD_ID)
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
end
end
end
---local Create Delete menu - list of characters in same faction
---@param faction string
---@param level number
local function DeleteMenuButtons(faction, level)
TitanPanelRightClickMenu_AddTitle(L["TITAN_GOLD_DELETE_PLAYER"], level)
local info = {};
local name = player_name
local server = realmName;
-- Sort names for the menu list
local GoldSorted = {};
for index, money in pairs(GoldSave) do
table.insert(GoldSorted, index)
end
GoldSorted = SortByIndex(GoldSorted)
for i = 1, #GoldSorted do
local index = GoldSorted[i]
local character, charserver, char_faction = GetIndexInfo(index)
info.notCheckable = true
if character and (char_faction == faction) then
info.text = character .. " - " .. charserver.." "..NiceTextCash(GoldSave[index].gold).."";
info.value = character;
info.func = function()
GoldSave[index] = {}
GoldSave[index] = nil
TitanPanelButton_UpdateButton(TITAN_GOLD_ID)
end
-- cannot delete current character
if name == character and server == charserver then
info.disabled = 1;
else
info.disabled = nil;
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
end
end
end
---local Based on user Coin selection set None | Labels | Icons
---@param chosen string
local function ShowProperLabels(chosen)
if chosen == "ShowCoinNone" then
TitanSetVar(TITAN_GOLD_ID, "ShowCoinNone", true);
TitanSetVar(TITAN_GOLD_ID, "ShowCoinLabels", false);
TitanSetVar(TITAN_GOLD_ID, "ShowCoinIcons", false);
end
if chosen == "ShowCoinLabels" then
TitanSetVar(TITAN_GOLD_ID, "ShowCoinNone", false);
TitanSetVar(TITAN_GOLD_ID, "ShowCoinLabels", true);
TitanSetVar(TITAN_GOLD_ID, "ShowCoinIcons", false);
end
if chosen == "ShowCoinIcons" then
TitanSetVar(TITAN_GOLD_ID, "ShowCoinNone", false);
TitanSetVar(TITAN_GOLD_ID, "ShowCoinLabels", false);
TitanSetVar(TITAN_GOLD_ID, "ShowCoinIcons", true);
end
TitanPanelButton_UpdateButton(TITAN_GOLD_ID);
end
---local Based on user Seperator selection set Comma | Period | Space
---@param chosen string
local function Seperator(chosen)
if chosen == "UseSeperatorComma" then
TitanSetVar(TITAN_GOLD_ID, "UseSeperatorComma", true);
TitanSetVar(TITAN_GOLD_ID, "UseSeperatorPeriod", false);
TitanSetVar(TITAN_GOLD_ID, "UseSeperatorSpace", false);
end
if chosen == "UseSeperatorPeriod" then
TitanSetVar(TITAN_GOLD_ID, "UseSeperatorComma", false);
TitanSetVar(TITAN_GOLD_ID, "UseSeperatorPeriod", true);
TitanSetVar(TITAN_GOLD_ID, "UseSeperatorSpace", false);
end
if chosen == "UseSeperatorSpace" then
TitanSetVar(TITAN_GOLD_ID, "UseSeperatorComma", false);
TitanSetVar(TITAN_GOLD_ID, "UseSeperatorPeriod", false);
TitanSetVar(TITAN_GOLD_ID, "UseSeperatorSpace", true);
end
TitanPanelButton_UpdateButton(TITAN_GOLD_ID);
end
---local Based on user Server selection set Merge | Seperate | All
---@param chosen string
local function Merger(chosen)
if chosen == "MergeServers" then
TitanSetVar(TITAN_GOLD_ID, "MergeServers", true);
TitanSetVar(TITAN_GOLD_ID, "SeparateServers", false);
TitanSetVar(TITAN_GOLD_ID, "AllServers", false);
end
if chosen == "SeparateServers" then
TitanSetVar(TITAN_GOLD_ID, "MergeServers", false);
TitanSetVar(TITAN_GOLD_ID, "SeparateServers", true);
TitanSetVar(TITAN_GOLD_ID, "AllServers", false);
end
if chosen == "AllServers" then
TitanSetVar(TITAN_GOLD_ID, "MergeServers", false);
TitanSetVar(TITAN_GOLD_ID, "SeparateServers", false);
TitanSetVar(TITAN_GOLD_ID, "AllServers", true);
end
TitanPanelButton_UpdateButton(TITAN_GOLD_ID);
end
---local Toggles when the player selects the show gold/hour stats
local function GoldGPH_Toggle()
TitanToggleVar(TITAN_GOLD_ID, "DisplayGoldPerHour")
if TitanGetVar(TITAN_GOLD_ID, "DisplayGoldPerHour") then
if GoldTimerRunning then
-- Do not create a new one
else
GoldTimer = AceTimer:ScheduleRepeatingTimer(TitanPanelPluginHandle_OnUpdate, 1, updateTable)
GoldTimerRunning = true
end
elseif GoldTimer and not TitanGetVar(TITAN_GOLD_ID, "DisplayGoldPerHour") then
AceTimer:CancelTimer(GoldTimer)
GoldTimerRunning = false
end
end
---local Helper for TotalGold
--- If toon is to be shown add amount to total; otherwise pass back running total
local function ToonAdd(show, amount, total)
local new_total = 0
if show then
new_total = total + amount
else
new_total = total
end
return new_total
end
---local Calculates total gold for display per user selections
---@return integer
local function TotalGold()
-- EvalIndexInfo checks the toon info against the user options
-- then returns as a table of 'flags'.
-- The if within each loop checks the appropriate flags per user server display option.
local ttlgold = 0;
if TitanGetVar(TITAN_GOLD_ID, "SeparateServers") then
-- Parse the database and display all characters on this server
for index, money in pairs(GoldSave) do
local char = EvalIndexInfo(index)
if char.valid and char.same_realm and char.show_toon then
ttlgold = ToonAdd(GoldSave[index].show, GoldSave[index].gold, ttlgold)
else
-- Do not show per flags
end
end
elseif TitanGetVar(TITAN_GOLD_ID, "MergeServers") then
-- Parse the database and display characters on merged / connected servers
for index, money in pairs(GoldSave) do
local char = EvalIndexInfo(index)
if char.valid and char.merge_realm and char.show_toon then
ttlgold = ToonAdd(GoldSave[index].show, GoldSave[index].gold, ttlgold)
else
-- Do not show per flags
end
end
elseif TitanGetVar(TITAN_GOLD_ID, "AllServers") then
-- Parse the database and display characters on all servers
for index, money in pairs(GoldSave) do
local char = EvalIndexInfo(index)
if char.valid and char.show_toon then
ttlgold = ToonAdd(GoldSave[index].show, GoldSave[index].gold, ttlgold)
else
-- Do not show per flags
end
end
end
--
-- === Add Warband Bank, if enabled and requested
if Warband.Use() then
ttlgold = ttlgold + Warband.GetSum()
end
return ttlgold;
end
-- ====== Tool tip routines
---local Generate formatted tooltip text
---@return string
local function GetTooltipText()
local GoldSorted = {};
local currentMoneyRichText = "";
local countelements = 0;
local faction = player_faction
local ignore_faction = TitanGetVar(TITAN_GOLD_ID, "IgnoreFaction")
for _ in pairs(realmNames) do
countelements = countelements + 1
end
-- insert all keys from hash into the GoldSorted array
if TitanGetVar(TITAN_GOLD_ID, "SeparateServers") then
-- Parse the database and display characters from this server
for index, money in pairs(GoldSave) do
local char = EvalIndexInfo(index)
if char.valid and char.same_realm and char.show_toon then
table.insert(GoldSorted, index);
end
end
elseif TitanGetVar(TITAN_GOLD_ID, "MergeServers") then
-- Parse the database and display characters from merged / connected servers
for index, money in pairs(GoldSave) do
local char = EvalIndexInfo(index)
if char.valid and char.merge_realm and char.show_toon then
table.insert(GoldSorted, index);
end
end
elseif TitanGetVar(TITAN_GOLD_ID, "AllServers") then
-- Parse the database and display characters from all servers
for index, money in pairs(GoldSave) do
local char = EvalIndexInfo(index)
if char.valid and char.show_toon then
table.insert(GoldSorted, index);
end
end
end
local by_realm = TitanGetVar(TITAN_GOLD_ID, "GroupByRealm")
GoldSorted = SortByIndex(GoldSorted)
-- Array holds all characters to display, nicely sorted.
currentMoneyRichText = ""
local coin_str = ""
local faction_text = ""
local curr_realm = ""
local show_dash = false
local show_realm = true
local character, charserver, char_faction
for i = 1, #GoldSorted do
character, charserver, char_faction = GetIndexInfo(GoldSorted[i])
coin_str = NiceCash(GoldSave[GoldSorted[i]].gold, false, false)
show_dash = false
show_realm = true
if (TitanGetVar(TITAN_GOLD_ID, "SeparateServers")) then
show_realm = false
elseif (TitanGetVar(TITAN_GOLD_ID, "MergeServers")) then
show_dash = true
elseif (TitanGetVar(TITAN_GOLD_ID, "AllServers")) then
show_dash = true
end
if by_realm then
-- Set a realm header
if charserver ~= curr_realm then
currentMoneyRichText = currentMoneyRichText .. "\n"
.. "-- " .. charserver
curr_realm = charserver
end
show_dash = false
show_realm = false
end
if ignore_faction then
local font_size = TitanPanelGetVar("FontSize")
local icon_pre = "|TInterface/AddOns/TitanGold/Artwork/"
local icon_post = ":" .. font_size .. ":" .. font_size .. ":2:0|t"
local a_icon = icon_pre .. "UI_AllianceIcon-round" .. icon_post
local h_icon = icon_pre .. "UI_HordeIcon-round" .. icon_post
if char_faction == TITAN_ALLIANCE then
faction_text = " " .. a_icon
elseif char_faction == TITAN_HORDE then
faction_text = " " .. h_icon
end
end
currentMoneyRichText = currentMoneyRichText .. "\n"
.. character
.. (show_dash and "-" or "")
.. (show_realm and charserver or "")
.. faction_text
.. "\t" .. coin_str
end
--
-- === Add Warband Bank
--
if Warband.Use() then
currentMoneyRichText = currentMoneyRichText .. "\n"
.. "------ \t +" .. "\n"
.. Warband.GetName() -- localized
.. "\t" .. NiceCash(Warband.GetSum(), false, false)
end
--[[
print("TG"
.." "..tostring(counter)
.." "..tostring(x0)
.." "..tostring(x1)
.." "..tostring(getn(GoldSorted))
.." "..tostring(TitanGetVar(TITAN_GOLD_ID, "SeparateServers"))
.." "..tostring(TitanGetVar(TITAN_GOLD_ID, "MergeServers"))
.." "..tostring(TitanGetVar(TITAN_GOLD_ID, "AllServers"))
.." "..tostring(TITANPANEL_TOOLTIP)
--.." "..tostring(TITANPANEL_TOOLTIP_X)
)
--]]
--
-- === Add Total per user options
--
coin_str = ""
-- Display total gold
coin_str = NiceCash(TotalGold(), false, false)
currentMoneyRichText = currentMoneyRichText .. "\n"
.. TITAN_GOLD_SPACERBAR .. "\n"
.. L["TITAN_GOLD_TTL_GOLD"] .. "\t" .. coin_str
-- find session earnings and earning per hour
local sesstotal = Get_Money() - GOLD_STARTINGGOLD;
local negative = false;
if (sesstotal < 0) then
sesstotal = math.abs(sesstotal);
negative = true;
end
local sesslength = GetTime() - GOLD_SESSIONSTART;
local perhour = math.floor(sesstotal / sesslength * 3600);
coin_str = NiceCash(GOLD_STARTINGGOLD, false, false)
local session_status;
local per_hour_status;
local sessionMoneyRichText = ""
if TitanGetVar(TITAN_GOLD_ID, "ShowSessionInfo") then
sessionMoneyRichText = "\n\n" .. TitanUtils_GetHighlightText(L["TITAN_GOLD_STATS_TITLE"])
.. "\n" .. L["TITAN_GOLD_START_GOLD"] .. "\t" .. coin_str .. "\n"
if (negative) then
session_status = TitanUtils_GetRedText(L["TITAN_GOLD_SESS_LOST"])
per_hour_status = TitanUtils_GetRedText(L["TITAN_GOLD_PERHOUR_LOST"])
else
session_status = TitanUtils_GetGreenText(L["TITAN_GOLD_SESS_EARNED"])
per_hour_status = TitanUtils_GetGreenText(L["TITAN_GOLD_PERHOUR_EARNED"])
end
coin_str = NiceCash(sesstotal, true, true)
sessionMoneyRichText = sessionMoneyRichText
.. session_status
.. "\t" .. coin_str .. "\n";
if TitanGetVar(TITAN_GOLD_ID, "DisplayGoldPerHour") then
coin_str = NiceCash(perhour, true, true)
sessionMoneyRichText = sessionMoneyRichText
.. per_hour_status
.. "\t" .. coin_str .. "\n";
end
else
-- Do not display session info
end
--
-- === Add Gold notes and info
--
local final_tooltip = TitanUtils_GetGoldText(L["TITAN_GOLD_TOOLTIPTEXT"] .. " : ")
local final_server = ""
if realmNames == nil or TitanGetVar(TITAN_GOLD_ID, "SeparateServers") then
final_server = realmName
elseif TitanGetVar(TITAN_GOLD_ID, "MergeServers") then
final_server = L["TITAN_GOLD_MERGED"]
elseif TitanGetVar(TITAN_GOLD_ID, "AllServers") then
final_server = ALL
end
final_server = TitanUtils_GetGoldText(final_server .. " : ")
local final_faction = ""
if ignore_faction then
final_faction = TitanUtils_GetGoldText(ALL)
elseif faction == TITAN_ALLIANCE then
final_faction = TitanUtils_GetHexText(FACTION_ALLIANCE, Titan_Global.colors.alliance)
elseif faction == TITAN_HORDE then
final_faction = TitanUtils_GetHexText(FACTION_HORDE, Titan_Global.colors.horde)
end
return ""
.. currentMoneyRichText .. "\n"
.. TITAN_GOLD_SPACERBAR .. "\n"
.. final_tooltip .. final_server .. final_faction .. "\n"
.. sessionMoneyRichText
end
-- ======
-- ====== Right click menu routines
---local Toggle whether button shows player or total gold (based on other user selections).
local function ViewAll_Toggle()
TitanToggleVar(TITAN_GOLD_ID, "ViewAll")
TitanPanelButton_UpdateButton(TITAN_GOLD_ID)
end
---local Toggle whether tooltip sorts by toon name or gold amount.
local function Sort_Toggle()
TitanToggleVar(TITAN_GOLD_ID, "SortByName")
end
local function ResetSession()
GOLD_STARTINGGOLD = Get_Money();
GOLD_SESSIONSTART = GetTime();
DEFAULT_CHAT_FRAME:AddMessage(TitanUtils_GetGreenText(L["TITAN_GOLD_SESSION_RESET"]));
end
---local See if this toon is in saved vars AFTER PEW event.
--- Get current total and session start time. Toon gold is available via API AFTER PEW event.
---@param self Button
local function Initialize_Array(self)
if (GOLD_INITIALIZED) then
-- already done
else
self:UnregisterEvent("ADDON_LOADED");
-- See if this is a new toon to Gold
if (GoldSave[GOLD_INDEX] == nil) then
GoldSave[GOLD_INDEX] = {}
GoldSave[GOLD_INDEX] = { gold = Get_Money(), name = player_name }
end
-- Ensure the saved vars are usable
for index, money in pairs(GoldSave) do
local character, charserver, char_faction = GetIndexInfo(index)
-- Could be a new toon to Gold or an updated Gold
local show_toon = GoldSave[index].show
if show_toon == nil then
show_toon = true
end
GoldSave[index].show = show_toon
GoldSave[index].realm = charserver -- added July 2022
-- added Aug 2022 for #1332.
-- Faction in index was not set for display in tool tip.
-- Created localized faction as a field; set every time in case user changes languages
if char_faction == TITAN_ALLIANCE then
GoldSave[index].faction = FACTION_ALLIANCE
elseif char_faction == TITAN_HORDE then
GoldSave[index].faction = FACTION_HORDE
else
GoldSave[index].faction = FACTION_OTHER
end
end
GOLD_STARTINGGOLD = Get_Money();
GOLD_SESSIONSTART = GetTime();
GOLD_INITIALIZED = true;
--[[
print("Init"
.." "..tostring(GOLD_STARTINGGOLD)..""
.." "..tostring(GOLD_SESSIONSTART)..""
.." "..tostring(GOLD_INITIALIZED)..""
)
--]]
end
end
---local Clear the gold array and rebuild
---@param self Button
local function ClearData(self)
GOLD_INITIALIZED = false;
GoldSave = {};
Initialize_Array(self);
DEFAULT_CHAT_FRAME:AddMessage(TitanUtils_GetGreenText(L["TITAN_GOLD_DB_CLEARED"]));
end
---local Pops an 'are you sure' when user clicks to reset the gold array
local function TitanGold_ClearDB()
StaticPopupDialogs["TITANGOLD_CLEAR_DATABASE"] = {
text = TitanUtils_GetNormalText(L["TITAN_PANEL_MENU_TITLE"] .. " "
.. L["TITAN_GOLD_MENU_TEXT"]) .. "\n\n" .. L["TITAN_GOLD_CLEAR_DATA_WARNING"],
button1 = ACCEPT,
button2 = CANCEL,
OnAccept = function(self)
local frame = _G["TitanPanelGoldButton"]
ClearData(frame)
end,
showAlert = 1,
timeout = 0,
whileDead = 1,
hideOnEscape = 1
};
StaticPopup_Show("TITANGOLD_CLEAR_DATABASE");
end
---local Generate the tooltip display option menu
local function DisplayOptions()
local info = {};
info.notCheckable = true
info.text = L["TITAN_GOLD_SORT_BY"];
info.value = "Sorting";
info.hasArrow = 1;
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
TitanPanelRightClickMenu_AddSeparator(TitanPanelRightClickMenu_GetDropdownLevel());
-- Which characters to show
-- - Separate : this server
-- - Merge : connected / merged servers
-- - All : any server
info = {};
info.text = L["TITAN_GOLD_SEPARATE"];
info.checked = TitanGetVar(TITAN_GOLD_ID, "SeparateServers");
info.func = function()
Merger("SeparateServers")
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
info = {};
info.text = L["TITAN_GOLD_MERGE"];
info.checked = TitanGetVar(TITAN_GOLD_ID, "MergeServers");
info.func = function()
Merger("MergeServers")
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
info = {};
info.text = L["TITAN_GOLD_ALL"];
info.checked = TitanGetVar(TITAN_GOLD_ID, "AllServers");
info.func = function()
Merger("AllServers")
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
TitanPanelRightClickMenu_AddSeparator(TitanPanelRightClickMenu_GetDropdownLevel());
-- Option to ignore faction - per 9.2.5 changes
info = {};
info.text = L["TITAN_GOLD_IGNORE_FACTION"];
info.checked = TitanGetVar(TITAN_GOLD_ID, "IgnoreFaction");
info.func = function()
TitanToggleVar(TITAN_GOLD_ID, "IgnoreFaction");
TitanPanelButton_UpdateButton(TITAN_GOLD_ID);
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
TitanPanelRightClickMenu_AddSeparator(TitanPanelRightClickMenu_GetDropdownLevel());
-- What labels to show next to money : none / text / icon
info = {};
info.text = L["TITAN_GOLD_COIN_NONE"];
info.checked = TitanGetVar(TITAN_GOLD_ID, "ShowCoinNone");
info.func = function()
ShowProperLabels("ShowCoinNone")
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
info = {};
info.text = L["TITAN_GOLD_COIN_LABELS"];
info.checked = TitanGetVar(TITAN_GOLD_ID, "ShowCoinLabels");
info.func = function()
ShowProperLabels("ShowCoinLabels")
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
info = {};
info.text = L["TITAN_GOLD_COIN_ICONS"];
info.checked = TitanGetVar(TITAN_GOLD_ID, "ShowCoinIcons");
info.func = function()
ShowProperLabels("ShowCoinIcons")
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
TitanPanelRightClickMenu_AddSeparator(TitanPanelRightClickMenu_GetDropdownLevel());
-- Show gold only option - no silver, no copper
info = {};
info.text = L["TITAN_GOLD_ONLY"];
info.checked = TitanGetVar(TITAN_GOLD_ID, "ShowGoldOnly");
info.func = function()
TitanToggleVar(TITAN_GOLD_ID, "ShowGoldOnly");
TitanPanelButton_UpdateButton(TITAN_GOLD_ID);
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
TitanPanelRightClickMenu_AddSeparator(TitanPanelRightClickMenu_GetDropdownLevel());
-- Use thousands separater : , . ' '
info = {};
info.text = L["TITAN_PANEL_USE_COMMA"];
info.checked = TitanGetVar(TITAN_GOLD_ID, "UseSeperatorComma");
info.func = function()
Seperator("UseSeperatorComma")
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
info = {};
info.text = L["TITAN_PANEL_USE_PERIOD"];
info.checked = TitanGetVar(TITAN_GOLD_ID, "UseSeperatorPeriod");
info.func = function()
Seperator("UseSeperatorPeriod")
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
TITAN_PANEL_USE_SPACE = "Use Space"
info = {};
info.text = TITAN_PANEL_USE_SPACE
info.checked = TitanGetVar(TITAN_GOLD_ID, "UseSeperatorSpace");
info.func = function()
Seperator("UseSeperatorSpace")
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
TitanPanelRightClickMenu_AddSeparator(TitanPanelRightClickMenu_GetDropdownLevel());
-- Show session info
info = {};
info.text = L["TITAN_GOLD_SHOW_STATS_TITLE"];
info.checked = TitanGetVar(TITAN_GOLD_ID, "ShowSessionInfo");
info.func = function()
TitanToggleVar(TITAN_GOLD_ID, "ShowSessionInfo");
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
TitanPanelRightClickMenu_AddSeparator(TitanPanelRightClickMenu_GetDropdownLevel());
-- Function to toggle gold per hour sort
info = {};
info.text = L["TITAN_GOLD_TOGGLE_GPH_SHOW"]
info.checked = TitanGetVar(TITAN_GOLD_ID, "DisplayGoldPerHour");
info.func = function()
GoldGPH_Toggle()
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
end
---local Generate the options menu
local function CreateMenu()
if TitanPanelRightClickMenu_GetDropdownLevel() == 1 then
-- Menu title
TitanPanelRightClickMenu_AddTitle(L["TITAN_GOLD_ITEMNAME"]);
-- Function to toggle button gold view
local info = {};
info.text = L["TITAN_GOLD_TOGGLE_ALL_TEXT"]
info.checked = TitanGetVar(TITAN_GOLD_ID, "ViewAll");
info.func = function()
ViewAll_Toggle()
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
info = {};
info.text = L["TITAN_GOLD_TOGGLE_PLAYER_TEXT"]
info.checked = not TitanGetVar(TITAN_GOLD_ID, "ViewAll");
info.func = function()
ViewAll_Toggle()
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
TitanPanelRightClickMenu_AddSeparator();
-- Display options
info = {};
info.notCheckable = true
info.text = L["TITAN_GOLD_TOOLTIP_DISPLAY_OPTIONS"];
info.value = "Display_Options";
info.hasArrow = 1;
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
TitanPanelRightClickMenu_AddSeparator();
if Warband.active then
-- Function to toggle show / hide of Warbank gold
info = {};
info.text = L["TITAN_GOLD_INCLUDE_WARBANK"] -- .. " - " .. NiceTextCash(Warband.GetSum()).."";
info.checked = TitanGetVar(TITAN_GOLD_ID, "ShowWarband");
info.func = function()
TitanToggleVar(TITAN_GOLD_ID, "ShowWarband")
TitanPanelButton_UpdateButton(TITAN_GOLD_ID)
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel())
else
-- Warbank not in this expansion
end
-- Show / delete toons
info = {};
info.notCheckable = true
info.text = L["TITAN_GOLD_SHOW_PLAYER"];
info.value = "ToonShow";
info.hasArrow = 1;
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
info = {};
info.notCheckable = true
info.text = L["TITAN_GOLD_DELETE_PLAYER"];
info.value = "ToonDelete";
info.hasArrow = 1;
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
TitanPanelRightClickMenu_AddSeparator();
-- Option to clear the enter database
info = {};
info.notCheckable = true
info.text = L["TITAN_GOLD_CLEAR_DATA_TEXT"];
info.func = TitanGold_ClearDB;
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
TitanPanelRightClickMenu_AddCommand(L["TITAN_GOLD_RESET_SESS_TEXT"], TITAN_GOLD_ID, ResetSession);
TitanPanelRightClickMenu_AddControlVars(TITAN_GOLD_ID)
end
-- Second (2nd) level for show / delete | sort by
if TitanPanelRightClickMenu_GetDropdownLevel() == 2
and TitanPanelRightClickMenu_GetDropdMenuValue() == "ToonDelete" then
local info = {};
info.notCheckable = true
info.text = L["TITAN_GOLD_FACTION_PLAYER_ALLY"];
info.value = "DeleteAlliance";
info.hasArrow = 1;
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
info.text = L["TITAN_GOLD_FACTION_PLAYER_HORDE"];
info.value = "DeleteHorde";
info.hasArrow = 1;
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
elseif TitanPanelRightClickMenu_GetDropdownLevel() == 2
and TitanPanelRightClickMenu_GetDropdMenuValue() == "ToonShow" then
local info = {};
info.notCheckable = true
info.text = L["TITAN_GOLD_FACTION_PLAYER_ALLY"];
info.value = "ShowAlliance";
info.hasArrow = 1;
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
info.text = L["TITAN_GOLD_FACTION_PLAYER_HORDE"];
info.value = "ShowHorde";
info.hasArrow = 1;
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
elseif TitanPanelRightClickMenu_GetDropdownLevel() == 3
and TitanPanelRightClickMenu_GetDropdMenuValue() == "Sorting" then
-- Show gold only option - no silver, no copper
local info = {};
info.text = L["TITAN_GOLD_TOGGLE_SORT_GOLD"]
info.checked = not TitanGetVar(TITAN_GOLD_ID, "SortByName");
info.func = function()
Sort_Toggle()
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
local info = {};
info.text = L["TITAN_GOLD_TOGGLE_SORT_NAME"]
info.checked = TitanGetVar(TITAN_GOLD_ID, "SortByName");
info.func = function()
Sort_Toggle()
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
TitanPanelRightClickMenu_AddSeparator(TitanPanelRightClickMenu_GetDropdownLevel());
local info = {};
info.text = L["TITAN_GOLD_GROUP_BY_REALM"];
info.checked = TitanGetVar(TITAN_GOLD_ID, "GroupByRealm")
info.func = function()
TitanToggleVar(TITAN_GOLD_ID, "GroupByRealm")
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
elseif TitanPanelRightClickMenu_GetDropdownLevel() == 2
and TitanPanelRightClickMenu_GetDropdMenuValue() == "Display_Options" then
DisplayOptions()
end
-- Third (3rd) level for the list of characters / toons
if TitanPanelRightClickMenu_GetDropdownLevel() == 3 and TitanPanelRightClickMenu_GetDropdMenuValue() == "DeleteAlliance" then
DeleteMenuButtons(TITAN_ALLIANCE, 3)
elseif TitanPanelRightClickMenu_GetDropdownLevel() == 3 and TitanPanelRightClickMenu_GetDropdMenuValue() == "DeleteHorde" then
DeleteMenuButtons(TITAN_HORDE, 3)
elseif TitanPanelRightClickMenu_GetDropdownLevel() == 3 and TitanPanelRightClickMenu_GetDropdMenuValue() == "ShowAlliance" then
ShowMenuButtons(TITAN_ALLIANCE, 3)
elseif TitanPanelRightClickMenu_GetDropdownLevel() == 3 and TitanPanelRightClickMenu_GetDropdMenuValue() == "ShowHorde" then
ShowMenuButtons(TITAN_HORDE, 3)
end
end
---local Get the gold total the user wants (server or player).
local function FindGold()
if (not GOLD_INITIALIZED) then
-- in case there is no db entry for this toon, return blank.
-- When Gold is ready it will init
return ""
end
local ret_str = ""
local ttlgold = 0;
if TitanGetVar(TITAN_GOLD_ID, "ViewAll") then
ttlgold = TotalGold()
else
ttlgold = GoldSave[GOLD_INDEX].gold
end
ret_str = NiceCash(ttlgold, true, false)
return L["TITAN_GOLD_MENU_TEXT"] .. ": " .. FONT_COLOR_CODE_CLOSE, ret_str
end
---local Build the plugin .registry and init and register for events
---@param self Button
local function OnLoad(self)
local notes = ""
.. "Keeps track of all gold held by a player's toons.\n"
.. "- Can show by server / merged servers / all servers.\n"
.. "- Can show by faction.\n"
.. "Shift + Left click will print list of connected servers to chat.\n"
self.registry = {
id = TITAN_GOLD_ID,
category = "Built-ins",
version = TITAN_GOLD_VERSION,
menuText = L["TITAN_GOLD_MENU_TEXT"],
menuTextFunction = CreateMenu,
tooltipTitle = L["TITAN_GOLD_TOOLTIP"],
tooltipTextFunction = GetTooltipText,
buttonTextFunction = FindGold,
icon = "Interface\\AddOns\\TitanGold\\Artwork\\TitanGold",
iconWidth = 16,
notes = notes,
controlVariables = {
ShowIcon = true,
ShowLabelText = true,
ShowRegularText = false,
ShowColoredText = false,
DisplayOnRightSide = true,
},
savedVariables = {
Initialized = true,
DisplayGoldPerHour = true,
ShowCoinNone = false,
ShowCoinLabels = true,
ShowCoinIcons = false,
ShowGoldOnly = false,
SortByName = true,
ViewAll = true,
ShowIcon = true,
ShowLabelText = false,
ShowColoredText = true,
DisplayOnRightSide = false,
UseSeperatorComma = true,
UseSeperatorPeriod = false,
UseSeperatorSpace = false,
MergeServers = false,
SeparateServers = true,
AllServers = false,
IgnoreFaction = false,
GroupByRealm = false,
gold = { total = "112233", neg = false },
ShowSessionInfo = true,
ShowWarband = true,
}
};
self:RegisterEvent("ADDON_LOADED");
self:RegisterEvent("PLAYER_ENTERING_WORLD");
end
---local When shown, register needed events and start timer for gold per hour
---@param self Button
local function OnShow(self)
self:RegisterEvent("PLAYER_MONEY")
GoldSave[GOLD_INDEX].gold = Get_Money()
if GoldSave and TitanGetVar(TITAN_GOLD_ID, "DisplayGoldPerHour") then
if GoldTimerRunning then
-- Do not start a new one
else
GoldTimer = AceTimer:ScheduleRepeatingTimer(TitanPanelPluginHandle_OnUpdate, 1, updateTable)
GoldTimerRunning = true
end
else
-- timer running or user does not want gold per hour
end
-- Leave active so user can toggle
if Warband.active then
Warband.SetSum()
self:RegisterEvent("ACCOUNT_MONEY") -- register for changes
end
end
---local When shown, unregister needed events and stop timer for gold per hour
---@param self Button
local function OnHide(self)
self:UnregisterEvent("PLAYER_MONEY");
if Warband.active then
---@diagnostic disable-next-line: param-type-mismatch
self:UnregisterEvent("ACCOUNT_MONEY")
end
AceTimer:CancelTimer(GoldTimer)
GoldTimerRunning = false
end
---local Handle registered events for this plugin
---@param self Button
---@param event string
---@param ... any
local function OnEvent(self, event, a1, ...)
--[[
print("_OnEvent"
.." "..tostring(event)..""
)
--]]
if (event == "PLAYER_MONEY") then
if (GOLD_INITIALIZED) then
GoldSave[GOLD_INDEX].gold = Get_Money()
TitanPanelButton_UpdateButton(TITAN_GOLD_ID)
end
elseif (event == "ACCOUNT_MONEY") then
if (GOLD_INITIALIZED) then
Warband.SetSum()
end
elseif (event == "ADDON_LOADED") then
if a1 == addonName then
realmName = GetRealmName() -- this realm
realmNames = GetConnectedRealms()
-- flip to make a simple lookup later rather than a loop
for index, realm in pairs(realmNames) do
merged_realms[realm] = true
end
-- Faction is English to use as index NOT display
GOLD_INDEX = CreateIndex(player_name, realmName, player_faction)
else
-- Not this addon
end
elseif (event == "PLAYER_ENTERING_WORLD") then
Initialize_Array(self);
Warband.Init()
TitanPanelButton_UpdateButton(TITAN_GOLD_ID)
end
end
---Button clicks - only shift-left for now
---@param self Button
---@param button string
function OnClick(self, button)
if button == "LeftButton" and IsShiftKeyDown() then
local realms = GetConnectedRealms()
local this_realm = " * "
local mark = ""
TitanPrint("Connected Realms:", "plain")
for idx = 1, #realms do
if realms[idx] == realmName then
mark = this_realm
else
mark = ""
end
TitanPrint("- " .. tostring(realms[idx]) .. mark, "plain")
end
end
end
---local Create required Gold frames
local function Create_Frames()
if _G[TITAN_BUTTON] then
return -- if already created
end
-- general container frame
local f = CreateFrame("Frame", nil, UIParent)
-- f:Hide()
-- Titan plugin button
local window = CreateFrame("Button", TITAN_BUTTON, f, "TitanPanelComboTemplate")
window:SetFrameStrata("FULLSCREEN")
-- Using SetScript("OnLoad", does not work
OnLoad(window);
-- TitanPanelButton_OnLoad(window); -- Titan XML template calls this...
window:SetScript("OnShow", function(self)
OnShow(self);
TitanPanelButton_OnShow(self);
end)
window:SetScript("OnHide", function(self)
OnHide(self);
end)
window:SetScript("OnEvent", function(self, event, ...)
OnEvent(self, event, ...)
end)
window:SetScript("OnClick", function(self, button)
OnClick(self, button);
TitanPanelButton_OnClick(self, button);
end)
end
Create_Frames() -- do the work