using UnityEngine; using UnityEngine.UI; using PlayFab; using PlayFab.ClientModels; using System; using System.Collections.Generic; using System.Threading.Tasks; using OneSignalSDK; using System.Collections; public class GoogleSignInManager : MonoBehaviour { // private GoogleSignInConfiguration configuration; public Bootstrapper bootstrapper; public Button guestLoginButton; void Awake() { Application.quitting += SyncPlayerPrefsToPlayFabOnQuit; } void Start() { guestLoginButton.onClick.RemoveAllListeners(); guestLoginButton.onClick.AddListener(GuestLogin); if (PlayerPrefs.HasKey("GuestMode")) { Debug.Log("Guest mode previously selected. Letting user choose again."); guestLoginButton.gameObject.SetActive(true); } else { Debug.Log("No login info found. Showing login options."); guestLoginButton.gameObject.SetActive(true); } } public void GuestLogin() { Debug.Log("Starting game in Guest Mode..."); SafePlayerPrefs.SetInt("GuestMode", 1); PlayerPrefs.Save(); guestLoginButton.gameObject.SetActive(false); PlayFabSettings.staticSettings.TitleId = GameConstants.PlayfabTitleId; string customId = SystemInfo.deviceUniqueIdentifier; SafePlayerPrefs.SetString("GuestCustomID", customId); // Save customId var request = new LoginWithCustomIDRequest { CustomId = customId, CreateAccount = true }; PlayFabClientAPI.LoginWithCustomID(request, result => { Debug.Log("✅ Guest Login Success! PlayFab ID: " + result.PlayFabId); SafePlayerPrefs.SetString("PlayFabID", result.PlayFabId); PlayerPrefs.Save(); if (result.NewlyCreated) { SafePlayerPrefs.SetInt("NeedsDisplayNameUpload", 1); PlayerPrefs.Save(); } bootstrapper.StartGame(); }, error => { Debug.LogError("❌ Guest PlayFab login failed: " + error.GenerateErrorReport()); guestLoginButton.gameObject.SetActive(true); }); } public void SignInWithGoogle() { PlayerPrefs.DeleteKey("GuestMode"); PlayerPrefs.DeleteAll(); PlayerPrefs.Save(); guestLoginButton.interactable = false; } private void LoginToPlayFab(string authCode) { PlayFabSettings.staticSettings.TitleId = GameConstants.PlayfabTitleId; var request = new LoginWithGoogleAccountRequest { TitleId = GameConstants.PlayfabTitleId, ServerAuthCode = authCode, CreateAccount = true }; PlayFabClientAPI.LoginWithGoogleAccount(request, OnPlayFabLoginSuccess, OnPlayFabLoginFailure); } private void OnPlayFabLoginSuccess(LoginResult result) { Debug.Log("✅ PlayFab Login Success! PlayFab ID: " + result.PlayFabId); SafePlayerPrefs.SetString("PlayFabID", result.PlayFabId); PlayerPrefs.Save(); OneSignal.Login(result.PlayFabId); StartCoroutine(SaveOneSignalPlayerIdToPlayFab()); LoadPlayerPrefsFromPlayFab(() => { guestLoginButton.gameObject.SetActive(false); bootstrapper.StartGame(); }); } private IEnumerator SaveOneSignalPlayerIdToPlayFab() { yield return new WaitForSeconds(1f); string playerId = OneSignal.User.PushSubscription.Id; if (!string.IsNullOrEmpty(playerId)) { Debug.Log("✅ Got OneSignal Player ID: " + playerId); var request = new UpdateUserDataRequest { Data = new Dictionary { { "OneSignalPlayerId", playerId } } }; PlayFabClientAPI.UpdateUserData(request, result => Debug.Log("✅ Saved OneSignal Player ID to PlayFab"), error => Debug.LogError("❌ Failed to save OneSignal Player ID: " + error.GenerateErrorReport())); } else { Debug.LogWarning("⚠️ OneSignal Player ID not available yet."); } } private void OnPlayFabLoginFailure(PlayFabError error) { Debug.LogError("❌ PlayFab Login Failed: " + error.GenerateErrorReport()); guestLoginButton.gameObject.SetActive(true); guestLoginButton.interactable = true; } private void LoadPlayerPrefsFromPlayFab(Action onComplete) { PlayFabClientAPI.GetUserData(new GetUserDataRequest(), result => { if (result.Data != null) { foreach (var entry in result.Data) { string key = entry.Key; string rawValue = entry.Value.Value; if (rawValue.StartsWith("int:") && int.TryParse(rawValue.Substring(4), out int i)) SafePlayerPrefs.SetInt(key, i); else if (rawValue.StartsWith("float:") && float.TryParse(rawValue.Substring(6), out float f)) SafePlayerPrefs.SetFloat(key, f); else if (rawValue.StartsWith("string:")) SafePlayerPrefs.SetString(key, rawValue.Substring(7)); else SafePlayerPrefs.SetString(key, rawValue); PlayerPrefsKeys.RegisterKey(key); } PlayerPrefs.Save(); } onComplete?.Invoke(); }, error => { Debug.LogError("❌ Failed to load SafePlayerPrefs from PlayFab: " + error.GenerateErrorReport()); onComplete?.Invoke(); }); } private void SyncPlayerPrefsToPlayFabOnQuit() { if (PlayerPrefs.GetInt("GuestMode", 0) == 1) return; Dictionary allPrefs = new Dictionary(); foreach (var key in PlayerPrefsKeys.GetAllKeys()) { allPrefs[key] = PlayerPrefs.GetString(key); } var request = new UpdateUserDataRequest { Data = allPrefs }; if (PlayFabClientAPI.IsClientLoggedIn()) { PlayFabClientAPI.UpdateUserData(request, result => Debug.Log("✅ Synced SafePlayerPrefs to PlayFab on quit."), error => Debug.LogError("❌ Failed to sync SafePlayerPrefs: " + error.GenerateErrorReport())); } } public void SignOut() { // 1) Clear PlayFab session in memory PlayFabClientAPI.ForgetAllCredentials(); // 2) Delete every PlayerPref we’ve registered foreach (var key in PlayerPrefsKeys.GetAllKeys()) PlayerPrefs.DeleteKey(key); // Also remove any extra cruft PlayerPrefs.DeleteKey("GuestMode"); PlayerPrefs.DeleteKey("GuestCustomID"); PlayerPrefs.Save(); // 3) Sign out of Google // 4) Unlink OneSignal from this user OneSignal.Logout(); // 5) Bring back your login buttons guestLoginButton.gameObject.SetActive(true); guestLoginButton.interactable = true; Debug.Log("✅ User fully signed out."); } }