Compare commits

...

2 commits

View file

@ -11,10 +11,48 @@ using UnityEngine;
/// </summary> /// </summary>
public class Backend : MonoBehaviour public class Backend : MonoBehaviour
{ {
/// <summary>
/// enum for the result of the authentication process
/// </summary>
// ReSharper disable once MemberCanBePrivate.Global
public enum AuthenticationResult
{
Ok,
AlreadyAuthenticated,
NonExistentUser,
AlreadyExistingUser,
InvalidCredentials,
GenericError
}
/// <summary>
/// generic enum for the result of a database transaction
/// </summary>
// ReSharper disable once MemberCanBePrivate.Global
public enum DatabaseTransactionResult
{
Ok,
Unauthenticated,
Error
}
/// <summary>
/// enum for the connection status of the firebase backend
/// </summary>
public enum FirebaseConnectionStatus
{
NotConnected,
Connected,
UpdateRequired, // "a required system component is out of date"
Updating, // "a required system component is updating, retrying in a bit..."
ExternalError, // "a system component is disabled, invalid, missing, or permissions are insufficient"
InternalError // "an unknown error occurred"
}
/// <summary> /// <summary>
/// whether the backend is connected to the firebase backend /// whether the backend is connected to the firebase backend
/// </summary> /// </summary>
public bool connected; public FirebaseConnectionStatus status = FirebaseConnectionStatus.NotConnected;
/// <summary> /// <summary>
/// the firebase authentication object /// the firebase authentication object
@ -56,6 +94,8 @@ public class Backend : MonoBehaviour
private void OnDestroy() private void OnDestroy()
{ {
SignOutUser(); SignOutUser();
_auth.StateChanged -= AuthStateChanged;
_auth = null;
} }
/// <summary> /// <summary>
@ -65,6 +105,7 @@ public class Backend : MonoBehaviour
{ {
FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task =>
{ {
// cher is this robust enough
switch (task.Result) switch (task.Result)
{ {
case DependencyStatus.Available: case DependencyStatus.Available:
@ -72,28 +113,33 @@ public class Backend : MonoBehaviour
_auth = FirebaseAuth.GetAuth(app); _auth = FirebaseAuth.GetAuth(app);
_auth.StateChanged += AuthStateChanged; _auth.StateChanged += AuthStateChanged;
_db = FirebaseDatabase.DefaultInstance.RootReference; _db = FirebaseDatabase.DefaultInstance.RootReference;
connected = true; status = FirebaseConnectionStatus.Connected;
Debug.Log("firebase initialised");
break; break;
case DependencyStatus.UnavailableDisabled: case DependencyStatus.UnavailableDisabled:
case DependencyStatus.UnavailableInvalid: case DependencyStatus.UnavailableInvalid:
case DependencyStatus.UnavilableMissing: case DependencyStatus.UnavilableMissing:
case DependencyStatus.UnavailablePermission: case DependencyStatus.UnavailablePermission:
Debug.LogError("firebase error outside of our control"); status = FirebaseConnectionStatus.ExternalError;
break;
case DependencyStatus.UnavailableUpdating:
status = FirebaseConnectionStatus.Updating;
RetryInitialiseAfterDelay();
break; break;
case DependencyStatus.UnavailableUpdaterequired: case DependencyStatus.UnavailableUpdaterequired:
case DependencyStatus.UnavailableUpdating: status = FirebaseConnectionStatus.UpdateRequired;
Debug.LogError("firebase is updating");
RetryInitialiseAfterDelay();
break; break;
case DependencyStatus.UnavailableOther: case DependencyStatus.UnavailableOther:
default: default:
status = FirebaseConnectionStatus.InternalError;
Debug.LogError("firebase ??? blew up or something," + task.Result); Debug.LogError("firebase ??? blew up or something," + task.Result);
break; break;
} }
Debug.Log("firebase status is" + status);
}); });
} }
@ -104,17 +150,18 @@ public class Backend : MonoBehaviour
/// <param name="eventArgs">the event arguments</param> /// <param name="eventArgs">the event arguments</param>
private void AuthStateChanged(object sender, EventArgs eventArgs) private void AuthStateChanged(object sender, EventArgs eventArgs)
{ {
// if the user hasn't changed, do nothing
if (_auth.CurrentUser == _user) return; if (_auth.CurrentUser == _user) return;
// if the user has changed, check if they've signed in or out
var signedIn = _user != _auth.CurrentUser && _auth.CurrentUser != null; var signedIn = _user != _auth.CurrentUser && _auth.CurrentUser != null;
switch (signedIn)
{ // if we're not signed in, but we still hold _user locally, we've signed out
case false when _user != null: if (!signedIn && _user != null) _onSignOutCallback(_user);
_onSignOutCallback(_user);
break; // they have signed in, update _user
case true: _user = _auth.CurrentUser;
_onSignInCallback(_auth.CurrentUser); if (signedIn) _onSignInCallback(_user);
break;
}
} }
/// <summary> /// <summary>
@ -168,7 +215,7 @@ public class Backend : MonoBehaviour
{ {
return _user; return _user;
} }
/// <summary> /// <summary>
/// abstraction function to sign out the user /// abstraction function to sign out the user
/// </summary> /// </summary>
@ -180,10 +227,10 @@ public class Backend : MonoBehaviour
/// <summary> /// <summary>
/// abstraction function to submit a play to the database /// abstraction function to submit a play to the database
/// </summary> /// </summary>
/// <param name="averageMatchAccuracy">the float percentage (0-100) of how accurate the user was when colour matching</param> /// <param name="playData">play data</param>
/// <param name="callback">callback function that takes in one DatabaseTransactionResult argument</param> /// <param name="callback">callback function that takes in one DatabaseTransactionResult argument</param>
private void SubmitPlay( private void SubmitPlay(
float averageMatchAccuracy, PlayData playData,
Action<DatabaseTransactionResult> callback) Action<DatabaseTransactionResult> callback)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
@ -235,27 +282,15 @@ public class Backend : MonoBehaviour
} }
/// <summary> /// <summary>
/// enum for the result of the authentication process /// struct for play data
/// </summary> /// </summary>
// ReSharper disable once MemberCanBePrivate.Global // ReSharper disable once MemberCanBePrivate.Global
public enum AuthenticationResult public struct PlayData
{ {
Ok, public int RoundsPlayed;
AlreadyAuthenticated, public float AverageOverallAccuracy;
NonExistentUser, public float AverageLuminanceAccuracy;
AlreadyExistingUser, public float AverageRedGreenAccuracy;
InvalidCredentials, public float AverageBlueYellowAccuracy;
GenericError
}
/// <summary>
/// generic enum for the result of a database transaction
/// </summary>
// ReSharper disable once MemberCanBePrivate.Global
public enum DatabaseTransactionResult
{
Ok,
Unauthenticated,
Error
} }
} }