#nullable enable using System; using System.Threading.Tasks; namespace Barotrauma.Eos; /// /// Handles a player that owns a copy of Barotrauma on Epic Games Store (therefore they /// will use their Epic Account ID as their primary identity) logging into EOS. /// static class EosEpicPrimaryLogin { public static void Start(string exchangeCode) { TaskPool.Add("Eos.Core.LoginEpic", Initialize(exchangeCode), t => { if (!t.TryGetResult(out Action? action)) { return; } action(); }); } private static void Success() { Eos.EosAccount.CloseMessageBox(); Eos.EosAccount.RefreshSelfAccountIds(); EosAccount.OnLoginSuccess(); } private static async Task Initialize(string exchangeCode) { void retry() => Start(exchangeCode); static void cancel() => EosInterface.Core.CleanupAndQuit(); var failedToInitializeIntro = TextManager.Get("EosFailedToInitialize"); var loginResult = await EosInterface.Login.LoginEpicExchangeCode(exchangeCode); if (!loginResult.TryUnwrapSuccess(out var either)) { LocalizedString localizedError = $"Login failed with unknown error code."; if (loginResult.TryUnwrapFailure(out EosInterface.Login.LoginError errorCode)) { localizedError = TextManager .Get($"EosInterface.Core.InitError.{errorCode}") .Fallback($"Failed to initialize Epic Online Services (error code {errorCode})"); } return EosAccount.RetryAction(failedToInitializeIntro, localizedError, retry, cancel); } if (either.TryGet(out EosInterface.EosConnectContinuanceToken eosContinuanceToken)) { var createProductAccountResult = await EosInterface.Login.CreateProductAccount(eosContinuanceToken); if (!createProductAccountResult.TryUnwrapSuccess(out var puid)) { return EosAccount.RetryAction( failedToInitializeIntro, $"Failed to create product user account: {(createProductAccountResult.TryUnwrapFailure(out var failure) ? failure : "unknown")}", retry, cancel); } DebugConsole.NewMessage($"Logged into EOS for the first time with Epic as primary external account ID: {puid}"); return Success; } else if (either.TryGet(out EosInterface.ProductUserId puid)) { DebugConsole.NewMessage($"Logged into EOS with Epic as primary external account ID: {puid}"); return Success; } throw new UnreachableCodeException(); } }