feat(neoforge): NeoForge 官方源版本列表

feat(neoforge): NeoForge Minecraft 版本列表(官方源 Only)
fix: NeoForge 手动安装无法正常加载(只修了一半)
ui: 在自动安装的 NeoForge 卡片中显示最新稳定版和最新测试版
chores: 代码清理
This commit is contained in:
Pigeon0v0
2024-06-26 21:27:08 +08:00
parent 61ac6270cb
commit 3f5c29264f
4 changed files with 208 additions and 26 deletions
@@ -721,6 +721,108 @@
#End Region #End Region
#Region "DlNeoForgeList | NeoForge Minecraft 版本列表"
Public Structure DlNeoForgeListResult
''' <summary>
''' 数据来源名称,如“Official”,“BMCLAPI”。
''' </summary>
Public SourceName As String
''' <summary>
''' 是否为官方的实时数据。
''' </summary>
Public IsOfficial As Boolean
''' <summary>
''' 获取到的数据。
''' </summary>
Public Value As List(Of String)
End Structure
''' <summary>
''' NeoForge 版本列表,主加载器。
''' </summary>
Public DlNeoForgeListLoader As New LoaderTask(Of Integer, DlNeoForgeListResult)("DlNeoForgeList Main", AddressOf DlNeoForgeListMain)
Private Sub DlNeoForgeListMain(Loader As LoaderTask(Of Integer, DlNeoForgeListResult))
Select Case Setup.Get("ToolDownloadVersion")
Case 0
DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)) From {
New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 30),
New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 60)
}, Loader.IsForceRestarting)
Case 1
DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)) From {
New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 5),
New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 35)
}, Loader.IsForceRestarting)
Case Else
DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)) From {
New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 60),
New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 60)
}, Loader.IsForceRestarting)
End Select
End Sub
''' <summary>
''' NeoForge 版本列表,官方源。
''' </summary>
Public DlNeoForgeListOfficialLoader As New LoaderTask(Of Integer, DlNeoForgeListResult)("DlNeoForgeList Official", AddressOf DlNeoForgeListOfficialMain)
Private Sub DlNeoForgeListOfficialMain(Loader As LoaderTask(Of Integer, DlNeoForgeListResult))
'Dim Result As String = NetGetCodeByRequestRetry("https://files.minecraftforge.net/maven/net/minecraftforge/forge/index_1.2.4.html", Encoding.Default, "text/html", UseBrowserUserAgent:=True)
'If Result.Length < 200 Then Throw New Exception("获取到的版本列表长度不足(" & Result & ")")
''获取所有版本信息
'Dim Names As List(Of String) = RegexSearch(Result, "(?<=a href=""index_)[0-9.]+(_pre[0-9]?)?(?=.html)")
'If Names.Count < 10 Then Throw New Exception("获取到的版本数量不足(" & Result & ")")
'Loader.Output = New DlNeoForgeListResult With {.IsOfficial = True, .SourceName = "NeoForge 官方源", .Value = Names}
Dim ResultLatest As String
Dim VersionsJArray As JArray
Try
ResultLatest = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/neoforge", UseBrowserUserAgent:=True)
Catch ex As Exception
If GetExceptionSummary(ex).Contains("(404)") Then
Throw New Exception("没有可用版本")
Else
Throw
End If
End Try
If ResultLatest.Length < 50 Then Throw New Exception("获取到的版本列表长度不足(" & ResultLatest & ")")
VersionsJArray = GetJson(ResultLatest)("versions")
Dim Versions As List(Of String) = New List(Of String)
Versions.Add("1.20.1")
Try
For Each Token As String In VersionsJArray
Dim Version As String = Token.ToString().Replace("neoforge-", "")
Dim Inherit As String = "1." & Version.ToString().Split(".")(0) & "." & Token.ToString().Split(".")(1)
If Inherit.EndsWith(".0") Then
Inherit = Inherit.Replace(".0", "")
End If
If Versions.Contains(Inherit) Then
Continue For
Else
Versions.Add(Inherit)
End If
Next
Catch ex As Exception
MyMsgBox(ex.ToString(), "错误")
Throw New Exception("版本列表解析失败(" & VersionsJArray.ToString & ")", ex)
End Try
If Not Versions.Any() Then Throw New Exception("没有可用版本")
Loader.Output = New DlNeoForgeListResult With {.IsOfficial = True, .SourceName = "NeoForge 官方源", .Value = Versions}
End Sub
''' <summary>
''' NeoForge 版本列表,BMCLAPI。
''' </summary>
'Public DlNeoForgeListBmclapiLoader As New LoaderTask(Of Integer, DlNeoForgeListResult)("DlNeoForgeList Bmclapi", AddressOf DlNeoForgeListBmclapiMain)
'Private Sub DlNeoForgeListBmclapiMain(Loader As LoaderTask(Of Integer, DlNeoForgeListResult))
' Dim Result As String = NetGetCodeByRequestRetry("https://bmclapi2.bangbang93.com/forge/minecraft", Encoding.Default)
' If Result.Length < 200 Then Throw New Exception("获取到的版本列表长度不足(" & Result & ")")
' '获取所有版本信息
' Dim Names As List(Of String) = RegexSearch(Result, "[0-9.]+(_pre[0-9]?)?")
' If Names.Count < 10 Then Throw New Exception("获取到的版本数量不足(" & Result & ")")
' Loader.Output = New DlNeoForgeListResult With {.IsOfficial = False, .SourceName = "BMCLAPI", .Value = Names}
'End Sub
#End Region
#Region "DlNeoForgeVersion | NeoForge 版本列表" #Region "DlNeoForgeVersion | NeoForge 版本列表"
Public Class DlNeoForgeVersionEntry Public Class DlNeoForgeVersionEntry
@@ -811,7 +913,6 @@
''' <summary> ''' <summary>
''' NeoForge 版本列表,主加载器。 ''' NeoForge 版本列表,主加载器。
''' </summary> ''' </summary>
Public DlNeoForgeListLoader As New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeList Main", AddressOf DlNeoForgeVersionMain)
Public Sub DlNeoForgeVersionMain(Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))) 'BMCLAPI 不会返回完整的 NeoForge 版本列表,而貌似也没有办法获取 NeoForge 支持的所有 Minecraft 版本 Public Sub DlNeoForgeVersionMain(Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))) 'BMCLAPI 不会返回完整的 NeoForge 版本列表,而貌似也没有办法获取 NeoForge 支持的所有 Minecraft 版本
Dim DlNeoForgeVersionOfficialLoader As New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeVersion Official", AddressOf DlNeoForgeVersionOfficialMain) Dim DlNeoForgeVersionOfficialLoader As New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeVersion Official", AddressOf DlNeoForgeVersionOfficialMain)
Dim DlNeoForgeVersionBmclapiLoader As New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeVersion Bmclapi", AddressOf DlNeoForgeVersionBmclapiMain) Dim DlNeoForgeVersionBmclapiLoader As New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeVersion Bmclapi", AddressOf DlNeoForgeVersionBmclapiMain)
@@ -838,10 +939,15 @@
''' NeoForge 版本列表,官方源。 ''' NeoForge 版本列表,官方源。
''' </summary> ''' </summary>
Public Sub DlNeoForgeVersionOfficialMain(Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))) Public Sub DlNeoForgeVersionOfficialMain(Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)))
Dim Result As String Dim ResultLatest As String
Dim ResultJson As JObject Dim ResultLegacy As String
Dim ResultJson As String
Dim ResultLatestJson As JObject
Dim ResultLegacyJson As JObject
Dim VersionsJArray As JArray
Try Try
Result = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/neoforge", UseBrowserUserAgent:=True) ResultLatest = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/neoforge", UseBrowserUserAgent:=True)
ResultLegacy = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/forge", UseBrowserUserAgent:=True)
Catch ex As Exception Catch ex As Exception
If GetExceptionSummary(ex).Contains("(404)") Then If GetExceptionSummary(ex).Contains("(404)") Then
Throw New Exception("没有可用版本") Throw New Exception("没有可用版本")
@@ -849,10 +955,52 @@
Throw Throw
End If End If
End Try End Try
If Result.Length < 50 Then Throw New Exception("获取到的版本列表长度不足(" & Result & ")") If ResultLatest.Length < 50 AndAlso ResultLegacy.Length < 50 Then Throw New Exception("获取到的版本列表长度不足(" & ResultLatest & ")")
ResultJson = GetJson(Result) ResultLatestJson = GetJson(ResultLatest)
Dim VersionArray As Array = ResultJson("versions") ResultLegacyJson = GetJson(ResultLegacy)
If Loader.Input IsNot Nothing Then
If Loader.Input Is "1.20.1" Then
VersionsJArray = ResultLegacyJson("versions")
Else
VersionsJArray = ResultLatestJson("versions")
End If
Else
VersionsJArray = ResultLatestJson("versions")
End If
Dim Versions As New List(Of DlNeoForgeVersionEntry) Dim Versions As New List(Of DlNeoForgeVersionEntry)
Try
For Each Token As String In VersionsJArray
Dim StdVersion As String
Dim IsBeta As Boolean
Dim rawVersion As String = Token.ToString()
If rawVersion.Contains("-beta") Then
StdVersion = Token.ToString().Replace("neoforge-", "").Replace("-beta", "")
IsBeta = True
Else
StdVersion = Token.ToString().Replace("neoforge-", "")
IsBeta = False
End If
Dim Inherit As String = "1." & StdVersion.ToString().Split(".")(0) & "." & StdVersion.ToString().Split(".")(1)
If Inherit.EndsWith(".0") Then
Inherit = Inherit.Replace(".0", "")
End If
Dim Entry = New DlNeoForgeVersionEntry
If Loader.Input IsNot Nothing Then
If Inherit Is Loader.Input Then
Entry = New DlNeoForgeVersionEntry With {.Version = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion}
Versions.Add(Entry)
Continue For
Else
Continue For
End If
End If
Entry = New DlNeoForgeVersionEntry With {.Version = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion}
Versions.Add(Entry)
Next
Catch ex As Exception
MyMsgBox(ex.ToString(), "错误")
Throw New Exception("版本列表解析失败(" & VersionsJArray.ToString & ")", ex)
End Try
If Not Versions.Any() Then Throw New Exception("没有可用版本") If Not Versions.Any() Then Throw New Exception("没有可用版本")
Loader.Output = Versions Loader.Output = Versions
End Sub End Sub
@@ -865,8 +1013,7 @@
Dim Versions As New List(Of DlNeoForgeVersionEntry) Dim Versions As New List(Of DlNeoForgeVersionEntry)
Try Try
For Each Token As JObject In Json For Each Token As JObject In Json
Dim Name As String '存储 rawVersion,貌似变化更加频繁 Dim StdVersion As String
Dim StdVersion As String '存储 version,相对规则
Dim IsBeta As Boolean Dim IsBeta As Boolean
Dim rawVersion As String = Token("rawVersion") Dim rawVersion As String = Token("rawVersion")
If rawVersion.Contains("-beta") Then If rawVersion.Contains("-beta") Then
@@ -876,9 +1023,8 @@
StdVersion = Token("version").ToString().Replace("neoforge-", "").Replace("1.20.1-", "") StdVersion = Token("version").ToString().Replace("neoforge-", "").Replace("1.20.1-", "")
IsBeta = False IsBeta = False
End If End If
Name = rawVersion
Dim Inherit As String = Token("mcversion") Dim Inherit As String = Token("mcversion")
Dim Entry = New DlNeoForgeVersionEntry With {.Version = Name, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} Dim Entry = New DlNeoForgeVersionEntry With {.Version = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion}
Versions.Add(Entry) Versions.Add(Entry)
Next Next
Catch ex As Exception Catch ex As Exception
@@ -2187,16 +2187,28 @@ Retry:
#Region "NeoForge 下载菜单" #Region "NeoForge 下载菜单"
Public Sub NeoForgeDownloadListItemPreload(Stack As StackPanel, Entrys As List(Of DlNeoForgeVersionEntry), OnClick As MyListItem.ClickEventHandler, IsSaveOnly As Boolean) Public Sub NeoForgeDownloadListItemPreload(Stack As StackPanel, Entrys As List(Of DlNeoForgeVersionEntry), OnClick As MyListItem.ClickEventHandler, IsSaveOnly As Boolean)
'获取最新版本 '获取最新稳定版和测试版
Dim FreshVersion As DlNeoForgeVersionEntry = Nothing Dim FreshStableVersion As DlNeoForgeVersionEntry = Nothing
Dim FreshBetaVersion As DlNeoForgeVersionEntry = Nothing
If Entrys.Any Then If Entrys.Any Then
FreshVersion = Entrys.Last() For Each Entry In Entrys
If Entry.IsBeta Then
FreshBetaVersion = Entry
Else
FreshStableVersion = Entry
End If
Next
Else Else
Log("[System] 未找到可用的 NeoForge 版本", LogLevel.Debug) Log("[System] 未找到可用的 NeoForge 版本", LogLevel.Debug)
End If End If
'显示各个版本 '显示各个版本
If FreshVersion IsNot Nothing Then If FreshStableVersion IsNot Nothing Then
Dim Fresh = NeoForgeDownloadListItem(FreshVersion, OnClick, IsSaveOnly) Dim Fresh = NeoForgeDownloadListItem(FreshStableVersion, OnClick, IsSaveOnly)
Fresh.Info = "最新版" & If(Fresh.Info = "", "", "," & Fresh.Info)
Stack.Children.Add(Fresh)
End If
If FreshBetaVersion IsNot Nothing Then
Dim Fresh = NeoForgeDownloadListItem(FreshBetaVersion, OnClick, IsSaveOnly)
Fresh.Info = "最新版" & If(Fresh.Info = "", "", "," & Fresh.Info) Fresh.Info = "最新版" & If(Fresh.Info = "", "", "," & Fresh.Info)
Stack.Children.Add(Fresh) Stack.Children.Add(Fresh)
End If End If
@@ -17,10 +17,11 @@
</Grid> </Grid>
</StackPanel> </StackPanel>
</local:MyCard> </local:MyCard>
<local:MyCard x:Name="CardVersions" Margin="20,15,20,20" Title="版本列表"> <!--<local:MyCard x:Name="CardVersions" Margin="20,15,20,20" Title="版本列表">
<StackPanel x:Name="PanVersions" Margin="20,40,18,20" /> <StackPanel x:Name="PanVersions" Margin="20,40,18,20" />
</local:MyCard> </local:MyCard>-->
<local:MyCard HorizontalAlignment="Center" SnapsToDevicePixels="True" x:Name="PanLoad" UseAnimation="False" Margin="40,50"> <StackPanel Name="PanMain" Margin="20,15,20,5" Grid.IsSharedSizeScope="True" />
<local:MyCard HorizontalAlignment="Center" Margin="40,50" SnapsToDevicePixels="True" x:Name="PanLoad" UseAnimation="False">
<local:MyLoading Text="正在获取 NeoForge 列表" Margin="20,20,20,17" x:Name="Load" HorizontalAlignment="Center" VerticalAlignment="Center" /> <local:MyLoading Text="正在获取 NeoForge 列表" Margin="20,20,20,17" x:Name="Load" HorizontalAlignment="Center" VerticalAlignment="Center" />
</local:MyCard> </local:MyCard>
</StackPanel> </StackPanel>
@@ -1,7 +1,7 @@
Public Class PageDownloadNeoForge Public Class PageDownloadNeoForge
Private Sub LoaderInit() Handles Me.Initialized Private Sub LoaderInit() Handles Me.Initialized
PageLoaderInit(Load, PanLoad, CardVersions, CardTip, DlNeoForgeListLoader, AddressOf Load_OnFinish) PageLoaderInit(Load, PanLoad, PanMain, CardTip, DlNeoForgeListLoader, AddressOf Load_OnFinish)
End Sub End Sub
Private Sub Init() Handles Me.Loaded Private Sub Init() Handles Me.Loaded
PanBack.ScrollToHome() PanBack.ScrollToHome()
@@ -10,21 +10,44 @@
Private Sub Load_OnFinish() Private Sub Load_OnFinish()
'结果数据化 '结果数据化
Try Try
Dim Versions As List(Of DlNeoForgeVersionEntry) = DlNeoForgeListLoader.Output Dim Versions = Sort(DlNeoForgeListLoader.Output.Value, AddressOf VersionSortBoolean)
PanVersions.Children.Clear() 'Dim Versions As List(Of DlNeoForgeVersionEntry) = DlNeoForgeListLoader.Output
For Each Version In Versions PanMain.Children.Clear()
PanVersions.Children.Add(NeoForgeDownloadListItem(Version, AddressOf NeoForge_Selected, True)) For Each Version As String In Versions
'增加卡片
Dim NewCard As New MyCard With {.Title = Version.Replace("_p", " P"), .Margin = New Thickness(0, 0, 0, 15), .SwapType = 5}
Dim NewStack As New StackPanel With {.Margin = New Thickness(20, MyCard.SwapedHeight, 18, 0), .VerticalAlignment = VerticalAlignment.Top, .RenderTransform = New TranslateTransform(0, 0), .Tag = Version}
NewCard.Children.Add(NewStack)
NewCard.SwapControl = NewStack
NewCard.IsSwaped = True
PanMain.Children.Add(NewCard)
Next Next
CardVersions.Title = "版本列表 (" & Versions.Count & ")"
Catch ex As Exception Catch ex As Exception
Log(ex, "可视化 NeoForge 版本列表出错", LogLevel.Feedback) Log(ex, "可视化 NeoForge 版本列表出错", LogLevel.Feedback)
End Try End Try
End Sub End Sub
Public Sub NeoForge_StateChanged(sender As MyLoading, newState As MyLoading.MyLoadingState, oldState As MyLoading.MyLoadingState)
If newState <> MyLoading.MyLoadingState.Stop Then Exit Sub
Dim Card As MyCard = CType(sender.Parent, FrameworkElement).Parent
Dim Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)) = sender.State
'载入列表
Card.SwapControl.Children.Clear()
Card.SwapControl.Tag = Loader.Output
Card.SwapType = 6
Card.StackInstall()
End Sub
Public Sub NeoForge_Click(sender As MyLoading, e As MouseButtonEventArgs)
If sender.State.LoadingState = MyLoading.MyLoadingState.Error Then
CType(sender.State, LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))).Start(IsForceRestart:=True)
End If
End Sub
Private Sub NeoForge_Selected(sender As MyListItem, e As EventArgs) Private Sub NeoForge_Selected(sender As MyListItem, e As EventArgs)
McDownloadNeoForgeSave(sender.Tag) McDownloadNeoForgeSave(sender.Tag)
End Sub End Sub
Public Sub DownloadStart(sender As MyListItem, e As Object)
McDownloadNeoForge(sender.Tag)
End Sub
Private Sub BtnWeb_Click(sender As Object, e As EventArgs) Handles BtnWeb.Click Private Sub BtnWeb_Click(sender As Object, e As EventArgs) Handles BtnWeb.Click
OpenWebsite("https://neoforged.net/") OpenWebsite("https://neoforged.net/")
End Sub End Sub