//======= Copyright (c) Valve Corporation, All rights reserved. =============== // // Purpose: Notify developers when a new version of the plugin is available. // //============================================================================= using UnityEngine; using UnityEditor; using System.IO; using System.Text.RegularExpressions; #if UNITY_2018_3_OR_NEWER #pragma warning disable CS0618 #endif namespace Valve.VR { [InitializeOnLoad] public class SteamVR_Update : EditorWindow { const string currentVersion = "2.8"; const string versionUrl = "https://media.steampowered.com/apps/steamvr/unitypluginversion.txt"; const string notesUrl = "https://media.steampowered.com/apps/steamvr/unityplugin-v{0}.txt"; const string pluginUrl = "https://u3d.as/content/valve-corporation/steam-vr-plugin"; const string doNotShowKey = "SteamVR.DoNotShow.v{0}"; static bool gotVersion = false; static WWW wwwVersion, wwwNotes; static string version, notes; static SteamVR_Update window; static SteamVR_Update() { EditorApplication.update += Update; } static void Update() { if (!gotVersion) { if (wwwVersion == null) wwwVersion = new WWW(versionUrl); if (!wwwVersion.isDone) return; if (UrlSuccess(wwwVersion)) version = wwwVersion.text; wwwVersion = null; gotVersion = true; if (ShouldDisplay()) { var url = string.Format(notesUrl, version); wwwNotes = new WWW(url); window = GetWindow(true); window.minSize = new Vector2(320, 440); //window.title = "SteamVR"; } } if (wwwNotes != null) { if (!wwwNotes.isDone) return; if (UrlSuccess(wwwNotes)) notes = wwwNotes.text; wwwNotes = null; if (notes != "") window.Repaint(); } EditorApplication.update -= Update; } static bool UrlSuccess(WWW www) { if (!string.IsNullOrEmpty(www.error)) return false; if (Regex.IsMatch(www.text, "404 not found", RegexOptions.IgnoreCase)) return false; return true; } static bool ShouldDisplay() { if (string.IsNullOrEmpty(version)) return false; if (version == currentVersion) return false; if (EditorPrefs.HasKey(string.Format(doNotShowKey, version))) return false; // parse to see if newer (e.g. 1.0.4 vs 1.0.3) var versionSplit = version.Split('.'); var currentVersionSplit = currentVersion.Split('.'); for (int i = 0; i < versionSplit.Length && i < currentVersionSplit.Length; i++) { int versionValue, currentVersionValue; if (int.TryParse(versionSplit[i], out versionValue) && int.TryParse(currentVersionSplit[i], out currentVersionValue)) { if (versionValue > currentVersionValue) return true; if (versionValue < currentVersionValue) return false; } } // same up to this point, now differentiate based on number of sub values (e.g. 1.0.4.1 vs 1.0.4) if (versionSplit.Length <= currentVersionSplit.Length) return false; return true; } Vector2 scrollPosition; bool toggleState; string GetResourcePath() { var ms = MonoScript.FromScriptableObject(this); var path = AssetDatabase.GetAssetPath(ms); path = Path.GetDirectoryName(path); return path.Substring(0, path.Length - "Editor".Length) + "Textures/"; } public void OnGUI() { EditorGUILayout.HelpBox("A new version of the SteamVR plugin is available!", MessageType.Warning); var resourcePath = GetResourcePath(); var logo = AssetDatabase.LoadAssetAtPath(resourcePath + "logo.png"); var rect = GUILayoutUtility.GetRect(position.width, 150, GUI.skin.box); if (logo) GUI.DrawTexture(rect, logo, ScaleMode.ScaleToFit); scrollPosition = GUILayout.BeginScrollView(scrollPosition); GUILayout.Label("Current version: " + currentVersion); GUILayout.Label("New version: " + version); if (notes != "") { GUILayout.Label("Release notes:"); EditorGUILayout.HelpBox(notes, MessageType.Info); } GUILayout.EndScrollView(); GUILayout.FlexibleSpace(); if (GUILayout.Button("Get Latest Version")) { Application.OpenURL(pluginUrl); } EditorGUI.BeginChangeCheck(); var doNotShow = GUILayout.Toggle(toggleState, "Do not prompt for this version again."); if (EditorGUI.EndChangeCheck()) { toggleState = doNotShow; var key = string.Format(doNotShowKey, version); if (doNotShow) EditorPrefs.SetBool(key, true); else EditorPrefs.DeleteKey(key); } } } } #if UNITY_2018_3_OR_NEWER #pragma warning restore CS0618 #endif