You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
4.0 KiB
C#
106 lines
4.0 KiB
C#
3 weeks ago
|
using System;
|
||
|
using System.Threading.Tasks;
|
||
|
using Unity.BossRoom.Infrastructure;
|
||
|
using Unity.Services.Authentication;
|
||
|
using Unity.Services.Core;
|
||
|
using UnityEngine;
|
||
|
using VContainer;
|
||
|
|
||
|
namespace Unity.BossRoom.UnityServices.Auth
|
||
|
{
|
||
|
public class AuthenticationServiceFacade
|
||
|
{
|
||
|
[Inject]
|
||
|
IPublisher<UnityServiceErrorMessage> m_UnityServiceErrorMessagePublisher;
|
||
|
|
||
|
public InitializationOptions GenerateAuthenticationOptions(string profile)
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
var unityAuthenticationInitOptions = new InitializationOptions();
|
||
|
if (profile.Length > 0)
|
||
|
{
|
||
|
unityAuthenticationInitOptions.SetProfile(profile);
|
||
|
}
|
||
|
|
||
|
return unityAuthenticationInitOptions;
|
||
|
}
|
||
|
catch (Exception e)
|
||
|
{
|
||
|
var reason = e.InnerException == null ? e.Message : $"{e.Message} ({e.InnerException.Message})";
|
||
|
m_UnityServiceErrorMessagePublisher.Publish(new UnityServiceErrorMessage("Authentication Error", reason, UnityServiceErrorMessage.Service.Authentication, e));
|
||
|
throw;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public async Task InitializeAndSignInAsync(InitializationOptions initializationOptions)
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
await Unity.Services.Core.UnityServices.InitializeAsync(initializationOptions);
|
||
|
|
||
|
if (!AuthenticationService.Instance.IsSignedIn)
|
||
|
{
|
||
|
await AuthenticationService.Instance.SignInAnonymouslyAsync();
|
||
|
}
|
||
|
}
|
||
|
catch (Exception e)
|
||
|
{
|
||
|
var reason = e.InnerException == null ? e.Message : $"{e.Message} ({e.InnerException.Message})";
|
||
|
m_UnityServiceErrorMessagePublisher.Publish(new UnityServiceErrorMessage("Authentication Error", reason, UnityServiceErrorMessage.Service.Authentication, e));
|
||
|
throw;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public async Task SwitchProfileAndReSignInAsync(string profile)
|
||
|
{
|
||
|
if (AuthenticationService.Instance.IsSignedIn)
|
||
|
{
|
||
|
AuthenticationService.Instance.SignOut();
|
||
|
}
|
||
|
|
||
|
AuthenticationService.Instance.SwitchProfile(profile);
|
||
|
|
||
|
try
|
||
|
{
|
||
|
await AuthenticationService.Instance.SignInAnonymouslyAsync();
|
||
|
}
|
||
|
catch (Exception e)
|
||
|
{
|
||
|
var reason = e.InnerException == null ? e.Message : $"{e.Message} ({e.InnerException.Message})";
|
||
|
m_UnityServiceErrorMessagePublisher.Publish(new UnityServiceErrorMessage("Authentication Error", reason, UnityServiceErrorMessage.Service.Authentication, e));
|
||
|
throw;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public async Task<bool> EnsurePlayerIsAuthorized()
|
||
|
{
|
||
|
if (AuthenticationService.Instance.IsAuthorized)
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
try
|
||
|
{
|
||
|
await AuthenticationService.Instance.SignInAnonymouslyAsync();
|
||
|
return true;
|
||
|
}
|
||
|
catch (AuthenticationException e)
|
||
|
{
|
||
|
var reason = e.InnerException == null ? e.Message : $"{e.Message} ({e.InnerException.Message})";
|
||
|
m_UnityServiceErrorMessagePublisher.Publish(new UnityServiceErrorMessage("Authentication Error", reason, UnityServiceErrorMessage.Service.Authentication, e));
|
||
|
|
||
|
//not rethrowing for authentication exceptions - any failure to authenticate is considered "handled failure"
|
||
|
return false;
|
||
|
}
|
||
|
catch (Exception e)
|
||
|
{
|
||
|
//all other exceptions should still bubble up as unhandled ones
|
||
|
var reason = e.InnerException == null ? e.Message : $"{e.Message} ({e.InnerException.Message})";
|
||
|
m_UnityServiceErrorMessagePublisher.Publish(new UnityServiceErrorMessage("Authentication Error", reason, UnityServiceErrorMessage.Service.Authentication, e));
|
||
|
throw;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|