👌 💥 更新 LTCatt 的审核
This commit is contained in:
@@ -2,45 +2,6 @@
|
|||||||
|
|
||||||
Public Module ModNet
|
Public Module ModNet
|
||||||
|
|
||||||
#Region "Mod"
|
|
||||||
Public Function ModMirrorUrl(Url As String) As String
|
|
||||||
Select Case Setup.Get("ToolDownloadMod")
|
|
||||||
Case 0
|
|
||||||
Return Url
|
|
||||||
Case 1
|
|
||||||
Return Url.Replace("api.modrinth.com/v2", "mod.mcmirror.top/modrinth").
|
|
||||||
Replace("staging-api.modrinth.com/v2", "mod.mcmirror.top/modrinth").
|
|
||||||
Replace("cdn.modrinth.com", "mod.mcimirror.top").
|
|
||||||
Replace("api.curseforge.com", "mod.mcimirror.top/curseforge").
|
|
||||||
Replace("edge.forgecdn.net", "mod.mcimirror.top").
|
|
||||||
Replace("mediafilez.forgecdn.net", "mod.mcimirror.top").
|
|
||||||
Replace("media.forgecdn.net", "mod.mcimirror.top")
|
|
||||||
Case Else
|
|
||||||
Return Url
|
|
||||||
End Select
|
|
||||||
End Function
|
|
||||||
Public Function AllowModMirror(IsModFile As Boolean)
|
|
||||||
Return Setup.Get("ToolDownloadMod") <> 0 AndAlso (Setup.Get("ToolDownloadModMirror") OrElse Not IsModFile)
|
|
||||||
End Function
|
|
||||||
''' <summary>
|
|
||||||
''' 请求 CurseForge 或者 Modrinth。会抛出异常。
|
|
||||||
''' </summary>
|
|
||||||
Public Function NetRequestMod(Url As String, Method As String, Data As Object, ContentType As String,
|
|
||||||
Optional Headers As Dictionary(Of String, String) = Nothing,
|
|
||||||
Optional IsModFile As Boolean = False) As String
|
|
||||||
Try
|
|
||||||
If AllowModMirror(IsModFile) Then
|
|
||||||
Return NetRequestOnce(Url, Method, Data, ContentType, Timeout:=5000, Headers:=Headers)
|
|
||||||
Else
|
|
||||||
Return NetRequestRetry(Url, Method, Data, ContentType, Headers:=Headers)
|
|
||||||
End If
|
|
||||||
Catch ex1 As Exception
|
|
||||||
If Not AllowModMirror(IsModFile) Then Throw ex1 '没机会了,45s 都没有加载完
|
|
||||||
Dim retry As Integer = 0
|
|
||||||
Return NetRequestOnce(ModMirrorUrl(Url), Method, Data, ContentType, Timeout:=30000, Headers:=Headers)
|
|
||||||
End Try
|
|
||||||
End Function
|
|
||||||
#End Region
|
|
||||||
|
|
||||||
Public Const NetDownloadEnd As String = ".PCLDownloading"
|
Public Const NetDownloadEnd As String = ".PCLDownloading"
|
||||||
|
|
||||||
@@ -143,9 +104,6 @@ Retry:
|
|||||||
Dim RetryCount As Integer = 0
|
Dim RetryCount As Integer = 0
|
||||||
Dim RetryException As Exception = Nothing
|
Dim RetryException As Exception = Nothing
|
||||||
Dim StartTime As Long = GetTimeTick()
|
Dim StartTime As Long = GetTimeTick()
|
||||||
If BackupUrl Is Nothing Then
|
|
||||||
If ModMirrorUrl(Url) <> Url Then BackupUrl = ModMirrorUrl(Url)
|
|
||||||
End If
|
|
||||||
Try
|
Try
|
||||||
Retry:
|
Retry:
|
||||||
Select Case RetryCount
|
Select Case RetryCount
|
||||||
|
|||||||
@@ -947,7 +947,7 @@ Retry:
|
|||||||
Try
|
Try
|
||||||
'获取工程列表
|
'获取工程列表
|
||||||
Log("[Comp] 开始从 CurseForge 获取工程列表:" & CurseForgeUrl)
|
Log("[Comp] 开始从 CurseForge 获取工程列表:" & CurseForgeUrl)
|
||||||
Dim RequestResult As JObject = NetGetCodeByRequestRetry(CurseForgeUrl, IsJson:=True, Encode:=Encoding.UTF8, BackupUrl:=ModMirrorUrl(CurseForgeUrl))
|
Dim RequestResult As JObject = DlModRequest(CurseForgeUrl, IsJson:=True)
|
||||||
Task.Progress += 0.2
|
Task.Progress += 0.2
|
||||||
Dim ProjectList As New List(Of CompProject)
|
Dim ProjectList As New List(Of CompProject)
|
||||||
For Each JsonEntry As JObject In RequestResult("data")
|
For Each JsonEntry As JObject In RequestResult("data")
|
||||||
@@ -977,7 +977,7 @@ Retry:
|
|||||||
Sub()
|
Sub()
|
||||||
Try
|
Try
|
||||||
Log("[Comp] 开始从 Modrinth 获取工程列表:" & ModrinthUrl)
|
Log("[Comp] 开始从 Modrinth 获取工程列表:" & ModrinthUrl)
|
||||||
Dim RequestResult As JObject = NetGetCodeByRequestRetry(ModrinthUrl, IsJson:=True, Encode:=Encoding.UTF8, BackupUrl:=ModMirrorUrl(ModrinthUrl))
|
Dim RequestResult As JObject = DlModRequest(ModrinthUrl, IsJson:=True)
|
||||||
Task.Progress += 0.2
|
Task.Progress += 0.2
|
||||||
Dim ProjectList As New List(Of CompProject)
|
Dim ProjectList As New List(Of CompProject)
|
||||||
For Each JsonEntry As JObject In RequestResult("hits")
|
For Each JsonEntry As JObject In RequestResult("hits")
|
||||||
@@ -1212,7 +1212,7 @@ Retry:
|
|||||||
''' <param name="LocalAddress">目标本地文件夹,或完整的文件路径。会自动判断类型。</param>
|
''' <param name="LocalAddress">目标本地文件夹,或完整的文件路径。会自动判断类型。</param>
|
||||||
Public Function ToNetFile(LocalAddress As String) As NetFile
|
Public Function ToNetFile(LocalAddress As String) As NetFile
|
||||||
Dim urls As List(Of String) = DownloadUrls
|
Dim urls As List(Of String) = DownloadUrls
|
||||||
If AllowModMirror(True) Then urls.AddRange(MirrorUrls)
|
urls.AddRange(MirrorUrls)
|
||||||
Return New NetFile(urls, LocalAddress & If(LocalAddress.EndsWithF("\"), FileName, ""), New FileChecker(Hash:=Hash), UseBrowserUserAgent:=True)
|
Return New NetFile(urls, LocalAddress & If(LocalAddress.EndsWithF("\"), FileName, ""), New FileChecker(Hash:=Hash), UseBrowserUserAgent:=True)
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
@@ -1334,7 +1334,7 @@ Retry:
|
|||||||
'末尾添加备用镜像 URL
|
'末尾添加备用镜像 URL
|
||||||
MirrorUrls = New List(Of String)
|
MirrorUrls = New List(Of String)
|
||||||
For Each u In DownloadUrls
|
For Each u In DownloadUrls
|
||||||
MirrorUrls.Add(ModMirrorUrl(u))
|
MirrorUrls.Add(DlSourceModGet(u))
|
||||||
Next
|
Next
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
@@ -1442,11 +1442,11 @@ Retry:
|
|||||||
Retry:
|
Retry:
|
||||||
Dim comp As Object
|
Dim comp As Object
|
||||||
If FromCurseForge Then 'CurseForge
|
If FromCurseForge Then 'CurseForge
|
||||||
comp = NetGetCodeByRequestRetry("https://api.curseforge.com/v1/mods/" & ProjectId, IsJson:=True, Encode:=Encoding.UTF8)
|
comp = DlModRequest("https://api.curseforge.com/v1/mods/" & ProjectId, IsJson:=True)
|
||||||
TargetProject = New CompProject(NetGetCodeByRequestRetry("https://api.curseforge.com/v1/mods/" & ProjectId, IsJson:=True, Encode:=Encoding.UTF8)("data"))
|
TargetProject = New CompProject(DlModRequest("https://api.curseforge.com/v1/mods/" & ProjectId, IsJson:=True)("data"))
|
||||||
Else 'Modrinth
|
Else 'Modrinth
|
||||||
comp = NetGetCodeByRequestRetry("https://api.modrinth.com/v2/project/" & ProjectId, IsJson:=True, Encode:=Encoding.UTF8)
|
comp = DlModRequest("https://api.modrinth.com/v2/project/" & ProjectId, IsJson:=True)
|
||||||
TargetProject = New CompProject(NetGetCodeByRequestRetry("https://api.modrinth.com/v2/project/" & ProjectId, IsJson:=True, Encode:=Encoding.UTF8))
|
TargetProject = New CompProject(DlModRequest("https://api.modrinth.com/v2/project/" & ProjectId, IsJson:=True))
|
||||||
End If
|
End If
|
||||||
If comp Is Nothing Then '获取 ("data") 时会报值不能为 null
|
If comp Is Nothing Then '获取 ("data") 时会报值不能为 null
|
||||||
If retryCount > 2 Then Throw New Exception("工程对象获取失败,请等待一段时间后刷新再试!")
|
If retryCount > 2 Then Throw New Exception("工程对象获取失败,请等待一段时间后刷新再试!")
|
||||||
@@ -1462,13 +1462,13 @@ Retry:
|
|||||||
If FromCurseForge Then
|
If FromCurseForge Then
|
||||||
'CurseForge
|
'CurseForge
|
||||||
If TargetProject.Type = CompType.Mod Then 'Mod 使用每个版本最新的文件
|
If TargetProject.Type = CompType.Mod Then 'Mod 使用每个版本最新的文件
|
||||||
ResultJsonArray = GetJson(NetRequestMod("https://api.curseforge.com/v1/mods/files", "POST", "{""fileIds"": [" & Join(TargetProject.CurseForgeFileIds, ",") & "]}", "application/json"))("data")
|
ResultJsonArray = GetJson(DlModRequest("https://api.curseforge.com/v1/mods/files", "POST", "{""fileIds"": [" & Join(TargetProject.CurseForgeFileIds, ",") & "]}", "application/json"))("data")
|
||||||
Else '否则使用全部文件
|
Else '否则使用全部文件
|
||||||
ResultJsonArray = NetGetCodeByRequestRetry($"https://api.curseforge.com/v1/mods/{ProjectId}/files?pageSize=999", Accept:="application/json", IsJson:=True)("data")
|
ResultJsonArray = NetGetCodeByRequestRetry($"https://api.curseforge.com/v1/mods/{ProjectId}/files?pageSize=999", Accept:="application/json", IsJson:=True, BackupUrl:=DlSourceModGet($"https://api.curseforge.com/v1/mods/{ProjectId}/files?pageSize=999"))("data")
|
||||||
End If
|
End If
|
||||||
Else
|
Else
|
||||||
'Modrinth
|
'Modrinth
|
||||||
ResultJsonArray = NetGetCodeByRequestRetry($"https://api.modrinth.com/v2/project/{ProjectId}/version", Accept:="application/json", IsJson:=True)
|
ResultJsonArray = NetGetCodeByRequestRetry($"https://api.modrinth.com/v2/project/{ProjectId}/version", Accept:="application/json", IsJson:=True, BackupUrl:=DlSourceModGet($"https://api.modrinth.com/v2/project/{ProjectId}/version"))
|
||||||
End If
|
End If
|
||||||
CompFilesCache(ProjectId) = ResultJsonArray.Select(Function(a) New CompFile(a, TargetProject.Type)).
|
CompFilesCache(ProjectId) = ResultJsonArray.Select(Function(a) New CompFile(a, TargetProject.Type)).
|
||||||
Where(Function(a) a.Available).ToList.Distinct(Function(a, b) a.Id = b.Id) 'CurseForge 可能会重复返回相同项(#1330)
|
Where(Function(a) a.Available).ToList.Distinct(Function(a, b) a.Id = b.Id) 'CurseForge 可能会重复返回相同项(#1330)
|
||||||
@@ -1482,7 +1482,7 @@ Retry:
|
|||||||
Log($"[Comp] {ProjectId} 文件列表中还需要获取信息的前置 Mod:{Join(UndoneDeps, ",")}")
|
Log($"[Comp] {ProjectId} 文件列表中还需要获取信息的前置 Mod:{Join(UndoneDeps, ",")}")
|
||||||
Dim Projects As JArray
|
Dim Projects As JArray
|
||||||
If TargetProject.FromCurseForge Then
|
If TargetProject.FromCurseForge Then
|
||||||
Projects = GetJson(NetRequestMod("https://api.curseforge.com/v1/mods",
|
Projects = GetJson(DlModRequest("https://api.curseforge.com/v1/mods",
|
||||||
"POST", "{""modIds"": [" & Join(UndoneDeps, ",") & "]}", "application/json"))("data")
|
"POST", "{""modIds"": [" & Join(UndoneDeps, ",") & "]}", "application/json"))("data")
|
||||||
Else
|
Else
|
||||||
Projects = NetGetCodeByRequestRetry($"https://api.modrinth.com/v2/projects?ids=[""{Join(UndoneDeps, """,""")}""]",
|
Projects = NetGetCodeByRequestRetry($"https://api.modrinth.com/v2/projects?ids=[""{Join(UndoneDeps, """,""")}""]",
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Imports System.Security.Policy
|
Imports Newtonsoft
|
||||||
|
|
||||||
Public Module ModDownload
|
Public Module ModDownload
|
||||||
|
|
||||||
@@ -1077,6 +1077,69 @@ Public Module ModDownload
|
|||||||
|
|
||||||
#End Region
|
#End Region
|
||||||
|
|
||||||
|
#Region "DlMod* | Mod 列表 / 信息 / 下载"
|
||||||
|
Public Function DlModRequest(Url As String, Optional IsJson As Boolean = False) As String
|
||||||
|
Dim McimUrl As String = DlSourceModGet(Url)
|
||||||
|
Dim Urls As New List(Of KeyValuePair(Of String, Integer))
|
||||||
|
If McimUrl <> Url Then
|
||||||
|
Select Case Setup.Get("ToolDownloadVersion")
|
||||||
|
Case 0
|
||||||
|
Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30))
|
||||||
|
Urls.Add(New KeyValuePair(Of String, Integer)(Url, 60))
|
||||||
|
Case 1
|
||||||
|
Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5))
|
||||||
|
Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 35))
|
||||||
|
Case Else
|
||||||
|
Urls.Add(New KeyValuePair(Of String, Integer)(Url, 60))
|
||||||
|
Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60))
|
||||||
|
End Select
|
||||||
|
End If
|
||||||
|
Return DlModRequest(Urls, IsJson:=IsJson)
|
||||||
|
End Function
|
||||||
|
Public Function DlModRequest(Url As String, Method As String, Data As String, ContentType As String,
|
||||||
|
Optional Headers As Dictionary(Of String, String) = Nothing) As String
|
||||||
|
Dim McimUrl As String = DlSourceModGet(Url)
|
||||||
|
Dim Urls As New List(Of KeyValuePair(Of String, Integer))
|
||||||
|
If McimUrl <> Url Then
|
||||||
|
Select Case Setup.Get("ToolDownloadVersion")
|
||||||
|
Case 0
|
||||||
|
Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30))
|
||||||
|
Urls.Add(New KeyValuePair(Of String, Integer)(Url, 60))
|
||||||
|
Case 1
|
||||||
|
Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5))
|
||||||
|
Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 35))
|
||||||
|
Case Else
|
||||||
|
Urls.Add(New KeyValuePair(Of String, Integer)(Url, 60))
|
||||||
|
Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60))
|
||||||
|
End Select
|
||||||
|
End If
|
||||||
|
Return DlModRequest(Urls, Method, Data, ContentType, Headers:=Headers)
|
||||||
|
End Function
|
||||||
|
Private Function DlModRequest(Urls As List(Of KeyValuePair(Of String, Integer)), Optional IsJson As Boolean = False) As String
|
||||||
|
Dim exMessage As String = ""
|
||||||
|
For Each url In Urls
|
||||||
|
Try
|
||||||
|
Return NetGetCodeByDownload(url.Key, Timeout:=url.Value, IsJson:=IsJson)
|
||||||
|
Catch ex As Exception
|
||||||
|
exMessage += ex.Message + vbCrLf
|
||||||
|
End Try
|
||||||
|
Next
|
||||||
|
Throw New Exception(exMessage)
|
||||||
|
End Function
|
||||||
|
Private Function DlModRequest(Urls As List(Of KeyValuePair(Of String, Integer)), Method As String, Data As String,
|
||||||
|
ContentType As String, Optional Headers As Dictionary(Of String, String) = Nothing) As String
|
||||||
|
Dim exMessage As String = ""
|
||||||
|
For Each url In Urls
|
||||||
|
Try
|
||||||
|
Return NetRequestOnce(url.Key, Method, Data, ContentType, Timeout:=url.Value, Headers:=Headers)
|
||||||
|
Catch ex As Exception
|
||||||
|
exMessage += ex.Message + vbCrLf
|
||||||
|
End Try
|
||||||
|
Next
|
||||||
|
Throw New Exception(exMessage)
|
||||||
|
End Function
|
||||||
|
#End Region
|
||||||
|
|
||||||
#Region "DlSource | 镜像下载源"
|
#Region "DlSource | 镜像下载源"
|
||||||
|
|
||||||
Public Function DlSourceResourceGet(MojangBase As String) As String()
|
Public Function DlSourceResourceGet(MojangBase As String) As String()
|
||||||
@@ -1094,18 +1157,15 @@ Public Module ModDownload
|
|||||||
MojangBase
|
MojangBase
|
||||||
}
|
}
|
||||||
End Function
|
End Function
|
||||||
Public Function DlSourceCfOrMrGet(CfMrBase As String) As String()
|
Public Function DlSourceModGet(CfMrBase As String) As String
|
||||||
If CfMrBase Is Nothing Then Throw New Exception("无对应的 Mod 下载地址")
|
'If CfMrBase Is Nothing Then Throw New Exception("无对应的 Mod 下载地址")
|
||||||
Return {
|
Return CfMrBase.Replace("api.modrinth.com/v2", "mod.mcmirror.top/modrinth") _
|
||||||
CfMrBase.Replace("api.modrinth.com/v2", "mod.mcmirror.top/modrinth") _
|
|
||||||
.Replace("staging-api.modrinth.com/v2", "mod.mcmirror.top/modrinth") _
|
.Replace("staging-api.modrinth.com/v2", "mod.mcmirror.top/modrinth") _
|
||||||
.Replace("cdn.modrinth.com", "mod.mcimirror.top") _
|
.Replace("cdn.modrinth.com", "mod.mcimirror.top") _
|
||||||
.Replace("api.curseforge.com", "mod.mcimirror.top/curseforge") _
|
.Replace("api.curseforge.com", "mod.mcimirror.top/curseforge") _
|
||||||
.Replace("edge.forgecdn.net", "mod.mcimirror.top") _
|
.Replace("edge.forgecdn.net", "mod.mcimirror.top") _
|
||||||
.Replace("mediafilez.forgecdn.net", "mod.mcimirror.top") _
|
.Replace("mediafilez.forgecdn.net", "mod.mcimirror.top") _
|
||||||
.Replace("media.forgecdn.net", "mod.mcimirror.top"),
|
.Replace("media.forgecdn.net", "mod.mcimirror.top")
|
||||||
CfMrBase
|
|
||||||
}
|
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
Public Function DlSourceLauncherOrMetaGet(MojangBase As String) As String()
|
Public Function DlSourceLauncherOrMetaGet(MojangBase As String) As String()
|
||||||
|
|||||||
@@ -952,7 +952,7 @@ Finished:
|
|||||||
Try
|
Try
|
||||||
'步骤 1:获取 Hash 与对应的工程 ID
|
'步骤 1:获取 Hash 与对应的工程 ID
|
||||||
Dim ModrinthHashes = Mods.Select(Function(m) m.ModrinthHash).ToList()
|
Dim ModrinthHashes = Mods.Select(Function(m) m.ModrinthHash).ToList()
|
||||||
Dim ModrinthVersion = CType(GetJson(NetRequestMod("https://api.modrinth.com/v2/version_files", "POST",
|
Dim ModrinthVersion = CType(GetJson(DlModRequest("https://api.modrinth.com/v2/version_files", "POST",
|
||||||
$"{{""hashes"": [""{ModrinthHashes.Join(""",""")}""], ""algorithm"": ""sha1""}}", "application/json")), JObject)
|
$"{{""hashes"": [""{ModrinthHashes.Join(""",""")}""], ""algorithm"": ""sha1""}}", "application/json")), JObject)
|
||||||
Log($"[Mod] 从 Modrinth 获取到 {ModrinthVersion.Count} 个本地 Mod 的对应信息")
|
Log($"[Mod] 从 Modrinth 获取到 {ModrinthVersion.Count} 个本地 Mod 的对应信息")
|
||||||
'步骤 2:尝试读取工程信息缓存,构建其他 Mod 的对应关系
|
'步骤 2:尝试读取工程信息缓存,构建其他 Mod 的对应关系
|
||||||
@@ -985,7 +985,7 @@ Finished:
|
|||||||
Next
|
Next
|
||||||
Log($"[Mod] 已从 Modrinth 获取本地 Mod 信息,继续获取更新信息")
|
Log($"[Mod] 已从 Modrinth 获取本地 Mod 信息,继续获取更新信息")
|
||||||
'步骤 4:获取更新信息
|
'步骤 4:获取更新信息
|
||||||
Dim ModrinthUpdate = CType(GetJson(NetRequestMod("https://api.modrinth.com/v2/version_files/update", "POST",
|
Dim ModrinthUpdate = CType(GetJson(DlModRequest("https://api.modrinth.com/v2/version_files/update", "POST",
|
||||||
$"{{""hashes"": [""{ModrinthMapping.SelectMany(Function(l) l.Value.Select(Function(m) m.ModrinthHash)).Join(""",""")}""], ""algorithm"": ""sha1"",
|
$"{{""hashes"": [""{ModrinthMapping.SelectMany(Function(l) l.Value.Select(Function(m) m.ModrinthHash)).Join(""",""")}""], ""algorithm"": ""sha1"",
|
||||||
""loaders"": [""{ModLoaders.Join(""",""").ToLower}""],""game_versions"": [""{McVersion}""]}}", "application/json")), JObject)
|
""loaders"": [""{ModLoaders.Join(""",""").ToLower}""],""game_versions"": [""{McVersion}""]}}", "application/json")), JObject)
|
||||||
For Each Entry In Mods
|
For Each Entry In Mods
|
||||||
@@ -1022,7 +1022,7 @@ Finished:
|
|||||||
CurseForgeHashes.Add(Entry.CurseForgeHash)
|
CurseForgeHashes.Add(Entry.CurseForgeHash)
|
||||||
If Loader.IsAbortedWithThread(MainThread) Then Exit Sub
|
If Loader.IsAbortedWithThread(MainThread) Then Exit Sub
|
||||||
Next
|
Next
|
||||||
Dim CurseForgeRaw = CType(CType(GetJson(NetRequestMod("https://api.curseforge.com/v1/fingerprints/432/", "POST",
|
Dim CurseForgeRaw = CType(CType(GetJson(DlModRequest("https://api.curseforge.com/v1/fingerprints/432/", "POST",
|
||||||
$"{{""fingerprints"": [{CurseForgeHashes.Join(",")}]}}", "application/json")), JObject)("data")("exactMatches"), JContainer)
|
$"{{""fingerprints"": [{CurseForgeHashes.Join(",")}]}}", "application/json")), JObject)("data")("exactMatches"), JContainer)
|
||||||
Log($"[Mod] 从 CurseForge 获取到 {CurseForgeRaw.Count} 个本地 Mod 的对应信息")
|
Log($"[Mod] 从 CurseForge 获取到 {CurseForgeRaw.Count} 个本地 Mod 的对应信息")
|
||||||
'步骤 2:尝试读取工程信息缓存,构建其他 Mod 的对应关系
|
'步骤 2:尝试读取工程信息缓存,构建其他 Mod 的对应关系
|
||||||
@@ -1045,7 +1045,7 @@ Finished:
|
|||||||
Log($"[Mod] 需要从 CurseForge 获取 {CurseForgeMapping.Count} 个本地 Mod 的工程信息")
|
Log($"[Mod] 需要从 CurseForge 获取 {CurseForgeMapping.Count} 个本地 Mod 的工程信息")
|
||||||
'步骤 3:获取工程信息
|
'步骤 3:获取工程信息
|
||||||
If Not CurseForgeMapping.Any() Then Exit Sub
|
If Not CurseForgeMapping.Any() Then Exit Sub
|
||||||
Dim CurseForgeProject = CType(GetJson(NetRequestMod("https://api.curseforge.com/v1/mods", "POST",
|
Dim CurseForgeProject = CType(GetJson(DlModRequest("https://api.curseforge.com/v1/mods", "POST",
|
||||||
$"{{""modIds"": [{CurseForgeMapping.Keys.Join(",")}]}}", "application/json")), JObject)("data")
|
$"{{""modIds"": [{CurseForgeMapping.Keys.Join(",")}]}}", "application/json")), JObject)("data")
|
||||||
Dim UpdateFileIds As New Dictionary(Of Integer, List(Of McMod)) 'FileId -> 本地 Mod 文件列表
|
Dim UpdateFileIds As New Dictionary(Of Integer, List(Of McMod)) 'FileId -> 本地 Mod 文件列表
|
||||||
Dim FileIdToProjectSlug As New Dictionary(Of Integer, String)
|
Dim FileIdToProjectSlug As New Dictionary(Of Integer, String)
|
||||||
@@ -1087,7 +1087,7 @@ Finished:
|
|||||||
Log($"[Mod] 已从 CurseForge 获取本地 Mod 信息,需要获取 {UpdateFileIds.Count} 个用于检查更新的文件信息")
|
Log($"[Mod] 已从 CurseForge 获取本地 Mod 信息,需要获取 {UpdateFileIds.Count} 个用于检查更新的文件信息")
|
||||||
'步骤 4:获取更新文件信息
|
'步骤 4:获取更新文件信息
|
||||||
If Not UpdateFileIds.Any() Then Exit Sub
|
If Not UpdateFileIds.Any() Then Exit Sub
|
||||||
Dim CurseForgeFiles = CType(GetJson(NetRequestMod("https://api.curseforge.com/v1/mods/files", "POST",
|
Dim CurseForgeFiles = CType(GetJson(DlModRequest("https://api.curseforge.com/v1/mods/files", "POST",
|
||||||
$"{{""fileIds"": [{UpdateFileIds.Keys.Join(",")}]}}", "application/json")), JObject)("data")
|
$"{{""fileIds"": [{UpdateFileIds.Keys.Join(",")}]}}", "application/json")), JObject)("data")
|
||||||
Dim UpdateFiles As New Dictionary(Of McMod, CompFile)
|
Dim UpdateFiles As New Dictionary(Of McMod, CompFile)
|
||||||
For Each FileJson In CurseForgeFiles
|
For Each FileJson In CurseForgeFiles
|
||||||
|
|||||||
@@ -47,12 +47,10 @@
|
|||||||
</local:MyComboBox>
|
</local:MyComboBox>
|
||||||
<TextBlock Grid.Row="4" VerticalAlignment="Center" HorizontalAlignment="Left" Text="Mod 信息获取" Margin="0,0,25,0" />
|
<TextBlock Grid.Row="4" VerticalAlignment="Center" HorizontalAlignment="Left" Text="Mod 信息获取" Margin="0,0,25,0" />
|
||||||
<local:MyComboBox x:Name="ComboDownloadMod" Grid.Row="4" Grid.ColumnSpan="2" Tag="ToolDownloadMod" Grid.Column="1">
|
<local:MyComboBox x:Name="ComboDownloadMod" Grid.Row="4" Grid.ColumnSpan="2" Tag="ToolDownloadMod" Grid.Column="1">
|
||||||
<local:MyComboBoxItem x:Name="ComboItemDefault" Content="官方源" IsSelected="True" />
|
<local:MyComboBoxItem Content="尽量使用官方源" IsSelected="True" />
|
||||||
<local:MyComboBoxItem Content="MCIM 镜像源" />
|
<local:MyComboBoxItem Content="在官方源加载缓慢时改用镜像源" />
|
||||||
|
<local:MyComboBoxItem Content="尽量使用镜像源" />
|
||||||
</local:MyComboBox>
|
</local:MyComboBox>
|
||||||
<local:MyCheckBox Margin="0,2,0,4" Text="在官方源下载 Mod 文件缓慢时改用镜像源" Grid.Row="6" Height="22" Grid.ColumnSpan="2"
|
|
||||||
x:Name="CheckDownloadModMirror" Tag="ToolDownloadModMirror"
|
|
||||||
ToolTip="下载 Mod 文件时,是否允许使用镜像源。" />
|
|
||||||
<TextBlock Grid.Row="7" VerticalAlignment="Center" HorizontalAlignment="Left" Text="最大线程数" Margin="0,0,25,0" />
|
<TextBlock Grid.Row="7" VerticalAlignment="Center" HorizontalAlignment="Left" Text="最大线程数" Margin="0,0,25,0" />
|
||||||
<local:MySlider x:Name="SliderDownloadThread" Grid.Row="7" Tag="ToolDownloadThread" MaxValue="255" Value="63" Grid.Column="1"
|
<local:MySlider x:Name="SliderDownloadThread" Grid.Row="7" Tag="ToolDownloadThread" MaxValue="255" Value="63" Grid.Column="1"
|
||||||
ToolTip="线程数越多,限速的文件下载越快,但过高的线程数会造成下载时非常严重的卡顿。
一般而言,64 线程已可以保证足够的下载速度。" />
|
ToolTip="线程数越多,限速的文件下载越快,但过高的线程数会造成下载时非常严重的卡顿。
一般而言,64 线程已可以保证足够的下载速度。" />
|
||||||
|
|||||||
@@ -57,12 +57,6 @@
|
|||||||
ComboDownloadVersion.SelectedIndex = Setup.Get("ToolDownloadVersion")
|
ComboDownloadVersion.SelectedIndex = Setup.Get("ToolDownloadVersion")
|
||||||
ComboDownloadTranslate.SelectedIndex = Setup.Get("ToolDownloadTranslate")
|
ComboDownloadTranslate.SelectedIndex = Setup.Get("ToolDownloadTranslate")
|
||||||
ComboDownloadMod.SelectedIndex = Setup.Get("ToolDownloadMod")
|
ComboDownloadMod.SelectedIndex = Setup.Get("ToolDownloadMod")
|
||||||
CheckDownloadModMirror.Checked = Setup.Get("ToolDownloadModMirror")
|
|
||||||
If ComboDownloadMod.SelectedItem Is ComboItemDefault Then
|
|
||||||
CheckDownloadModMirror.IsEnabled = False
|
|
||||||
Else
|
|
||||||
CheckDownloadModMirror.IsEnabled = True
|
|
||||||
End If
|
|
||||||
CheckDownloadKeepModpack.Checked = Setup.Get("ToolDownloadKeepModpack")
|
CheckDownloadKeepModpack.Checked = Setup.Get("ToolDownloadKeepModpack")
|
||||||
CheckDownloadIgnoreQuilt.Checked = Setup.Get("ToolDownloadIgnoreQuilt")
|
CheckDownloadIgnoreQuilt.Checked = Setup.Get("ToolDownloadIgnoreQuilt")
|
||||||
CheckDownloadCert.Checked = Setup.Get("ToolDownloadCert")
|
CheckDownloadCert.Checked = Setup.Get("ToolDownloadCert")
|
||||||
@@ -98,7 +92,6 @@
|
|||||||
Setup.Reset("ToolDownloadIgnoreQuilt")
|
Setup.Reset("ToolDownloadIgnoreQuilt")
|
||||||
Setup.Reset("ToolDownloadCert")
|
Setup.Reset("ToolDownloadCert")
|
||||||
Setup.Reset("ToolDownloadMod")
|
Setup.Reset("ToolDownloadMod")
|
||||||
Setup.Reset("ToolDownloadModMirror")
|
|
||||||
Setup.Reset("ToolUpdateRelease")
|
Setup.Reset("ToolUpdateRelease")
|
||||||
Setup.Reset("ToolUpdateSnapshot")
|
Setup.Reset("ToolUpdateSnapshot")
|
||||||
Setup.Reset("ToolHelpChinese")
|
Setup.Reset("ToolHelpChinese")
|
||||||
@@ -120,7 +113,7 @@
|
|||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
'将控件改变路由到设置改变
|
'将控件改变路由到设置改变
|
||||||
Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckDebugMode.Change, CheckDebugDelay.Change, CheckDebugSkipCopy.Change, CheckUpdateRelease.Change, CheckUpdateSnapshot.Change, CheckHelpChinese.Change, CheckDownloadKeepModpack.Change, CheckDownloadIgnoreQuilt.Change, CheckDownloadCert.Change, CheckDownloadModMirror.Change
|
Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckDebugMode.Change, CheckDebugDelay.Change, CheckDebugSkipCopy.Change, CheckUpdateRelease.Change, CheckUpdateSnapshot.Change, CheckHelpChinese.Change, CheckDownloadKeepModpack.Change, CheckDownloadIgnoreQuilt.Change, CheckDownloadCert.Change
|
||||||
If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked)
|
If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked)
|
||||||
End Sub
|
End Sub
|
||||||
Private Shared Sub SliderChange(sender As MySlider, e As Object) Handles SliderDebugAnim.Change, SliderDownloadThread.Change, SliderDownloadSpeed.Change
|
Private Shared Sub SliderChange(sender As MySlider, e As Object) Handles SliderDebugAnim.Change, SliderDownloadThread.Change, SliderDownloadSpeed.Change
|
||||||
@@ -132,14 +125,6 @@
|
|||||||
Private Shared Sub TextBoxChange(sender As MyTextBox, e As Object) Handles TextSystemCache.ValidatedTextChanged
|
Private Shared Sub TextBoxChange(sender As MyTextBox, e As Object) Handles TextSystemCache.ValidatedTextChanged
|
||||||
If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Text)
|
If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Text)
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub ComboDownloadMod_SelectionChanged(sender As MyComboBox, e As Object) Handles ComboDownloadMod.SelectionChanged
|
|
||||||
If CheckDownloadModMirror Is Nothing Then Exit Sub
|
|
||||||
If sender.SelectedItem Is ComboItemDefault Then
|
|
||||||
CheckDownloadModMirror.IsEnabled = False
|
|
||||||
Else
|
|
||||||
CheckDownloadModMirror.IsEnabled = True
|
|
||||||
End If
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
'滑动条
|
'滑动条
|
||||||
Private Sub SliderLoad()
|
Private Sub SliderLoad()
|
||||||
|
|||||||
Reference in New Issue
Block a user