Skip to content

Commit 8c79ce9

Browse files
committed
feat: update CmlLib.Core 4.0.0
1 parent 3dcab62 commit 8c79ce9

18 files changed

+767
-559
lines changed

CmlLib.Core.Installer.Forge/CmlLib.Core.Installer.Forge.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
3-
<LangVersion>10.0</LangVersion>
3+
<LangVersion>12.0</LangVersion>
44
<TargetFramework>netstandard2.0</TargetFramework>
55
<OutputType>Library</OutputType>
66
<Nullable>enable</Nullable>
@@ -9,7 +9,7 @@
99
</PropertyGroup>
1010

1111
<PropertyGroup>
12-
<Version>0.0.3</Version>
12+
<Version>1.0.0-beta.1</Version>
1313
<Description>Minecraft Forge Installer</Description>
1414
<Copyright>Copyright (c) 2023 CmlLib</Copyright>
1515
<PackageProjectUrl>https://github.com/CmlLib/CmlLib.Core.Installer.Forge</PackageProjectUrl>
@@ -25,7 +25,7 @@
2525
</PropertyGroup>
2626

2727
<ItemGroup>
28-
<PackageReference Include="CmlLib.Core" Version="3.3.7" />
28+
<PackageReference Include="CmlLib.Core" Version="4.0.0-beta.2" />
2929
<PackageReference Include="HtmlAgilityPack" Version="1.11.48" />
3030
</ItemGroup>
3131

CmlLib.Core.Installer.Forge/MForge.cs renamed to CmlLib.Core.Installer.Forge/ForgeInstaller.cs

Lines changed: 28 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,32 @@
1-
using CmlLib.Core.Downloader;
2-
using CmlLib.Core.Installer.Forge.Versions;
1+
using CmlLib.Core.Installer.Forge.Versions;
2+
using CmlLib.Core.Installers;
33
using CmlLib.Core.Version;
4-
using System.ComponentModel;
54
using System.Diagnostics;
65

76
namespace CmlLib.Core.Installer.Forge;
87

9-
public class MForge
8+
public class ForgeInstaller
109
{
1110
public static readonly string ForgeAdUrl =
1211
"https://adfoc.us/serve/sitelinks/?id=271228&url=https://maven.minecraftforge.net/";
1312

14-
private readonly CMLauncher _launcher;
13+
private readonly MinecraftLauncher _launcher;
1514
private readonly IForgeInstallerVersionMapper _installerMapper;
1615
private readonly ForgeVersionLoader _versionLoader;
1716

18-
public event DownloadFileChangedHandler? FileChanged;
19-
public event EventHandler<ProgressChangedEventArgs>? ProgressChanged;
20-
public event EventHandler<string>? InstallerOutput;
21-
22-
public MForge(CMLauncher launcher)
17+
public ForgeInstaller(MinecraftLauncher launcher)
2318
{
24-
_launcher = launcher;
2519
_installerMapper = new ForgeInstallerVersionMapper();
2620
_versionLoader = new ForgeVersionLoader(new HttpClient());
21+
_launcher = launcher;
2722
}
2823

29-
private ForgeInstallOptions createDefaultOptions()
30-
{
31-
return new ForgeInstallOptions(_launcher.MinecraftPath)
32-
{
33-
Downloader = new SequenceDownloader()
34-
};
35-
}
36-
37-
public Task<string> Install(string mcVersion, bool forceUpdate = false) =>
38-
Install(mcVersion, createDefaultOptions(), forceUpdate);
24+
public Task<string> Install(string mcVersion) =>
25+
Install(mcVersion, new ForgeInstallOptions());
3926

4027
public async Task<string> Install(
4128
string mcVersion,
42-
ForgeInstallOptions options,
43-
bool forceUpdate = false)
29+
ForgeInstallOptions options)
4430
{
4531
var versions = await _versionLoader.GetForgeVersions(mcVersion);
4632
var bestVersion =
@@ -49,53 +35,53 @@ public async Task<string> Install(
4935
versions.FirstOrDefault() ??
5036
throw new InvalidOperationException("Cannot find any version");
5137

52-
return await Install(bestVersion, options, forceUpdate);
38+
return await Install(bestVersion, options);
5339
}
5440

55-
public Task<string> Install(string mcVersion, string forgeVersion, bool forceUpdate = false) =>
56-
Install(mcVersion, forgeVersion, createDefaultOptions(), forceUpdate);
41+
public Task<string> Install(string mcVersion, string forgeVersion) =>
42+
Install(mcVersion, forgeVersion, new ForgeInstallOptions());
5743

5844
public async Task<string> Install(
5945
string mcVersion,
6046
string forgeVersion,
61-
ForgeInstallOptions options,
62-
bool forceUpdate = false)
47+
ForgeInstallOptions options)
6348
{
6449
var versions = await _versionLoader.GetForgeVersions(mcVersion);
6550

6651
var foundVersion = versions.FirstOrDefault(v => v.ForgeVersionName == forgeVersion) ??
6752
throw new InvalidOperationException("Cannot find version name " + forgeVersion);
68-
return await Install(foundVersion, options, forceUpdate);
53+
return await Install(foundVersion, options);
6954
}
7055

