Files
galaxy-game/client/loader/download.go
T
2026-03-16 15:48:00 +02:00

85 lines
2.2 KiB
Go

package loader
import (
"errors"
"fmt"
"galaxy/connector"
"galaxy/util"
)
func (l *loader) checkAndDownloadPluginVersion() error {
versions, err := l.connector.CheckVersion()
if err != nil {
return err
} else if latest, ok, err := latestVersion(versions); err != nil {
return err
} else if ok {
return l.preparePluginVersion(latest)
} else {
return errors.New("Server did not respond with a suitable client version")
}
}
// preparePluginVersion fetches and stores given version of plugin artifact, if newer to the current known version.
func (l *loader) preparePluginVersion(v connector.VersionInfo) error {
s, exists, err := l.loadCurrentState()
if err != nil {
return err
}
version, err := util.ParseSemver(v.Version)
if err != nil {
return err
}
if exists {
currentVersion, err := util.ParseSemver(s.ClientCurrentVersion)
if err != nil {
return err
}
if util.CompareSemver(currentVersion, version) > 0 {
return nil
}
}
err = l.downloadPlugin(v.URL, v.Version, v.Checksum)
if err != nil {
return err
}
return nil
}
// downloadPlugin downloads and stores at the App's local storage with a pre-defined name with semver suffix.
func (l *loader) downloadPlugin(url, version string, checksum [32]byte) error {
data, err := l.connector.DownloadVersion(url)
if err != nil {
return fmt.Errorf("Plugin v%s download error: %w", version, err)
}
dataChecksum := SumSHA256(data)
if !EqualSHA256(checksum, dataChecksum) {
return errors.New("Downloaded pligin checksum incorrect")
}
versionFileName := resolvePluginFile(version)
versionFileExists, _, err := l.storage.FileExists(versionFileName)
if err != nil {
return fmt.Errorf("Check plugin v%s exists error: %w", version, err)
}
if versionFileExists {
storedData, err := l.storage.ReadFile(versionFileName)
if err != nil {
return err
}
if EqualSHA256(dataChecksum, SumSHA256(storedData)) {
return nil
}
if err := l.storage.DeleteFile(versionFileName); err != nil {
return fmt.Errorf("Plugin v%s delete error: %w", version, err)
}
}
err = l.storage.WriteFile(versionFileName, data)
if err != nil {
return fmt.Errorf("Plugin file write error: %w", err)
}
if err := l.setNextVersion(&version); err != nil {
return err
}
return nil
}