-
-
Notifications
You must be signed in to change notification settings - Fork 85
/
IDownloadablePackage.cs
228 lines (189 loc) · 6.73 KB
/
IDownloadablePackage.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
namespace Reloaded.Mod.Loader.Update.Interfaces;
/// <summary>
/// Represents a package that can be downloaded.
/// </summary>
public interface IDownloadablePackage : INotifyPropertyChanged
{
/// <summary>
/// Name of the mod to be downloaded.
/// </summary>
public string Name { get; }
/// <summary>
/// Source of the package.
/// Which provider the package comes from.
/// </summary>
public string Source { get; }
/// <summary>
/// Id of the mod to be downloaded.
/// </summary>
public string? Id { get; }
/// <summary>
/// The mod authors. As displayed in launcher.
/// Used for credits.
/// </summary>
public string? Authors { get; }
/// <summary>
/// Contains information about the person who uploaded this item.
/// </summary>
public Submitter? Submitter { get; }
/// <summary>
/// Short description of the mod, as seen in mod config menu.
/// </summary>
public string? Description { get; }
/// <summary>
/// Version of the mod to download.
/// </summary>
public NuGetVersion? Version { get; }
/// <summary>
/// File size in bytes of the item to be downloaded.
/// </summary>
public long? FileSize { get; }
/// <summary>
/// Provides a human readable readme file, in markdown format.
/// </summary>
public string? MarkdownReadme { get; }
/// <summary>
/// Long description of the mod.
/// </summary>
public string? LongDescription => !string.IsNullOrEmpty(MarkdownReadme) ? MarkdownReadme : Description;
/// <summary>
/// Provides a list of images for this package.
/// </summary>
public DownloadableImage[]? Images { get; }
/// <summary>
/// The URL of the web page of the project.
/// </summary>
public Uri? ProjectUri { get; }
/// <summary>
/// Number of likes/upvotes for this package.
/// </summary>
public long? LikeCount { get; }
/// <summary>
/// Number of views for this package.
/// </summary>
public long? ViewCount { get; }
/// <summary>
/// Number of downloads for this package.
/// </summary>
public long? DownloadCount { get; }
/// <summary>
/// Time when this package was published.
/// In UTC.
/// </summary>
public DateTime? Published { get; }
/// <summary>
/// Changelog for this package.
/// </summary>
public string? Changelog { get; }
/// <summary>
/// Collection of tags related to this package.
/// Tags are optional and their usage depends on implementation.
///
/// For example NuGet uses tags to filter games.
/// </summary>
public string[]? Tags { get; set; }
/// <summary>
/// Downloads the package in question asynchronously.
/// </summary>
/// <param name="packageFolder">The folder containing all the packages.</param>
/// <param name="progress">Provides progress reporting for the download operation.</param>
/// <param name="token">Allows you to cancel the operation.</param>
/// <returns>Folder where the package was downloaded.</returns>
public Task<string> DownloadAsync(string packageFolder, IProgress<double>? progress, CancellationToken token = default);
}
/// <summary>
/// Represents an image that can be downloaded from the web for this package.
/// </summary>
public struct DownloadableImage : INotifyPropertyChanged
{
/// <summary>
/// Provides an URL to the image.
/// </summary>
public Uri Uri { get; set; }
/// <summary>
/// Caption to display under the image.
/// </summary>
public string? Caption { get; set; }
/// <summary>
/// Provides additional thumbnails for this image.
/// </summary>
public DownloadableImageThumbnail[]? Thumbnails { get; set; }
/// <summary>
/// Selects an image to display based on a width hint.
/// </summary>
/// <param name="width">Default value of max will pick the highest quality.</param>
public Uri SelectBasedOnWidth(int width = int.MaxValue)
{
if (width == int.MaxValue || Thumbnails == null || Thumbnails.Length == 0)
return Uri;
foreach (var thumbnail in Thumbnails)
{
if (thumbnail.WidthHint == null)
continue;
if (thumbnail.WidthHint > width)
return thumbnail.Uri;
}
return Uri;
}
// Binding
/// <inheritdoc />
public event PropertyChangedEventHandler? PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string? propertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
/// <summary>
/// Represents a thumbnail for downloadable image.
/// </summary>
public struct DownloadableImageThumbnail : INotifyPropertyChanged
{
/// <summary>
/// Represents a thumbnail for a downloadable image.
/// </summary>
/// <param name="uri">Full URI to the image.</param>
/// <param name="widthHint">Hint about the width of the image.</param>
public DownloadableImageThumbnail(Uri uri, short? widthHint = null)
{
Uri = uri;
WidthHint = widthHint;
}
/// <summary>
/// Provides an URL to the image.
/// </summary>
public Uri Uri { get; set; }
/// <summary>
/// Provides a hint regarding the width of an image.
/// Used for picking images without downloading them.
/// </summary>
public short? WidthHint { get; set; }
// Binding
/// <inheritdoc />
public event PropertyChangedEventHandler? PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string? propertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
/// <summary>
/// Represents the submitter of the downloadable item, i.e. the person that uploaded it.
/// </summary>
public struct Submitter : INotifyPropertyChanged
{
// TODO: [NET7] Restore constructor with guarantee of non-null username. Right now we can't because it breaks built-in System.Text.Json. This is fixed in newer versions.
/// <summary>
/// Name of the submitter.
/// </summary>
public string UserName { get; set; }
/// <summary>
/// Provides an URL to the user's avatar.
/// </summary>
public Uri? AvatarUrl { get; set; }
/// <summary>
/// Date of when the user has joined.
/// In UTC.
/// </summary>
public DateTime? JoinDate { get; set; }
/// <summary>
/// URL of the user created profile.
/// </summary>
public Uri? ProfileUrl { get; set; }
// For binding
/// <inheritdoc />
public event PropertyChangedEventHandler? PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string? propertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}