11using System ;
22using System . Linq ;
3- using UnityEditor ;
4- using UnityEngine ;
5- using Newtonsoft . Json ;
63using System . Threading ;
7- using UnityEngine . Networking ;
84using System . Threading . Tasks ;
5+ using Newtonsoft . Json ;
6+ using UnityEditor ;
97using UnityEditor . PackageManager ;
10- using UnityEditor . PackageManager . Requests ;
8+ using UnityEngine ;
9+ using UnityEngine . Networking ;
1110using PackageInfo = UnityEditor . PackageManager . PackageInfo ;
1211
1312namespace ReadyPlayerMe . Core . Editor
1413{
1514 /// <summary>
16- /// Class <c>ModuleUpdater</c> is responsible for checking and updating the Ready Player Me SDK modules.
15+ /// It is responsible for checking and updating the Ready Player Me SDK modules.
1716 /// </summary>
18- public static class ModuleUpdater
17+ [ InitializeOnLoad ]
18+ public class ModuleUpdater
1919 {
20+ private class Release
21+ {
22+ [ JsonProperty ( "tag_name" ) ]
23+ public string Tag ;
24+ }
25+
2026 private const string PACKAGE_JSON = "package.json" ;
2127 private const string PACKAGE_DOMAIN = "com.readyplayerme" ;
2228
2329 private const string GITHUB_WEBSITE = "https://github.com" ;
2430 private const string GITHUB_API_URL = "https://api.github.com/repos" ;
2531
26- private const string WARNING_PACKAGES_NOT_FOUND = "No Ready Player Me packages found." ;
27- private const string WARNING_UPDATE_SKIPPED = "No Ready Player Me packages found." ;
2832 private const int MILLISECONDS_TIMEOUT = 20 ;
2933 private const string ASSET_FILTER = "package" ;
3034
35+ private const string DONT_ASK = "Dont Ask" ;
36+
37+ static ModuleUpdater ( )
38+ {
39+ EntryPoint . Startup += ( ) => Check ( true ) ;
40+ }
41+
3142 /// <summary>
32- /// Check for Ready Player Me package updates.
43+ /// Check for Ready Player Me package updates.
3344 /// </summary>
3445 [ MenuItem ( "Ready Player Me/Check For Updates" ) ]
3546 public static void CheckForUpdates ( )
47+ {
48+ Check ( ) ;
49+ }
50+
51+ private static void Check ( bool isStartup = false )
3652 {
3753 // Get PackageInfo array from RPM Module package.json files
38- PackageInfo [ ] packages = AssetDatabase . FindAssets ( ASSET_FILTER )
54+ var packages = AssetDatabase . FindAssets ( ASSET_FILTER )
3955 . Select ( AssetDatabase . GUIDToAssetPath )
4056 . Where ( x => x . Contains ( PACKAGE_JSON ) && x . Contains ( PACKAGE_DOMAIN ) )
4157 . Select ( PackageInfo . FindForAssetPath )
4258 . ToArray ( ) ;
4359
60+ if ( packages . Length == 0 )
61+ {
62+ Debug . Log ( "No rpm package found" ) ;
63+ }
64+
4465 // Turn package_name@repo_url#branch_name into https://api.github.com/repos/readyplayerme/repo_name/releases
45- foreach ( PackageInfo package in packages )
66+ foreach ( var package in packages )
4667 {
4768 var repoUrl = package . packageId . Split ( '@' ) [ 1 ] ;
48- var releasesUrl = repoUrl . Replace ( GITHUB_WEBSITE , GITHUB_API_URL )
49- . Split ( new [ ] { ".git#" } , StringSplitOptions . None ) [ 0 ] + "/releases" ;
69+ var releasesUrl = repoUrl
70+ . Split ( new [ ] { ".git" } , StringSplitOptions . None ) [ 0 ]
71+ . Replace ( GITHUB_WEBSITE , GITHUB_API_URL ) + "/releases" ;
72+
73+
5074 var packageUrl = repoUrl . Split ( '#' ) [ 0 ] ;
5175
5276 // Experimental or prerelease packages might look like 0.1.0-exp.1, remove after dash to parse with Version
5377 var version = package . version . Split ( '-' ) [ 0 ] ;
78+
79+ if ( isStartup && EditorPrefs . GetBool ( DONT_ASK + "-" + package . name ) )
80+ {
81+ continue ;
82+ }
83+
5484 FetchReleases ( package . name , packageUrl , releasesUrl , new Version ( version ) ) ;
5585 }
5686 }
@@ -65,18 +95,17 @@ public static void CheckForUpdates()
6595 private static async void FetchReleases ( string packageName , string packageUrl , string releasesUrl ,
6696 Version currentVersion )
6797 {
68- UnityWebRequest request = UnityWebRequest . Get ( releasesUrl ) ;
69- UnityWebRequestAsyncOperation op = request . SendWebRequest ( ) ;
98+ var request = UnityWebRequest . Get ( releasesUrl ) ;
99+ var op = request . SendWebRequest ( ) ;
70100 while ( ! op . isDone ) await Task . Yield ( ) ;
71101
72102 if ( request . result == UnityWebRequest . Result . Success )
73103 {
74104 var response = request . downloadHandler . text ;
75- Release [ ] releases = JsonConvert . DeserializeObject < Release [ ] > ( response ) ;
76-
77- Version [ ] versions = releases . Select ( r => new Version ( r . Tag . Substring ( 1 ) . Split ( '-' ) [ 0 ] ) ) . ToArray ( ) ;
105+ var releases = JsonConvert . DeserializeObject < Release [ ] > ( response ) ;
106+ var versions = releases ! . Select ( r => new Version ( r . Tag . Substring ( 1 ) . Split ( '-' ) [ 0 ] ) ) . ToArray ( ) ;
78107
79- Version latestVersion = versions . Max ( ) ;
108+ var latestVersion = versions . Max ( ) ;
80109
81110 if ( latestVersion > currentVersion )
82111 {
@@ -99,20 +128,27 @@ private static async void FetchReleases(string packageName, string packageUrl, s
99128 private static void DisplayUpdateDialog ( string packageName , Version currentVersion , Version latestVersion ,
100129 string packageUrl )
101130 {
102- var shouldUpdate = EditorUtility . DisplayDialog ( "Update Packages" ,
131+ var shouldUpdate = EditorUtility . DisplayDialogComplex ( "Update Packages" ,
103132 $ "New update available for { packageName } \n Current version: { currentVersion } \n Latest version: { latestVersion } ",
104133 "Update" ,
105- "Skip" ) ;
134+ "Cancel" ,
135+ "Don't ask" ) ;
106136
107- if ( shouldUpdate )
108- {
109- packageUrl += "#v" + latestVersion ;
110- UpdateModule ( packageName , packageUrl , currentVersion , latestVersion ) ;
111- }
112- else
137+ switch ( shouldUpdate )
113138 {
114- // TODO: Bring analytics here
115- Debug . LogWarning ( WARNING_UPDATE_SKIPPED ) ;
139+ // Update
140+ case 0 :
141+ packageUrl += "#v" + latestVersion ;
142+ UpdateModule ( packageName , packageUrl , currentVersion , latestVersion ) ;
143+ break ;
144+ // Cancel
145+ case 1 :
146+ // Do nothing
147+ break ;
148+ // Don't ask
149+ case 2 :
150+ EditorPrefs . SetBool ( DONT_ASK + "-" + packageName , true ) ;
151+ break ;
116152 }
117153 }
118154
@@ -125,19 +161,13 @@ private static void DisplayUpdateDialog(string packageName, Version currentVersi
125161 /// <param name="latest">The new version of the package.</param>
126162 private static void UpdateModule ( string name , string url , Version current , Version latest )
127163 {
128- RemoveRequest removeRequest = Client . Remove ( name ) ;
164+ var removeRequest = Client . Remove ( name ) ;
129165 while ( ! removeRequest . IsCompleted ) Thread . Sleep ( MILLISECONDS_TIMEOUT ) ;
130166
131- AddRequest addRequest = Client . Add ( url ) ;
167+ var addRequest = Client . Add ( url ) ;
132168 while ( ! addRequest . IsCompleted ) Thread . Sleep ( MILLISECONDS_TIMEOUT ) ;
133169
134170 Debug . Log ( $ "Updated { name } from v{ current } to v{ latest } ") ;
135171 }
136172 }
137-
138- internal class Release
139- {
140- [ JsonProperty ( "tag_name" ) ]
141- public string Tag ;
142- }
143173}
0 commit comments