7156
public async Task<string> Install(
7257
ForgeVersion forgeVersion,
73-
ForgeInstallOptions options,
74-
bool forceUpdate)
58+
ForgeInstallOptions options)
7559
{
7660
var installer = _installerMapper.CreateInstaller(forgeVersion);
77-
78-
if (await checkVersionInstalled(installer.VersionName) && !forceUpdate)
61+
if (options.SkipIfAlreadyInstalled && await checkVersionInstalled(installer.VersionName))
7962
return installer.VersionName;
8063

81-
var version = await checkAndDownloadVanillaVersion(forgeVersion.MinecraftVersionName);
64+
var version = await checkAndDownloadVanillaVersion(
65+
forgeVersion.MinecraftVersionName,
66+
options.FileProgress,
67+
options.ByteProgress);
68+
8269
if (string.IsNullOrEmpty(options.JavaPath))
8370
options.JavaPath = getJavaPath(version);
8471

85-
installer.FileChanged += e => FileChanged?.Invoke(e);
86-
installer.ProgressChanged += (s, e) => ProgressChanged?.Invoke(this, e);
87-
installer.InstallerOutput += (s, e) => InstallerOutput?.Invoke(this, e);
88-
await installer.Install(options);
89-
72+
await installer.Install(_launcher.MinecraftPath, _launcher.GameInstaller, options);
9073
showAd();
9174
await _launcher.GetAllVersionsAsync();
9275
return installer.VersionName;
9376
}
9477

95-
private async Task<MVersion> checkAndDownloadVanillaVersion(string mcVersion)
78+
private async Task<IVersion> checkAndDownloadVanillaVersion(
79+
string mcVersion,
80+
IProgress<InstallerProgressChangedEventArgs>? fileProgress,
81+
IProgress<ByteProgress>? byteProgress)
9682
{
9783
var version = await _launcher.GetVersionAsync(mcVersion);
98-
await _launcher.CheckAndDownloadAsync(version);
84+
await _launcher.InstallAsync(version, fileProgress, byteProgress);
9985
return version;
10086
}
10187

@@ -112,7 +98,7 @@ private async Task<bool> checkVersionInstalled(string versionName)
11298
}
11399
}
114100

115-
private string getJavaPath(MVersion version)
101+
private string getJavaPath(IVersion version)
116102
{
117103
var javaPath = _launcher.GetJavaPath(version);
118104
if (string.IsNullOrEmpty(javaPath) || !File.Exists(javaPath))
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
using System.Text.RegularExpressions;
2+
3+
namespace CmlLib.Core.Installer.Forge;
4+
5+
public class ForgeMapper
6+
{
7+
private static readonly Regex argBracket = new Regex(@"\$?\{(.*?)}");
8+
9+
public static IEnumerable<string> Map(IEnumerable<string> arg, IReadOnlyDictionary<string, string?> dicts, string prepath)
10+
{
11+
var checkPath = !string.IsNullOrEmpty(prepath);
12+
foreach (string item in arg)
13+
{
14+
var a = Interpolation(item, dicts, false);
15+
if (checkPath)
16+
a = ToFullPath(a, prepath);
17+
yield return HandleEmptyArg(a);
18+
}
19+
}
20+
21+
public static string ToFullPath(string str, string prepath)
22+
{
23+
// [de.oceanlabs.mcp:mcp_config:1.16.2-20200812.004259@zip]
24+
// \libraries\de\oceanlabs\mcp\mcp_config\1.16.2-20200812.004259\mcp_config-1.16.2-20200812.004259.zip
25+
26+
// [net.minecraft:client:1.16.2-20200812.004259:slim]
27+
// /libraries\net\minecraft\client\1.16.2-20200812.004259\client-1.16.2-20200812.004259-slim.jar
28+
29+
if (str.StartsWith("[") && str.EndsWith("]") && !string.IsNullOrEmpty(prepath))
30+
{
31+
var innerStr = str.TrimStart('[').TrimEnd(']').Split('@');
32+
var pathName = innerStr[0];
33+
var extension = "jar";
34+
35+
if (innerStr.Length > 1)
36+
extension = innerStr[1];
37+
38+
return Path.Combine(prepath,
39+
PackageName.Parse(pathName).GetPath(null, extension));
40+
}
41+
else if (str.StartsWith("\'") && str.EndsWith("\'"))
42+
return str.Trim('\'');
43+
else
44+
return str;
45+
}
46+
47+
public static string Interpolation(string str, IReadOnlyDictionary<string, string?> dicts, bool handleEmpty)
48+
{
49+
str = argBracket.Replace(str, (match =>
50+
{
51+
if (match.Groups.Count < 2)
52+
return match.Value;
53+
54+
var key = match.Groups[1].Value;
55+
if (dicts.TryGetValue(key, out string? value))
56+
{
57+
if (value == null)
58+
value = "";
59+
60+
return value;
61+
}
62+
63+
return match.Value;
64+
}));
65+
66+
if (handleEmpty)
67+
return HandleEmptyArg(str);
68+
else
69+
return str;
70+
}
71+
72+
// key=value 1 => key="value 1"
73+
// key="va l" => key="va l"
74+
// va lue => "va lue"
75+
// "va lue" => "va lue"
76+
public static string HandleEmptyArg(string input)
77+
{
78+
if (input.Contains("="))
79+
{
80+
var s = input.Split('=');
81+
82+
if (s[1].Contains(" ") && !checkEmptyHandled(s[1]))
83+
return s[0] + "=\"" + s[1] + "\"";
84+
else
85+
return input;
86+
}
87+
else if (input.Contains(" ") && !checkEmptyHandled(input))
88+
return "\"" + input + "\"";
89+
else
90+
return input;
91+
}
92+
93+
static bool checkEmptyHandled(string str)
94+
{
95+
return str.StartsWith("\"") || str.EndsWith("\"");
96+
}
97+
}

CmlLib.Core.Installer.Forge/HttpUtil.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
namespace CmlLib.Core.Installer.Forge;
22

3-
public class HttpUtil
3+
internal class HttpUtil
44
{
55
public static async Task DownloadFile(HttpClient httpClient, string url, string dest)
66
{

0 commit comments

Comments
 (0)