1
+ using Newtonsoft . Json ;
2
+ using Rubberduck . Settings ;
3
+ using System ;
4
+ using System . Linq ;
5
+ using System . Net . Http ;
6
+ using System . Threading ;
7
+ using System . Threading . Tasks ;
8
+
9
+ namespace Rubberduck . VersionCheck
10
+ {
11
+ public class VersionCheckService : IVersionCheckService
12
+ {
13
+ /// <param name="version">That would be the version of the assembly for the <c>_Extension</c> class.</param>
14
+ public VersionCheckService ( Version version )
15
+ {
16
+ CurrentVersion = version ;
17
+ #if DEBUG
18
+ IsDebugBuild = true ;
19
+ #endif
20
+ VersionString = IsDebugBuild
21
+ ? $ "{ version . Major } .{ version . Minor } .{ version . Build } .x (debug)"
22
+ : version . ToString ( ) ;
23
+ }
24
+
25
+ private Version _latestVersion ;
26
+ public async Task < Version > GetLatestVersionAsync ( GeneralSettings settings , CancellationToken token = default )
27
+ {
28
+ if ( _latestVersion != default ) { return _latestVersion ; }
29
+
30
+ try
31
+ {
32
+ return settings . IncludePreRelease
33
+ ? await GetGitHubNext ( )
34
+ : await GetGitHubMain ( ) ;
35
+ }
36
+ catch
37
+ {
38
+ return _latestVersion ;
39
+ }
40
+ }
41
+
42
+ public Version CurrentVersion { get ; }
43
+ public bool IsDebugBuild { get ; }
44
+ public string VersionString { get ; }
45
+
46
+ private async Task < Version > GetGitHubMain ( )
47
+ {
48
+ var url = new Uri ( "https://github.com/repos/rubberduck-vba/Rubberduck/releases/latest" ) ;
49
+ using ( var client = new HttpClient ( ) )
50
+ {
51
+ client . DefaultRequestHeaders . UserAgent . Add ( new System . Net . Http . Headers . ProductInfoHeaderValue ( "rubberduck.version-check" ) ) ;
52
+ using ( var response = await client . GetAsync ( url ) )
53
+ {
54
+ var content = await response . Content . ReadAsStringAsync ( ) ;
55
+ var tagName = ( string ) JsonConvert . DeserializeObject < dynamic > ( content ) . tag_name ;
56
+
57
+ // assumes a tag name like "v2.5.3.0"
58
+ return new Version ( tagName . Substring ( "v" . Length ) ) ;
59
+ }
60
+ }
61
+ }
62
+
63
+ private async Task < Version > GetGitHubNext ( )
64
+ {
65
+ var url = new Uri ( "https://github.com/repos/rubberduck-vba/Rubberduck/releases" ) ;
66
+ using ( var client = new HttpClient ( ) )
67
+ {
68
+ client . DefaultRequestHeaders . UserAgent . Add ( new System . Net . Http . Headers . ProductInfoHeaderValue ( "rubberduck.version-check" ) ) ;
69
+ using ( var response = await client . GetAsync ( url ) )
70
+ {
71
+ var content = await response . Content . ReadAsStringAsync ( ) ;
72
+ var tagName = ( string ) JsonConvert . DeserializeObject < dynamic > ( content ) [ 0 ] . tag_name ;
73
+
74
+ // assumes a tag name like "Prerelease-v2.5.2.1234"
75
+ return new Version ( tagName . Substring ( "Prerelease-v" . Length ) ) ;
76
+ }
77
+ }
78
+ }
79
+ }
80
+ }
0 commit comments