using Firebase; using Firebase.Auth; using IVDataFormat; using IVServerFormat; using JetBrains.Annotations; using System; using System.Collections; using System.Reflection; using UnityEngine; using UnityEngine.Networking; public class SingleMgr : Singleton { #region FCM Data Key Value /*** 데이터 푸시 START ***/ public const string MDT_ALL = "all"; #if VER_ONESTORE public const string MDT_OSType = "onestore"; #elif UNITY_ANDROID public const string MDT_OSType = "android"; #else public const string MDT_OSType = "ios"; #endif #if VER_TEST public const string MDT_Noti = "notitest"; #else public const string MDT_Noti = "notilive"; #endif public const string MDK_NotiKey = "show_notibar"; public const string MDK_NotiValue = "Value"; public const string MDK_Key = "Key"; public const string MDK_Value = "Value"; public const string MDK_Msg = "msg"; public const string MDK_ReInitNotice = "reinit_notice"; public const string MDK_ReInitText = "reinit_text"; public const string MDK_ReInitImg = "reinit_img"; public const string MDK_Exit = "exit"; public const string MDK_Kill = "kill"; /*** 데이터 푸시 END ***/ #endregion FCM Data Key Value public enum eLoginType { AuthEmpty = -1, AUTH_NONE = 0, AUTH_GUEST = 1, AUTH_GOOGLE = 2, AUTH_APPLE = 3, AUTH_FACEBOOK = 4, AUTH_TWITTER = 5, LOGIN_SUCC = 1, LOGIN_CANCEL = 3, LOGIN_CANCEL_A = 2, LOGIN_CANCEL_USER = 0, LOGIN_FAIL_PRE = -1, LOGIN_FAIL_A = -2, LOGIN_FAIL = -3, LOGIN_FAIL_TOKEN_NULL = -4, LOGIN_FAIL_TOKEN_ERROR = -5, LOGIN_FAIL_TASK_NULL = -6, LOGIN_FAIL_TASK_ERROR = -7, LOGIN_FAIL_SIGNIN_NULL = -8, LOGIN_FAIL_SIGNIN_ERROR = -9, LOGIN_NONE = -99 } public enum eUserState { Logout = 0, Login = 1, Refreshing = 8, Loading = 9 } public static eUserState UserState { get; private set; } public static string UserID { get; private set; } public static string UserToken { get; private set; } #if !UNITY_EDITOR private static FirebaseAuth auth = null; #endif public static bool IsNeedAttend { get; private set; } public static bool IsNeedSave { get; private set; } private static bool B_INIT = false; private static bool B_INIT_SDK = false; private static bool B_PLAY = false; private static bool B_PAUSE = false; public static bool B_NewDay { get; private set; } = false; public static bool B_Attending { get; private set; } = false; private static bool B_DataSaving = false; private static bool B_CheckTime = false; public static int I_OfflineTime = 0; #if VER_DEV public const int I_Server = 0; #elif VER_TEST public const int I_Server = 1; #elif VER_ZOMBIE public const int I_Server = 3; #else public const int I_Server = 2; #endif public static bool B_CCheck = false; public static bool B_AttendShow = false; #if APPSFLYER_ANALYTICS private static bool AppsFlyerTokenSent = false; private const string AppsFlyerKey = "HMXC9vJHx8vdtvJEvP6HNg"; #if UNITY_ANDROID private const string AppId = ""; #elif UNITY_IOS private const string AppId = "1628480211"; private bool tokenSent; #endif #endif #if UNITY_EDITOR private static string strPushToken = "null"; #else private static string strPushToken = null; #endif private bool bPause = false; private bool bNotAdsPause = true; private bool bWaitBagConsume = false; private bool bWaitPointEnhanceConsume = false; private bool bWaitTradeConsume = false; private bool bWaitRaiseConsume = false; private bool bWaitRouletteConsume = false; private bool bWaitSetting = false; private bool bMission = false; private bool bDailyQuest = false; private bool bRepeatQuest = false; private bool bGrowQuest = false; private bool bWaitFinish = false; private int iTimeSave = 0; private int iMinCount = 0; private int iTouchCount = 0; private float fTick = 0f; // 시스템 언어 읽기. public static SystemLanguage GetSavedLanguage() { SystemLanguage ilang = (SystemLanguage)ES3.Load(Global.ES3_Language, -1); if (ilang < 0) { ilang = Application.systemLanguage; if (ilang != SystemLanguage.Korean && ilang != SystemLanguage.Japanese) { ilang = SystemLanguage.English; } ES3.Save(Global.ES3_Language, (int)ilang); } return ilang; } public void Init() { if (B_INIT) return; B_INIT = true; Application.runInBackground = false; Application.targetFrameRate = 60; Screen.sleepTimeout = SleepTimeout.NeverSleep; Input.multiTouchEnabled = false; UserState = eUserState.Logout; LocalizationText.SetLanguage(GetSavedLanguage()); #if UNITY_EDITOR UserID = "editor"; UserToken = PlayerPrefs.GetString("editortoken", "input your token here").Trim(); UserState = eUserState.Login; #endif InitializeSDK(); } private void InitializeSDK() { if (B_INIT_SDK) return; B_INIT_SDK = true; Logger.Log("Initialize SDK"); #if APPSFLYER_ANALYTICS #if UNITY_EDITOR || VER_DEV || VER_TEST || VER_ZOMBIE AppsFlyer.setIsDebug(true); #else AppsFlyer.setIsDebug(false); #endif AppsFlyer.initSDK(AppsFlyerKey, AppId, this); AppsFlyer.startSDK(); #if UNITY_IOS UnityEngine.iOS.NotificationServices.RegisterForNotifications(UnityEngine.iOS.NotificationType.Alert | UnityEngine.iOS.NotificationType.Badge | UnityEngine.iOS.NotificationType.Sound); #endif #endif #if EASY_MOBILE && UNITY_IOS //Logger.LogWarning("EASY_MOBILE_ATT"); EasyMobile.Privacy.AppTrackingManager.RequestTrackingAuthorization(status => { }); #endif InitFirebase(); AdsMgr.SInit(); IapMgr.SInit(); } public void ResetAll() { UserID = null; UserToken = null; UserState = eUserState.Logout; B_PAUSE = false; B_PLAY = false; B_INIT = false; B_NewDay = false; B_Attending = false; B_CheckTime = false; B_AttendShow = false; } public void FinalizeSDK() { if (!B_INIT_SDK) { return; } B_INIT_SDK = false; #if APPSFLYER_ANALYTICS AppsFlyer.stopSDK(true); #endif } public void SetAdsPause(bool badspause) { bNotAdsPause = !badspause; } public void PauseOff() { fTick = 0f; bPause = false; if(!SleepModeMgr.GetIsSleep()) SettingMgr.SLoadSettingSound(); } private void OnApplicationPause(bool pause) { if (pause) { CancelInvoke("PauseOff"); bPause = true; SoundMgr.SPauseBgm(); if (!B_PLAY) return; GameUIMgr.SPrintTestLog("PAUSE"); NotifyMgr.SSendEndNoti(); TimeUtils.SaveDeviceTime(); } else { SoundMgr.SResumeBgm(); if (!B_PLAY) return; GameUIMgr.SPrintTestLog("REPLAY"); B_CheckTime = true; NotifyMgr.SCancelAllNotification(); TimeUtils.ReCalcNow(); EventMgr.CheckHotTimeOnOff(); B_CheckTime = false; Invoke(nameof(PauseOff), 0.2f); } } bool isUpdateAlart = false; public static void ChangeAlartTrue() { if (!Instance.isUpdateAlart) { Instance.isUpdateAlart = true; } } public static void ChangeAlartFalse() { if (Instance.isUpdateAlart) { Instance.isUpdateAlart = false; } } private void Update() { #if APPSFLYER_ANALYTICS && UNITY_IOS if (!tokenSent) { byte[] token = UnityEngine.iOS.NotificationServices.deviceToken; if (token != null) { AppsFlyeriOS.registerUninstall(token); tokenSent = true; } } #endif if (bPause) return; fTick += Time.unscaledDeltaTime; if (fTick >= 1f) { int itick = (int)fTick; if (itick > 1) { fTick -= itick; TimeUtils.AddNowSec(itick); iMinCount += itick; iTimeSave += itick; } else { fTick -= 1f; TimeUtils.AddNowSec1(); iMinCount++; iTimeSave++; } if (bNotAdsPause && B_PLAY) { AdBuffMgr.SUpdateOneSec(); ShopMgr.SUpdateOneSec(); PassMgr.SUpdateOneSec(); BattleMgr.UpdateDpsOneSec(); if (SleepModeMgr.GetIsSleep() == false) iTouchCount++; else iTouchCount = 0; //if (!SubUIManager.IsNull()) // SubUIManager.Instance.CheckTime(); } if (iMinCount >= 60) { iMinCount = 0; if (bNotAdsPause && B_PLAY) { DataHandler.AddRecord(eCondition.PlayTimeM); BagMgr.SSetBadge(); PassMgr.SSetBadge(true); EventMgr.CheckHotTimeOnOff(); } if (isUpdateAlart) { TryUpdateCheck(); } //접속 도중 이벤트 기간 확인할때 여기 넣으면 될 거 같음(분당 체크) } if (bNotAdsPause && B_PLAY && iTimeSave >= 300) { CheckSaveData(true); DataHandler.CheckAllAchivement(); ProfileMgr.SSetBadge(); if (!isUpdateAlart) { TryUpdateCheck(); } } if (bNotAdsPause && B_PLAY && iTouchCount >= 300 && SleepModeMgr.GetIsSleep() == false && SleepModeMgr.SGetAutoSleep()) { SleepModeMgr.SOnSleep(); } } if (bNotAdsPause && B_PLAY && Input.GetMouseButtonDown(0)) { iTouchCount = 0; } } // 실시간 업데이트 여부 판별 private void TryUpdateCheck() { SvConnectManager.Instance.RequestSvGet(true, 2, UrlApi.GetUrl(UrlApi.GameVer), typeof(dGame), AUpdateCheckSucc, AUpdateCheckFail, false, false); } // 통신 실패 - 업데이트 판별. private void AUpdateCheckFail(SvError error) { } // 통신 성공 - 업데이트 판별. private void AUpdateCheckSucc(object result) { dGame data = result as dGame; if (data == null) { AUpdateCheckFail(new SvError(eErrorCode.NULL_OR_EMPTY)); return; } DataHandler.SetUpdateNoticeInfo(data.isNotice, data.updateStartAt, data.updateMsg); DataHandler.isUpdateNotice(); } #region Save & Attend // 날짜 변경 시 처리. public static void ProcessNewDay() { B_NewDay = true; IsNeedAttend = true; // 패스 갱신. if (DataHandler.ResetPass()) PassMgr.SResetPass(); // 상점 갱신. DataHandler.ResetShop(); ShopMgr.SResetShop(); QuestMgr.SRefreshQuest(); AttendMgr.AttendReckeck(); EventMgr.HotTimeTimerSet(); } public static void SetPlay(bool bplay) { B_PLAY = bplay; if (bplay) NotifyMgr.SCancelAllNotification(); } public static void CheckSaveData(bool bforce) { if (bforce) IsNeedSave = true; if (IsNeedSave) { if (IsNull() || B_DataSaving) return; if (SvConnectManager.DataSavingCount > 0) { IsNeedSave = true; return; } Instance.SaveDataToServer(); } } // 데이터 저장. private void SaveDataToServer() { if (B_DataSaving || SvConnectManager.IsNull()) return; B_DataSaving = true; iTimeSave = 0; DataHandler.OnSaveDataServer(); DataHandler.SaveData(); nSaveData saveData = new nSaveData(); saveData.playCurrency = DataHandler.Goods; saveData.playUser = DataHandler.PlayData; saveData.playBox = DataHandler.GetBoxPlayDatas(); saveData.playUserInfo = nUserInfo.GetMyInfo(); saveData.playRecordDaily = DataHandler.GetDailyRecord(); saveData.playRecordTotal = DataHandler.GetTotalRecord(); saveData.playEventRoulette = DataHandler.GetPlayEventRoulette(); saveData.playEventRaise = DataHandler.GetPlayEventRaise(); saveData.playEventTrade = DataHandler.GetPlayEventTrade(); saveData.playRecordDaily = DataHandler.GetDailyRecord(); saveData.playRecordTotal = DataHandler.GetTotalRecord(); SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.SaveData), typeof(nSaveReturn), ASaveDataSucc, ASaveDataFail, saveData, true); } // 통신 실패 - 데이터 저장. private void ASaveDataFail(SvError error, object request) { B_DataSaving = false; // 가방 소모품 사용 처리 필요. if (bWaitBagConsume) { bWaitBagConsume = false; BagMgr.SUseConsumeSv(); } if (bWaitPointEnhanceConsume) { bWaitPointEnhanceConsume = false; EnhanceMgr.SAPointEnhance(); } if (bWaitTradeConsume) { bWaitTradeConsume = false; //EventMgr.SSVTradeTry(); } if (bWaitRaiseConsume) { bWaitRaiseConsume = false; } if (bWaitSetting) { bWaitSetting = false; SettingMgr.SSaveFail(); } if (bWaitFinish) { bWaitFinish = false; } if (bMission) { bMission = false; } if (bDailyQuest) { bDailyQuest = false; } if (bRepeatQuest) { bRepeatQuest = false; } if (bGrowQuest) { bGrowQuest = false; } } // 통신 성공 - 데이터 저장. private void ASaveDataSucc(object result, object request) { nSaveReturn data = result as nSaveReturn; if (data == null) { ASaveDataFail(new SvError(eErrorCode.NULL_OR_EMPTY), request); return; } DataHandler.SetMailCount(data.mailCount); B_DataSaving = false; IsNeedSave = false; // 가방 소모품 사용 처리 필요. if (bWaitBagConsume) { bWaitBagConsume = false; BagMgr.SUseConsumeSv(); } if (bWaitPointEnhanceConsume) { bWaitPointEnhanceConsume = false; EnhanceMgr.SAPointEnhance(); } if (bWaitTradeConsume) { bWaitTradeConsume = false; EventMgr.SSVTradeTry(); } if (bWaitRaiseConsume) { bWaitRaiseConsume = false; } if (bWaitSetting) { bWaitSetting = false; SettingMgr.SSaveSucc(); } if (bWaitFinish) { bWaitFinish = false; } if (bMission) { bMission = false; MissionMgr.SClearMission(); } if (bDailyQuest) { bDailyQuest = false; QuestMgr.SClearDailyQuest(dQuestId); } if (bRepeatQuest) { bRepeatQuest = false; QuestMgr.SClearRepeatQuest(rQuestId, rQuestCount); } if (bGrowQuest) { bGrowQuest = false; EventMgr.SClearGrowMissionQuest(gQuestId); } } // 가방 소모품 사용 전 데이터 저장. public static void SaveDataBagConsume() { Instance.bWaitBagConsume = true; Instance.SaveDataToServer(); } //포인트 사용 전 저장하기 public static void SaveDataPointEnhanceConsume() { Instance.bWaitPointEnhanceConsume = true; Instance.SaveDataToServer(); } //이벤트 교환 재화 사용 전 저장하기 public static void SaveDataEventTradeConsume() { Instance.bWaitTradeConsume = true; Instance.SaveDataToServer(); } //이벤트 키우기 재화 사용 전 저장하기 public static void SaveDataEventRaiseConsume() { Instance.bWaitRaiseConsume = true; Instance.SaveDataToServer(); } public static void SaveDataEventRouletteConsume() { Instance.bWaitRouletteConsume = true; Instance.SaveDataToServer(); } // 가방 소모품 사용 전 데이터 저장. public static void SaveDataSetting() { Instance.bWaitSetting = true; Instance.SaveDataToServer(); } //미션 클리어 전 데이터 저장 public static void SaveDataMission() { Instance.bMission = true; Instance.SaveDataToServer(); } int dQuestId = 0; //일일미션 클리어 전 데이터 저장 public static void SaveDataDQuest(int id) { Instance.bDailyQuest = true; Instance.dQuestId = id; Instance.SaveDataToServer(); } int rQuestId = 0; int rQuestCount = 0; //반복미션 클리어 전 데이터 저장 public static void SaveDataRQuest(int id, int cnt) { Instance.bRepeatQuest = true; Instance.rQuestId = id; Instance.rQuestCount = cnt; Instance.SaveDataToServer(); } int gQuestId = 0; //성장미션 클리어 전 데이터 저장 public static void SaveDataGQuest(int id) { Instance.bGrowQuest = true; Instance.gQuestId = id; Instance.SaveDataToServer(); } #endregion Save & Attend #region MoveContent public static void MoveContent(eEventMoveType content) { switch (content) { case eEventMoveType.EnhnaceGold: case eEventMoveType.EnhancePoint: case eEventMoveType.EnhanceAwakne: EnhanceMgr.SMoveEnhance(content); break; case eEventMoveType.SummonWeapon: case eEventMoveType.SummonArmor: case eEventMoveType.SummonAcc: case eEventMoveType.SummonTreasure: GachaMgr.SMoveGacha(content); break; case eEventMoveType.BagWeapon: case eEventMoveType.BagArmorCape: case eEventMoveType.BagArmorHat: case eEventMoveType.BagArmorShoes: case eEventMoveType.BagAccEar: case eEventMoveType.BagAccNeck: case eEventMoveType.BagAccRing: case eEventMoveType.BagConsume: BagMgr.SMoveBag(content); break; case eEventMoveType.BagTreasure: case eEventMoveType.BagTreasureR: TreasureMgr.SopenTreasure(); break; case eEventMoveType.skillActive: case eEventMoveType.skillPassive: SkillMgr.SMoveSkill(content); break; case eEventMoveType.pet: case eEventMoveType.petSprit: PetMgr.SMovePet(content); break; case eEventMoveType.DgGold: case eEventMoveType.DgStone: case eEventMoveType.DgPet: case eEventMoveType.DgAwaken: DungeonMgr.SMoveDungeon(content); break; case eEventMoveType.ProfileIcon: case eEventMoveType.ProfileTitleBattle: case eEventMoveType.ProfileTitleEquip: case eEventMoveType.ProfileTitleSummon: case eEventMoveType.ProfileTitleDungeon: case eEventMoveType.ProfileTitleEtc: ProfileMgr.SMoveProfile(content); break; case eEventMoveType.AdBuff: AdBuffMgr.SMoveAdbuff(); break; case eEventMoveType.Attend: AttendMgr.SMoveAttend(content); break; case eEventMoveType.SettingSys: case eEventMoveType.SettingId: SettingMgr.SMoveSetting(content); break; default: return; } } #endregion #region Account public void LoginRefresh() { } public void LogoutAuto() { } #endregion Account #region Firebase private void InitFirebase() { #if UNITY_EDITOR Invoke(nameof(OnInitFirebaseSucc), 1f); #else FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => { var dependencyStatus = task.Result; if (dependencyStatus == DependencyStatus.Available) { FirebaseApp app = FirebaseApp.DefaultInstance; Invoke(nameof(OnInitFirebaseSucc), 1f); } else { Debug.LogError(FormatString.StringFormat("Could not resolve all Firebase dependencies: {0}", dependencyStatus)); Invoke(nameof(OnInitFirebaseFail), 1f); } }); #endif } public void OnInitFirebaseSucc() { #if FIREBASE_PUSH Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived; Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived; #if UNITY_ANDROID #elif UNITY_IOS Messaging.FirebaseMessaging.RequestPermissionAsync(); #endif #endif #if FIREBASE_CRASHLYTICS CrashlyticsInit.Init(); #endif CheckLoginUser(); } public void OnInitFirebaseFail() { OpenPopup1Button(LocalizationText.GetText("exc_vergoogleplay"), GameFinishOnly); } #endregion Firebase #region Firebase Delegate #if FIREBASE_PUSH // 토큰 획득. public void OnTokenReceived(object sender, Messaging.TokenReceivedEventArgs token) { strPushToken = token.Token; bFCMInit = true; //int itopicall = 0; //int itopicnoti = -1; //int itopiclang = -1; //try //{ // itopicall = ObscuredPrefs.GetInt(Global.PREFS_TopicAll, 0); // itopicnoti = ObscuredPrefs.GetInt(Global.PREFS_TopicNoti, -1); // itopiclang = ObscuredPrefs.GetInt(Global.PREFS_TopicLang, -1); //} //catch { } //if (itopicall == 0) //{ // Messaging.FirebaseMessaging.SubscribeAsync(Global.MDT_ALL); // ObscuredPrefs.SetInt(Global.PREFS_TopicAll, 1); // ObscuredPrefs.Save(); //} //if (itopicnoti == -1) //{ // if (Global.MDT_Noti.Equals("notitest")) // { // Messaging.FirebaseMessaging.SubscribeAsync(Global.MDT_Noti); // ObscuredPrefs.SetInt(Global.PREFS_TopicNoti, 1); // ObscuredPrefs.Save(); // } // else if (Global.MDT_Noti.Equals("notilive")) // { // Messaging.FirebaseMessaging.SubscribeAsync(Global.MDT_Noti); // ObscuredPrefs.SetInt(Global.PREFS_TopicNoti, 2); // ObscuredPrefs.Save(); // } //} //else //{ // if (Global.MDT_Noti.Equals("notilive")) // { // if (itopicnoti == 1) // { // Messaging.FirebaseMessaging.UnsubscribeAsync("notitest"); // Messaging.FirebaseMessaging.SubscribeAsync(Global.MDT_Noti); // ObscuredPrefs.SetInt(Global.PREFS_TopicNoti, 2); // ObscuredPrefs.Save(); // } // } // else if (Global.MDT_Noti.Equals("notitest")) // { // if (itopicnoti == 2) // { // Messaging.FirebaseMessaging.UnsubscribeAsync("notilive"); // Messaging.FirebaseMessaging.SubscribeAsync(Global.MDT_Noti); // ObscuredPrefs.SetInt(Global.PREFS_TopicNoti, 1); // ObscuredPrefs.Save(); // } // } //} //if (itopicnoti == 0) //{ // Messaging.FirebaseMessaging.SubscribeAsync(Global.MDT_Noti); // ObscuredPrefs.SetInt(Global.PREFS_TopicNoti, 1); // ObscuredPrefs.Save(); //} //string strostype = ObscuredPrefs.GetString(Global.PREFS_TopicOSType, null); //if (!Global.MDT_OSType.Equals(strostype)) //{ // if (!string.IsNullOrEmpty(strostype)) // Messaging.FirebaseMessaging.UnsubscribeAsync(strostype); // Messaging.FirebaseMessaging.SubscribeAsync(Global.MDT_OSType); // ObscuredPrefs.SetString(Global.PREFS_TopicOSType, Global.MDT_OSType); // ObscuredPrefs.Save(); //} //if (Global.iLanguage != itopiclang) //{ // if (itopiclang >= 0 && itopiclang < Global.arStrLangTopic.Length) // Messaging.FirebaseMessaging.UnsubscribeAsync(Global.arStrLangTopic[itopiclang]); // if (Global.iLanguage >= 0 && Global.iLanguage < Global.arStrLangTopic.Length) // { // Messaging.FirebaseMessaging.SubscribeAsync(Global.arStrLangTopic[Global.iLanguage]); // ObscuredPrefs.SetInt(Global.PREFS_TopicLang, Global.iLanguage); // ObscuredPrefs.Save(); // } //} #if APPSFLYER_ANALYTICS && UNITY_ANDROID AppsFlyerAndroid.updateServerUninstallToken(token.Token); #endif } // 푸시 수신. public void OnMessageReceived(object sender, Messaging.MessageReceivedEventArgs e) { if (e.Message.Data != null && e.Message.Data.Count > 0) { string key = null; string value = null; foreach (KeyValuePair item in e.Message.Data) { if (item.Key.Equals(MDK_Key)) key = item.Value; else if (item.Key.Equals(MDK_Value)) value = item.Value; else if (item.Key.Equals(MDK_NotiKey)) key = item.Value; } Logger.Log("OnMessageReceived: Data " + key + " : " + value); //if (!string.IsNullOrEmpty(key)) // DataMgr.CheckMessageDataS(key, value); } } #endif #endregion Firebase Delegate #region Firebase Login // 로그인 된 유저 체크. private static void CheckLoginUser() { #if UNITY_EDITOR MainMgr.SSetLoginUi(0); #else int ilogintype = ES3.Load(Global.ES3_Login, 0); auth = FirebaseAuth.DefaultInstance; //auth.StateChanged += AuthStateChanged; //AuthStateChanged(this, null); // 이전에 로그인 한 유저 정보가 없음. if (ilogintype <= 0 || auth == null || auth.CurrentUser == null) { ES3.Save(Global.ES3_Login, 0); MainMgr.SSetLoginUi(0); return; } FirebaseUser user = auth.CurrentUser; if (user == null || string.IsNullOrEmpty(user.UserId)) { ES3.Save(Global.ES3_Login, 0); MainMgr.SSetLoginUi(0); return; } // 이전에 로그인 한 유저 정보가 있음. user.TokenAsync(true).ContinueWith(tasktoken => { if (tasktoken.IsCompleted && !tasktoken.IsCanceled && !tasktoken.IsFaulted) { //Logger.Log(string.Format("FIREBASE TOKEN: {0}", tasktoken.Result)); if (string.IsNullOrEmpty(user.UserId)) { Logger.Log("UserId is empty."); ES3.Save(Global.ES3_Login, 0); MainMgr.SSetLoginUi(0); } else { UserID = user.UserId; UserToken = tasktoken.Result; UserState = eUserState.Login; MainMgr.SSetLoginUi(0);//수정해봄 FormatString.PrintLog("CheckLoginUser"); FormatString.PrintLog(UserToken); } } else if (tasktoken.IsCanceled) { Logger.Log("TokenAsync was canceled."); ES3.Save(Global.ES3_Login, 0); MainMgr.SSetLoginUi(0); } else if (tasktoken.IsFaulted) { Logger.Log("TokenAsync encountered an error: " + tasktoken.Exception); OpenPopup1Button(tasktoken.Exception.Message); ES3.Save(Global.ES3_Login, 0); MainMgr.SSetLoginUi(0); } }); #endif } public static void AuthResult(eLoginType logintype, eLoginType loginres, string strresult, string strid) { Logger.Log("SingleMgr - AuthResult " + logintype.ToString() + " / " + loginres.ToString()); switch (loginres) { // succ case eLoginType.LOGIN_SUCC: UserID = strid; UserToken = strresult; UserState = eUserState.Login; ES3.Save(Global.ES3_Login, (int)logintype); Debug.LogWarningFormat("Login Success with UID : {0}, USER_TOKEN : {1}", UserID, UserToken); MainMgr.SPlatformLoginSucc(); return; // cancel case eLoginType.LOGIN_CANCEL: OpenPopup1Button(LocalizationText.GetText("error_login_cancel")); Logger.LogWarning("LOGIN_CANCEL"); break; // cancel another case eLoginType.LOGIN_CANCEL_A: OpenPopup1Button(LocalizationText.GetText("error_login_cancel_a")); Logger.LogWarning("LOGIN_CANCEL_A"); break; // cancel user case eLoginType.LOGIN_CANCEL_USER: Logger.LogWarning("LOGIN_CANCEL_USER"); break; // fail pre case eLoginType.LOGIN_FAIL_PRE: OpenPopup1Button(FormatString.StringFormat(LocalizationText.GetText("error_login_fail_pre"), strresult)); Logger.Log(string.Format("LOGIN_FAIL_PRE: {0} ::: {1}", strresult, strid)); break; // fail another case eLoginType.LOGIN_FAIL_A: OpenPopup1Button(FormatString.StringFormat(LocalizationText.GetText("error_login_fail_a"), strresult)); Logger.Log(string.Format("LOGIN_FAIL_A: {0} ::: {1}", strresult, strid)); break; // fail case eLoginType.LOGIN_FAIL: OpenPopup1Button(FormatString.StringFormat(LocalizationText.GetText("error_login_fail"), strresult)); Logger.Log(string.Format("LOGIN_FAIL: {0} ::: {1}", strresult, strid)); break; // fail token null case eLoginType.LOGIN_FAIL_TOKEN_NULL: OpenPopup1Button(LocalizationText.GetText("error_login_token_null")); Logger.LogWarning("LOGIN_FAIL_TOKEN_NULL"); break; // fail token error case eLoginType.LOGIN_FAIL_TOKEN_ERROR: OpenPopup1Button(FormatString.StringFormat(LocalizationText.GetText("error_login_token_error"), strresult)); Logger.Log(string.Format("LOGIN_FAIL_TOKEN_ERROR: {0} ::: {1}", strresult, strid)); break; // fail task null case eLoginType.LOGIN_FAIL_TASK_NULL: OpenPopup1Button(LocalizationText.GetText("error_login_task_null")); Logger.LogWarning("LOGIN_FAIL_TASK_NULL"); break; // fail task error case eLoginType.LOGIN_FAIL_TASK_ERROR: OpenPopup1Button(FormatString.StringFormat(LocalizationText.GetText("error_login_task_error"), strresult)); Logger.Log(string.Format("LOGIN_FAIL_TASK_ERROR: {0} ::: {1}", strresult, strid)); break; // fail task null case eLoginType.LOGIN_FAIL_SIGNIN_NULL: OpenPopup1Button(LocalizationText.GetText("error_login_signin_null")); Logger.LogWarning("LOGIN_FAIL_SIGNIN_NULL"); break; // fail task error case eLoginType.LOGIN_FAIL_SIGNIN_ERROR: OpenPopup1Button(FormatString.StringFormat(LocalizationText.GetText("error_login_signin_error"), strresult)); Logger.Log(string.Format("LOGIN_FAIL_SIGNIN_ERROR: {0} ::: {1}", strresult, strid)); break; // fail another default: OpenPopup1Button(FormatString.StringFormat(LocalizationText.GetText("error_login_default"), strresult)); Logger.Log(string.Format("LOGIN_FAIL_DEFAULT: {0} ::: {1}", strresult, strid)); break; } MainMgr.SLoginFail(); } // 게스트 로그인. public static void AuthAnonymous() { #if UNITY_EDITOR AuthResult(eLoginType.AUTH_GUEST, eLoginType.LOGIN_SUCC, PlayerPrefs.GetString("editortoken", "input your token here").Trim(), "editor"); #else auth = FirebaseAuth.DefaultInstance; Logger.Log("AuthAnonymous - SignInAnonymouslyAsync"); auth.SignInAnonymouslyAsync().ContinueWith(task => { Logger.Log("AuthAnonymous - CheckTask"); if (task != null && task.IsCompleted && !task.IsCanceled && !task.IsFaulted && task.Result != null) { Logger.Log("AuthAnonymous - RequestToken"); FirebaseUser user = task.Result.User; user.TokenAsync(true).ContinueWith(tasktoken => { Logger.Log("AuthAnonymous - CheckToken"); if (tasktoken != null && tasktoken.IsCompleted && !tasktoken.IsCanceled && !tasktoken.IsFaulted && tasktoken.Result != null) { Logger.Log("AuthAnonymous - Complete"); AuthResult(eLoginType.AUTH_GUEST, eLoginType.LOGIN_SUCC, tasktoken.Result, user.UserId); } else { Logger.Log("AuthAnonymous - TokenError"); if (tasktoken == null) { AuthResult(eLoginType.AUTH_GUEST, eLoginType.LOGIN_FAIL_TOKEN_NULL, null, null); } else if (tasktoken.IsCanceled) { AuthResult(eLoginType.AUTH_GUEST, eLoginType.LOGIN_CANCEL, null, null); } else if (tasktoken.IsFaulted) { AuthResult(eLoginType.AUTH_GUEST, eLoginType.LOGIN_FAIL, tasktoken.Exception.Message, tasktoken.Exception.ToString()); } else { AuthResult(eLoginType.AUTH_GUEST, eLoginType.LOGIN_FAIL_TOKEN_ERROR, tasktoken.Exception.Message, tasktoken.Exception.ToString()); } } }); } else { Logger.Log("AuthAnonymous - TaskError"); if (task == null) { AuthResult(eLoginType.AUTH_GUEST, eLoginType.LOGIN_FAIL_TASK_NULL, null, null); } else if (task.IsCanceled) { AuthResult(eLoginType.AUTH_GUEST, eLoginType.LOGIN_CANCEL_A, null, null); } else if (task.IsFaulted) { AuthResult(eLoginType.AUTH_GUEST, eLoginType.LOGIN_FAIL_A, task.Exception.Message, task.Exception.ToString()); } else { AuthResult(eLoginType.AUTH_GUEST, eLoginType.LOGIN_FAIL_TASK_ERROR, task.Exception.Message, task.Exception.ToString()); } } }); #endif } #endregion Firebase Login #region AppsFlyer Delegate #if APPSFLYER_ANALYTICS // 전환 데이터를 가져올때 사용. public void onConversionDataSuccess(string conversionData) { #if UNITY_EDITOR || VER_DEV || VER_TEST || VER_ZOMBIE Logger.Log(" *************************** onConversionDataSuccess : " + conversionData); #endif AppsFlyer.AFLog("onConversionDataSuccess", conversionData); Dictionary conversionDataDictionary = AppsFlyer.CallbackStringToDictionary(conversionData); // add deferred deeplink logic here } // 전환 데이터를 가져오지 못했을 경우. public void onConversionDataFail(string error) { #if UNITY_EDITOR || VER_DEV || VER_TEST || VER_ZOMBIE Logger.LogWarning(" *************************** onConversionDataFail : " + error); #endif AppsFlyer.AFLog("onConversionDataFail", error); } // 딥링크를 통해 열릴 때 딥링크 데이터를 가져옴. public void onAppOpenAttribution(string attributionData) { #if UNITY_EDITOR || VER_DEV || VER_TEST || VER_ZOMBIE Logger.Log(" *************************** onAppOpenAttribution : " + attributionData); #endif AppsFlyer.AFLog("onAppOpenAttribution", attributionData); Dictionary attributionDataDictionary = AppsFlyer.CallbackStringToDictionary(attributionData); // add direct deeplink logic here } // 딥링크 데이터를 가져오는동안 오류. public void onAppOpenAttributionFailure(string error) { #if UNITY_EDITOR || VER_DEV || VER_TEST || VER_ZOMBIE Logger.LogWarning(" *************************** onAppOpenAttributionFailure : " + error); #endif AppsFlyer.AFLog("onAppOpenAttributionFailure", error); } #endif #endregion AppsFlyer Delegate #region Popup public static void OpenPopupCheckNet(string strmsg, System.Action actionyes = null, string strtitle = null, string stryes = null, bool bclose = true, float ftime = 0f) { if (B_PLAY) { GameUIMgr.SOpenPopupCheckNet(strmsg, actionyes, strtitle, stryes, bclose, ftime); } else if (MainMgr.IsMain()) { MainMgr.SOpenPopupCheckNet(strmsg, actionyes, strtitle, stryes, bclose, ftime); } } public static void OpenPopup1Button(string strmsg, System.Action actionyes = null, string strtitle = null, string stryes = null, bool bclose = true, float ftime = 0f) { if (B_PLAY) { GameUIMgr.SOpenPopup1Button(strmsg, actionyes, strtitle, stryes, bclose, ftime); } else if (MainMgr.IsMain()) { MainMgr.SOpenPopup1Button(strmsg, actionyes, strtitle, stryes, bclose, ftime); } } public static void OpenPopup2Button(string strmsg, System.Action actionyes = null, System.Action actionno = null, string strtitle = null, string stryes = null, string strno = null) { if (B_PLAY) { GameUIMgr.SOpenPopup2Button(strmsg, actionyes, actionno, strtitle, stryes, strno); } else if (MainMgr.IsMain()) { MainMgr.SOpenPopup2Button(strmsg, actionyes, actionno, strtitle, stryes, strno); } } public static void OpenToast(string strmsg, float ftime = 2f, int itype = 1) { if (B_PLAY) { GameUIMgr.SOpenToast(strmsg, ftime, itype); } else if (MainMgr.IsMain()) { MainMgr.SOpenToast(strmsg, ftime); } } #endregion Popup #region Finish & Update public static void GameFinishDate() { CoverCamera.Hold(); BattleMgr.Instance.BattlePause = true; DataHandler.PlayData.SaveDate(TimeUtils.Now().AddDays(-1d)); #if UNITY_EDITOR UnityEditor.EditorApplication.ExecuteMenuItem("Edit/Play"); #else Application.Quit(); #endif } public static void GameFinishOnly() { CoverCamera.Hold(); #if UNITY_EDITOR UnityEditor.EditorApplication.ExecuteMenuItem("Edit/Play"); #else Application.Quit(); #endif } public static void GameFinish() { CoverCamera.Hold(); if (B_PLAY) Instance.StartCoroutine(nameof(GameFinishProcess)); } private IEnumerator GameFinishProcess() { if (B_PLAY) { NotifyMgr.SSendEndNoti(); } yield return null; yield return null; yield return null; DataHandler.SaveData(); yield return null; yield return null; yield return null; #if UNITY_EDITOR UnityEditor.EditorApplication.ExecuteMenuItem("Edit/Play"); yield break; #else Application.Quit(); #endif } public static void GameFinishSvSave() { CoverCamera.Hold(); if (B_PLAY) Instance.StartCoroutine(nameof(GameFinishSvSaveProcess)); } private IEnumerator GameFinishSvSaveProcess() { GameUIMgr.SOpenToast(LocalizationText.GetText("msg_exitsave"), 99f, 1); if (B_PLAY) { NotifyMgr.SSendEndNoti(); } yield return null; yield return null; yield return null; DataHandler.SaveData(); yield return null; yield return null; yield return null; bWaitFinish = true; Instance.SaveDataToServer(); while (bWaitFinish) { yield return YieldInstructionCache.WaitForSeconds(0.5f); } #if UNITY_EDITOR UnityEditor.EditorApplication.ExecuteMenuItem("Edit/Play"); yield break; #else Application.Quit(); #endif } public static void GameUpdate() { CoverCamera.Hold(); #if VER_ONESTORE Application.OpenURL(LocalizationText.GetText("update_onestore")); #elif UNITY_IOS Application.OpenURL(LocalizationText.GetText("update_apple")); #else Application.OpenURL(LocalizationText.GetText("update_google")); #endif } #endregion Finish & Update #region Others public static void ResetCount() { Instance.iTouchCount = 0; } #endregion }