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.
CrowdControl/Assets/GoogleSignInManager.cs

224 lines
7.1 KiB
C#

4 weeks ago
using UnityEngine;
using UnityEngine.UI;
using Google;
using PlayFab;
using PlayFab.ClientModels;
using System;
using System.Collections.Generic;
4 weeks ago
using System.Threading.Tasks;
public class GoogleSignInManager : MonoBehaviour
{
private GoogleSignInConfiguration configuration;
public Bootstrapper bootstrapper; // Assign in Inspector
4 weeks ago
public Button googleSignInButton;
void Awake()
4 weeks ago
{
configuration = new GoogleSignInConfiguration
{
WebClientId = "723833850517-865419enf8t0j1itln3cgmd1b67shsue.apps.googleusercontent.com",
RequestEmail = true,
RequestAuthCode = true
4 weeks ago
};
GoogleSignIn.Configuration = configuration;
Application.quitting += SyncPlayerPrefsToPlayFabOnQuit;
}
void Start()
{
4 weeks ago
if (PlayerPrefs.HasKey("PlayFabID"))
{
Debug.Log("User already signed in, attempting silent login...");
SignInSilently();
}
else
{
Debug.Log("No saved PlayFab ID, waiting for user sign-in.");
googleSignInButton.gameObject.SetActive(true);
googleSignInButton.onClick.RemoveAllListeners();
4 weeks ago
googleSignInButton.onClick.AddListener(SignInWithGoogle);
}
}
public void SignInWithGoogle()
{
googleSignInButton.interactable = false;
4 weeks ago
GoogleSignIn.DefaultInstance.SignIn().ContinueWith(OnGoogleSignIn);
}
private void OnGoogleSignIn(Task<GoogleSignInUser> task)
{
if (task.IsFaulted || task.IsCanceled)
4 weeks ago
{
Debug.LogError("Google Sign-In failed: " + task.Exception);
// ✅ Show the sign-in button again
googleSignInButton.gameObject.SetActive(true);
googleSignInButton.interactable = true;
googleSignInButton.onClick.RemoveAllListeners();
googleSignInButton.onClick.AddListener(SignInWithGoogle);
return;
4 weeks ago
}
GoogleSignInUser user = task.Result;
string authCode = user.AuthCode;
SafePlayerPrefs.SetString("GoogleAuthCode", authCode);
//PlayerPrefsKeys.RegisterKey("GoogleAuthCode");
//PlayerPrefs.Save();
LoginToPlayFab(authCode);
}
private void SignInSilently()
{
Debug.Log("Attempting Google Silent Sign-In...");
GoogleSignIn.DefaultInstance.SignInSilently().ContinueWith(task =>
4 weeks ago
{
if (task.IsFaulted || task.IsCanceled)
{
Debug.LogWarning("Silent Sign-In failed, falling back to interactive sign-in.");
googleSignInButton.gameObject.SetActive(true);
googleSignInButton.interactable = true;
googleSignInButton.onClick.RemoveAllListeners();
googleSignInButton.onClick.AddListener(SignInWithGoogle);
return;
}
GoogleSignInUser user = task.Result;
string authCode = user.AuthCode;
// Store it if needed for debugging — not for reuse
SafePlayerPrefs.SetString("GoogleAuthCode", authCode);
LoginToPlayFab(authCode);
});
}
private void LoginToPlayFab(string authCode)
4 weeks ago
{
PlayFabSettings.staticSettings.TitleId = "1879F5";
4 weeks ago
var request = new LoginWithGoogleAccountRequest
{
TitleId = "1879F5",
ServerAuthCode = authCode,
4 weeks ago
CreateAccount = true
};
PlayFabClientAPI.LoginWithGoogleAccount(request, OnPlayFabLoginSuccess, OnPlayFabLoginFailure);
}
private void OnPlayFabLoginSuccess(LoginResult result)
{
Debug.Log("✅ PlayFab Login Success! PlayFab ID: " + result.PlayFabId);
4 weeks ago
SafePlayerPrefs.SetString("PlayFabID", result.PlayFabId);
//PlayerPrefsKeys.RegisterKey("PlayFabID");
//PlayerPrefs.Save();
4 weeks ago
LoadPlayerPrefsFromPlayFab(() =>
{
googleSignInButton.gameObject.SetActive(false);
bootstrapper.StartGame(); // Start the game after loading
});
4 weeks ago
}
private void OnPlayFabLoginFailure(PlayFabError error)
{
Debug.LogError("❌ PlayFab Login Failed: " + error.GenerateErrorReport());
// ✅ Re-enable button so player can retry
googleSignInButton.gameObject.SetActive(true);
googleSignInButton.interactable = true;
googleSignInButton.onClick.RemoveAllListeners();
googleSignInButton.onClick.AddListener(SignInWithGoogle);
4 weeks ago
}
private void LoadPlayerPrefsFromPlayFab(Action onComplete)
4 weeks ago
{
PlayFabClientAPI.GetUserData(new GetUserDataRequest(), result =>
4 weeks ago
{
if (result.Data != null)
{
foreach (var entry in result.Data)
{
string key = entry.Key;
string rawValue = entry.Value.Value;
if (rawValue.StartsWith("int:"))
{
if (int.TryParse(rawValue.Substring(4), out int intVal))
{
SafePlayerPrefs.SetInt(key, intVal);
}
}
else if (rawValue.StartsWith("float:"))
{
if (float.TryParse(rawValue.Substring(6), out float floatVal))
{
SafePlayerPrefs.SetFloat(key, floatVal);
}
}
else if (rawValue.StartsWith("string:"))
{
SafePlayerPrefs.SetString(key, rawValue.Substring(7));
}
else
{
// Backward compatibility: if value has no type prefix, store as string
SafePlayerPrefs.SetString(key, rawValue);
}
PlayerPrefsKeys.RegisterKey(key);
}
PlayerPrefs.Save();
Debug.Log("✅ Loaded PlayerPrefs from PlayFab.");
}
else
{
Debug.Log(" No saved PlayerPrefs found in PlayFab.");
}
onComplete?.Invoke();
},
error =>
4 weeks ago
{
Debug.LogError("❌ Failed to load PlayerPrefs from PlayFab: " + error.GenerateErrorReport());
onComplete?.Invoke();
});
}
private void SyncPlayerPrefsToPlayFabOnQuit()
{
Dictionary<string, string> allPrefs = new Dictionary<string, string>();
foreach (var key in PlayerPrefsKeys.GetAllKeys())
{
allPrefs[key] = PlayerPrefs.GetString(key);
4 weeks ago
}
var request = new UpdateUserDataRequest
{
Data = allPrefs
};
PlayFabClientAPI.UpdateUserData(request,
result => Debug.Log("✅ Synced PlayerPrefs to PlayFab on quit."),
error => Debug.LogError("❌ Failed to sync PlayerPrefs on quit: " + error.GenerateErrorReport()));
4 weeks ago
}
public void SignOut()
{
PlayerPrefs.DeleteKey("PlayFabID");
PlayerPrefs.DeleteKey("GoogleAuthCode");
4 weeks ago
PlayerPrefs.Save();
GoogleSignIn.DefaultInstance.SignOut();
Debug.Log("User signed out.");
4 weeks ago
}
}