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

302 lines
9.6 KiB
C#

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()
{
PlayerPrefs.DeleteKey("GoogleAuthCode");
PlayerPrefs.DeleteKey("PlayFabID");
PlayerPrefs.DeleteKey("GuestMode");
PlayerPrefs.Save();
GoogleSignIn.DefaultInstance.SignOut();
Debug.Log("User signed out.");
}
}