/// <summary> /// Callback when new RemoteConfig data is successfully uploaded. Update the UI to match /// the new server state. /// </summary> /// <param name="sender">Event source.</param> /// <param name="data">Newly synced data.</param> private void RemoteConfigDataUpdatedCallback(object sender, RemoteConfigData data) { ready = true; retrievingRemoteConfigData = false; RemoteConfigData = data; UpdateUI(); }
/// <summary> /// Register callbacks and make first call to RemoteConfigDataManager, and initialize the UI. /// </summary> public void OnEnable() { Instance = this; titleContent = new GUIContent("Remote Config Sync"); // Initialize UI state if necessary. if (rootVisualElement.childCount == 0) { InitializeUI(); } retrievingRemoteConfigData = false; SyncDataManager.DataRetrieved += RemoteConfigDataUpdatedCallback; SyncDataManager.DataUploaded += RemoteConfigDataUpdatedCallback; SyncDataManager.RetrieveError += RemoteConfigErrorCallback; if (File.Exists(SyncDataManager.LocalFilePath)) { var localContent = File.ReadAllText(SyncDataManager.LocalFilePath); RemoteConfigData = RemoteConfigData.Deserialize(localContent); SyncDataManager.CurrentData = RemoteConfigData; ready = true; UpdateUI(); } else if (!EditorApplication.isPlayingOrWillChangePlaymode) { GetRemoteConfigData(); } }
/// <summary> /// Upload new RemoteConfigData via REST API. /// </summary> /// <param name="newData">New data to upload to Remote Config.</param> private static void UpdateRemoteConfig(RemoteConfigData newData) { var newRemoteConfigData = JsonConvert.SerializeObject(newData); var webRequest = UnityWebRequest.Put(remoteConfigUrl, newRemoteConfigData); webRequest.SetRequestHeader("Authorization", "Bearer " + accessToken); webRequest.SetRequestHeader("Content-Type", "application/json; UTF8"); webRequest.SetRequestHeader("If-Match", "*"); string data = ""; webRequest.SendWebRequest().completed += op => { data = webRequest.downloadHandler.text; if (webRequest.isHttpError) { var exception = new Exception( $"Error uploading RemoteConfig: {webRequest.error}\nData: {data}"); RetrieveError.Invoke(null, new ErrorArgs(exception)); return; } SetCurrentData(data); DataUploaded(CurrentData, CurrentData); }; }
/// <summary> /// Deserialize the JSON RemoteConfigData into the CurrentData field. /// </summary> /// <param name="json">String data to deserialize.</param> private static void SetCurrentData(string json) { // Save to local docs file so it doesn't have to be retrieved on every compile time. if (!File.Exists(LocalFilePath)) { File.Create(LocalFilePath).Close(); } File.WriteAllText(LocalFilePath, json); CurrentData = RemoteConfigData.Deserialize(json); }
/// <summary> /// Uploads new data to Remote Config on server via REST API. /// </summary> /// <param name="newData">Data to upload to Remote Config.</param> public static void UpdateRemoteConfigAsync(RemoteConfigData newData) { if (string.IsNullOrWhiteSpace(accessToken)) { GetAccessToken(() => UpdateRemoteConfig(newData)); } else { UpdateRemoteConfig(newData); } }
protected virtual void DownloadTitleData_Completed(GetTitleDataResult result) { Debug.Log("MetaLoopGameManager Downloading TitleData Completed..."); if (result != null) { if (!ReadTitleData(result, false)) { return; } } else { ShowUnavailableMessage(GameUnavailableMessageType.HOST_UNREACHABLE); return; } AssetManifest assetManifest; if (result.Data.ContainsKey(MetaStateSettings._TitleDataKey_CdnManifest)) { assetManifest = JsonConvert.DeserializeObject <AssetManifest>(result.Data[MetaStateSettings._TitleDataKey_CdnManifest]); RemoteAssetsManager.Init(assetManifest); } if (result.Data.ContainsKey(MetaStateSettings._TitleDataKey_RemoteConfig)) { RemoteConfigData.Load(result.Data[MetaStateSettings._TitleDataKey_RemoteConfig]); } else { RemoteConfigData.Load(null); } EventManagerState eventManagerState; if (result.Data.ContainsKey(MetaStateSettings._TitleDataKey_EventManager)) { eventManagerState = JsonConvert.DeserializeObject <EventManagerState>(result.Data[MetaStateSettings._TitleDataKey_EventManager]); } else { eventManagerState = new EventManagerState(); } Debug.Log("MetaLoopGameManager Downloading User Data..."); DownloadUserData(); }
public static void ChangeServerStatus(bool available, string secondsToWait, string versionId = null) { int waitingTime = Convert.ToInt32(secondsToWait); var currentStatus = PlayFab.PlayFabServerAPI.GetTitleDataAsync(new PlayFab.ServerModels.GetTitleDataRequest() { Keys = new List <string>() { MetaStateSettings._TitleDataKey_ServerInfo, MetaStateSettings._TitleDataKey_RemoteConfig } }).GetAwaiter().GetResult(); ServerInfo serverInfo = null; RemoteConfigData configData = null; bool updateRemoteConfig = false; if (currentStatus.Result.Data.ContainsKey(MetaStateSettings._TitleDataKey_ServerInfo)) { serverInfo = JsonConvert.DeserializeObject <ServerInfo>(currentStatus.Result.Data[MetaStateSettings._TitleDataKey_ServerInfo]); } else { serverInfo = new ServerInfo(); Console.WriteLine("COULD NOT READ ServerInfo, CREATING NEW ONE..."); } if (currentStatus.Result.Data.ContainsKey(MetaStateSettings._TitleDataKey_RemoteConfig)) { configData = JsonConvert.DeserializeObject <RemoteConfigData>(currentStatus.Result.Data[MetaStateSettings._TitleDataKey_RemoteConfig]); } else { configData = new RemoteConfigData(); configData.Values.Add("Foo", "Value"); Console.WriteLine("COULD NOT READ RemoteConfigData, CREATING NEW ONE..."); updateRemoteConfig = true; } serverInfo.ServerStatus = (available || waitingTime == 0) ? ServerStatus.Online : ServerStatus.Offline; serverInfo.MaintenanceMessage = (available || waitingTime == 0) ? string.Empty : GameUnavailableMessageType.MAINTENANCE.ToString(); serverInfo.CacheVersion++; if (!string.IsNullOrEmpty(versionId)) { serverInfo.AppVersion = versionId; } if (available) { Console.WriteLine("Waking up Azure...."); WakeUpAzureRequests(10); WaitFor(Convert.ToInt32(secondsToWait)); Console.WriteLine("Setting server Online..."); var updateData = PlayFabServerAPI.SetTitleDataAsync(new PlayFab.ServerModels.SetTitleDataRequest() { Key = MetaStateSettings._TitleDataKey_ServerInfo, Value = serverInfo.ToJson() }).GetAwaiter().GetResult(); if (updateData.Error == null) { Console.WriteLine("SUCCESS"); } } else { if (updateRemoteConfig) { var updateDataForRemoteConfig = PlayFabServerAPI.SetTitleDataAsync(new PlayFab.ServerModels.SetTitleDataRequest() { Key = MetaStateSettings._TitleDataKey_RemoteConfig, Value = configData.ToJson() }).GetAwaiter().GetResult(); if (updateDataForRemoteConfig.Error == null) { Console.WriteLine("RemoteConfig Created."); } } Console.WriteLine("Shutting Down Servers..."); var updateData = PlayFabServerAPI.SetTitleDataAsync(new PlayFab.ServerModels.SetTitleDataRequest() { Key = MetaStateSettings._TitleDataKey_ServerInfo, Value = serverInfo.ToJson() }).GetAwaiter().GetResult(); if (updateData.Error == null) { Console.WriteLine("SUCCESS"); WaitFor(Convert.ToInt32(secondsToWait)); } } }