Implement frontend api

This commit is contained in:
2025-01-11 20:37:21 +01:00
parent 75d92a2542
commit 4a6a2cf057
6 changed files with 195 additions and 37 deletions

54
app.go
View File

@@ -23,4 +23,56 @@ func (a *App) startup(ctx context.Context) {
} }
func (a *App) Close() { func (a *App) Close() {
runtime.Quit(a.ctx) runtime.Quit(a.ctx)
} }
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(),
}
}

View File

@@ -1,4 +1,15 @@
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT // This file is automatically generated. DO NOT EDIT
import {main} from '../models';
export function Close():Promise<void>; export function Close():Promise<void>;
export function GetAddon(arg1:string):Promise<main.AddonResponse>;
export function GetAddonLocalVersion(arg1:string):Promise<main.StringResponse>;
export function GetAddonRemoteVersion(arg1:string):Promise<main.StringResponse>;
export function GetAddons():Promise<main.AddonsResponse>;
export function UpdateAddon(arg1:string):Promise<main.AddonResponse>;

View File

@@ -5,3 +5,23 @@
export function Close() { export function Close() {
return window['go']['main']['App']['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);
}

View File

@@ -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"];
}
}
}

36
main.go
View File

@@ -7,7 +7,6 @@ import (
"io" "io"
"log" "log"
"os" "os"
"os/signal"
"github.com/wailsapp/wails/v2" "github.com/wailsapp/wails/v2"
"github.com/wailsapp/wails/v2/pkg/options" "github.com/wailsapp/wails/v2/pkg/options"
@@ -39,45 +38,35 @@ type Settings struct {
Addons map[string]Addon `json:"addons"` 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() { func main() {
settingsFile, err := os.OpenFile(settingsFilePath, os.O_RDWR|os.O_CREATE, 0644) settingsFile, err := os.OpenFile(settingsFilePath, os.O_RDWR|os.O_CREATE, 0644)
if err != nil { if err != nil {
Error.Printf("error opening settings file: %s", err) Error.Printf("error opening settings file: %s", err)
return return
} }
defer settingsFile.Close()
settings := Settings{} settings := Settings{}
err = json.NewDecoder(settingsFile).Decode(&settings) err = json.NewDecoder(settingsFile).Decode(&settings)
if err != nil { if err != nil {
Warning.Printf("error decoding settings: %s", err) Warning.Printf("error decoding settings: %s", err)
settings = Settings{} settings = Settings{}
} }
settingsFile.Close()
log.Printf("Loaded settings: %+v", settings) log.Printf("Loaded settings: %+v", settings)
addonService = &AddonService{} addonService = &AddonService{}
addonService.Addons = settings.Addons 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() app := NewApp()
err = wails.Run(&options.App{ err = wails.Run(&options.App{
@@ -97,4 +86,5 @@ func main() {
if err != nil { if err != nil {
println("Error:", err.Error()) println("Error:", err.Error())
} }
SaveSettings(settings)
} }

View File

@@ -1,13 +1 @@
{ {"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"}}}
"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"
}
}
}