using System; using System.Collections; using System.Reflection; using System.Text; using Unity.EditorCoroutines.Editor; using UnityEditor; using UnityEngine; using UnityEngine.Networking; namespace TriflesGames.SDKManagement.Editor.SDKFiles { public class GameAnalyticsSDKFile : SDKFile { private const string SDK_VERSION_URL = "https://s3.amazonaws.com/public.gameanalytics.com/sdk_status/change_logs.json"; private string _sdkVersion; public override string SDKVersion => _sdkVersion; public GameAnalyticsSDKFile(string id, string name, long driveVersion, long localVersion) : base(id, name, driveVersion, localVersion) { EditorWindow.GetWindow().StartCoroutine(GetCurrentVersion()); } private IEnumerator GetCurrentVersion() { var unityWebRequest = new UnityWebRequest(SDK_VERSION_URL) { downloadHandler = new DownloadHandlerBuffer(), timeout = 10, }; if (!string.IsNullOrEmpty(unityWebRequest.error)) { Debug.LogError(unityWebRequest.error); } yield return unityWebRequest.SendWebRequest(); var responseJson = unityWebRequest.downloadHandler.text; if (string.IsNullOrEmpty(responseJson)) { Debug.LogError("Unable to retrieve SDK version manifest. Showing installed SDKs only."); yield break; } var sb = new StringBuilder(); var onlineVersionList = JsonUtility.FromJson(responseJson); try { var assemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (var assembly in assemblies) { var gameAnalyticsSettings = assembly.GetType("GameAnalyticsSDK.Setup.Settings"); if (gameAnalyticsSettings != null) { var downloadedActualVersion = gameAnalyticsSettings .GetField( "VERSION", BindingFlags.Public | BindingFlags.Static) ?.GetValue(default); sb.Append($"current: {downloadedActualVersion} -> "); break; } } } catch (Exception ex) { Debug.LogError($"Failed to read local SDK Version: {ex.Message}\n\r{ex.StackTrace}"); } if (onlineVersionList != null && onlineVersionList.unity.Length > 0) { sb.Append($"latest: {onlineVersionList.unity[0].version}"); } else { sb.Append("latest: ---"); } _sdkVersion = sb.ToString(); } [System.Serializable] private class SdkContainer { public Sdk[] unity; } [System.Serializable] private class Sdk { public string version; } } }