install: rework ModpackInstaller (incomplete)

This commit is contained in:
2024-06-17 18:30:57 +02:00
parent a4d5fff876
commit 9c43055580
6 changed files with 95 additions and 53 deletions

View File

@@ -1,4 +1,5 @@
Imports System.IO Imports System.IO
Imports System.IO.Compression
Imports System.Net Imports System.Net
Imports System.Net.Http Imports System.Net.Http
@@ -28,17 +29,23 @@ Public Class ModpackInstaller
Return UpdateInfos.Parse(content) Return UpdateInfos.Parse(content)
End Function End Function
Public Async Function CheckForUpdates(ignoreRevmoedFiles As Boolean) As Task(Of UpdateCheckResult) Private Async Function DownloadInstallInfos() As Task(Of InstallInfos)
Dim infos As UpdateInfos = Await DownloadUpdateInfos() Dim content As String = Await httpClient.GetStringAsync(updateConfig.InstallUrl)
Return InstallInfos.Parse(content)
End Function
Public Async Function Check(ignoreRevmoedFiles As Boolean) As Task(Of UpdateCheckResult)
Dim result As New UpdateCheckResult Dim result As New UpdateCheckResult
If infos IsNot Nothing AndAlso infos.Updates.Any Then If ModpackInfo.HasModpackInfo(localPath) Then
Dim infos As UpdateInfos = Await DownloadUpdateInfos()
Dim modpackInfo As ModpackInfo = ModpackInfo.Load(localPath)
If infos IsNot Nothing AndAlso infos.Updates.Count <> 0 Then
Dim updatesOrderes = infos.Updates.OrderByDescending(Function(n) n.Version) Dim updatesOrderes = infos.Updates.OrderByDescending(Function(n) n.Version)
result.LatestVersion = updatesOrderes.First.Version result.LatestVersion = updatesOrderes.First.Version
If ModpackInfo.HasModpackInfo(localPath) Then
Dim modpackInfo As ModpackInfo = ModpackInfo.Load(localPath)
result.CurrentVersion = modpackInfo.Version result.CurrentVersion = modpackInfo.Version
result.IsInstalled = True
Dim checkingVersionIndex As Integer = 0 Dim checkingVersionIndex As Integer = 0
Dim checkingVersion As UpdateInfo = updatesOrderes(checkingVersionIndex) Dim checkingVersion As UpdateInfo = updatesOrderes(checkingVersionIndex)
@@ -47,24 +54,37 @@ Public Class ModpackInstaller
Dim actionsToAdd As New List(Of UpdateAction) Dim actionsToAdd As New List(Of UpdateAction)
For Each action In checkingVersion.Actions For Each action In checkingVersion.Actions
If Not result.UpdateActions.Any(Function(n) n.DestPath = action.DestPath) Then If Not result.Actions.Any(Function(n) n.DestPath = action.DestPath) Then
actionsToAdd.Add(action) actionsToAdd.Add(action)
End If End If
Next Next
result.UpdateActions.InsertRange(0, actionsToAdd) result.Actions.InsertRange(0, actionsToAdd)
checkingVersionIndex += 1 checkingVersionIndex += 1
checkingVersion = updatesOrderes.ElementAtOrDefault(checkingVersionIndex) checkingVersion = updatesOrderes.ElementAtOrDefault(checkingVersionIndex)
Loop Loop
Else
result.HasError = True
End If
End If
If Not result.IsInstalled Then
Dim infos As InstallInfos = Await DownloadInstallInfos()
If infos IsNot Nothing AndAlso infos.Actions.Count <> 0 Then
result.Actions.AddRange(infos.Actions)
Else
result.HasError = True
End If End If
End If End If
Return result Return result
End Function End Function
Public Async Function InstallUpdates(checkResult As UpdateCheckResult) As Task(Of Boolean?) Public Async Function Install(checkResult As UpdateCheckResult) As Task(Of Boolean?)
Dim modpackInfo As ModpackInfo Dim modpackInfo As ModpackInfo
Dim processed As Integer = 0
If ModpackInfo.HasModpackInfo(localPath) Then If ModpackInfo.HasModpackInfo(localPath) Then
modpackInfo = ModpackInfo.Load(localPath) modpackInfo = ModpackInfo.Load(localPath)
@@ -72,20 +92,17 @@ Public Class ModpackInstaller
modpackInfo = New ModpackInfo modpackInfo = New ModpackInfo
End If End If
Dim processed As Integer = 0 For Each iaction As InstallAction In checkResult.Actions
For Each action As UpdateAction In checkResult.UpdateActions Dim destFilePath As String = Path.Combine(localPath, iaction.DestPath)
Dim destFilePath As String = Path.Combine(localPath, action.DestPath)
Select Case action.Type If TypeOf iaction Is UpdateAction Then
Dim uaction As UpdateAction = iaction
Select Case uaction.Type
Case UpdateActionType.Update Case UpdateActionType.Update
Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) Await InstallFile(destFilePath, uaction.DownloadUrl, uaction.IsZip, uaction.ZipPath)
Dim sRemote As Stream = Await httpClient.GetStreamAsync(action.DownloadUrl)
Dim fs As New FileStream(destFilePath, FileMode.Create, FileAccess.ReadWrite)
Await sRemote.CopyToAsync(fs)
sRemote.Close()
fs.Close()
Case UpdateActionType.Delete Case UpdateActionType.Delete
If action.IsDirectory Then If uaction.IsDirectory Then
If Directory.Exists(destFilePath) Then If Directory.Exists(destFilePath) Then
Directory.Delete(destFilePath, True) Directory.Delete(destFilePath, True)
End If End If
@@ -95,18 +112,21 @@ Public Class ModpackInstaller
End If End If
End If End If
Case UpdateActionType.Copy Case UpdateActionType.Copy
Dim srcFilePath As String = Path.Combine(localPath, action.SrcPath) Dim srcFilePath As String = Path.Combine(localPath, uaction.SrcPath)
If File.Exists(srcFilePath) Then If File.Exists(srcFilePath) Then
Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) Directory.CreateDirectory(Path.GetDirectoryName(destFilePath))
File.Copy(srcFilePath, destFilePath, True) File.Copy(srcFilePath, destFilePath, True)
End If End If
Case UpdateActionType.Move Case UpdateActionType.Move
Dim srcFilePath As String = Path.Combine(localPath, action.SrcPath) Dim srcFilePath As String = Path.Combine(localPath, uaction.SrcPath)
If File.Exists(srcFilePath) Then If File.Exists(srcFilePath) Then
Directory.CreateDirectory(Path.GetDirectoryName(destFilePath)) Directory.CreateDirectory(Path.GetDirectoryName(destFilePath))
File.Move(srcFilePath, destFilePath, True) File.Move(srcFilePath, destFilePath, True)
End If End If
End Select End Select
Else
Await InstallFile(destFilePath, iaction.DownloadUrl, iaction.IsZip, iaction.ZipPath)
End If
processed += 1 processed += 1
RaiseEvent InstallProgessUpdated(checkResult, processed) RaiseEvent InstallProgessUpdated(checkResult, processed)
@@ -118,4 +138,23 @@ Public Class ModpackInstaller
Return True Return True
End Function End Function
Private Async Function InstallFile(destFilePath As String, sourceUrl As String, isZip As Boolean, zipPath As String) As Task
Directory.CreateDirectory(Path.GetDirectoryName(destFilePath))
Dim fsDestinationPath As String = If(isZip, Path.Combine(Path.GetTempPath(), $"mc_update_file_{Date.Now.ToBinary}.zip"), destFilePath)
Dim sRemote As Stream = Await httpClient.GetStreamAsync(sourceUrl)
Dim fs As New FileStream(destFilePath, FileMode.Create, FileAccess.ReadWrite)
Await sRemote.CopyToAsync(fs)
sRemote.Close()
fs.Close()
If isZip Then
Dim zipDir As String = $"{Path.GetFileNameWithoutExtension(fsDestinationPath)}_extracted"
ZipFile.ExtractToDirectory(fsDestinationPath, zipDir)
'...
File.Delete(fsDestinationPath)
Directory.Delete(zipDir, True)
End If
End Function
End Class End Class

