Files
steamcmd-api/avorion-ship-design-copy/main.go
2024-09-17 10:47:26 +02:00

144 lines
3.8 KiB
Go

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
}