Skip to content

Commit bdc7d96

Browse files
committed
v3.6.4.5
优化了关于资源下载部分的史山代码 [帮助缓解了modrinth的api压力(雾,都怪以前的史山代码)]
1 parent 608e323 commit bdc7d96

File tree

6 files changed

+167
-48
lines changed

6 files changed

+167
-48
lines changed

Libraries/Modrinth.Net.dll

0 Bytes
Binary file not shown.

MSL/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,5 @@
4949
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
5050
//通过使用 "*",如下所示:
5151
// [assembly: AssemblyVersion("1.0.*")]
52-
[assembly: AssemblyVersion("3.6.4.4")]
53-
[assembly: AssemblyFileVersion("3.6.4.4")]
52+
[assembly: AssemblyVersion("3.6.4.5")]
53+
[assembly: AssemblyFileVersion("3.6.4.5")]

MSL/forms/DownloadMod.xaml

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,18 @@
109109
</ListView.ItemContainerStyle>
110110
<ListView.View>
111111
<GridView>
112-
<GridViewColumn Width="300" Header="文件列表(双击下载)" DisplayMemberBinding="{Binding Name}"/>
112+
<GridViewColumn Width="300" Header="文件列表(双击下载)">
113+
<GridViewColumn.CellTemplate>
114+
<DataTemplate>
115+
<StackPanel Orientation="Vertical">
116+
<TextBlock Text="{Binding Name}" FontWeight="Bold"/>
117+
<TextBlock Text="{Binding FileName}" Foreground="Gray"/>
118+
</StackPanel>
119+
</DataTemplate>
120+
</GridViewColumn.CellTemplate>
121+
</GridViewColumn>
113122
<GridViewColumn x:Name="MVL_Platform" Width="100" Header="平台" DisplayMemberBinding="{Binding Platform}"/>
114-
<GridViewColumn Width="100" Header="依赖" DisplayMemberBinding="{Binding Dependency}"/>
123+
<GridViewColumn x:Name="MVL_Dependency" Width="100" Header="依赖" DisplayMemberBinding="{Binding Dependency}"/>
115124
<GridViewColumn Width="150" Header="支持的MC版本" DisplayMemberBinding="{Binding MCVersion}"/>
116125
</GridView>
117126
</ListView.View>

MSL/forms/DownloadMod.xaml.cs

