commit 736944c9a0c54ccee17b1d2ef891cb92ac2e236d Author: Merith-TK Date: Sun Apr 16 16:46:55 2023 -0700 add core func diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..31a17b4 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module jar-dedup + +go 1.20 diff --git a/main.go b/main.go new file mode 100644 index 0000000..3325ec3 --- /dev/null +++ b/main.go @@ -0,0 +1,107 @@ +package main + +import ( + "archive/zip" + "encoding/json" + "io/ioutil" + "log" + "os" +) + +// Fabric/Quilt Mod Json +type FabricModJson struct { + ID string `json:"id"` + Version string `json:"version"` + Name string `json:"name"` +} +type QuiltModJson struct { + QuiltLoader struct { + ID string `json:"id"` + Version string `json:"version"` + Metadata struct { + Name string `json:"name"` + } `json:"metadata"` + } `json:"quilt_loader"` +} + +var ( + fabricMods []FabricModJson + quiltMods []QuiltModJson +) + +// deduplicate mod jars based off the name of the jar +// if the jar name is the same, then we will only keep the one with the highest version +// or the latest modified date +func main() { + // get list of jars in ./mods + files, err := ioutil.ReadDir("./mods") + if err != nil { + log.Fatalln("[READ DIR]", err) + } + + // for modjars, + for _, file := range files { + // read the mod.json file and return the name, version, and filename + name, version, loader := readMod("./mods/" + file.Name()) + if loader != "" { + // rename the file to Name-Version.jar + err := os.Rename("./mods/"+file.Name(), "./mods/"+name+"-"+version+".jar") + if err != nil { + log.Fatalln("[RENAME MOD]", err) + } + log.Println(loader, name, version) + } else { + log.Println("Unsupported Loader", file.Name()) + } + } + for _, mod := range fabricMods { + // check if there is a duplicate in the list + for _, mod2 := range fabricMods { + if mod.Name == mod2.Name && mod.Version != mod2.Version { + // if there is a duplicate, delete the one with the lower semver version + if mod.Version < mod2.Version { + err := os.Remove("./mods/" + mod.Name + "-" + mod.Version + ".jar") + if err != nil { + log.Fatalln("[REMOVE MOD]", err) + } + } + } + } + } + +} + +// read the mod.json file and return the name, version, and filename + +func readMod(filename string) (string, string, string) { + var fabricJson FabricModJson + var quiltJson QuiltModJson + var loader string + zipReader, err := zip.OpenReader(filename) + if err != nil { + log.Fatalln("[READ ZIP]", err) + } + defer zipReader.Close() + for _, file := range zipReader.File { + contents, _ := file.Open() + if file.Name == "fabric.mod.json" { + loader = "fabric" + // add to fabric list + json.NewDecoder(contents).Decode(&fabricJson) + } + if file.Name == "quilt.mod.json" { + loader = "quilt" + json.NewDecoder(contents).Decode(&quiltJson) + } + } + + if loader == "fabric" { + fabricMods = append(fabricMods, fabricJson) + return fabricJson.Name, fabricJson.Version, loader + } + if loader == "quilt" { + quiltMods = append(quiltMods, quiltJson) + return quiltJson.QuiltLoader.Metadata.Name, quiltJson.QuiltLoader.Version, loader + } + return "", "", "" +}