Skip to content

Commit 38b1dfa

Browse files
committed
Adjust Sophon usages
1 parent bf5da9f commit 38b1dfa

7 files changed

Lines changed: 152 additions & 132 deletions

File tree

CollapseLauncher/Classes/InstallManagement/Base/InstallManagerBase.Sophon.cs

Lines changed: 103 additions & 105 deletions
Large diffs are not rendered by default.

CollapseLauncher/Classes/InstallManagement/Genshin/GenshinInstall.PkgVersion.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,9 @@ public static async Task<string> DownloadPkgVersionStatic(HttpClient
114114
string gameBasePath,
115115
string gameAudioListPath,
116116
SophonChunkManifestInfoPair? manifestInfoPair = null,
117-
List<SophonAsset>? outputAssetList = null,
118-
CancellationToken token = default)
117+
SophonDownloadSpeedLimiter? speedLimiter = null,
118+
List<SophonAsset>? outputAssetList = null,
119+
CancellationToken token = default)
119120
{
120121
const string errorRaiseMsg = "Please raise this issue to our Github Repo or Official Discord";
121122

@@ -153,6 +154,7 @@ await CreateFakePkgVersionFromSophon(client,
153154
manifestInfoPair,
154155
outputAssetList,
155156
"pkg_version",
157+
speedLimiter,
156158
token);
157159

158160
// Get the existing voice-over matching fields
@@ -164,7 +166,7 @@ await GetVoiceOverPkgVersionMatchingFields(availableVaMatchingFields,
164166
// ReSharper disable once InvertIf
165167
if (availableVaMatchingFields.Count != 0) // If any, then create them
166168
{
167-
foreach (var field in availableVaMatchingFields)
169+
foreach (string field in availableVaMatchingFields)
168170
{
169171
SophonChunkManifestInfoPair voManifestInfoPair = manifestInfoPair.GetOtherManifestInfoPair(field);
170172
if (!voManifestInfoPair.IsFound)
@@ -178,6 +180,7 @@ await CreateFakePkgVersionFromSophon(client,
178180
voManifestInfoPair,
179181
outputAssetList,
180182
$"Audio_{languageString}_pkg_version",
183+
speedLimiter,
181184
token);
182185
}
183186
}
@@ -191,6 +194,7 @@ private static async Task CreateFakePkgVersionFromSophon(HttpClient
191194
SophonChunkManifestInfoPair manifestPair,
192195
List<SophonAsset>? outputAssetList,
193196
string pkgVersionFilename,
197+
SophonDownloadSpeedLimiter? speedLimiter,
194198
CancellationToken token)
195199
{
196200
// Ensure and try to create examine FileInfo
@@ -204,14 +208,14 @@ private static async Task CreateFakePkgVersionFromSophon(HttpClient
204208
await using FileStream stream = fileInfo.Create();
205209

206210
// Start enumerate the SophonAsset
207-
byte[] newLineBytes = "\r\n"u8.ToArray();
211+
byte[] newLineBytes = [.. "\r\n"u8];
208212
await foreach (SophonAsset assetInfo in SophonManifest.EnumerateAsync(client,
209213
manifestPair,
210-
null,
214+
speedLimiter,
211215
token))
212216
{
213217
// Ignore stock pkg_version
214-
if (assetInfo.AssetName.EndsWith("pkg_version", StringComparison.OrdinalIgnoreCase))
218+
if (assetInfo.AssetName?.EndsWith("pkg_version", StringComparison.OrdinalIgnoreCase) ?? false)
215219
{
216220
continue;
217221
}

CollapseLauncher/Classes/Interfaces/Class/ProgressBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ public ObservableCollection<IAssetProperty> AssetEntry
167167
// Extension for IGameInstallManager
168168

169169
private const int RefreshInterval = 100;
170-
protected nint SpeedLimiterServiceContext { get; } = SpeedLimiterService.CreateServiceContext();
170+
internal nint SpeedLimiterServiceContext { get; } = SpeedLimiterService.CreateServiceContext();
171171

172172
public bool IsSophonInUpdateMode { get; protected set; }
173173
public bool IsSophonInPreloadVerifyMode { get; protected set; }

CollapseLauncher/Classes/RepairManagement/Genshin/Fetch.cs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -113,17 +113,21 @@ internal static void EliminateUnnecessaryAssetIndex<T>(string audioLang
113113
string[] currentAudioLangList = File.Exists(audioLangListPath) ? File.ReadAllLines(audioLangListPath) : [];
114114

115115
// Set the ignored audio lang
116-
string[] ignoredAudioLangList = audioLangList
117-
.Where(x => !currentAudioLangList.Contains(x))
118-
.Select(x => $"{separatorChar}{x}{separatorChar}")
119-
.ToArray();
116+
string[] ignoredAudioLangList =
117+
[
118+
.. audioLangList
119+
.Where(x => !currentAudioLangList.Contains(x))
120+
.Select(x => $"{separatorChar}{x}{separatorChar}")
121+
];
120122
SearchValues<string> ignoredAudioLangListSearch = SearchValues.Create(ignoredAudioLangList, StringComparison.OrdinalIgnoreCase);
121123

122124
// Return only for asset index that doesn't have language included in ignoredAudioLangList
123-
List<T> tempFiltered = assetIndex.Where(x => !predicate(x)
124-
.AsSpan()
125-
.ContainsAny(ignoredAudioLangListSearch))
126-
.ToList();
125+
List<T> tempFiltered =
126+
[
127+
.. assetIndex.Where(x => !predicate(x)
128+
.AsSpan()
129+
.ContainsAny(ignoredAudioLangListSearch))
130+
];
127131
assetIndex.Clear();
128132
assetIndex.AddRange(tempFiltered);
129133
}
@@ -159,6 +163,9 @@ internal async Task BuildPrimaryManifest(DownloadClient
159163
sophonManifestUrls.MainUrl,
160164
sophonManifestUrls.MainBranchMatchingField,
161165
token);
166+
SophonDownloadSpeedLimiter? speedLimiter = SpeedLimiterServiceContext == nint.Zero
167+
? null
168+
: SophonDownloadSpeedLimiter.CreateInstance(SpeedLimiterServiceContext);
162169

163170
// Create fake pkg_version(s) from Sophon and get the list of SphonAsset(s)
164171
List<SophonAsset> sophonAssetList = [];
@@ -167,6 +174,7 @@ await GenshinInstall.DownloadPkgVersionStatic(httpClient,
167174
GamePath,
168175
gameAudioListPath,
169176
manifestMainInfoPair,
177+
speedLimiter,
170178
sophonAssetList,
171179
token);
172180

@@ -182,9 +190,9 @@ await GenshinInstall.DownloadPkgVersionStatic(httpClient,
182190
isForceStoreInPersistent = false
183191
};
184192

185-
_ = SophonAssetDictRef.TryAdd(asset.AssetName.NormalizePath(), asset);
193+
_ = SophonAssetDictRef.TryAdd(asset.AssetName?.NormalizePath() ?? "", asset);
186194
assetIndex.Add(assetAsPkgVersionProp);
187-
hashtableManifest.TryAdd(asset.AssetName, assetAsPkgVersionProp);
195+
hashtableManifest.TryAdd(asset.AssetName ?? "", assetAsPkgVersionProp);
188196
}
189197
LogWriteLine($"Main asset list fetched with count: {SophonAssetDictRef.Count} from Sophon manifest", LogType.Default, true);
190198
}

CollapseLauncher/Classes/RepairManagement/SophonRepairFetchUtility.cs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,18 +54,27 @@ public static async Task FetchAssetsFromSophonAsync(
5454
false,
5555
token);
5656

57+
SophonDownloadSpeedLimiter? speedLimiter = instance.SpeedLimiterServiceContext == nint.Zero ? null :
58+
SophonDownloadSpeedLimiter.CreateInstance(instance.SpeedLimiterServiceContext);
59+
5760
if (!infoPair.IsFound)
5861
{
5962
throw new InvalidOperationException($"Sophon cannot find matching field: {matchingField} from API URL: {sophonApiUrl}");
6063
}
6164

6265
SearchValues<string> excludedMatchingFields = SearchValues.Create(excludeMatchingFieldList, StringComparison.OrdinalIgnoreCase);
63-
List<SophonChunkManifestInfoPair> infoPairs = [infoPair];
64-
infoPairs.AddRange(infoPair
65-
.OtherSophonBuildData?
66-
.ManifestIdentityList
67-
.Where(x => !string.IsNullOrEmpty(x.MatchingField) && !x.MatchingField.ContainsAny(excludedMatchingFields) && !x.MatchingField.Equals(matchingField))
68-
.Select(x => infoPair.GetOtherManifestInfoPair(x.MatchingField!)) ?? []);
66+
List<SophonChunkManifestInfoPair> infoPairs =
67+
[
68+
infoPair,
69+
.. infoPair
70+
.OtherSophonBuildData?
71+
.ManifestIdentityList
72+
.Where(x => !string.IsNullOrEmpty(x.MatchingField) &&
73+
!x.MatchingField.ContainsAny(excludedMatchingFields) &&
74+
!x.MatchingField.Equals(matchingField))
75+
.Select(x => infoPair.GetOtherManifestInfoPair(x.MatchingField!)) ?? []
76+
77+
];
6978

7079
foreach (SophonChunkManifestInfoPair pair in infoPairs)
7180
{
@@ -77,15 +86,16 @@ public static async Task FetchAssetsFromSophonAsync(
7786
await foreach (SophonAsset asset in SophonManifest
7887
.EnumerateAsync(client,
7988
pair,
89+
downloadSpeedLimiter: speedLimiter,
8090
token: token))
8191
{
8292
assetIndex.Add(new FilePropertiesRemote
8393
{
8494
AssociatedObject = asset,
8595
S = asset.AssetSize,
86-
N = asset.AssetName.NormalizePath(),
96+
N = asset.AssetName?.NormalizePath(),
8797
CRC = asset.AssetHash,
88-
FT = assetTypeDeterminer(asset.AssetName)
98+
FT = assetTypeDeterminer(asset.AssetName ?? "")
8999
});
90100
}
91101
}

CollapseLauncher/packages.lock.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,7 @@
558558
"Google.Protobuf": "[3.35.0, )",
559559
"Hi3Helper.ZstdNet": "[*, )",
560560
"SharpHDiffPatch.Core": "[*, )",
561-
"System.IO.Hashing": "[10.0.8, )"
561+
"System.IO.Hashing": "[*, )"
562562
}
563563
},
564564
"hi3helper.win32": {

0 commit comments

Comments
 (0)