Implement downloading releases

This commit is contained in:
2025-01-11 15:26:05 +01:00
parent 863098f3ce
commit e36f46bd8c
2 changed files with 55 additions and 43 deletions

80
main.go
View File

@@ -10,7 +10,6 @@ import (
"os" "os"
"path/filepath" "path/filepath"
"regexp" "regexp"
"strings"
"github.com/wailsapp/wails/v2" "github.com/wailsapp/wails/v2"
"github.com/wailsapp/wails/v2/pkg/options" "github.com/wailsapp/wails/v2/pkg/options"
@@ -56,82 +55,79 @@ var addons = []*Addon{
NewAddon("Channeler", "https://git.site.quack-lab.dev/dave/wow_channeler"), NewAddon("Channeler", "https://git.site.quack-lab.dev/dave/wow_channeler"),
} }
func (a *Addon) GetRemoteToc() *url.URL { func (a *Addon) GetRemoteTocURL() *url.URL {
return a.URL.JoinPath("raw", "branch", "master", a.Name+".toc") return a.URL.JoinPath("raw", "branch", "master", a.Name+".toc")
} }
func (a *Addon) GetLocalToc() string { func (a *Addon) GetRemoteReleaseURL() *url.URL {
return a.URL.JoinPath("media", "branch", "master", a.Name+".zip")
}
func (a *Addon) GetRemoteRelease() (body []byte, err error) {
url := a.GetRemoteReleaseURL()
response, err := http.Get(url.String())
if err != nil {
return nil, fmt.Errorf("error getting remote release: %w", err)
}
return io.ReadAll(response.Body)
}
func (a *Addon) GetLocalTocPath() string {
return filepath.Join(gamePath, "Interface", "AddOns", a.Name, a.Name+".toc") return filepath.Join(gamePath, "Interface", "AddOns", a.Name, a.Name+".toc")
} }
func (a *Addon) GetRemoteVersion() (version string, err error) { func (a *Addon) GetRemoteVersion() (version string, err error) {
url := a.GetRemoteToc() url := a.GetRemoteTocURL()
log.Printf("Fetching remote version from %s", url.String()) log.Printf("Fetching remote version from %s", url.String())
response, err := http.Get(url.String()) response, err := http.Get(url.String())
if err != nil { if err != nil {
log.Printf("error getting remote version: %s", err) return "", fmt.Errorf("error getting remote version: %w", err)
return "", err
} }
if response.StatusCode != http.StatusOK { if response.StatusCode != http.StatusOK {
log.Printf("error getting remote version: %s", response.Status) return "", fmt.Errorf("error getting remote version with status: %s", response.Status)
return "", fmt.Errorf("error getting remote version: %s", response.Status)
} }
defer response.Body.Close() defer response.Body.Close()
body, err := io.ReadAll(response.Body) body, err := io.ReadAll(response.Body)
if err != nil { if err != nil {
log.Printf("error reading remote version: %s", err) return "", fmt.Errorf("error reading remote version: %w", err)
return "", err
} }
log.Printf("Remote version: %s", string(body)) return GetVersion(string(body))
lines := strings.Split(string(body), "\n")
for _, line := range lines {
if strings.HasPrefix(line, "## Version") {
version := versionRegex.FindString(line)
log.Printf("remote version: %s", version)
return version, nil
}
}
return "", fmt.Errorf("no version found")
} }
func (a *Addon) GetLocalVersion() string { func (a *Addon) GetLocalVersion() (version string, err error) {
file, err := os.Open(a.GetLocalToc()) file, err := os.Open(a.GetLocalTocPath())
if err != nil { if err != nil {
log.Printf("error opening local toc: %s", err) return "", fmt.Errorf("error opening local toc: %w", err)
return ""
} }
defer file.Close() defer file.Close()
body, err := io.ReadAll(file) body, err := io.ReadAll(file)
if err != nil { if err != nil {
log.Printf("error reading local toc: %s", err) return "", fmt.Errorf("error reading local toc: %w", err)
return ""
} }
lines := strings.Split(string(body), "\n") return GetVersion(string(body))
for _, line := range lines { }
if strings.HasPrefix(line, "## Version") { func (a *Addon) IsUpToDate() bool {
version := strings.TrimSpace(strings.TrimPrefix(line, "## Version")) remoteVersion, err := a.GetRemoteVersion()
log.Printf("local version: %s", version) if err != nil {
return version return false
}
} }
return "" localVersion, err := a.GetLocalVersion()
if err != nil {
return false
}
return remoteVersion == localVersion
} }
func main() { func main() {
gamePath = filepath.Join("C:\\", "Games", "WoWRuski") gamePath = filepath.Join("C:\\", "Games", "WoWRuski")
for _, addon := range addons { for _, addon := range addons {
log.Printf("%#v", addon.GetLocalToc()) log.Printf("%#v", addon.IsUpToDate())
log.Printf("%#v", addon.GetRemoteToc()) log.Printf("%#v", addon.GetRemoteReleaseURL())
remoteVersion, err := addon.GetRemoteVersion() body, err := addon.GetRemoteRelease()
if err != nil { if err != nil {
log.Printf("error getting remote version: %s", err) log.Printf("error getting remote release: %s", err)
continue continue
} }
log.Printf("%#v", remoteVersion) log.Printf("%#v", string(body))
log.Printf("%#v", addon.GetLocalVersion())
} }
return return
// Create an instance of the app structure
app := NewApp() app := NewApp()
// Create application with options
err := wails.Run(&options.App{ err := wails.Run(&options.App{
Title: "wails-template", Title: "wails-template",
Width: 1024, Width: 1024,

View File

@@ -1 +1,17 @@
package main package main
import (
"fmt"
"strings"
)
func GetVersion(data string) (version string, err error) {
lines := strings.Split(data, "\n")
for _, line := range lines {
version = versionRegex.FindString(line)
if version != "" {
return version, nil
}
}
return "", fmt.Errorf("no version found")
}