using System; using System.Collections; using UnityEngine; using BackEnd; namespace TON { /// /// 뒤끝 서버 인증(로그인/회원가입) 담당 클래스 /// public class BackendAuthManager { private const string PASSWORD = "O-xmP0-=rp&kCq^"; private const string CUSTOM_ID_KEY = "BackendCustomID"; private const int MAX_RETRY_COUNT = 1; private int signUpRetryCount = 0; // 로그인 상태 public bool IsLoggedIn { get; private set; } // 인증 이벤트 델리게이트 public delegate void AuthEvent(bool isSuccess, string message); public event AuthEvent OnLoginComplete; public event AuthEvent OnSignUpComplete; /// /// 자동 로그인 시도 /// public void TryAutoLogin() { string customID = GetOrCreateCustomID(); Backend.BMember.CustomLogin(customID, PASSWORD, callback => { if (callback.IsSuccess()) { Debug.Log("자동 로그인 성공!"); IsLoggedIn = true; OnLoginComplete?.Invoke(true, "로그인 성공"); } else { Debug.Log("로그인 실패, 회원가입 시도: " + callback.GetMessage()); signUpRetryCount = 0; TryAutoSignUp(customID); } }); } /// /// 자동 회원가입 시도 /// private void TryAutoSignUp(string customID) { Backend.BMember.CustomSignUp(customID, PASSWORD, callback => { if (callback.IsSuccess()) { Debug.Log("자동 회원가입 성공!"); IsLoggedIn = true; OnSignUpComplete?.Invoke(true, "회원가입 성공"); } else { Debug.LogError("자동 회원가입 실패: " + callback.GetMessage()); HandleSignUpError(); } }); } /// /// 커스텀 ID 생성 또는 가져오기 /// private string GetOrCreateCustomID(bool forceNew = false) { string savedID = PlayerPrefs.GetString(CUSTOM_ID_KEY, string.Empty); if (string.IsNullOrEmpty(savedID) || forceNew) { string deviceID = SystemInfo.deviceUniqueIdentifier; string appID = Application.identifier; savedID = $"{appID}_{deviceID}_{DateTime.Now.Ticks}"; PlayerPrefs.SetString(CUSTOM_ID_KEY, savedID); PlayerPrefs.Save(); } return savedID; } /// /// 닉네임 변경 /// public void ChangeNickname(string newNickname, Action callback) { if (string.IsNullOrEmpty(newNickname) || newNickname.Length < 2) { callback?.Invoke(false, "닉네임은 2자 이상이어야 합니다."); return; } Backend.BMember.UpdateNickname(newNickname, bro => { if (bro.IsSuccess()) { Debug.Log("닉네임 변경 성공: " + newNickname); callback?.Invoke(true, "닉네임이 변경되었습니다."); } else { Debug.LogError("닉네임 변경 실패: " + bro.GetMessage()); callback?.Invoke(false, "닉네임 변경 실패: " + bro.GetMessage()); } }); } /// /// 회원가입 오류 처리 /// private void HandleSignUpError() { if (signUpRetryCount < MAX_RETRY_COUNT) { signUpRetryCount++; Debug.Log($"회원가입 재시도 중... ({signUpRetryCount}/{MAX_RETRY_COUNT})"); // 이벤트 호출로 외부에서 회원가입 재시도 처리하도록 함 OnSignUpComplete?.Invoke(false, "재시도 중"); // 새 ID로 재시도 string newCustomID = GetOrCreateCustomID(true); TryAutoSignUp(newCustomID); } else { OnSignUpComplete?.Invoke(false, "최대 재시도 횟수 초과"); } } /// /// 로그아웃 /// public void Logout() { Backend.BMember.Logout(); IsLoggedIn = false; } } }