1
+ using System ;
2
+ using System . Net . Http ;
3
+ using System . Text . Json ;
4
+ using System . Reflection ;
5
+ using System . Threading . Tasks ;
6
+ using SemanticCode . Models ;
7
+
8
+ namespace SemanticCode . Services ;
9
+
10
+ public class UpdateService
11
+ {
12
+ private readonly HttpClient _httpClient ;
13
+ private const string GitHubApiUrl = "https://api.github.com/repos/AIDotNet/SemanticCode/releases/latest" ;
14
+
15
+ public UpdateService ( )
16
+ {
17
+ _httpClient = new HttpClient ( ) ;
18
+ _httpClient . DefaultRequestHeaders . Add ( "User-Agent" , "SemanticCode-UpdateChecker" ) ;
19
+ }
20
+
21
+ public async Task < UpdateInfo ? > CheckForUpdatesAsync ( )
22
+ {
23
+ try
24
+ {
25
+ var response = await _httpClient . GetStringAsync ( GitHubApiUrl ) ;
26
+ var releaseData = JsonSerializer . Deserialize < JsonElement > ( response ) ;
27
+
28
+ var latestVersion = releaseData . GetProperty ( "tag_name" ) . GetString ( ) ? . TrimStart ( 'v' ) ;
29
+ var currentVersion = GetCurrentVersion ( ) ;
30
+
31
+ if ( string . IsNullOrEmpty ( latestVersion ) || string . IsNullOrEmpty ( currentVersion ) )
32
+ return null ;
33
+
34
+ var updateInfo = new UpdateInfo
35
+ {
36
+ Version = latestVersion ,
37
+ ReleaseUrl = releaseData . GetProperty ( "html_url" ) . GetString ( ) ?? "" ,
38
+ Description = releaseData . GetProperty ( "body" ) . GetString ( ) ?? "" ,
39
+ PublishedAt = releaseData . GetProperty ( "published_at" ) . GetDateTime ( ) ,
40
+ IsNewerVersion = IsNewerVersion ( currentVersion , latestVersion )
41
+ } ;
42
+
43
+ if ( releaseData . TryGetProperty ( "assets" , out var assetsElement ) )
44
+ {
45
+ foreach ( var asset in assetsElement . EnumerateArray ( ) )
46
+ {
47
+ updateInfo . Assets . Add ( new UpdateAsset
48
+ {
49
+ Name = asset . GetProperty ( "name" ) . GetString ( ) ?? "" ,
50
+ DownloadUrl = asset . GetProperty ( "browser_download_url" ) . GetString ( ) ?? "" ,
51
+ Size = asset . GetProperty ( "size" ) . GetInt64 ( )
52
+ } ) ;
53
+ }
54
+ }
55
+
56
+ return updateInfo ;
57
+ }
58
+ catch ( Exception )
59
+ {
60
+ return null ;
61
+ }
62
+ }
63
+
64
+ private string GetCurrentVersion ( )
65
+ {
66
+ var assembly = Assembly . GetExecutingAssembly ( ) ;
67
+ var version = assembly . GetName ( ) . Version ;
68
+ return version ? . ToString ( ) ?? "0.0.0.0" ;
69
+ }
70
+
71
+ private bool IsNewerVersion ( string currentVersion , string latestVersion )
72
+ {
73
+ if ( Version . TryParse ( currentVersion , out var current ) &&
74
+ Version . TryParse ( latestVersion , out var latest ) )
75
+ {
76
+ return latest > current ;
77
+ }
78
+
79
+ return false ;
80
+ }
81
+
82
+ public void Dispose ( )
83
+ {
84
+ _httpClient . Dispose ( ) ;
85
+ }
86
+ }
0 commit comments