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

320 lines
10 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using UnityEngine;
using UnityEngine.UI;
using Google;
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 googleSignInButton;
public Button guestLoginButton;
void Awake()
{
configuration = new GoogleSignInConfiguration
{
WebClientId = "1021701058525-72qg4sbvqv3m3q7it4eck2h86ekoflla.apps.googleusercontent.com",
RequestEmail = true,
RequestAuthCode = true
};
GoogleSignIn.Configuration = configuration;
Application.quitting += SyncPlayerPrefsToPlayFabOnQuit;
OneSignal.Default.Initialize("3ee530aa-8613-485b-9cbd-0263727badc5");
}
void Start()
{
googleSignInButton.onClick.RemoveAllListeners();
googleSignInButton.onClick.AddListener(SignInWithGoogle);
guestLoginButton.onClick.RemoveAllListeners();
guestLoginButton.onClick.AddListener(GuestLogin);
if (PlayerPrefs.HasKey("PlayFabID") && !PlayerPrefs.HasKey("GuestMode"))
{
Debug.Log("User previously signed in with Google. Attempting silent login...");
googleSignInButton.gameObject.SetActive(false);
guestLoginButton.gameObject.SetActive(false);
SignInSilently();
}
else if (PlayerPrefs.HasKey("GuestMode"))
{
Debug.Log("Guest mode previously selected. Letting user choose again.");
googleSignInButton.gameObject.SetActive(true);
guestLoginButton.gameObject.SetActive(true);
}
else
{
Debug.Log("No login info found. Showing login options.");
googleSignInButton.gameObject.SetActive(true);
guestLoginButton.gameObject.SetActive(true);
}
}
public void GuestLogin()
{
Debug.Log("Starting game in Guest Mode...");
SafePlayerPrefs.SetInt("GuestMode", 1);
PlayerPrefs.Save();
googleSignInButton.gameObject.SetActive(false);
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());
googleSignInButton.gameObject.SetActive(true);
guestLoginButton.gameObject.SetActive(true);
});
}
public void SignInWithGoogle()
{
PlayerPrefs.DeleteKey("GuestMode");
PlayerPrefs.DeleteAll();
PlayerPrefs.Save();
googleSignInButton.interactable = false;
guestLoginButton.interactable = false;
GoogleSignIn.DefaultInstance.SignIn().ContinueWith(OnGoogleSignIn);
}
private void OnGoogleSignIn(Task<GoogleSignInUser> task)
{
if (task.IsFaulted || task.IsCanceled)
{
Debug.LogError("Google Sign-In failed: " + task.Exception);
googleSignInButton.gameObject.SetActive(true);
googleSignInButton.interactable = true;
guestLoginButton.gameObject.SetActive(true);
guestLoginButton.interactable = true;
return;
}
GoogleSignInUser user = task.Result;
string authCode = user.AuthCode;
SafePlayerPrefs.SetString("GoogleAuthCode", authCode);
PlayerPrefs.Save();
LoginToPlayFab(authCode);
}
private void SignInSilently()
{
Debug.Log("Attempting Google Silent Sign-In...");
GoogleSignIn.DefaultInstance.SignInSilently().ContinueWith(task =>
{
if (task.IsFaulted || task.IsCanceled)
{
Debug.LogWarning("Silent Sign-In failed. Showing login buttons.");
googleSignInButton.gameObject.SetActive(true);
googleSignInButton.interactable = true;
guestLoginButton.gameObject.SetActive(true);
guestLoginButton.interactable = true;
return;
}
GoogleSignInUser user = task.Result;
string authCode = user.AuthCode;
SafePlayerPrefs.SetString("GoogleAuthCode", authCode);
PlayerPrefs.Save();
LoginToPlayFab(authCode);
});
}
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(() =>
{
googleSignInButton.gameObject.SetActive(false);
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<string, string>
{
{ "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());
googleSignInButton.gameObject.SetActive(true);
googleSignInButton.interactable = true;
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<string, string> allPrefs = new Dictionary<string, string>();
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 weve 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
GoogleSignIn.DefaultInstance.SignOut();
// 4) Unlink OneSignal from this user
OneSignal.Logout();
// 5) Bring back your login buttons
googleSignInButton.gameObject.SetActive(true);
guestLoginButton.gameObject.SetActive(true);
googleSignInButton.interactable = true;
guestLoginButton.interactable = true;
Debug.Log("✅ User fully signed out.");
}
}