1
- using Avalonia ;
1
+ using System ;
2
+ using System . IO ;
3
+ using System . Net . Http ;
4
+ using System . Net . NetworkInformation ;
5
+ using System . Text . Json ;
6
+ using System . Threading . Tasks ;
7
+ using Avalonia ;
2
8
using Avalonia . Controls ;
3
9
using Avalonia . Markup . Xaml ;
10
+ using MultiRPC . Extensions ;
11
+ using MultiRPC . Utils ;
12
+ using TinyUpdate . Core . Logging ;
13
+ using TinyUpdate . Http . Extensions ;
4
14
5
15
namespace MultiRPC . UI . Pages
6
16
{
7
17
public partial class CreditsPage : SidePage
8
18
{
9
19
public override string IconLocation => "Icons/Credits" ;
10
20
public override string LocalizableName => "Credits" ;
11
- public override void Initialize ( bool loadXaml ) => InitializeComponent ( loadXaml ) ;
21
+ public override void Initialize ( bool loadXaml )
22
+ {
23
+ InitializeComponent ( loadXaml ) ;
24
+
25
+ tblCommunityAdminsTitle . DataContext = new Language ( "CommunityAdmins" ) ;
26
+ tblPatreonDonatorsTitle . DataContext = new Language ( "PatreonDonators" ) ;
27
+ tblPaypalDonatorsTitle . DataContext = new Language ( "PaypalDonators" ) ;
28
+ tblIconProvidersTitle . DataContext = new Language ( "IconProviders" ) ;
29
+ NetworkChange . NetworkAddressChanged += NetworkChangeOnNetworkAddressChanged ;
30
+ UpdateCredits ( ) ;
31
+ _ = DownloadAndShow ( ) ;
32
+ }
33
+
34
+ private async void NetworkChangeOnNetworkAddressChanged ( object ? sender , EventArgs e )
35
+ {
36
+ if ( NetworkUtil . NetworkIsAvailable ( ) )
37
+ {
38
+ await DownloadAndShow ( ) ;
39
+ }
40
+ }
41
+
42
+ private static readonly string CreditsFileLocation = Path . Combine ( Constants . SettingsFolder , "Credits.json" ) ;
43
+ private CreditsList ? _creditsList ;
44
+ private bool _downloadedCredit ;
45
+
46
+ private async Task DownloadAndShow ( )
47
+ {
48
+ await DownloadCredits ( ) ;
49
+ UpdateCredits ( ) ;
50
+ }
51
+
52
+ private void UpdateCredits ( )
53
+ {
54
+ var creditsFileInfo = new FileInfo ( CreditsFileLocation ) ;
55
+ if ( ! creditsFileInfo . Exists )
56
+ {
57
+ return ;
58
+ }
59
+
60
+ using var reader = creditsFileInfo . OpenRead ( ) ;
61
+ _creditsList = JsonSerializer . Deserialize < CreditsList > ( reader ) ;
62
+ if ( _creditsList != null )
63
+ {
64
+ tblCommunityAdmins . Text = string . Join ( "\r \n \r \n " , _creditsList . Admins ) ;
65
+ tblPatreonDonators . Text = string . Join ( "\r \n \r \n " , _creditsList . Patreon ) ;
66
+ tblPaypalDonators . Text = string . Join ( "\r \n \r \n " , _creditsList . Paypal ) ;
67
+ }
68
+
69
+ if ( ! NetworkUtil . NetworkIsAvailable ( ) && ! _downloadedCredit )
70
+ {
71
+ tblLastUpdated . Text = $ "{ Language . GetText ( "WaitingForInternetUpdate" ) } ...";
72
+ return ;
73
+ }
74
+
75
+ //TODO: Make this be updated on Lang change
76
+ tblLastUpdated . Text = creditsFileInfo . LastWriteTime . Date == DateTime . Now . Date
77
+ ? $ "{ Language . GetText ( "LastUpdatedAt" ) } : { creditsFileInfo . LastWriteTime . ToShortTimeString ( ) } "
78
+ : $ "{ Language . GetText ( "LastUpdatedOn" ) } : { creditsFileInfo . LastWriteTime . ToLongDateString ( ) } ";
79
+ }
80
+
81
+ private const string Url = Constants . WebsiteUrl + "Credits.json" ;
82
+ private readonly ILogging _logger = LoggingCreator . CreateLogger ( nameof ( CreditsPage ) ) ;
83
+ private async Task DownloadCredits ( )
84
+ {
85
+ if ( _downloadedCredit )
86
+ {
87
+ return ;
88
+ }
89
+
90
+ for ( int i = 0 ; i < Constants . RetryCount ; i ++ )
91
+ {
92
+ this . RunUILogic ( ( ) =>
93
+ tblLastUpdated . Text = Language . GetText ( "CheckForUpdates" ) . Replace ( "\r \n " , " " ) ) ;
94
+
95
+ var req = await App . HttpClient . GetResponseMessage ( new HttpRequestMessage ( HttpMethod . Get , Url ) ) ;
96
+ if ( req is null || ! req . IsSuccessStatusCode )
97
+ {
98
+ if ( req == null )
99
+ {
100
+ _logger . Error ( "Credit request returned nothing" ) ;
101
+ }
102
+ else
103
+ {
104
+ _logger . Error ( "StatusCode: {0}, Reason: {1}" , req . StatusCode , req . ReasonPhrase ) ;
105
+ }
106
+ continue ;
107
+ }
108
+
109
+ var creditStream = await req . Content . ReadAsStreamAsync ( ) ;
110
+ if ( creditStream . Length == 0 )
111
+ {
112
+ _logger . Error ( "Credit stream contains nothing!" ) ;
113
+ continue ;
114
+ }
115
+
116
+ if ( File . Exists ( CreditsFileLocation ) )
117
+ {
118
+ File . Delete ( CreditsFileLocation ) ;
119
+ }
120
+ var fileStream = File . OpenWrite ( CreditsFileLocation ) ;
121
+ await creditStream . CopyToAsync ( fileStream ) ;
122
+ await creditStream . DisposeAsync ( ) ;
123
+ await fileStream . DisposeAsync ( ) ;
124
+ _downloadedCredit = true ;
125
+ break ;
126
+ }
127
+ }
12
128
}
13
129
}
0 commit comments