@@ -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 }
0 commit comments