bbe2492a5b
Each DataStore_* / Altoholic_* addon now lives at the repo root, matching the Exiles fork-layout convention (one folder per addon, no wrapper dir).
881 lines
26 KiB
Lua
881 lines
26 KiB
Lua
local L = LibStub("AceLocale-3.0"):GetLocale("Altoholic")
|
|
|
|
Altoholic.Sharing = {}
|
|
Altoholic.Sharing.Clients = {} -- authorized clients
|
|
Altoholic.Sharing.Content = {} -- shared content
|
|
Altoholic.Sharing.AvailableContent = {} -- available content
|
|
|
|
local THIS_ACCOUNT = "Default"
|
|
local WHITE = "|cFFFFFFFF"
|
|
local RED = "|cFFFF0000"
|
|
local GREEN = "|cFF00FF00"
|
|
local LIGHTBLUE = "|cFFB0B0FF"
|
|
|
|
local AUTH_AUTO = 1
|
|
local AUTH_ASK = 2
|
|
local AUTH_NEVER = 3
|
|
|
|
local function FirstCap(s)
|
|
return strupper(s:sub(1,1)) .. strlower(s:sub(2)) -- first letter in cap, the rest lowercase
|
|
end
|
|
|
|
local function GetNumClients()
|
|
return #Altoholic.db.global.Sharing.Clients
|
|
end
|
|
|
|
local function GetClientInfo(index)
|
|
local info = Altoholic.db.global.Sharing.Clients[index]
|
|
if info then
|
|
local name, auth = strsplit("|", info)
|
|
return name, tonumber(auth)
|
|
end
|
|
end
|
|
|
|
local function GetSizeInKB(size)
|
|
return format("%2.1f KB", size / 1024)
|
|
end
|
|
|
|
-- *** Authorized Clients ***
|
|
|
|
local ClientsScrollFrame_Desc = {
|
|
NumLines = 6,
|
|
LineHeight = 18,
|
|
Frame = "AltoholicFrameSharingClients",
|
|
GetSize = function()
|
|
return #Altoholic.db.global.Sharing.Clients
|
|
end,
|
|
Update = function(self, offset, entry, desc)
|
|
for i=1, desc.NumLines do
|
|
local line = i + offset
|
|
if line <= desc:GetSize() then
|
|
local name, auth = GetClientInfo(line)
|
|
_G[ entry..i.."NameNormalText" ].name = name
|
|
|
|
if auth == AUTH_NEVER then
|
|
name = RED..name
|
|
elseif auth == AUTH_AUTO then
|
|
name = GREEN..name
|
|
end
|
|
|
|
_G[ entry..i.."NameNormalText" ]:SetText(name)
|
|
_G[ entry..i.."Never" ]:SetChecked((auth == AUTH_NEVER) and 1 or nil)
|
|
_G[ entry..i.."Ask" ]:SetChecked((auth == AUTH_ASK) and 1 or nil)
|
|
_G[ entry..i.."Auto" ]:SetChecked((auth == AUTH_AUTO) and 1 or nil)
|
|
|
|
_G[ entry..i ]:SetID(line)
|
|
_G[ entry..i ]:Show()
|
|
else
|
|
_G[ entry..i.."NameNormalText" ].name = nil
|
|
end
|
|
end
|
|
end,
|
|
}
|
|
|
|
function Altoholic.Sharing.Clients:Update()
|
|
Altoholic:ScrollFrameUpdate(ClientsScrollFrame_Desc)
|
|
end
|
|
|
|
function Altoholic.Sharing.Clients:Add(name)
|
|
if type(name) ~= "string" then return end
|
|
if strlen(name) == 0 then return end
|
|
|
|
name = FirstCap(name)
|
|
|
|
local clients = Altoholic.db.global.Sharing.Clients
|
|
local alreadyExists
|
|
|
|
for _, clientInfo in pairs(clients) do
|
|
local clientName = strsplit("|", clientInfo)
|
|
if clientName == name then
|
|
alreadyExists = true
|
|
end
|
|
end
|
|
|
|
if not alreadyExists then -- if this character does not exist, add it
|
|
table.insert(clients, format("%s|%s", name, AUTH_ASK))
|
|
end
|
|
end
|
|
|
|
function Altoholic.Sharing.Clients:Delete(name)
|
|
if type(name) ~= "string" then return end
|
|
|
|
name = FirstCap(name)
|
|
local clients = Altoholic.db.global.Sharing.Clients
|
|
|
|
for index, clientInfo in pairs(clients) do
|
|
local clientName = strsplit("|", clientInfo)
|
|
if clientName == name then -- clear the name if found in the table
|
|
table.remove(clients, index)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
function Altoholic.Sharing.Clients:Auth_OnClick(self)
|
|
local line = self:GetParent():GetID()
|
|
local name = GetClientInfo(line)
|
|
local clients = Altoholic.db.global.Sharing.Clients
|
|
|
|
clients[line] = format("%s|%s", name, self:GetID())
|
|
Altoholic.Sharing.Clients:Update()
|
|
end
|
|
|
|
function Altoholic.Sharing.Clients:GetRights(name)
|
|
-- returns the right of a given player
|
|
local clients = Altoholic.db.global.Sharing.Clients
|
|
|
|
for i = 1, GetNumClients() do
|
|
local clientName, auth = GetClientInfo(i)
|
|
if clientName == name then
|
|
return auth
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
-- *** Shared Content ***
|
|
|
|
local mandatoryModules = { -- mandatory modules are sent anyway (if the character is shared, of course)
|
|
"DataStore_Characters",
|
|
"DataStore_Stats",
|
|
}
|
|
|
|
local optionalModules = { -- this defines the order in which modules should be listed
|
|
"DataStore_Achievements",
|
|
"DataStore_Auctions",
|
|
"DataStore_Containers",
|
|
"DataStore_Crafts",
|
|
"DataStore_Currencies",
|
|
"DataStore_Inventory",
|
|
"DataStore_Mails",
|
|
"DataStore_Pets",
|
|
"DataStore_Quests",
|
|
"DataStore_Reputations",
|
|
"DataStore_Skills",
|
|
"DataStore_Spells",
|
|
"DataStore_Talents",
|
|
}
|
|
|
|
local moduleLabels = { -- these are the labels
|
|
["DataStore_Achievements"] = ACHIEVEMENT_BUTTON, -- "Achievements"
|
|
["DataStore_Auctions"] = format("%s & %s", AUCTIONS, BIDS),
|
|
-- ["DataStore_Characters"] = ,
|
|
["DataStore_Containers"] = L["Containers"],
|
|
["DataStore_Crafts"] = L["Professions"],
|
|
["DataStore_Currencies"] = CURRENCY,
|
|
["DataStore_Inventory"] = L["Equipment"],
|
|
["DataStore_Mails"] = L["Mails"],
|
|
["DataStore_Pets"] = format("%s & %s", COMPANIONS, MOUNTS),
|
|
["DataStore_Quests"] = L["Quests"],
|
|
["DataStore_Reputations"] = L["Reputations"],
|
|
["DataStore_Skills"] = SKILLS,
|
|
["DataStore_Spells"] = SPELLBOOK,
|
|
-- ["DataStore_Stats"] = ,
|
|
["DataStore_Talents"] = format("%s & %s", TALENTS, GLYPHS),
|
|
}
|
|
|
|
|
|
local GUILD_HEADER_LINE = 1
|
|
local GUILD_BANKTAB_LINE = 2
|
|
local CHARACTER_HEADER_LINE = 3
|
|
local CHARACTER_DATASTORE_LINE = 4
|
|
local CLASS_REFDATA_LINE = 5 -- only for available content, not for shared content view
|
|
|
|
local function isGuildShared(realm, name)
|
|
local sc = Altoholic.db.global.Sharing.SharedContent
|
|
local index = format("%s.%s.%s", THIS_ACCOUNT, realm, name)
|
|
|
|
return sc[index]
|
|
end
|
|
|
|
local function isGuildBankTabShared(realm, name, tabID)
|
|
local sc = Altoholic.db.global.Sharing.SharedContent
|
|
local index = format("%s.%s.%s.%s", THIS_ACCOUNT, realm, name, tabID)
|
|
|
|
return sc[index]
|
|
end
|
|
|
|
local function isCharacterShared(key)
|
|
local sc = Altoholic.db.global.Sharing.SharedContent
|
|
return sc[key]
|
|
end
|
|
|
|
local function isCharacterDataShared(key, module)
|
|
local sc = Altoholic.db.global.Sharing.SharedContent
|
|
local index = key .. "." .. module
|
|
|
|
return sc[index]
|
|
end
|
|
|
|
|
|
|
|
local ContentCollapsedHeaders -- a table containing the collapsed headers (character keys)
|
|
|
|
local ContentScrollFrame_Desc = {
|
|
NumLines = 14,
|
|
LineHeight = 18,
|
|
Frame = "AltoholicFrameSharedContent",
|
|
GetSize = function()
|
|
return #Altoholic.Sharing.Content.view
|
|
end,
|
|
Update = function(self, offset, entry, desc)
|
|
local line, LineDesc
|
|
|
|
for i=1, desc.NumLines do
|
|
line = i + offset
|
|
local lineData = Altoholic.Sharing.Content.view[line]
|
|
if line <= desc:GetSize() then
|
|
LineDesc = desc.Lines[lineData.linetype]
|
|
LineDesc:DrawCollapseButton(lineData, entry..i)
|
|
LineDesc:DrawCheckBox(lineData, entry..i)
|
|
_G[entry..i.."CheckText"]:SetText(LineDesc:GetText(lineData))
|
|
_G[entry..i.."Check"]:SetPoint("TOPLEFT", LineDesc:GetOffset(lineData), 0)
|
|
_G[ entry..i ]:SetID(line)
|
|
_G[ entry..i ]:Show()
|
|
end
|
|
end
|
|
end,
|
|
Lines = {
|
|
[GUILD_HEADER_LINE] = {
|
|
GetText = function(self, line)
|
|
return format("%s|r / %s", WHITE..line.realm, GREEN..line.name)
|
|
end,
|
|
GetOffset = function(self, line)
|
|
return 20
|
|
end,
|
|
DrawCollapseButton = function(self, line, entry)
|
|
local item = _G[ entry.."Collapse" ]
|
|
local index = format("%s.%s.%s", THIS_ACCOUNT, line.realm, line.name)
|
|
|
|
if not ContentCollapsedHeaders[index] then
|
|
item:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up");
|
|
else
|
|
item:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up");
|
|
end
|
|
item:Show()
|
|
end,
|
|
DrawCheckBox = function(self, line, entry)
|
|
_G[ entry.."Check" ]:SetChecked(isGuildShared(line.realm, line.name))
|
|
end,
|
|
},
|
|
[GUILD_BANKTAB_LINE] = {
|
|
GetText = function(self, line)
|
|
local DS = DataStore
|
|
local guild = DS:GetGuild(line.name, line.realm)
|
|
local tabName = DS:GetGuildBankTabName(guild, line.tabID)
|
|
|
|
return tabName
|
|
end,
|
|
GetOffset = function(self, line)
|
|
return 40
|
|
end,
|
|
DrawCollapseButton = function(self, line, entry)
|
|
_G[ entry.."Collapse" ]:Hide()
|
|
end,
|
|
DrawCheckBox = function(self, line, entry)
|
|
_G[ entry.."Check" ]:SetChecked(isGuildBankTabShared(line.realm, line.name, line.tabID))
|
|
end,
|
|
},
|
|
[CHARACTER_HEADER_LINE] = {
|
|
GetText = function(self, line)
|
|
local _, realm, name = strsplit(".", line.key)
|
|
return format("%s|r / %s", WHITE..realm, DataStore:GetColoredCharacterName(line.key))
|
|
end,
|
|
GetOffset = function(self, line)
|
|
return 20
|
|
end,
|
|
DrawCollapseButton = function(self, line, entry)
|
|
local item = _G[ entry.."Collapse" ]
|
|
if not ContentCollapsedHeaders[line.key] then
|
|
item:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up");
|
|
else
|
|
item:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up");
|
|
end
|
|
item:Show()
|
|
end,
|
|
DrawCheckBox = function(self, line, entry)
|
|
_G[ entry.."Check" ]:SetChecked(isCharacterShared(line.key))
|
|
end,
|
|
},
|
|
[CHARACTER_DATASTORE_LINE] = {
|
|
GetText = function(self, line)
|
|
return moduleLabels[line.module]
|
|
end,
|
|
GetOffset = function(self, line)
|
|
return 40
|
|
end,
|
|
DrawCollapseButton = function(self, line, entry)
|
|
_G[ entry.."Collapse" ]:Hide()
|
|
end,
|
|
DrawCheckBox = function(self, line, entry)
|
|
_G[ entry.."Check" ]:SetChecked(isCharacterDataShared(line.key, line.module))
|
|
end,
|
|
},
|
|
},
|
|
}
|
|
|
|
|
|
function Altoholic.Sharing.Content:BuildView()
|
|
ContentCollapsedHeaders = ContentCollapsedHeaders or {}
|
|
self.view = self.view or {}
|
|
wipe(self.view)
|
|
|
|
local DS = DataStore
|
|
for realm in pairs(DS:GetRealms()) do -- all realms on this account
|
|
for guildName, guild in pairs(DS:GetGuilds(realm)) do -- add guilds
|
|
table.insert(self.view, { linetype = GUILD_HEADER_LINE, realm = realm, name = guildName } )
|
|
|
|
local index = format("%s.%s.%s", THIS_ACCOUNT, realm, guildName)
|
|
|
|
if not ContentCollapsedHeaders[index] then
|
|
for i=1, 6 do -- add guild bank tabs
|
|
local tabName = DS:GetGuildBankTabName(guild, i)
|
|
if tabName then
|
|
table.insert(self.view, { linetype = GUILD_BANKTAB_LINE, realm = realm, name = guildName, tabID = i } )
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
for characterName, character in pairs(DS:GetCharacters(realm)) do
|
|
table.insert(self.view, { linetype = CHARACTER_HEADER_LINE, key = character } )
|
|
|
|
if not ContentCollapsedHeaders[character] then
|
|
for _, v in pairs(optionalModules) do
|
|
table.insert(self.view, { linetype = CHARACTER_DATASTORE_LINE, key = character, module = v } )
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function Altoholic.Sharing.Content:Update()
|
|
Altoholic:ScrollFrameUpdate(ContentScrollFrame_Desc)
|
|
end
|
|
|
|
function Altoholic.Sharing.Content:Collapse_OnClick(self, button)
|
|
local id = self:GetParent():GetID()
|
|
local self = Altoholic.Sharing.Content
|
|
local line = self.view[id]
|
|
|
|
local index
|
|
if line.linetype == GUILD_HEADER_LINE then
|
|
index = format("%s.%s.%s", THIS_ACCOUNT, line.realm, line.name)
|
|
elseif line.linetype == CHARACTER_HEADER_LINE then
|
|
index = line.key
|
|
end
|
|
|
|
if not ContentCollapsedHeaders[index] then
|
|
ContentCollapsedHeaders[index] = true
|
|
else
|
|
ContentCollapsedHeaders[index] = nil
|
|
end
|
|
self:BuildView()
|
|
self:Update()
|
|
end
|
|
|
|
function Altoholic.Sharing.Content:Check_OnClick(self, button)
|
|
local id = self:GetParent():GetID()
|
|
local isChecked = self:GetChecked()
|
|
|
|
local self = Altoholic.Sharing.Content
|
|
local line = self.view[id]
|
|
|
|
local sc = Altoholic.db.global.Sharing.SharedContent
|
|
local index
|
|
|
|
if line.linetype == GUILD_HEADER_LINE then
|
|
index = format("%s.%s.%s", THIS_ACCOUNT, line.realm, line.name)
|
|
elseif line.linetype == GUILD_BANKTAB_LINE then
|
|
index = format("%s.%s.%s.%s", THIS_ACCOUNT, line.realm, line.name, line.tabID)
|
|
elseif line.linetype == CHARACTER_HEADER_LINE then
|
|
index = line.key
|
|
else
|
|
index = line.key .. "." .. line.module
|
|
end
|
|
sc[index] = isChecked
|
|
self:BuildView()
|
|
self:Update()
|
|
end
|
|
|
|
function Altoholic.Sharing.Content:ToggleAll(self, button)
|
|
local tex
|
|
|
|
if not self.isCollapsed then -- are all entries collapsed or not ?
|
|
self.isCollapsed = true
|
|
tex = "Interface\\Buttons\\UI-PlusButton-Up"
|
|
else
|
|
self.isCollapsed = nil
|
|
tex = "Interface\\Buttons\\UI-MinusButton-Up"
|
|
end
|
|
self:SetNormalTexture(tex);
|
|
|
|
local DS = DataStore
|
|
for realm in pairs(DS:GetRealms()) do -- all realms on this account
|
|
for guildName, _ in pairs(DS:GetGuilds(realm)) do
|
|
local index = format("%s.%s.%s", THIS_ACCOUNT, realm, guildName)
|
|
ContentCollapsedHeaders[index] = self.isCollapsed
|
|
end
|
|
|
|
for characterName, character in pairs(DS:GetCharacters(realm)) do
|
|
ContentCollapsedHeaders[character] = self.isCollapsed
|
|
end
|
|
end
|
|
|
|
local self = Altoholic.Sharing.Content
|
|
self:BuildView()
|
|
self:Update()
|
|
end
|
|
|
|
function Altoholic.Sharing.Content:CheckAll(self, button)
|
|
local sc = Altoholic.db.global.Sharing.SharedContent
|
|
|
|
if not self.isChecked then -- are all entries collapsed or not ?
|
|
self.isChecked = true
|
|
else
|
|
self.isChecked = nil
|
|
end
|
|
self:SetChecked(self.isChecked);
|
|
|
|
local DS = DataStore
|
|
for realm in pairs(DS:GetRealms()) do -- all realms on this account
|
|
-- guilds
|
|
for guildName, guild in pairs(DS:GetGuilds(realm)) do
|
|
local index = format("%s.%s.%s", THIS_ACCOUNT, realm, guildName)
|
|
sc[index] = self.isChecked
|
|
|
|
for i=1, 6 do -- add guild bank tabs
|
|
if DS:GetGuildBankTabName(guild, i) then
|
|
index = format("%s.%s.%s.%s", THIS_ACCOUNT, realm, guildName, i)
|
|
sc[index] = self.isChecked
|
|
end
|
|
end
|
|
end
|
|
|
|
-- characters
|
|
for characterName, character in pairs(DS:GetCharacters(realm)) do
|
|
sc[character] = self.isChecked
|
|
|
|
for _, v in pairs(optionalModules) do
|
|
sc[character .. "." .. v] = self.isChecked
|
|
end
|
|
end
|
|
end
|
|
|
|
local self = Altoholic.Sharing.Content
|
|
self:BuildView()
|
|
self:Update()
|
|
end
|
|
|
|
local TOC_SETREALM = "1"
|
|
local TOC_SETGUILD = "2"
|
|
local TOC_BANKTAB = "3"
|
|
local TOC_SETCHAR = "4"
|
|
local TOC_DATASTORE = "5"
|
|
local TOC_REFDATA = "6"
|
|
|
|
function Altoholic.Sharing.Content:GetOptionalModuleName(index)
|
|
return optionalModules[index]
|
|
end
|
|
|
|
function Altoholic.Sharing.Content:GetSourceTOC()
|
|
-- prepares the table of content that will be sent to the user requesting account sharing
|
|
|
|
-- This method adds all realms, all guilds, all characters on the current account, assuming they are shared
|
|
-- Reference data (available classes) is always sent, and mandatory modules in datastore are not sent (they're implicit, if a character is shared, they must be sent)
|
|
|
|
-- on the receiving side, display mandatory items as part of the list, but greyed out/disabled and automatically selected for transfer
|
|
|
|
local DS = DataStore
|
|
local serializedData, lastUpdate
|
|
local toc = {}
|
|
|
|
for realm in pairs(DS:GetRealms()) do -- all realms on this account
|
|
table.insert(toc, format("%s|%s", TOC_SETREALM, realm))
|
|
|
|
for guildName, guild in pairs(DS:GetGuilds(realm)) do -- add guilds
|
|
if isGuildShared(realm, guildName) then
|
|
table.insert(toc, format("%s|%s", TOC_SETGUILD, guildName))
|
|
|
|
for tabID = 1, 6 do -- add guild bank tabs
|
|
local tabName = DS:GetGuildBankTabName(guild, tabID)
|
|
if tabName and isGuildBankTabShared(realm, guildName, tabID) then
|
|
serializedData = Altoholic:Serialize(DS:GetGuildBankTab(guild, tabID))
|
|
lastUpdate = DS:GetGuildBankTabLastUpdate(guild, tabID)
|
|
table.insert(toc, format("%s|%s|%s|%s|%s", TOC_BANKTAB, tabName, tabID, strlen(serializedData), lastUpdate or 0))
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
for characterName, character in pairs(DS:GetCharacters(realm)) do
|
|
if isCharacterShared(character) then
|
|
-- get the size of mandatory modules
|
|
local size = 0
|
|
for k, module in pairs(mandatoryModules) do
|
|
serializedData = Altoholic:Serialize(DS:GetCharacterTable(module, characterName, realm))
|
|
size = size + strlen(serializedData)
|
|
end
|
|
|
|
local _, class = DS:GetCharacterClass(character)
|
|
lastUpdate = DS:GetModuleLastUpdate("DataStore_Characters", characterName, realm)
|
|
table.insert(toc, format("%s|%s|%s|%s|%s", TOC_SETCHAR, characterName, class, size, lastUpdate or 0))
|
|
|
|
|
|
for k, module in pairs(optionalModules) do
|
|
if isCharacterDataShared(character, module) then
|
|
-- evaluate the size of transferred data
|
|
serializedData = Altoholic:Serialize(DS:GetCharacterTable(module, characterName, realm))
|
|
lastUpdate = DS:GetModuleLastUpdate(module, characterName, realm)
|
|
|
|
-- only pass the key to the right datastore module (ex 4 for DataStore_Crafts)
|
|
table.insert(toc, format("%s|%s|%s|%s", TOC_DATASTORE, k, strlen(serializedData), lastUpdate or 0))
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- add reference here
|
|
for class, _ in pairs(DS:GetReferenceTable()) do
|
|
serializedData = Altoholic:Serialize(DS:GetClassReference(class))
|
|
table.insert(toc, format("%s|%s|%s", TOC_REFDATA, class, strlen(serializedData)))
|
|
end
|
|
|
|
return toc
|
|
end
|
|
|
|
|
|
|
|
|
|
-- *** Available Content ***
|
|
local AvailableContentCollapsedHeaders -- a table containing the collapsed headers (character keys)
|
|
local AvailableContentCheckedItems -- a table containing the items checked in the TOC (index = true)
|
|
|
|
local AvailableContentScrollFrame_Desc = {
|
|
NumLines = 10,
|
|
LineHeight = 18,
|
|
Frame = "AltoholicFrameAvailableContent",
|
|
GetSize = function()
|
|
return #Altoholic.Sharing.AvailableContent.view
|
|
end,
|
|
Update = function(self, offset, entry, desc)
|
|
local line, LineDesc
|
|
|
|
for i=1, desc.NumLines do
|
|
line = i + offset
|
|
local lineData = Altoholic.Sharing.AvailableContent.view[line]
|
|
if line <= desc:GetSize() then
|
|
LineDesc = desc.Lines[lineData.linetype]
|
|
LineDesc:DrawCollapseButton(lineData, entry..i)
|
|
_G[entry..i.."CheckText"]:SetText(LineDesc:GetText(lineData))
|
|
_G[entry..i.."Check"]:SetPoint("TOPLEFT", LineDesc:GetOffset(lineData), 0)
|
|
_G[entry..i.."Check"]:SetID(lineData.parentID)
|
|
_G[entry..i.."Check"]:SetChecked(AvailableContentCheckedItems[lineData.parentID])
|
|
|
|
if lineData.size then
|
|
_G[entry..i.."Size"]:SetText(LIGHTBLUE..GetSizeInKB(lineData.size))
|
|
_G[entry..i.."Size"]:Show()
|
|
else
|
|
_G[entry..i.."Size"]:Hide()
|
|
end
|
|
|
|
if lineData.lastUpdate then
|
|
local text
|
|
if lineData.lastUpdate == 0 then
|
|
text = RED..NEVER
|
|
else
|
|
text = LineDesc:GetDate(lineData)
|
|
end
|
|
|
|
_G[entry..i.."Date"]:SetText(text)
|
|
_G[entry..i.."Date"]:Show()
|
|
else
|
|
_G[entry..i.."Date"]:Hide()
|
|
end
|
|
|
|
_G[ entry..i ]:SetID(line)
|
|
_G[ entry..i ]:Show()
|
|
end
|
|
end
|
|
end,
|
|
Lines = {
|
|
[GUILD_HEADER_LINE] = {
|
|
GetText = function(self, line)
|
|
return format("%s|r / %s", WHITE..line.realm, GREEN..line.name)
|
|
end,
|
|
GetOffset = function(self, line)
|
|
return 20
|
|
end,
|
|
DrawCollapseButton = function(self, line, entry)
|
|
local item = _G[ entry.."Collapse" ]
|
|
local index = format("%s.%s.%s", Altoholic.Comm.Sharing:GetAccount(), line.realm, line.name)
|
|
|
|
if not AvailableContentCollapsedHeaders[index] then
|
|
item:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up");
|
|
else
|
|
item:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up");
|
|
end
|
|
item:Show()
|
|
end,
|
|
GetDate = function(self, line)
|
|
return LIGHTBLUE..date("%m/%d/%Y %H:%M", line.lastUpdate)
|
|
end,
|
|
},
|
|
[GUILD_BANKTAB_LINE] = {
|
|
GetText = function(self, line)
|
|
return line.tabName
|
|
end,
|
|
GetOffset = function(self, line)
|
|
return 40
|
|
end,
|
|
DrawCollapseButton = function(self, line, entry)
|
|
_G[ entry.."Collapse" ]:Hide()
|
|
end,
|
|
GetDate = function(self, line)
|
|
return LIGHTBLUE..date("%m/%d/%Y %H:%M", line.lastUpdate)
|
|
end,
|
|
},
|
|
[CHARACTER_HEADER_LINE] = {
|
|
GetText = function(self, line)
|
|
local _, realm, name = strsplit(".", line.key)
|
|
name = Altoholic:GetClassColor(line.class) ..name
|
|
return format("%s|r / %s", WHITE..realm, name)
|
|
end,
|
|
GetOffset = function(self, line)
|
|
return 20
|
|
end,
|
|
DrawCollapseButton = function(self, line, entry)
|
|
local item = _G[ entry.."Collapse" ]
|
|
if not AvailableContentCollapsedHeaders[line.key] then
|
|
item:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up");
|
|
else
|
|
item:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up");
|
|
end
|
|
item:Show()
|
|
end,
|
|
GetDate = function(self, line)
|
|
local account, realm, name = strsplit(".", line.key)
|
|
local last = DataStore:GetModuleLastUpdate("DataStore_Characters", name, realm, account)
|
|
|
|
if last == line.lastUpdate then
|
|
return GREEN.."Up-to-date"
|
|
else
|
|
return LIGHTBLUE..date("%m/%d/%Y %H:%M", line.lastUpdate)
|
|
end
|
|
end,
|
|
},
|
|
[CHARACTER_DATASTORE_LINE] = {
|
|
GetText = function(self, line)
|
|
return moduleLabels[line.module]
|
|
end,
|
|
GetOffset = function(self, line)
|
|
return 40
|
|
end,
|
|
DrawCollapseButton = function(self, line, entry)
|
|
_G[ entry.."Collapse" ]:Hide()
|
|
end,
|
|
GetDate = function(self, line)
|
|
local account, realm, name = strsplit(".", line.key)
|
|
local last = DataStore:GetModuleLastUpdate(line.module, name, realm, account)
|
|
|
|
if last == line.lastUpdate then
|
|
return GREEN.."Up-to-date"
|
|
else
|
|
return LIGHTBLUE..date("%m/%d/%Y %H:%M", line.lastUpdate)
|
|
end
|
|
end,
|
|
},
|
|
[CLASS_REFDATA_LINE] = {
|
|
GetText = function(self, line)
|
|
return "Talent Tree Reference : " .. FirstCap(line.class)
|
|
end,
|
|
GetOffset = function(self, line)
|
|
return 20
|
|
end,
|
|
DrawCollapseButton = function(self, line, entry)
|
|
_G[ entry.."Collapse" ]:Hide()
|
|
end,
|
|
GetDate = function(self, line)
|
|
return LIGHTBLUE..date("%m/%d/%Y %H:%M", line.lastUpdate)
|
|
end,
|
|
},
|
|
},
|
|
}
|
|
|
|
|
|
function Altoholic.Sharing.AvailableContent:BuildView()
|
|
AvailableContentCollapsedHeaders = AvailableContentCollapsedHeaders or {}
|
|
AvailableContentCheckedItems = AvailableContentCheckedItems or {}
|
|
self.view = self.view or {}
|
|
wipe(self.view)
|
|
|
|
local sharing = Altoholic.Comm.Sharing
|
|
self.ToC = sharing.DestTOC
|
|
if not self.ToC then return end
|
|
|
|
local account = sharing:GetAccount()
|
|
local realm, character, guildName
|
|
|
|
for i = 1, #self.ToC do
|
|
local tocType, arg1, arg2, arg3, arg4 = strsplit("|", self.ToC[i])
|
|
|
|
if tocType == TOC_SETREALM then
|
|
realm = arg1
|
|
elseif tocType == TOC_SETGUILD then
|
|
guildName = arg1
|
|
table.insert(self.view, { linetype = GUILD_HEADER_LINE, realm = realm, name = guildName, parentID = i } )
|
|
elseif tocType == TOC_BANKTAB then
|
|
local index = format("%s.%s.%s", account, realm, guildName)
|
|
if not AvailableContentCollapsedHeaders[index] then
|
|
table.insert(self.view, {
|
|
linetype = GUILD_BANKTAB_LINE,
|
|
tabName = arg1,
|
|
tabID = tonumber(arg2),
|
|
size = tonumber(arg3),
|
|
lastUpdate = tonumber(arg4),
|
|
parentID = i,
|
|
} )
|
|
end
|
|
elseif tocType == TOC_SETCHAR then
|
|
character = format("%s.%s.%s", account, realm, arg1)
|
|
table.insert(self.view, {
|
|
linetype = CHARACTER_HEADER_LINE,
|
|
key = character,
|
|
class = arg2,
|
|
size = tonumber(arg3),
|
|
lastUpdate = tonumber(arg4),
|
|
parentID = i,
|
|
} )
|
|
elseif tocType == TOC_DATASTORE then
|
|
if not AvailableContentCollapsedHeaders[character] then
|
|
table.insert(self.view, {
|
|
linetype = CHARACTER_DATASTORE_LINE,
|
|
key = character,
|
|
module = optionalModules[tonumber(arg1)],
|
|
size = tonumber(arg2),
|
|
lastUpdate = tonumber(arg3),
|
|
parentID = i,
|
|
} )
|
|
end
|
|
elseif tocType == TOC_REFDATA then
|
|
if not DataStore:IsClassKnown(arg1) then -- filter to only list classes that are not yet available
|
|
table.insert(self.view, { linetype = CLASS_REFDATA_LINE, class = arg1, size = tonumber(arg2), parentID = i } )
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function Altoholic.Sharing.AvailableContent:Update()
|
|
Altoholic:ScrollFrameUpdate(AvailableContentScrollFrame_Desc)
|
|
end
|
|
|
|
function Altoholic.Sharing.AvailableContent:Collapse_OnClick(self, button)
|
|
local id = self:GetParent():GetID()
|
|
local content = Altoholic.Sharing.AvailableContent
|
|
local line = content.view[id]
|
|
|
|
local index
|
|
if line.linetype == GUILD_HEADER_LINE then
|
|
index = format("%s.%s.%s", Altoholic.Comm.Sharing:GetAccount(), line.realm, line.name)
|
|
elseif line.linetype == CHARACTER_HEADER_LINE then
|
|
index = line.key
|
|
end
|
|
|
|
if not AvailableContentCollapsedHeaders[index] then
|
|
AvailableContentCollapsedHeaders[index] = true
|
|
else
|
|
AvailableContentCollapsedHeaders[index] = nil
|
|
end
|
|
content:BuildView()
|
|
content:Update()
|
|
end
|
|
|
|
function Altoholic.Sharing.AvailableContent:Check_OnClick(self, button)
|
|
local id = self:GetID()
|
|
|
|
if not AvailableContentCheckedItems[id] then
|
|
AvailableContentCheckedItems[id] = true
|
|
else
|
|
AvailableContentCheckedItems[id] = nil
|
|
end
|
|
end
|
|
|
|
function Altoholic.Sharing.AvailableContent:ToggleAll(self, button)
|
|
local tex
|
|
|
|
if not self.isCollapsed then -- are all entries collapsed or not ?
|
|
self.isCollapsed = true
|
|
tex = "Interface\\Buttons\\UI-PlusButton-Up"
|
|
else
|
|
self.isCollapsed = nil
|
|
tex = "Interface\\Buttons\\UI-MinusButton-Up"
|
|
end
|
|
self:SetNormalTexture(tex);
|
|
|
|
local content = Altoholic.Sharing.AvailableContent
|
|
if not content.view then return end
|
|
|
|
for k, v in pairs(content.view) do -- parse the whole view
|
|
local index
|
|
if v.linetype == GUILD_HEADER_LINE then -- get the right index in lines that actually require it
|
|
index = format("%s.%s.%s", Altoholic.Comm.Sharing:GetAccount(), v.realm, v.name)
|
|
elseif v.linetype == CHARACTER_HEADER_LINE then
|
|
index = v.key
|
|
end
|
|
|
|
if index then
|
|
AvailableContentCollapsedHeaders[index] = self.isCollapsed
|
|
end
|
|
end
|
|
|
|
content:BuildView()
|
|
content:Update()
|
|
end
|
|
|
|
function Altoholic.Sharing.AvailableContent:CheckAll(self, button)
|
|
if not self.isChecked then -- are all entries collapsed or not ?
|
|
self.isChecked = true
|
|
else
|
|
self.isChecked = nil
|
|
end
|
|
self:SetChecked(self.isChecked);
|
|
|
|
local content = Altoholic.Sharing.AvailableContent
|
|
if not content.view then return end
|
|
|
|
for k, v in pairs(content.view) do -- parse the whole view
|
|
AvailableContentCheckedItems[v.parentID] = self.isChecked -- check or uncheck all
|
|
end
|
|
|
|
local self = Altoholic.Sharing.AvailableContent
|
|
self:BuildView()
|
|
self:Update()
|
|
end
|
|
|
|
function Altoholic.Sharing.AvailableContent:IsItemChecked(index)
|
|
if self.ToC then
|
|
local TocData = self.ToC[index]
|
|
if TocData then
|
|
local TocType = strsplit("|", TocData)
|
|
|
|
if TocType == TOC_SETREALM then
|
|
-- until I have more time to implement a fancier solution, always return true for realm lines, necessary to correctly switch realms when importing data from foreign realms
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
|
|
return AvailableContentCheckedItems[index]
|
|
end
|
|
|
|
function Altoholic.Sharing.AvailableContent:Clear()
|
|
-- clear command, after a successful transfer
|
|
|
|
wipe(AvailableContentCollapsedHeaders)
|
|
wipe(AvailableContentCheckedItems)
|
|
|
|
self:BuildView()
|
|
self:Update()
|
|
end
|