@@ -2,60 +2,97 @@ package funkin.backend.system.updating;
22
33import funkin .backend .system .github .GitHub ;
44import funkin .backend .system .github .GitHubRelease ;
5- import haxe . io . Path ;
5+
66import lime .app .Application ;
7+
8+ import sys .thread .Mutex ;
9+ import sys .thread .Thread ;
710import sys .FileSystem ;
811
12+ import haxe .io .Path ;
13+
914using funkin .backend .system .github .GitHub ;
1015
1116class UpdateUtil {
17+ public static var lastUpdateCheck : Null <UpdateCheckCallback >;
18+
19+ private static var __waitCallbacks : Array <UpdateCheckCallback -> Void >;
20+ private static var __mutex : Mutex ;
21+
1222 public static function init () {
1323 // deletes old bak file if it exists
1424 #if sys
1525 var bakPath = ' ${Path .withoutExtension (Sys .programPath ())}.bak' ;
16- if (FileSystem .exists (bakPath ))
17- FileSystem .deleteFile (bakPath );
26+ if (FileSystem .exists (bakPath )) FileSystem .deleteFile (bakPath );
1827 #end
28+
29+ __waitCallbacks = [];
30+ __mutex = new Mutex ();
31+ Thread .create (checkForUpdates .bind (true , false ));
32+ }
33+
34+ public static function waitForUpdates (force = false , callback : UpdateCheckCallback -> Void , lazy = false ) {
35+ if (__mutex .tryAcquire ()) {
36+ __mutex .release ();
37+ if (__shouldCheck (lazy ) || force ) {
38+ __waitCallbacks .push (callback );
39+ Thread .create (checkForUpdates .bind (force , false ));
40+ }
41+ else
42+ callback (lastUpdateCheck );
43+ }
44+ else
45+ __waitCallbacks .push (callback );
1946 }
2047
21- public static function checkForUpdates (): UpdateCheckCallback {
22- var curTag = ' v ${ Flags . VERSION } ' ;
23- trace ( " Current version: " + curTag );
48+ public static function checkForUpdates (force = false , lazy = false ): UpdateCheckCallback {
49+ var wasAcquired = ! __mutex . tryAcquire () ;
50+ if ( wasAcquired ) __mutex . acquire ( );
2451
25- var error = false ;
52+ if ((! force || wasAcquired ) && ! __shouldCheck (lazy )) {
53+ __mutex .release ();
54+ return lastUpdateCheck ;
55+ }
2656
27- var newUpdates = __doReleaseFiltering (GitHub .getReleases (Flags .REPO_OWNER , Flags .REPO_NAME , function (e ) {
57+ lastUpdateCheck = __checkForUpdates ();
58+ __mutex .release ();
59+
60+ FlxG .signals .preUpdate .addOnce (__callWaitCallbacks );
61+
62+ return lastUpdateCheck ;
63+ }
64+
65+ static function __checkForUpdates (): UpdateCheckCallback {
66+ var curTag = ' v ${Flags .VERSION }' , error = false ;
67+ var newUpdates = __doReleaseFiltering (GitHub .getReleases (Flags .REPO_OWNER , Flags .REPO_NAME , (e ) -> {
2868 error = true ;
2969 }), curTag );
3070
31- if (error ) return {
32- success : false ,
33- newUpdate : false
34- };
35-
36- if (newUpdates .length <= 0 ) {
37- return {
38- success : true ,
39- newUpdate : false
40- };
71+ var updateCheck : UpdateCheckCallback = {
72+ success : ! error ,
73+ newUpdate : ! error && newUpdates .length > 0 ,
74+ currentVersionTag : curTag ,
75+ date : Date .now ()
4176 }
4277
43- return {
44- success : true ,
45- newUpdate : true ,
46- currentVersionTag : curTag ,
47- newVersionTag : newUpdates .last ().tag_name ,
48- updates : newUpdates
49- };
78+ if (updateCheck .newUpdate ) updateCheck .newVersionTag = (updateCheck .updates = newUpdates ).last ().tag_name ;
79+ return updateCheck ;
80+ }
81+
82+ static function __shouldCheck (lazy : Bool ): Bool
83+ return lastUpdateCheck == null || ! lazy && (!lastUpdateCheck .newUpdate || Date .now ().getTime () - lastUpdateCheck .date .getTime () > 1800000 );
84+
85+ static function __callWaitCallbacks () {
86+ for (callback in __waitCallbacks ) callback (lastUpdateCheck );
87+ __waitCallbacks .resize (0 );
5088 }
5189
52- static var __curVersionPos = - 2 ;
5390 static function __doReleaseFiltering (releases : Array <GitHubRelease >, currentVersionTag : String ) {
5491 releases = releases .filterReleases (Options .betaUpdates , false );
5592 if (releases .length <= 0 )
5693 return releases ;
5794
58- var newArray : Array <GitHubRelease > = [];
95+ var newArray : Array <GitHubRelease > = [], __curVersionPos = - 2 ;
5996
6097 var skipNextBinaryChecks : Bool = false ;
6198 for (index in 0 ... releases .length ) {
@@ -73,12 +110,9 @@ class UpdateUtil {
73110 }
74111 if (containsBinary ) {
75112 skipNextBinaryChecks = true ; // no need to check for older versions
76- if (release .tag_name == currentVersionTag ) {
77- __curVersionPos = - 1 ;
78- }
113+ if (release .tag_name == currentVersionTag ) __curVersionPos = - 1 ;
79114 newArray .insert (0 , release );
80- if (__curVersionPos > - 2 )
81- __curVersionPos ++ ;
115+ if (__curVersionPos > - 2 ) __curVersionPos ++ ;
82116 }
83117 }
84118 if (__curVersionPos < - 1 )
@@ -98,4 +132,6 @@ typedef UpdateCheckCallback = {
98132 @:optional var newVersionTag : String ;
99133
100134 @:optional var updates : Array <GitHubRelease >;
135+
136+ @:optional var date : Date ;
101137}
0 commit comments