Files
Guda-ClassicAPI/Core/Database.lua
T
2025-11-16 15:41:03 +04:00

210 lines
5.5 KiB
Lua

-- Guda Database Module
-- Handles saving and loading character data
local addon = Guda
local DB = {}
addon.Modules.DB = DB
-- Current player info
local playerName, playerRealm, playerFaction
-- Initialize database
function DB:Initialize()
-- Get player info
playerName = UnitName("player")
playerRealm = GetRealmName()
playerFaction = UnitFactionGroup("player")
local fullName = playerName .. "-" .. playerRealm
-- Initialize global DB
if not Guda_DB then
Guda_DB = {
version = addon.VERSION,
characters = {},
}
end
-- Initialize character DB
if not Guda_CharDB then
Guda_CharDB = {
settings = {
showBankInBags = true,
showOtherChars = true,
bagColumns = 10,
bankBagColumns = 8,
bankColumns = 10,
sortMethod = "quality", -- quality, name, type
iconSize = 40,
iconSpacing = 0,
iconFontSize = 12,
},
}
end
-- Ensure new settings exist for existing installations
if not Guda_CharDB.settings.bagColumns then
Guda_CharDB.settings.bagColumns = 10
end
if not Guda_CharDB.settings.bankBagColumns then
Guda_CharDB.settings.bankBagColumns = 8
end
if not Guda_CharDB.settings.bankColumns then
Guda_CharDB.settings.bankColumns = 10
end
if not Guda_CharDB.settings.iconSize then
Guda_CharDB.settings.iconSize = 40
end
if not Guda_CharDB.settings.iconSpacing then
Guda_CharDB.settings.iconSpacing = 0
end
if not Guda_CharDB.settings.iconFontSize then
Guda_CharDB.settings.iconFontSize = 12
end
-- Initialize this character's data
if not Guda_DB.characters[fullName] then
Guda_DB.characters[fullName] = {
name = playerName,
realm = playerRealm,
faction = playerFaction,
class = UnitClass("player"),
level = UnitLevel("player"),
money = 0,
bags = {},
bank = {},
lastUpdate = time(),
}
end
addon:Debug("Database initialized for %s", fullName)
end
-- Get current player's full name
function DB:GetPlayerFullName()
return playerName .. "-" .. playerRealm
end
-- Get current character data
function DB:GetCurrentCharacter()
local fullName = self:GetPlayerFullName()
return Guda_DB.characters[fullName]
end
-- Save bag data
function DB:SaveBags(bagData)
local char = self:GetCurrentCharacter()
if char then
char.bags = bagData
char.lastUpdate = time()
addon:Debug("Saved bag data")
end
end
-- Save bank data
function DB:SaveBank(bankData)
local char = self:GetCurrentCharacter()
if char then
char.bank = bankData
char.lastUpdate = time()
addon:Debug("Saved bank data")
end
end
-- Save money
function DB:SaveMoney(copper)
local char = self:GetCurrentCharacter()
if char then
char.money = copper
char.level = UnitLevel("player")
addon:Debug("Saved money: %d copper", copper)
end
end
-- Get all characters (optionally filter by faction)
function DB:GetAllCharacters(sameFactionOnly)
local chars = {}
for fullName, data in pairs(Guda_DB.characters) do
if not sameFactionOnly or data.faction == playerFaction then
table.insert(chars, {
fullName = fullName,
name = data.name,
realm = data.realm,
class = data.class,
level = data.level,
faction = data.faction,
money = data.money,
lastUpdate = data.lastUpdate,
})
end
end
-- Sort by name
table.sort(chars, function(a, b)
return a.name < b.name
end)
return chars
end
-- Get character's bags
function DB:GetCharacterBags(fullName)
local char = Guda_DB.characters[fullName]
return char and char.bags or {}
end
-- Get character's bank
function DB:GetCharacterBank(fullName)
local char = Guda_DB.characters[fullName]
return char and char.bank or {}
end
-- Get total money across all characters
function DB:GetTotalMoney(sameFactionOnly)
local total = 0
for fullName, data in pairs(Guda_DB.characters) do
if not sameFactionOnly or data.faction == playerFaction then
total = total + (data.money or 0)
end
end
return total
end
-- Get character setting
function DB:GetSetting(key)
-- SavedVariables may not be initialized yet when some UI OnLoad scripts run
if not Guda_CharDB or not Guda_CharDB.settings then
return nil
end
return Guda_CharDB.settings[key]
end
-- Set character setting
function DB:SetSetting(key, value)
-- Ensure tables exist even if called early
if not Guda_CharDB then
Guda_CharDB = { settings = {} }
elseif not Guda_CharDB.settings then
Guda_CharDB.settings = {}
end
Guda_CharDB.settings[key] = value
end
-- Cleanup old characters (not updated in 90 days)
function DB:CleanupOldCharacters()
local cutoff = time() - (90 * 24 * 60 * 60) -- 90 days
local removed = 0
for fullName, data in pairs(Guda_DB.characters) do
if data.lastUpdate and data.lastUpdate < cutoff then
Guda_DB.characters[fullName] = nil
removed = removed + 1
end
end
if removed > 0 then
addon:Print("Cleaned up %d old character(s)", removed)
end
end