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 }