TradeSkillMaster/Core/Service/Groups/Sync.lua

100 lines
3.8 KiB
Lua
Raw Permalink Normal View History

2020-11-13 14:13:12 -05:00
-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
local _, TSM = ...
local GroupsSync = TSM.Groups:NewPackage("Sync")
local L = TSM.Include("Locale").GetTable()
local TempTable = TSM.Include("Util.TempTable")
local Math = TSM.Include("Util.Math")
local Log = TSM.Include("Util.Log")
local Sync = TSM.Include("Service.Sync")
local private = {}
-- ============================================================================
-- New Modules Functions
-- ============================================================================
function GroupsSync.OnInitialize()
Sync.RegisterRPC("CREATE_PROFILE", private.RPCCreateProfile)
end
function GroupsSync.SendCurrentProfile(targetPlayer)
local profileName = TSM.db:GetCurrentProfile()
local data = TempTable.Acquire()
data.groups = TempTable.Acquire()
for groupPath, moduleOperations in pairs(TSM.db:Get("profile", profileName, "userData", "groups")) do
data.groups[groupPath] = {}
for _, module in TSM.Operations.ModuleIterator() do
local operations = moduleOperations[module]
if operations.override then
data.groups[groupPath][module] = operations
end
end
end
data.items = TSM.db:Get("profile", profileName, "userData", "items")
data.operations = TSM.db:Get("profile", profileName, "userData", "operations")
local result, estimatedTime = Sync.CallRPC("CREATE_PROFILE", targetPlayer, private.RPCCreateProfileResultHandler, profileName, UnitName("player"), data)
if result then
estimatedTime = max(Math.Round(estimatedTime, 60), 60)
Log.PrintfUser(L["Sending your '%s' profile to %s. Please keep both characters online until this completes. This will take approximately: %s"], profileName, targetPlayer, SecondsToTime(estimatedTime))
else
Log.PrintUser(L["Failed to send profile. Ensure both characters are online and try again."])
end
TempTable.Release(data.groups)
TempTable.Release(data)
end
-- ============================================================================
-- Private Helper Functions
-- ============================================================================
function private.CopyTable(srcTbl, dstTbl)
for k, v in pairs(srcTbl) do
dstTbl[k] = v
end
end
function private.RPCCreateProfile(profileName, playerName, data)
assert(TSM.db:IsValidProfileName(profileName))
if TSM.db:ProfileExists(profileName) then
return false, L["A profile with that name already exists on the target account. Rename it first and try again."]
end
-- create and switch to the new profile
local currentProfile = TSM.db:GetCurrentProfile()
TSM.db:SetProfile(profileName)
-- copy all the data into this profile
private.CopyTable(data.groups, TSM.db.profile.userData.groups)
private.CopyTable(data.items, TSM.db.profile.userData.items)
TSM.Operations.ReplaceProfileOperations(data.operations)
-- switch back to our previous profile
TSM.db:SetProfile(currentProfile)
Log.PrintfUser(L["Added '%s' profile which was received from %s."], profileName, playerName)
return true, profileName, UnitName("player")
end
function private.RPCCreateProfileResultHandler(success, ...)
if success == nil then
Log.PrintUser(L["Failed to send profile."].." "..L["Ensure both characters are online and try again."])
return
elseif not success then
local errMsg = ...
Log.PrintUser(L["Failed to send profile."].." "..errMsg)
return
end
local profileName, targetPlayer = ...
Log.PrintfUser(L["Successfully sent your '%s' profile to %s!"], profileName, targetPlayer)
end