diff --git a/app.go b/app.go index 2c9cfee..9b3dd31 100644 --- a/app.go +++ b/app.go @@ -23,4 +23,56 @@ func (a *App) startup(ctx context.Context) { } func (a *App) Close() { runtime.Quit(a.ctx) -} \ No newline at end of file +} + +type AddonResponse struct { + Data Addon `json:"data"` + Error string `json:"error,omitempty"` +} +type AddonsResponse struct { + Data map[string]Addon `json:"data"` + Error string `json:"error,omitempty"` +} +type StringResponse struct { + Data string `json:"data"` + Error string `json:"error,omitempty"` +} + +func (a *App) GetAddons() AddonsResponse { + return AddonsResponse{ + Data: addonService.Addons, + Error: "", + } +} + +func (a *App) GetAddon(name string) AddonResponse { + addon, err := addonService.GetAddon(name) + return AddonResponse{ + Data: addon, + Error: err.Error(), + } +} + +func (a *App) GetAddonRemoteVersion(name string) StringResponse { + version, err := addonService.GetRemoteVersion(name) + return StringResponse{ + Data: version, + Error: err.Error(), + } +} + +func (a *App) GetAddonLocalVersion(name string) StringResponse { + version, err := addonService.GetLocalVersion(name) + return StringResponse{ + Data: version, + Error: err.Error(), + } +} + +func (a *App) UpdateAddon(name string) AddonResponse { + addon, err := addonService.UpdateAddon(name) + return AddonResponse{ + Data: addon, + Error: err.Error(), + } +} diff --git a/frontend/wailsjs/go/main/App.d.ts b/frontend/wailsjs/go/main/App.d.ts index 7e3d876..0f37118 100644 --- a/frontend/wailsjs/go/main/App.d.ts +++ b/frontend/wailsjs/go/main/App.d.ts @@ -1,4 +1,15 @@ // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL // This file is automatically generated. DO NOT EDIT +import {main} from '../models'; export function Close():Promise; + +export function GetAddon(arg1:string):Promise; + +export function GetAddonLocalVersion(arg1:string):Promise; + +export function GetAddonRemoteVersion(arg1:string):Promise; + +export function GetAddons():Promise; + +export function UpdateAddon(arg1:string):Promise; diff --git a/frontend/wailsjs/go/main/App.js b/frontend/wailsjs/go/main/App.js index abd085d..ff79d50 100644 --- a/frontend/wailsjs/go/main/App.js +++ b/frontend/wailsjs/go/main/App.js @@ -5,3 +5,23 @@ export function Close() { return window['go']['main']['App']['Close'](); } + +export function GetAddon(arg1) { + return window['go']['main']['App']['GetAddon'](arg1); +} + +export function GetAddonLocalVersion(arg1) { + return window['go']['main']['App']['GetAddonLocalVersion'](arg1); +} + +export function GetAddonRemoteVersion(arg1) { + return window['go']['main']['App']['GetAddonRemoteVersion'](arg1); +} + +export function GetAddons() { + return window['go']['main']['App']['GetAddons'](); +} + +export function UpdateAddon(arg1) { + return window['go']['main']['App']['UpdateAddon'](arg1); +} diff --git a/frontend/wailsjs/go/models.ts b/frontend/wailsjs/go/models.ts new file mode 100644 index 0000000..a84bbbb --- /dev/null +++ b/frontend/wailsjs/go/models.ts @@ -0,0 +1,97 @@ +export namespace main { + + export class Addon { + name: string; + url: string; + + static createFrom(source: any = {}) { + return new Addon(source); + } + + constructor(source: any = {}) { + if ('string' === typeof source) source = JSON.parse(source); + this.name = source["name"]; + this.url = source["url"]; + } + } + export class AddonResponse { + data: Addon; + error?: string; + + static createFrom(source: any = {}) { + return new AddonResponse(source); + } + + constructor(source: any = {}) { + if ('string' === typeof source) source = JSON.parse(source); + this.data = this.convertValues(source["data"], Addon); + this.error = source["error"]; + } + + convertValues(a: any, classs: any, asMap: boolean = false): any { + if (!a) { + return a; + } + if (a.slice && a.map) { + return (a as any[]).map(elem => this.convertValues(elem, classs)); + } else if ("object" === typeof a) { + if (asMap) { + for (const key of Object.keys(a)) { + a[key] = new classs(a[key]); + } + return a; + } + return new classs(a); + } + return a; + } + } + export class AddonsResponse { + data: {[key: string]: Addon}; + error?: string; + + static createFrom(source: any = {}) { + return new AddonsResponse(source); + } + + constructor(source: any = {}) { + if ('string' === typeof source) source = JSON.parse(source); + this.data = this.convertValues(source["data"], Addon, true); + this.error = source["error"]; + } + + convertValues(a: any, classs: any, asMap: boolean = false): any { + if (!a) { + return a; + } + if (a.slice && a.map) { + return (a as any[]).map(elem => this.convertValues(elem, classs)); + } else if ("object" === typeof a) { + if (asMap) { + for (const key of Object.keys(a)) { + a[key] = new classs(a[key]); + } + return a; + } + return new classs(a); + } + return a; + } + } + export class StringResponse { + data: string; + error?: string; + + static createFrom(source: any = {}) { + return new StringResponse(source); + } + + constructor(source: any = {}) { + if ('string' === typeof source) source = JSON.parse(source); + this.data = source["data"]; + this.error = source["error"]; + } + } + +} + diff --git a/main.go b/main.go index f9e39b3..0570756 100644 --- a/main.go +++ b/main.go @@ -7,7 +7,6 @@ import ( "io" "log" "os" - "os/signal" "github.com/wailsapp/wails/v2" "github.com/wailsapp/wails/v2/pkg/options" @@ -39,45 +38,35 @@ type Settings struct { Addons map[string]Addon `json:"addons"` } +func SaveSettings(settings Settings) error { + log.Printf("Saving settings: %+v", settings) + settingsFile, err := os.OpenFile(settingsFilePath, os.O_RDWR|os.O_CREATE, 0644) + if err != nil { + Error.Printf("error opening settings file: %s", err) + return err + } + defer settingsFile.Close() + return json.NewEncoder(settingsFile).Encode(settings) +} + func main() { settingsFile, err := os.OpenFile(settingsFilePath, os.O_RDWR|os.O_CREATE, 0644) if err != nil { Error.Printf("error opening settings file: %s", err) return } - defer settingsFile.Close() settings := Settings{} err = json.NewDecoder(settingsFile).Decode(&settings) if err != nil { Warning.Printf("error decoding settings: %s", err) settings = Settings{} } + settingsFile.Close() log.Printf("Loaded settings: %+v", settings) addonService = &AddonService{} addonService.Addons = settings.Addons - c := make(chan os.Signal, 1) - signal.Notify(c, os.Interrupt) - go func() { - <-c - err = settingsFile.Truncate(0) - if err != nil { - Error.Printf("error truncating settings file: %s", err) - } - _, err = settingsFile.Seek(0, 0) - if err != nil { - Error.Printf("error seeking settings file: %s", err) - } - err = json.NewEncoder(settingsFile).Encode(settings) - if err != nil { - Error.Printf("error encoding settings: %s", err) - } - settingsFile.Close() - os.Exit(0) - }() - - return app := NewApp() err = wails.Run(&options.App{ @@ -97,4 +86,5 @@ func main() { if err != nil { println("Error:", err.Error()) } + SaveSettings(settings) } diff --git a/settings.json b/settings.json index 0c45f82..83f052b 100644 --- a/settings.json +++ b/settings.json @@ -1,13 +1 @@ -{ - "addons": { - "Channeler": { - "url": "https://git.site.quack-lab.dev/dave/wow_channeler" - }, - "Heimdall": { - "url": "https://git.site.quack-lab.dev/dave/wow-Heimdall" - }, - "Dechickenator": { - "url": "https://git.site.quack-lab.dev/dave/wow_dechickenator" - } - } -} \ No newline at end of file +{"gamePath":"","addons":{"Channeler":{"name":"","url":"https://git.site.quack-lab.dev/dave/wow_channeler"},"Dechickenator":{"name":"","url":"https://git.site.quack-lab.dev/dave/wow_dechickenator"},"Heimdall":{"name":"","url":"https://git.site.quack-lab.dev/dave/wow-Heimdall"}}}