diff options
-rw-r--r-- | tools/updater/updater.go | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/tools/updater/updater.go b/tools/updater/updater.go new file mode 100644 index 0000000..ec778a3 --- /dev/null +++ b/tools/updater/updater.go @@ -0,0 +1,145 @@ +package main + +import ( + "fmt" + "strings" + "flag" + "errors" + "net/http" + "os" + "io" + "io/ioutil" + "encoding/json" +) + +type VersionMeta struct { + Poi VersionData `json:"poi"` +} + +type VersionData struct { + Version string `json:"version"` + Patch int `json:"patch"` + Commit string `json:"commit"` +} + +func parseJson(name string) (ver VersionMeta, err error) { + var reader io.Reader + + if strings.HasPrefix(name, "https://") { + // Grabbing stuff over https + resp, e := http.Get(name) + if resp.StatusCode != 200 { + e = errors.New("HTTP response not OK") + } + if e != nil { + fmt.Println("| Error encountered getting version.json: ", e) + } + defer resp.Body.Close() + reader = resp.Body + err = e + + } else { + // FIXME Assuming we're grabbing a local file + r, e := os.Open(name) + if e != nil { + fmt.Println("| Error opening file: ", e) + } + defer r.Close() + reader = r + err = e + } + + if err == nil { + body, err := ioutil.ReadAll(reader) + if err != nil { + fmt.Println("| Error encountered reading body") + } + + err = json.Unmarshal(body, &ver) + } + + return +} + +// left > right r -> 1 +// left = right r -> 0 +// left < right r -> -1 +func compareVersion(left, right string) (ret int) { + if strings.Compare(left, right) == 0 { + ret = 0 + return + } + + l := strings.Split(left, ".") + r := strings.Split(right, ".") + + for i := 0; i < 3; i++ { + if l[i] > r[i] { + ret = 1 + break + } else if l[i] < r[i] { + ret = -1 + break + } + } + + return +} + +func main() { + fmt.Println("[ smolbote updater ]") + + // read local version.json + localFlag := flag.Bool("local", true, "Read local version.json") + // read remote version.json + remoteFlag := flag.Bool("remote", true, "Read remote version.json") + // download update + downloadFlag := flag.Bool("download", false, "Download update") + // install update + installFlag := flag.Bool("install", false, "Install update") + + flag.Parse() + + var local VersionMeta + var remote VersionMeta + var err error + + if *localFlag { + fmt.Println("+ Reading local version.json") + local, err = parseJson("version.json") + if err == nil { + fmt.Println(fmt.Sprintf("| Got poi [%s-%d-%s]", local.Poi.Version, local.Poi.Patch, local.Poi.Commit)) + } else { + // there has been an error reading the local version.json + *localFlag = false + } + fmt.Println("\\ done") + } + + if *remoteFlag { + fmt.Println("+ Reading remote version.json") + remote, err = parseJson("https://neueland.iserlohn-fortress.net/version.json") + if err == nil { + fmt.Println(fmt.Sprintf("| Got poi [%s-%d-%s]", remote.Poi.Version, remote.Poi.Patch, remote.Poi.Commit)) + } + + comp := compareVersion(local.Poi.Version, remote.Poi.Version) + if comp >= 0 { + fmt.Println("| poi up to poi") + } else { // comp < 0 + fmt.Println("| poi out of poi") + } + + fmt.Println("\\ done") + } + + if *downloadFlag { + fmt.Println("+ Downloading update") + fmt.Println("\\ done") + } + + if *installFlag { + fmt.Println("+ Installing update") + fmt.Println("\\ done") + } +} |