Commit a6ca362a authored by Boris Mühmer's avatar Boris Mühmer
Browse files

added mini commandline tool and started to re-factor

parent 77c7b131
Loading
Loading
Loading
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)
		}
	}
}
+61 −38
Original line number Diff line number Diff line
@@ -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()

@@ -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:
@@ -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)
@@ -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
}