Files
HelixJump/Packages/com.merry-yellow.code-assist/Editor/Updater.cs
2025-12-15 17:49:08 -08:00

150 lines
5.3 KiB
C#

using System.Collections;
using UnityEngine;
using UnityEditor;
using UnityEngine.Networking;
#pragma warning disable IDE0005
using Serilog = Meryel.Serilog;
#pragma warning restore IDE0005
#nullable enable
namespace Meryel.UnityCodeAssist.Editor
{
public static class Updater
{
const string EditorPrefsKey = "my_uca_update_disabled";
const string SessionStateKey = "my_uca_update_checked_before";
const string ItchApiUri = "https://itch.io/api/1/x/wharf/latest?target=meryel/unity-code-assist&channel_name=asset";
const string ItchStoreUri = "https://meryel.itch.io/unity-code-assist";
const string AssetStoreUri = "https://assetstore.unity.com/packages/tools/utilities/code-assist-216713";
const string VSMarketplaceUri = "https://marketplace.visualstudio.com/items?itemName=MerryYellow.UCA-Lite";
const string VSCodeMarketplaceUri = "https://marketplace.visualstudio.com/items?itemName=MerryYellow.uca-lite-vscode";
#pragma warning disable CS0162
public static void CheckUpdateSilent()
{
#if !MERYEL_UCA_ITCH_BUILD
return;
#endif
var updateDisabled = EditorPrefs.GetBool(EditorPrefsKey, false);
if (updateDisabled)
return;
var updateCheckedBefore = SessionState.GetBool(SessionStateKey, false);
if (updateCheckedBefore)
return;
EditorCoroutines.EditorCoroutineUtility.StartCoroutine(GetRequest(ItchApiUri, false), MQTTnetInitializer.Publisher);
}
#pragma warning restore CS0162
public static void CheckUpdateForced()
{
EditorCoroutines.EditorCoroutineUtility.StartCoroutine(GetRequest(ItchApiUri, true), MQTTnetInitializer.Publisher);
}
static void DisplayDialog()
{
SessionState.SetBool(SessionStateKey, true);
int option = EditorUtility.DisplayDialogComplex(
"Update Unity Code Assist",
"Do you want to update asset: Unity Code Assist?",
"Update", //"Save",
"Cancel",
"Never ask again"); //"Don't Save");
switch (option)
{
// update - Save.
case 0:
#if MERYEL_UCA_ITCH_BUILD
Application.OpenURL(ItchStoreUri);
#endif
#if MERYEL_UCA_ASSET_STORE_BUILD
Application.OpenURL(AssetStoreUri);
Serilog.Log.Information("It may take a few days for the Asset Store team to review updates. Thank you for your patience.");
#endif
#if MERYEL_UCA_VS_MARKETPLACE_BUILD
Application.OpenURL(VSMarketplaceUri);
#endif
#if MERYEL_UCA_VSC_MARKETPLACE_BUILD
Application.OpenURL(VSCodeMarketplaceUri);
#endif
break;
// Cancel.
case 1:
// do nothing
break;
// never ask again - Don't Save.
case 2:
EditorPrefs.SetBool(EditorPrefsKey, true);
break;
default:
Serilog.Log.Error("Unrecognized option for {Location}.", nameof(DisplayDialog));
break;
}
}
static void Compare(string response, bool isForced)
{
var regex = new System.Text.RegularExpressions.Regex("\\d+(\\.\\d+){2,4}");
var match = regex.Match(response);
if (!match.Success)
{
Serilog.Log.Error("Invalid update response, couldn't parse: {Response}", response);
return;
}
var version = match.Value;
if (Assister.VersionCompare(Assister.Version, version) >= 0)
{
if (isForced)
Serilog.Log.Information("Unity Code Assist is up to date, version: {Version}", Assister.Version);
return;
}
DisplayDialog();
}
static IEnumerator GetRequest(string uri, bool isForced)
{
using (UnityWebRequest webRequest = UnityWebRequest.Get(uri))
{
// Request and wait for the desired page.
yield return webRequest.SendWebRequest();
string[] pages = uri.Split('/');
int page = pages.Length - 1;
switch (webRequest.result)
{
case UnityWebRequest.Result.ConnectionError:
case UnityWebRequest.Result.DataProcessingError:
Serilog.Log.Error("Error while checking new version of UnityCodeAssist " + pages[page] + ": Error: " + webRequest.error);
break;
case UnityWebRequest.Result.ProtocolError:
Serilog.Log.Error("Error while checking new version of UnityCodeAssist " + pages[page] + ": HTTP Error: " + webRequest.error);
break;
case UnityWebRequest.Result.Success:
Serilog.Log.Debug("Checking new version of UnityCodeAssist " + pages[page] + ": Received: " + webRequest.downloadHandler.text);
Compare(webRequest.downloadHandler.text, isForced);
break;
}
}
}
}
}