diff --git a/avorion-ship-design-copy/go.mod b/avorion-ship-design-copy/go.mod new file mode 100644 index 0000000..d0ffdee --- /dev/null +++ b/avorion-ship-design-copy/go.mod @@ -0,0 +1,3 @@ +module avorion-ship-design-copier + +go 1.23.0 diff --git a/avorion-ship-design-copy/main.go b/avorion-ship-design-copy/main.go new file mode 100644 index 0000000..f2fa79e --- /dev/null +++ b/avorion-ship-design-copy/main.go @@ -0,0 +1,143 @@ +package main + +import ( + "fmt" + "io" + "log" + "os" + "os/exec" + "path/filepath" + "sync" +) + +var Error *log.Logger +var Warning *log.Logger + +func init() { + log.SetFlags(log.Ldate | log.Lshortfile) + logFile, err := os.Create("main.log") + if err != nil { + log.Printf("Error creating log file: %v", err) + os.Exit(1) + } + logger := io.MultiWriter(os.Stdout, logFile) + log.SetOutput(logger) + + Error = log.New(io.MultiWriter(logFile, os.Stderr, os.Stdout), + fmt.Sprintf("%sERROR:%s ", "\033[0;101m", "\033[0m"), + log.Ldate|log.Lshortfile) + Warning = log.New(io.MultiWriter(logFile, os.Stdout), + fmt.Sprintf("%sWarning:%s ", "\033[0;93m", "\033[0m"), + log.Ldate|log.Lshortfile) +} + +var steamWorkshopContentDir = `C:/Users/Administrator/Seafile/Projects-Go/GoProjects/steamcmd-api/steamcmd/steamapps/workshop/content/445220` +var avorionRoaming = `C:/Users/Administrator/AppData/Roaming/Avorion` + +func main() { + steamWorkshopContentDir, _ = filepath.Abs(steamWorkshopContentDir) + files, err := os.ReadDir(steamWorkshopContentDir) + if err != nil { + Error.Printf("Error reading steam workshop content dir: %v", err) + return + } + + wg := sync.WaitGroup{} + for _, file := range files { + wg.Add(1) + go func(file os.DirEntry) { + defer wg.Done() + + if !file.IsDir() { + return + } + + src := filepath.Join(steamWorkshopContentDir, file.Name()) + modFile := filepath.Join(steamWorkshopContentDir, file.Name(), "modinfo.lua") + fileHandle, err := os.Open(modFile) + if err != nil { + if !os.IsNotExist(err) { + Error.Printf("Error opening mod file '%s': '%v'", modFile, err) + return + } else { + log.Printf("Mod '%s' is a ship!", src) + dst := filepath.Join(avorionRoaming, "ships", "workshop", file.Name()) + err2 := Copy(src, dst) + if err2 != nil { + Error.Printf("Error copying '%s' to '%s': '%v'", src, dst, err2) + return + } + + shipFileSrc := filepath.Join(steamWorkshopContentDir, file.Name(), "design.xml") + planFileSrc := filepath.Join(steamWorkshopContentDir, file.Name(), "plan.xml") + turretFileSrc := filepath.Join(steamWorkshopContentDir, file.Name(), "turretdesign.xml") + + shipFileDst := filepath.Join(avorionRoaming, "ships", "ships", file.Name()+".ship.xml") + planFileDst := filepath.Join(avorionRoaming, "ships", "plans", file.Name()+".plan.xml") + turretFileDst := filepath.Join(avorionRoaming, "ships", "turrets", file.Name()+".turret.xml") + + if FileExists(shipFileSrc) { + err := Copy(shipFileSrc, shipFileDst) + if err != nil { + Error.Printf("Error copying '%s' to '%s': '%v'", shipFileSrc, shipFileDst, err) + return + } + } + + if FileExists(planFileSrc) { + err := Copy(planFileSrc, planFileDst) + if err != nil { + Error.Printf("Error copying '%s' to '%s': '%v'", planFileSrc, planFileDst, err) + return + } + } + + if FileExists(turretFileSrc) { + err := Copy(turretFileSrc, turretFileDst) + if err != nil { + Error.Printf("Error copying '%s' to '%s': '%v'", turretFileSrc, turretFileDst, err) + return + } + } + } + } + if err == nil { + log.Printf("'%s' is a mod, not a ship, skipping", src) + fileHandle.Close() + return + } + }(file) + } + wg.Wait() +} + +func Copy(src, dst string) error { + cmd := exec.Command("cp", "-a", src, dst) + out, err := cmd.CombinedOutput() + if err != nil { + return fmt.Errorf("error copying '%s' to '%s': %v\n%s", src, dst, err, string(out)) + } + return nil +} + +func FileExists(path string) bool { + fileHandle, err := os.Open(path) + if err == nil { + fileHandle.Close() + return true + } + if err != nil { + if os.IsNotExist(err) { + return false + } + _, err2 := os.Stat(path) + if err == nil { + return true + } + if os.IsNotExist(err2) { + return false + } + return false + } + return false +} diff --git a/avorion-ship-design-copy/main.log b/avorion-ship-design-copy/main.log new file mode 100644 index 0000000..db9ab1e --- /dev/null +++ b/avorion-ship-design-copy/main.log @@ -0,0 +1,20 @@ +2024/09/17 main.go:63: Mod 'C:\Users\Administrator\Seafile\Projects-Go\GoProjects\steamcmd-api\steamcmd\steamapps\workshop\content\445220\2448424958' is a ship! +2024/09/17 main.go:63: Mod 'C:\Users\Administrator\Seafile\Projects-Go\GoProjects\steamcmd-api\steamcmd\steamapps\workshop\content\445220\2547911644' is a ship! +2024/09/17 main.go:63: Mod 'C:\Users\Administrator\Seafile\Projects-Go\GoProjects\steamcmd-api\steamcmd\steamapps\workshop\content\445220\2448461336' is a ship! +2024/09/17 main.go:63: Mod 'C:\Users\Administrator\Seafile\Projects-Go\GoProjects\steamcmd-api\steamcmd\steamapps\workshop\content\445220\2448470414' is a ship! +2024/09/17 main.go:63: Mod 'C:\Users\Administrator\Seafile\Projects-Go\GoProjects\steamcmd-api\steamcmd\steamapps\workshop\content\445220\2448426634' is a ship! +2024/09/17 main.go:63: Mod 'C:\Users\Administrator\Seafile\Projects-Go\GoProjects\steamcmd-api\steamcmd\steamapps\workshop\content\445220\2870507130' is a ship! +2024/09/17 main.go:63: Mod 'C:\Users\Administrator\Seafile\Projects-Go\GoProjects\steamcmd-api\steamcmd\steamapps\workshop\content\445220\2547912835' is a ship! +2024/09/17 main.go:63: Mod 'C:\Users\Administrator\Seafile\Projects-Go\GoProjects\steamcmd-api\steamcmd\steamapps\workshop\content\445220\2547904213' is a ship! +2024/09/17 main.go:63: Mod 'C:\Users\Administrator\Seafile\Projects-Go\GoProjects\steamcmd-api\steamcmd\steamapps\workshop\content\445220\2547927481' is a ship! +2024/09/17 main.go:63: Mod 'C:\Users\Administrator\Seafile\Projects-Go\GoProjects\steamcmd-api\steamcmd\steamapps\workshop\content\445220\2547918360' is a ship! +2024/09/17 main.go:63: Mod 'C:\Users\Administrator\Seafile\Projects-Go\GoProjects\steamcmd-api\steamcmd\steamapps\workshop\content\445220\2547910789' is a ship! +2024/09/17 main.go:63: Mod 'C:\Users\Administrator\Seafile\Projects-Go\GoProjects\steamcmd-api\steamcmd\steamapps\workshop\content\445220\2547929251' is a ship! +2024/09/17 main.go:63: Mod 'C:\Users\Administrator\Seafile\Projects-Go\GoProjects\steamcmd-api\steamcmd\steamapps\workshop\content\445220\2547919133' is a ship! +2024/09/17 main.go:63: Mod 'C:\Users\Administrator\Seafile\Projects-Go\GoProjects\steamcmd-api\steamcmd\steamapps\workshop\content\445220\2547926761' is a ship! +2024/09/17 main.go:63: Mod 'C:\Users\Administrator\Seafile\Projects-Go\GoProjects\steamcmd-api\steamcmd\steamapps\workshop\content\445220\2832727474' is a ship! +2024/09/17 main.go:63: Mod 'C:\Users\Administrator\Seafile\Projects-Go\GoProjects\steamcmd-api\steamcmd\steamapps\workshop\content\445220\2448476238' is a ship! +2024/09/17 main.go:63: Mod 'C:\Users\Administrator\Seafile\Projects-Go\GoProjects\steamcmd-api\steamcmd\steamapps\workshop\content\445220\2547881665' is a ship! +2024/09/17 main.go:63: Mod 'C:\Users\Administrator\Seafile\Projects-Go\GoProjects\steamcmd-api\steamcmd\steamapps\workshop\content\445220\2547891637' is a ship! +2024/09/17 main.go:63: Mod 'C:\Users\Administrator\Seafile\Projects-Go\GoProjects\steamcmd-api\steamcmd\steamapps\workshop\content\445220\2842358106' is a ship! +2024/09/17 main.go:63: Mod 'C:\Users\Administrator\Seafile\Projects-Go\GoProjects\steamcmd-api\steamcmd\steamapps\workshop\content\445220\2547890050' is a ship!