Lines changed: 138 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ namespace MSL
2323
/// </summary>
2424
public partial class DownloadMod : HandyControl.Controls.Window
2525
{
26+
public string FileName { get; set; }
2627
private int LoadType = 0; //0: mods , 1: modpacks , 2: plugins
2728
private int LoadSource = 0; //0: Curseforge , 1: Modrinth
2829
private readonly bool CloseImmediately;
@@ -94,7 +95,7 @@ private async Task LoadEvent_CurseForge()
9495
}
9596
else if (LoadType == 1)
9697
{
97-
var modpacks = await CurseForgeApiClient.SearchModsAsync(432, null, 5128);
98+
var modpacks = await CurseForgeApiClient.SearchModsAsync(432, null, 4475);
9899
foreach (var modPack in modpacks.Data)
99100
{
100101
list.Add(new DM_ModsInfo(modPack.Id.ToString(), modPack.Logo.ThumbnailUrl, modPack.Name, modPack.Links.WebsiteUrl.ToString()));
@@ -197,10 +198,11 @@ private async Task Search_CurseForge(string name, int index = 0)
197198
}
198199
else if (LoadType == 1)
199200
{
200-
mods = await CurseForgeApiClient.SearchModsAsync(432, categoryId: 5128, searchFilter: name, index: index);
201+
mods = await CurseForgeApiClient.SearchModsAsync(432, categoryId: 4475, searchFilter: name, index: index);
201202
}
202203
foreach (var mod in mods.Data)
203204
{
205+
//MessageBox.Show(mod.PrimaryCategoryId.ToString());
204206
list.Add(new DM_ModsInfo(mod.Id.ToString(), mod.Logo.ThumbnailUrl, mod.Name, mod.Links.WebsiteUrl.ToString()));
205207
}
206208
ModList.ItemsSource = list;
@@ -370,51 +372,56 @@ private async Task ModInfo_CurseForge(DM_ModsInfo info)
370372
var totalCount = modFiles.Data.Count;
371373
using var semaphore = new SemaphoreSlim(50);
372374
bool onlyShowServerPack = false;
373-
if (LoadType == 1)
375+
376+
// 获取用户是否仅展示适用于服务器的整合包文件
377+
if (LoadType == 1 && await MagicShow.ShowMsgDialogAsync(this,
378+
"是否仅展示适用于服务器的整合包文件?\n注意:如果不使用服务器专用包开服,可能会出现无法开服/崩溃的问题!", "询问", true) == true)
374379
{
375-
if (await MagicShow.ShowMsgDialogAsync(this, "是否仅展示适用于服务器的整合包文件?\n注意:如果不使用服务器专用包开服,可能会出现无法开服/崩溃的问题!", "询问", true) == true)
376-
{
377-
onlyShowServerPack = true;
378-
}
380+
onlyShowServerPack = true;
379381
}
382+
380383
async Task LoadAndAddModInfo(CurseForge.APIClient.Models.Files.File modData)
381384
{
382385
await semaphore.WaitAsync();
383386
try
384387
{
385-
DM_ModInfo modInfo;
388+
// 用于保存要显示的 modInfo
389+
DM_ModInfo modInfo = null;
386390
DM_ModInfo _modInfo = null;
391+
387392
if (LoadType == 0)
388393
{
389-
modInfo = new DM_ModInfo(
390-
modData.DisplayName,
391-
modData.DownloadUrl,
392-
modData.FileName,
393-
"",
394-
string.Join(",", (await Task.WhenAll(modData.Dependencies.Select(s => CurseForgeApiClient.GetModAsync(s.ModId)))).Select(p => p.Data.Name)),
395-
string.Join(",", modData.GameVersions));
394+
// 直接加载 Mod 信息
395+
modInfo = await CreateModInfo(modData);
396396
}
397397
else if (LoadType == 1)
398398
{
399-
try
399+
if (!onlyShowServerPack)
400400
{
401-
if (!onlyShowServerPack)
402-
{
403-
var _modFile = await CurseForgeApiClient.GetModFileAsync(int.Parse(info.ID), modData.Id);
404-
_modInfo = new DM_ModInfo(_modFile.Data.DisplayName, _modFile.Data.DownloadUrl, _modFile.Data.FileName, "", string.Join(",", (await Task.WhenAll(_modFile.Data.Dependencies.Select(s => CurseForgeApiClient.GetModAsync(s.ModId)))).Select(p => p.Data.Name)), string.Join(",", _modFile.Data.GameVersions));
405-
}
401+
// 加载非服务器专用包文件
402+
var _modFile = await CurseForgeApiClient.GetModFileAsync(int.Parse(info.ID), modData.Id);
403+
_modInfo = await CreateModInfo(_modFile.Data);
406404
}
407-
finally
405+
406+
// 加载服务器专用包文件
407+
if (modData.ServerPackFileId.HasValue)
408408
{
409409
var modFile = await CurseForgeApiClient.GetModFileAsync(int.Parse(info.ID), modData.ServerPackFileId.Value);
410-
modInfo = new DM_ModInfo(modFile.Data.DisplayName, modFile.Data.DownloadUrl, modFile.Data.FileName, "", string.Join(",", (await Task.WhenAll(modFile.Data.Dependencies.Select(s => CurseForgeApiClient.GetModAsync(s.ModId)))).Select(p => p.Data.Name)), string.Join(",", modFile.Data.GameVersions));
410+
modInfo = await CreateModInfo(modFile.Data);
411+
}
412+
else
413+
{
414+
// 处理没有 ServerPackFileId 的情况
415+
Console.WriteLine("ServerPackFileId is null for " + modData.DisplayName);
416+
return; // 没有服务器专用包,退出处理
411417
}
412418
}
413419
else
414420
{
415421
return; // 不支持的 LoadType
416422
}
417423

424+
// 在 UI 线程中更新界面
418425
await Dispatcher.InvokeAsync(() =>
419426
{
420427
ModVerList.Items.Add(modInfo);
@@ -426,49 +433,137 @@ await Dispatcher.InvokeAsync(() =>
426433
ModInfoLoadingProcess.Content = $"{loadedCount}/{totalCount}";
427434
});
428435
}
436+
catch (Exception ex)
437+
{
438+
// 处理异常,避免整个流程崩溃
439+
Console.WriteLine($"Error loading mod info: {ex.Message}");
440+
}
429441
finally
430442
{
431443
semaphore.Release();
432444
}
433445
}
434446

447+
async Task<DM_ModInfo> CreateModInfo(CurseForge.APIClient.Models.Files.File modData)
448+
{
449+
// 构造并返回一个 DM_ModInfo 对象
450+
var dependencies = await Task.WhenAll(modData.Dependencies.Select(s => CurseForgeApiClient.GetModAsync(s.ModId)));
451+
var dependenciesNames = string.Join(",", dependencies.Select(p => p.Data.Name));
452+
var gameVersions = string.Join(",", modData.GameVersions);
453+
454+
return new DM_ModInfo(
455+
modData.DisplayName,
456+
modData.DownloadUrl,
457+
modData.FileName,
458+
"",
459+
dependenciesNames,
460+
gameVersions
461+
);
462+
}
463+
435464
var loadTasks = modFiles.Data.Select(LoadAndAddModInfo);
436465
await Task.WhenAll(loadTasks);
466+
437467
}
438468

439469
private async Task ModInfo_Modrinth(DM_ModsInfo info)
440470
{
441471
var modInfo = await ModrinthApiClient.Project.GetAsync(info.ID);
442-
string[] versions = modInfo.Versions.Reverse().ToArray();//反转列表
472+
ModInfoLoadingProcess.Content = "加载中";
443473
VerFilterCombo.Items.Add("全部");
444474
VerFilterCombo.SelectedIndex = 0;
445-
foreach (var gameVersion in modInfo.GameVersions.Reverse())
475+
foreach (var gameVersion in modInfo.GameVersions)
446476
{
447477
VerFilterCombo.Items.Add(gameVersion);
448478
}
449-
var loadedCount = 0;
450-
var totalCount = modInfo.Versions.Length;
479+
//var loadedCount = 0;
480+
var modInfo1 = await ModrinthApiClient.Version.GetProjectVersionListAsync(info.ID);
481+
foreach (var version in modInfo1)
482+
{
483+
//MessageBox.Show(version.Name);
484+
foreach (var file in version.Files)
485+
{
486+
//MessageBox.Show(file.FileName);
487+
DM_ModInfo DMmodInfo = null;
488+
489+
if (LoadType == 1)
490+
{
491+
DMmodInfo = new DM_ModInfo(
492+
version.Name,
493+
file.Url,
494+
file.FileName,
495+
string.Join(",", version.Loaders),
496+
"",
497+
GetMcVersion(version.GameVersions)
498+
);
499+
}
500+
else
501+
{
502+
DMmodInfo = new DM_ModInfo(
503+
version.Name,
504+
file.Url,
505+
file.FileName,
506+
string.Join(",", version.Loaders),
507+
"",
508+
GetMcVersion(version.GameVersions)
509+
);
510+
}
511+
ModVerList.Items.Add(DMmodInfo); // 将每个 modInfo 添加到列表
512+
VerFilter_VersList.Add(version.GameVersions);
513+
}
514+
}
515+
516+
/*
451517
using var semaphore = new SemaphoreSlim(50);
518+
452519
async Task LoadAndAddVersion(string modID)
453520
{
454521
await semaphore.WaitAsync();
455522
try
456523
{
457524
var modVersion = await ModrinthApiClient.Version.GetAsync(modID);
458525
var modGameVer = modVersion.GameVersions;
459-
var modInfo = new DM_ModInfo(
460-
modVersion.Name,
461-
modVersion.Files[0].Url,
462-
modVersion.Files[0].FileName,
463-
string.Join(",", modVersion.Loaders),
464-
string.Join(",", (await Task.WhenAll(modVersion.Dependencies.Select(s => ModrinthApiClient.Project.GetAsync(s.ProjectId)))).Select(p => p.Title)),
465-
//string.Join(",", modVersion.GameVersions)
466-
GetMcVersion(modGameVer)
467-
);
468526
527+
// 遍历 modVersion.Files 中的每个文件,创建一个 DM_ModInfo 实例
528+
var modInfos = new List<DM_ModInfo>(); // 创建一个列表保存所有生成的 DM_ModInfo 实例
529+
530+
foreach (var file in modVersion.Files)
531+
{
532+
DM_ModInfo modInfo = null;
533+
534+
if (LoadType == 1)
535+
{
536+
modInfo = new DM_ModInfo(
537+
modVersion.Name,
538+
file.Url,
539+
file.FileName,
540+
string.Join(",", modVersion.Loaders),
541+
"",
542+
GetMcVersion(modGameVer)
543+
);
544+
}
545+
else
546+
{
547+
modInfo = new DM_ModInfo(
548+
modVersion.Name,
549+
file.Url,
550+
file.FileName,
551+
string.Join(",", modVersion.Loaders),
552+
string.Join(",", (await Task.WhenAll(modVersion.Dependencies.Select(s => ModrinthApiClient.Project.GetAsync(s.ProjectId)))).Select(p => p.Title)),
553+
GetMcVersion(modGameVer)
554+
);
555+
}
556+
557+
modInfos.Add(modInfo); // 将每个文件对应的 modInfo 添加到列表中
558+
}
559+
560+
// 使用 Dispatcher 更新 UI,将所有的 modInfo 添加到 ModVerList 中
469561
await Dispatcher.InvokeAsync(() =>
470562
{
471-
ModVerList.Items.Add(modInfo);
563+
foreach (var info in modInfos)
564+
{
565+
ModVerList.Items.Add(info); // 将每个 modInfo 添加到列表
566+
}
472567
VerFilter_VersList.Add(modGameVer);
473568
loadedCount++;
474569
ModInfoLoadingProcess.Content = $"{loadedCount}/{totalCount}";
@@ -482,6 +577,7 @@ await Dispatcher.InvokeAsync(() =>
482577
483578
var loadTasks = versions.Select(LoadAndAddVersion);
484579
await Task.WhenAll(loadTasks);
580+
*/
485581
}
486582

487583
public static string GetMcVersion(string[] lists)
@@ -546,12 +642,14 @@ private async void ModList_MouseDoubleClick(object sender, MouseButtonEventArgs
546642
{
547643
VerFilterPannel.Visibility = Visibility.Collapsed;
548644
MVL_Platform.Width = 0;
645+
MVL_Dependency.Width = 100;
549646
await ModInfo_CurseForge(info);
550647
}
551648
else
552649
{
553650
VerFilterPannel.Visibility = Visibility.Visible;
554651
MVL_Platform.Width = 100;
652+
MVL_Dependency.Width = 0;
555653
await ModInfo_Modrinth(info);
556654
}
557655
ModInfoLoadingProcess.Visibility = Visibility.Collapsed;
@@ -678,14 +776,15 @@ private async void ModVerList_MouseDoubleClick(object sender, MouseButtonEventAr
678776
}
679777
var iteminfo = ModVerList.SelectedItem as DM_ModInfo;
680778
Directory.CreateDirectory(SavingPath);
681-
string filename = iteminfo.FileName;
779+
FileName = iteminfo.FileName;
682780
//MessageBox.Show(iteminfo.DownloadUrl);
683-
bool dwnRet = await MagicShow.ShowDownloader(this, iteminfo.DownloadUrl, SavingPath, filename, "下载中……", "", false);
781+
bool dwnRet = await MagicShow.ShowDownloader(this, iteminfo.DownloadUrl, SavingPath, FileName, "下载中……", "", false);
684782
if (dwnRet)
685783
{
686784
if (CloseImmediately)
687785
{
688786
Close();
787+
return;
689788
}
690789
MagicShow.ShowMsgDialog(this, "下载完成!", "提示");
691790
}

MSL/pages/CreateServer.xaml.cs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,16 +91,27 @@ private async void ImportPack_SelectionChanged(object sender, SelectionChangedEv
9191
if (ImportPack.SelectedIndex == 1)
9292
{
9393
ImportPack.SelectedIndex = 0;
94-
DownloadMod downloadMod = new DownloadMod("MSL", 0, 1, false, true, true)
94+
await MagicShow.ShowMsgDialogAsync(Window.GetWindow(this), "请务必下载文件名含有“server”且为.zip格式的服务端整合包!否则会出现软件无法读取或开服失败的问题!", "下载须知");
95+
DownloadMod downloadMod = new DownloadMod("MSL\\Downloads", 0, 1, false, true, true)
9596
{
9697
Owner = Window.GetWindow(Window.GetWindow(this))
9798
};
9899
downloadMod.ShowDialog();
99-
if (!File.Exists("MSL\\ServerPack.zip"))
100+
string dFilename = downloadMod.FileName;
101+
if (dFilename == null)
102+
{
103+
return;
104+
}
105+
if (!File.Exists($"MSL\\Downloads\\{dFilename}"))
100106
{
101107
MagicShow.ShowMsgDialog(Window.GetWindow(this), "下载失败!", "错误");
102108
return;
103109
}
110+
if (Path.GetExtension($"MSL\\Downloads\\{dFilename}") != ".zip")
111+
{
112+
MagicShow.ShowMsgDialog(Window.GetWindow(this), "您所下载的整合包文件不符合导入格式(目前软件仅支持导入.zip文件)!请检查您所下载的文件是否为服务端专用包并重试!\n错误的格式:" + Path.GetExtension($"MSL\\Downloads\\{dFilename}"), "错误");
113+
return;
114+
}
104115
string input = await MagicShow.ShowInput(Window.GetWindow(this), "服务器名称:", "MyServer");
105116
if (input != null)
106117
{
@@ -123,13 +134,13 @@ private async void ImportPack_SelectionChanged(object sender, SelectionChangedEv
123134
try
124135
{
125136
waitDialog = Dialog.Show(new TextDialog("解压整合包中,请稍等……"));
126-
await Task.Run(() => new FastZip().ExtractZip("MSL\\ServerPack.zip", serverPath, ""));
137+
await Task.Run(() => new FastZip().ExtractZip("MSL\\Downloads\\" + dFilename, serverPath, ""));
127138
DirectoryInfo[] dirs = new DirectoryInfo(serverPath).GetDirectories();
128139
if (dirs.Length == 1)
129140
{
130141
Functions.MoveFolder(dirs[0].FullName, serverPath);
131142
}
132-
File.Delete("MSL\\ServerPack.zip");
143+
File.Delete("MSL\\Downloads\\" + dFilename);
133144
}
134145
catch (Exception ex)
135146
{

MSL/pages/frpProviders/MSLFrp.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ private async void Button_Click(object sender, RoutedEventArgs e)
286286
}
287287
}
288288
}
289-
289+
290290
//MSL-FRP
291291
string frptype = "";
292292
string frpc;

0 commit comments

Comments
 (0)