-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPocketmineVersionFactory.cs
66 lines (57 loc) · 2.73 KB
/
PocketmineVersionFactory.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
using System.Net.Http.Json;
using MinecraftJars.Core;
using MinecraftJars.Core.Downloads;
using MinecraftJars.Core.Versions;
using MinecraftJars.Plugin.Pocketmine.Model;
using MinecraftJars.Plugin.Pocketmine.Model.ReleaseApi;
namespace MinecraftJars.Plugin.Pocketmine;
internal static class PocketmineVersionFactory
{
private const string PocketmineReleaseRequestUri = "https://api.github.com/repos/pmmp/PocketMine-MP/releases";
public static PluginHttpClientFactory HttpClientFactory { get; set; } = default!;
public static async Task<List<PocketmineVersion>> GetVersion(
string projectName,
VersionOptions options,
CancellationToken cancellationToken)
{
var project = PocketmineProjectFactory.Projects.Single(p => p.Name.Equals(projectName));
var client = HttpClientFactory.GetClient();
var releaseApi = await client.GetFromJsonAsync<List<Release>>(PocketmineReleaseRequestUri, cancellationToken) ??
throw new InvalidOperationException("Could not acquire version details.");
foreach (var release in releaseApi)
{
release.Assets.RemoveAll(a =>
!a.Name.Contains(".phar", StringComparison.OrdinalIgnoreCase) ||
!a.State.Equals("uploaded", StringComparison.OrdinalIgnoreCase));
}
releaseApi.RemoveAll(r => !r.Assets.Any());
var versions = (from release in releaseApi
where string.IsNullOrWhiteSpace(options.Version) || release.TagName.Equals(options.Version)
let isSnapShot = release.TagName.Contains("beta", StringComparison.OrdinalIgnoreCase) ||
release.TagName.Contains("alpha", StringComparison.OrdinalIgnoreCase)
where options.IncludeSnapshotBuilds || !isSnapShot
let asset = release.Assets.First()
select new PocketmineVersion(
Project: project,
Version: release.TagName,
IsSnapShot: isSnapShot)
{
Download = new PocketmineDownload(
FileName: asset.Name,
Size: asset.Size,
BuildId: release.Id.ToString(),
Url: asset.BrowserDownloadUrl,
ReleaseTime: new[] { asset.CreatedAt, asset.UpdatedAt }.Max())
}).ToList();
return options.MaxRecords.HasValue
? versions.Take(options.MaxRecords.Value).ToList()
: versions;
}
public static Task<IMinecraftDownload> GetDownload(
DownloadOptions options,
PocketmineVersion version,
CancellationToken cancellationToken)
{
return Task.FromResult((IMinecraftDownload) version.Download);
}
}