View File

@@ -5,6 +5,10 @@
<TargetFramework>net8.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<PackageReference Include="System.IO.Compression.ZipFile" Version="4.3.0" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\ModpackUpdater.Model\ModpackUpdater.Model.vbproj" /> <ProjectReference Include="..\ModpackUpdater.Model\ModpackUpdater.Model.vbproj" />
</ItemGroup> </ItemGroup>

View File

@@ -4,12 +4,13 @@ Public Class UpdateCheckResult
Public Property CurrentVersion As Version Public Property CurrentVersion As Version
Public Property LatestVersion As Version Public Property LatestVersion As Version
Public ReadOnly Property UpdateActions As New List(Of UpdateAction) Public ReadOnly Property Actions As New List(Of InstallAction)
Public Property IsInstalled As Boolean
Public Property HasError As Boolean Public Property HasError As Boolean
Public ReadOnly Property HasUpdates As Boolean Public ReadOnly Property HasUpdates As Boolean
Get Get
Return CurrentVersion < LatestVersion Return Not IsInstalled OrElse CurrentVersion < LatestVersion
End Get End Get
End Property End Property

View File

@@ -1,9 +1,8 @@
Imports Newtonsoft.Json.Converters Public Class InstallAction
Public Class InstallAction
Public Property IsZip As Boolean
Public Property ZipPath As String
Public Property DestPath As String Public Property DestPath As String
Public Property DownloadUrl As String Public Property DownloadUrl As String
Public Property IsZip As Boolean
End Class End Class

