Loading main.go 0 → 100644 +39 −0 Original line number Diff line number Diff line package main import ( "io/ioutil" "log" "path" "regexp" "repositories.muehmer.net/boris.muehmer/sotatool/offline" ) func main() { example01() } // Scan the `sourcedir` for `*.sota` files, and extract the JSON segements // under `destdir`. func example01() { sourcedir := "data/sample/offline/savedgames" //sourcefiles := "data/sample/offline/savedgames/*.sota" destdir := "data/sample/offline/analyse" files, err := ioutil.ReadDir(sourcedir) if err != nil { log.Fatal(err) } re := regexp.MustCompile(".*\\.sota") for _, file := range files { if file.IsDir() { continue } if re.MatchString(file.Name()) { //fmt.Println(file.Name()) savegame.DumpJSONContents(path.Join(sourcedir, file.Name()), destdir) } } } offline/savegame.go +61 −38 Original line number Diff line number Diff line Loading @@ -3,25 +3,20 @@ package savegame import ( "encoding/json" "encoding/xml" "errors" "fmt" "io" "os" "path" "strings" "repositories.muehmer.net/boris.muehmer/sotatool/offline/data" ) // Decode an save-game file to an internal structure. func Decode(filename string) (savegame *data.SaveGame, e error) { savegame = &data.SaveGame{} e = nil // savegame2xml converts an save game to the XML structure func savegame2xml(filename string) (*data.Database, error) { f, err := os.Open(filename) if err != nil { es := "failed to open file " + filename e = errors.New(es) return return nil, fmt.Errorf("failed to open file", filename) } defer f.Close() Loading @@ -31,7 +26,7 @@ func Decode(filename string) (savegame *data.SaveGame, e error) { if err == io.EOF { break } else if err != nil { fmt.Errorf("xmlselect: %v", err) return nil, fmt.Errorf("xmlselect: %v", err) } switch se := tok.(type) { case xml.StartElement: Loading @@ -40,10 +35,24 @@ func Decode(filename string) (savegame *data.SaveGame, e error) { var database data.Database xe := xdec.DecodeElement(&database, &se) if xe != nil { fmt.Errorf("decode element failed: %v", xe) e = xe return return nil, fmt.Errorf("decode element failed: %v", xe) } return &database, nil default: return nil, fmt.Errorf("unknown token %s", tok) } } } return nil, fmt.Errorf("not implemented yet") } // Decode an save-game file to an internal structure. func Decode(filename string) (savegame *data.SaveGame, e error) { database, err := savegame2xml(filename) if err != nil { return nil, err } fmt.Printf("database build %s\n", database.Build) for i, c := range database.Collections.Collection { fmt.Printf("collection %s (%d)\n", c.Name, i+1) Loading @@ -66,14 +75,28 @@ func Decode(filename string) (savegame *data.SaveGame, e error) { fmt.Errorf("failed to decode generic JSON: %v", jerr) } } //fmt.Printf("JSON: %s", r.DataJSON) } } default: fmt.Errorf("unknown token %s", tok) return } func DumpJSONContents(filepath string, destdir string) error { _, filename := path.Split(filepath) database, err := savegame2xml(filepath) if err != nil { return err } fmt.Printf("file: %s\n", filename) for i, c := range database.Collections.Collection { fmt.Printf(" - collection %s (%d)\n", c.Name, i) for j, r := range c.Records.Record { fmt.Printf(" - record %s (%d)\n", r.ID, j) // beautify JSON and dump to file } } return return nil } Loading
main.go 0 → 100644 +39 −0 Original line number Diff line number Diff line package main import ( "io/ioutil" "log" "path" "regexp" "repositories.muehmer.net/boris.muehmer/sotatool/offline" ) func main() { example01() } // Scan the `sourcedir` for `*.sota` files, and extract the JSON segements // under `destdir`. func example01() { sourcedir := "data/sample/offline/savedgames" //sourcefiles := "data/sample/offline/savedgames/*.sota" destdir := "data/sample/offline/analyse" files, err := ioutil.ReadDir(sourcedir) if err != nil { log.Fatal(err) } re := regexp.MustCompile(".*\\.sota") for _, file := range files { if file.IsDir() { continue } if re.MatchString(file.Name()) { //fmt.Println(file.Name()) savegame.DumpJSONContents(path.Join(sourcedir, file.Name()), destdir) } } }
offline/savegame.go +61 −38 Original line number Diff line number Diff line Loading @@ -3,25 +3,20 @@ package savegame import ( "encoding/json" "encoding/xml" "errors" "fmt" "io" "os" "path" "strings" "repositories.muehmer.net/boris.muehmer/sotatool/offline/data" ) // Decode an save-game file to an internal structure. func Decode(filename string) (savegame *data.SaveGame, e error) { savegame = &data.SaveGame{} e = nil // savegame2xml converts an save game to the XML structure func savegame2xml(filename string) (*data.Database, error) { f, err := os.Open(filename) if err != nil { es := "failed to open file " + filename e = errors.New(es) return return nil, fmt.Errorf("failed to open file", filename) } defer f.Close() Loading @@ -31,7 +26,7 @@ func Decode(filename string) (savegame *data.SaveGame, e error) { if err == io.EOF { break } else if err != nil { fmt.Errorf("xmlselect: %v", err) return nil, fmt.Errorf("xmlselect: %v", err) } switch se := tok.(type) { case xml.StartElement: Loading @@ -40,10 +35,24 @@ func Decode(filename string) (savegame *data.SaveGame, e error) { var database data.Database xe := xdec.DecodeElement(&database, &se) if xe != nil { fmt.Errorf("decode element failed: %v", xe) e = xe return return nil, fmt.Errorf("decode element failed: %v", xe) } return &database, nil default: return nil, fmt.Errorf("unknown token %s", tok) } } } return nil, fmt.Errorf("not implemented yet") } // Decode an save-game file to an internal structure. func Decode(filename string) (savegame *data.SaveGame, e error) { database, err := savegame2xml(filename) if err != nil { return nil, err } fmt.Printf("database build %s\n", database.Build) for i, c := range database.Collections.Collection { fmt.Printf("collection %s (%d)\n", c.Name, i+1) Loading @@ -66,14 +75,28 @@ func Decode(filename string) (savegame *data.SaveGame, e error) { fmt.Errorf("failed to decode generic JSON: %v", jerr) } } //fmt.Printf("JSON: %s", r.DataJSON) } } default: fmt.Errorf("unknown token %s", tok) return } func DumpJSONContents(filepath string, destdir string) error { _, filename := path.Split(filepath) database, err := savegame2xml(filepath) if err != nil { return err } fmt.Printf("file: %s\n", filename) for i, c := range database.Collections.Collection { fmt.Printf(" - collection %s (%d)\n", c.Name, i) for j, r := range c.Records.Record { fmt.Printf(" - record %s (%d)\n", r.ID, j) // beautify JSON and dump to file } } return return nil }