92 lines
1.8 KiB
Go
92 lines
1.8 KiB
Go
package remote
|
|
|
|
import (
|
|
"cloudsave/pkg/game"
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
)
|
|
|
|
type (
|
|
Remote struct {
|
|
URL string `json:"url"`
|
|
GameID string `json:"-"`
|
|
}
|
|
)
|
|
|
|
var (
|
|
roaming string
|
|
datastorepath string
|
|
)
|
|
|
|
func init() {
|
|
var err error
|
|
roaming, err = os.UserConfigDir()
|
|
if err != nil {
|
|
panic("failed to get user config path: " + err.Error())
|
|
}
|
|
|
|
datastorepath = filepath.Join(roaming, "cloudsave", "data")
|
|
err = os.MkdirAll(datastorepath, 0740)
|
|
if err != nil {
|
|
panic("cannot make the datastore:" + err.Error())
|
|
}
|
|
}
|
|
|
|
func All() ([]Remote, error) {
|
|
ds, err := os.ReadDir(datastorepath)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("cannot open the datastore: %w", err)
|
|
}
|
|
|
|
var remotes []Remote
|
|
for _, d := range ds {
|
|
content, err := os.ReadFile(filepath.Join(datastorepath, d.Name(), "remote.json"))
|
|
if err != nil {
|
|
continue
|
|
}
|
|
|
|
var r Remote
|
|
err = json.Unmarshal(content, &r)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("corrupted datastore: failed to parse %s/remote.json: %w", d.Name(), err)
|
|
}
|
|
|
|
content, err = os.ReadFile(filepath.Join(datastorepath, d.Name(), "metadata.json"))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("corrupted datastore: failed to read %s/metadata.json: %w", d.Name(), err)
|
|
}
|
|
|
|
var m game.Metadata
|
|
err = json.Unmarshal(content, &m)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("corrupted datastore: failed to parse %s/metadata.json: %w", d.Name(), err)
|
|
}
|
|
|
|
r.GameID = m.ID
|
|
remotes = append(remotes, r)
|
|
}
|
|
return remotes, nil
|
|
}
|
|
|
|
func Set(gameID, url string) error {
|
|
r := Remote{
|
|
URL: url,
|
|
}
|
|
|
|
f, err := os.OpenFile(filepath.Join(datastorepath, gameID, "remote.json"), os.O_WRONLY|os.O_CREATE, 0740)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer f.Close()
|
|
|
|
e := json.NewEncoder(f)
|
|
err = e.Encode(r)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|