View File

@@ -2,12 +2,11 @@
Imports Newtonsoft.Json.Converters Imports Newtonsoft.Json.Converters
Public Class UpdateAction Public Class UpdateAction
Inherits InstallAction
<JsonConverter(GetType(StringEnumConverter))> <JsonConverter(GetType(StringEnumConverter))>
Public Property Type As UpdateActionType Public Property Type As UpdateActionType
Public Property DestPath As String
Public Property SrcPath As String Public Property SrcPath As String
Public Property DownloadUrl As String
Public Property IsDirectory As Boolean Public Property IsDirectory As Boolean
End Class End Class

View File

@@ -97,7 +97,7 @@ Public Class Form1
SetStatus(LangRes.StatusText_CheckingForUpdates, MySymbols.icons8_update_16px) SetStatus(LangRes.StatusText_CheckingForUpdates, MySymbols.icons8_update_16px)
Try Try
lastUpdateCheckResult = Await updater.CheckForUpdates(Not AppConfig.Instance.AllowRemoveLocalFiles) lastUpdateCheckResult = Await updater.Check(Not AppConfig.Instance.AllowRemoveLocalFiles)
Catch ex As Exception Catch ex As Exception
SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, MySymbols.icons8_delete_16px) SetStatus(LangRes.StatusText_ErrorWhileUpdateCheckOrUpdate, MySymbols.icons8_delete_16px)
Finally Finally
@@ -112,7 +112,7 @@ Public Class Form1
currentUpdating = True currentUpdating = True
Try Try
If Await updater.InstallUpdates(lastUpdateCheckResult) Then If Await updater.Install(lastUpdateCheckResult) Then
lastUpdateCheckResult = Nothing 'Reset last update check, a new one would be needed now. lastUpdateCheckResult = Nothing 'Reset last update check, a new one would be needed now.
SetStatus(LangRes.StatusTest_EverythingOk, MySymbols.icons8_checkmark_16px) SetStatus(LangRes.StatusTest_EverythingOk, MySymbols.icons8_checkmark_16px)
Else Else
@@ -132,7 +132,7 @@ Public Class Form1
End Function End Function
Private Sub Update_InstallProgessUpdated(result As UpdateCheckResult, processedSyncs As Integer) Private Sub Update_InstallProgessUpdated(result As UpdateCheckResult, processedSyncs As Integer)
Dim actionCount = result.UpdateActions.Count Dim actionCount = result.Actions.Count
SetStatus(Math.Round(processedSyncs / actionCount * 100, 1) & "%", MySymbols.icons8_software_installer_16px) SetStatus(Math.Round(processedSyncs / actionCount * 100, 1) & "%", MySymbols.icons8_software_installer_16px)
End Sub End Sub