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.
198 lines
6.1 KiB
198 lines
6.1 KiB
|
5 years ago
|
-- ========================================================================= --
|
||
|
|
-- SylingTracker --
|
||
|
|
-- https://www.curseforge.com/wow/addons/sylingtracker --
|
||
|
|
-- --
|
||
|
|
-- Repository: --
|
||
|
|
-- https://github.com/Skamer/SylingTracker --
|
||
|
|
-- --
|
||
|
|
-- ========================================================================= --
|
||
|
|
Syling "SylingTracker.Core.Profiles" ""
|
||
|
|
-- ========================================================================= --
|
||
|
|
namespace "SLT"
|
||
|
|
-- ========================================================================= --
|
||
|
|
_SPECS_INDEX_ID = "__ScorpioSpecs"
|
||
|
|
_FIRST_EVENT_CALL_OCCURRED = false
|
||
|
|
GetActiveSpecGroup = GetActiveSpecGroup
|
||
|
|
-- ========================================================================= --
|
||
|
|
class "Profiles" (function(_ENV)
|
||
|
|
-----------------------------------------------------------------------------
|
||
|
|
-- Methods --
|
||
|
|
-----------------------------------------------------------------------------
|
||
|
|
__Static__() function SelectSpec()
|
||
|
|
Database.SelectRootSpec()
|
||
|
|
Database.SetValue("profile_used", "__spec")
|
||
|
|
end
|
||
|
|
|
||
|
|
__Static__() function SelectChar()
|
||
|
|
Database.SelectRootSpec()
|
||
|
|
Database.SetValue("profile_used", "__char")
|
||
|
|
end
|
||
|
|
|
||
|
|
__Static__() function SelectGlobal()
|
||
|
|
Database.SelectRootSpec()
|
||
|
|
Database.SetValue("profile_used", nil)
|
||
|
|
end
|
||
|
|
|
||
|
|
__Arguments__ { String }
|
||
|
|
__Static__() function Select(name)
|
||
|
|
Database.SelectRootSpec()
|
||
|
|
Database.SetValue("profile_used", name)
|
||
|
|
end
|
||
|
|
|
||
|
|
__Arguments__ { String }
|
||
|
|
__Static__() function Create(name)
|
||
|
|
Database.SelectRoot()
|
||
|
|
Database.SelectTable("profiles")
|
||
|
|
Database.SetValue(name, { __profile_name = name })
|
||
|
|
end
|
||
|
|
|
||
|
|
__Arguments__ { String }
|
||
|
|
__Static__() function Delete(name)
|
||
|
|
Database.SelectRoot()
|
||
|
|
if Database.SelectTable(false, "profiles") then
|
||
|
|
Database.SetValue(name, nil)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
__Arguments__ { String }
|
||
|
|
__Static__() function CopyFrom(name)
|
||
|
|
local sourceDB
|
||
|
|
if Profiles.IsGlobal(name) then
|
||
|
|
sourceDB = Database:GetCopyTable(Database:Path())
|
||
|
|
elseif Profiles.IsChar(name) then
|
||
|
|
sourceDB = Database:GetCopyTable(Database:Path():SetRelativeDB("char"))
|
||
|
|
elseif Profiles.IsSpec(name) then
|
||
|
|
sourceDB = Database:GetCopyTable(Database:Path():SetRelativeDB("spec"))
|
||
|
|
end
|
||
|
|
|
||
|
|
Profiles.PrepareDatabase()
|
||
|
|
Scorpio.FireSystemEvent("SLT_COPY_PROFILE_PROCESS", sourceDB, Database.GetCurrentTable(), destProfile)
|
||
|
|
end
|
||
|
|
|
||
|
|
__Arguments__ { Variable.Optional(String) }
|
||
|
|
__Static__() function IsGlobal(profileName)
|
||
|
|
return profileName == nil or profileName == "__global"
|
||
|
|
end
|
||
|
|
|
||
|
|
__Arguments__ { String }
|
||
|
|
__Static__() function IsSpec(profileName)
|
||
|
|
return profileName == "__spec"
|
||
|
|
end
|
||
|
|
|
||
|
|
__Arguments__ { String }
|
||
|
|
__Static__() function IsChar(profileName)
|
||
|
|
return profileName == "__char"
|
||
|
|
end
|
||
|
|
|
||
|
|
__Arguments__ { String }
|
||
|
|
__Static__() function IsUser(profileName)
|
||
|
|
return not Profiles.IsGlobal(profileName) and not Profiles.IsSpec(profileName) and not Profiles.IsChar(profileName)
|
||
|
|
end
|
||
|
|
|
||
|
|
__Arguments__ { Number, Variable.Optional(String) }
|
||
|
|
__Static__() function SelectForSpec(specIndex, profile)
|
||
|
|
if not Database.GetChar()[_SPECS_INDEX_ID] then
|
||
|
|
Database.GetChar()[_SPECS_INDEX_ID] = {}
|
||
|
|
end
|
||
|
|
|
||
|
|
if not Database.GetChar()[_SPECS_INDEX_ID][specIndex] then
|
||
|
|
Database.GetChar()[_SPECS_INDEX_ID][specIndex] = {}
|
||
|
|
end
|
||
|
|
|
||
|
|
Database.GetChar()[_SPECS_INDEX_ID][specIndex].profile_used = profile
|
||
|
|
|
||
|
|
if GetSpecialization() == specIndex then
|
||
|
|
Profiles.CheckProfileChange()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
__Arguments__ { Number }
|
||
|
|
__Static__() function GetProfileForSpec(specIndex)
|
||
|
|
Database.SelectRootChar()
|
||
|
|
if Database.SelectTable(false, _SPECS_INDEX_ID) then
|
||
|
|
local value = Database.GetValue(specIndex)
|
||
|
|
if value then
|
||
|
|
return value.profile_used
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
__Arguments__ { Variable.Optional(String) }
|
||
|
|
__Static__() function PrepareDatabase(profile)
|
||
|
|
if not profile then
|
||
|
|
profile = Database.GetSpec().profile_used
|
||
|
|
end
|
||
|
|
|
||
|
|
if not profile or profile == "__global" then
|
||
|
|
Database.SelectRoot()
|
||
|
|
elseif profile == "__spec" then
|
||
|
|
Database.SelectRootSpec()
|
||
|
|
elseif profile == "__char" then
|
||
|
|
Database.SelectRootChar()
|
||
|
|
else
|
||
|
|
Database.SelectRoot()
|
||
|
|
Database.SelectTable(false, "profiles", profile)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
__Static__() function GetUserProfilesList()
|
||
|
|
Database.SelectRoot()
|
||
|
|
local list = {}
|
||
|
|
if Database.SelectTable(false, "profiles") then
|
||
|
|
for profileName in Database.IterateTable() do
|
||
|
|
list[profileName] = profileName
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
return list
|
||
|
|
end
|
||
|
|
|
||
|
|
__Async__()
|
||
|
|
__Static__() function CheckProfileChange()
|
||
|
|
local profile = Database.GetSpec().profile_used or "__global"
|
||
|
|
local oldProfile = Profiles.name or "__global"
|
||
|
|
local hasChanged = false
|
||
|
|
|
||
|
|
|
||
|
|
if profile == "__spec" then
|
||
|
|
hasChanged = true
|
||
|
|
elseif profile ~= oldProfile then
|
||
|
|
hasChanged = true
|
||
|
|
end
|
||
|
|
|
||
|
|
Profiles.name = profile
|
||
|
|
|
||
|
|
if hasChanged then
|
||
|
|
Scorpio.FireSystemEvent("SLT_PROFILE_CHANGED", profile, oldProfile)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
-----------------------------------------------------------------------------
|
||
|
|
-- Properties --
|
||
|
|
-----------------------------------------------------------------------------
|
||
|
|
__Static__() property "name" {
|
||
|
|
type = String
|
||
|
|
}
|
||
|
|
end)
|
||
|
|
|
||
|
|
function OnLoad(self)
|
||
|
|
local spec = GetSpecialization()
|
||
|
|
if not spec then
|
||
|
|
TryToLoadProfiles()
|
||
|
|
else
|
||
|
|
Profiles:CheckProfileChange()
|
||
|
|
Scorpio.FireSystemEvent("SLT_PROFILES_LOADED")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
__Async__()
|
||
|
|
function TryToLoadProfiles()
|
||
|
|
NextEvent("PLAYER_LOGIN")
|
||
|
|
|
||
|
|
Profiles:CheckProfileChange()
|
||
|
|
Scorpio.FireSystemEvent("EKT_PROFILES_LOADED")
|
||
|
|
end
|
||
|
|
|
||
|
|
__SystemEvent__()
|
||
|
|
function PLAYER_SPECIALIZATION_CHANGED()
|
||
|
|
Profiles:CheckProfileChange()
|
||
|
|
end
|