Started work on adding mod downloader
Read from mod-list.json in mod dir and download each mod in list. This requires reading from factorio mod portal api, and extracting download url and calling it with username and api token. new field in config.yml username and apitoken, is needed to download mod files from mod.factorio.com
This commit is contained in:
21
cli.go
21
cli.go
@@ -6,7 +6,8 @@ import (
|
||||
)
|
||||
|
||||
func cliToolMode() {
|
||||
var c = readCfg(fmConfig)
|
||||
var c = readCfg("config.yml")
|
||||
modlist := string(c.Server.ServDir) + "/mods/mod-list.json"
|
||||
if verifyConfig(c) {
|
||||
if len(os.Args) > 1 {
|
||||
switch os.Args[1] {
|
||||
@@ -18,6 +19,22 @@ func cliToolMode() {
|
||||
fmt.Printf("Start Server: %s start\nStop Server: %s stop\n", os.Args[0], os.Args[0])
|
||||
fmt.Printf("Run backup\n\tFull backup: %s backup full", os.Args[0])
|
||||
fmt.Printf("\n\tBackup saves: %s backup saves\n", os.Args[0])
|
||||
case "mod":
|
||||
if len(os.Args) > 2 {
|
||||
switch os.Args[2] {
|
||||
case "download":
|
||||
if !findmodlist(modlist) {
|
||||
fmt.Printf("FAILED TO FIND MOD LIST")
|
||||
} else {
|
||||
fmt.Printf("found %s\n", modlist)
|
||||
downloadMods(modlist)
|
||||
}
|
||||
default:
|
||||
fmt.Println("Invalid mod option: use 'update'")
|
||||
}
|
||||
} else {
|
||||
fmt.Println("Missing mod option: use 'update'")
|
||||
}
|
||||
case "backup":
|
||||
if len(os.Args) > 2 {
|
||||
switch os.Args[2] {
|
||||
@@ -35,7 +52,7 @@ func cliToolMode() {
|
||||
fmt.Printf("Unknown command: %s. Use 'start', 'stop', or 'backup'.\n", os.Args[1])
|
||||
}
|
||||
} else {
|
||||
fmt.Println("Use 'start', 'stop', or 'backup' command\nex. factoryman start\nTo configure edit 'conifg.yml'")
|
||||
fmt.Println("Use 'start', 'stop', or 'backup' command\nex. factoryman start\nTo configure edit 'config.yml'")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,8 +9,6 @@ import (
|
||||
"gopkg.in/yaml.v3"
|
||||
)
|
||||
|
||||
const fmConfig = "config.yml"
|
||||
|
||||
type GoConfig struct {
|
||||
Server struct { // server specific settings
|
||||
ServDir string `yaml:"serverFolder"`
|
||||
@@ -24,6 +22,8 @@ type GoConfig struct {
|
||||
BackupDir string `yaml:"backupDir"`
|
||||
UseScreen bool `yaml:"screen"`
|
||||
ScreenName string `yaml:"screenName"`
|
||||
UserName string `yaml:"username"`
|
||||
ApiToken string `yaml:"apitoken"`
|
||||
} `yaml:"factoryman"`
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
server:
|
||||
serverFolder: "factorio"
|
||||
worldFile: "factorio/data/saves/newworld.zip"
|
||||
worldFile: "factorio/saves/test.zip"
|
||||
serverSettings: "factorio/data/server-settings.json"
|
||||
serverExec: "factorio/bin/x64/factorio"
|
||||
port: 34197
|
||||
@@ -9,3 +9,5 @@ factoryman:
|
||||
screen: True
|
||||
screenName: "Factorio"
|
||||
backupDir: "factorio/backups"
|
||||
username: ""
|
||||
apitoken: ""
|
||||
BIN
factoryman
BIN
factoryman
Binary file not shown.
37
jsonStruts.go
Normal file
37
jsonStruts.go
Normal file
@@ -0,0 +1,37 @@
|
||||
package main
|
||||
|
||||
type Mod struct {
|
||||
Name string `json:"name"`
|
||||
Enabled bool `json:"enabled"`
|
||||
Version string `json:"version,omitempty"`
|
||||
}
|
||||
|
||||
type ModList struct {
|
||||
Mods []Mod `json:"mods"`
|
||||
}
|
||||
|
||||
type ModPortal struct {
|
||||
Category string `json:"category"`
|
||||
DownloadCount int `json:"downloads_count"`
|
||||
Name string `json:"name"`
|
||||
Owner string `json:"owner"`
|
||||
Releases []Release `json:"releases"`
|
||||
Score float64 `json:"score"`
|
||||
Summary string `json:"summary"`
|
||||
Thumbnail string `json:"thumbnail"`
|
||||
Title string `json:"title"`
|
||||
}
|
||||
|
||||
type Release struct {
|
||||
DownloadUrl string `json:"download_url"`
|
||||
Filename string `json:"file_name"`
|
||||
InfoJson InfoJSON `json:"info_json"`
|
||||
ReleaseTime string `json:"released_at"`
|
||||
Sha1 string `json:"sha1"`
|
||||
Version string `json:"version"`
|
||||
}
|
||||
|
||||
type InfoJSON struct {
|
||||
Dependencies []string `json:"dependencies"`
|
||||
FactorioVersion string `json:"factorio_version"`
|
||||
}
|
||||
@@ -11,7 +11,7 @@ func startStopServer(cmd string, con GoConfig) {
|
||||
switch cmd {
|
||||
case "start":
|
||||
x := fmt.Sprintf("%s --port %d --server-settings %s --start-server %s", con.Server.ServExec, con.Server.ServPort, con.Server.ServCfg, con.Server.WorldFile)
|
||||
if con.Factoryman.UseScreen { // if screen enabled in confing.yml
|
||||
if con.Factoryman.UseScreen { // if screen enabled in config.yml
|
||||
fmt.Println("Starting factorio server in screen session")
|
||||
startScreenCmd := exec.Command("screen", "-dmS", con.Factoryman.ScreenName, "bash", "-c", x, "; exec sh")
|
||||
startScreenCmd.Stdout = os.Stdout
|
||||
|
||||
88
mods.go
Normal file
88
mods.go
Normal file
@@ -0,0 +1,88 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
)
|
||||
|
||||
func findmodlist(modlist string) bool {
|
||||
if !isItReal(modlist) {
|
||||
return false
|
||||
} else {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
func download(filedest string, url string) error {
|
||||
resp, err := http.Get(url)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
out, err := os.Create(filedest)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer out.Close()
|
||||
|
||||
_, err = io.Copy(out, resp.Body)
|
||||
return err
|
||||
}
|
||||
|
||||
func downloadMods(modlist string) {
|
||||
var c = readCfg("config.yml")
|
||||
fmt.Printf("Updating mods from %s\n", modlist)
|
||||
file, err := os.Open(modlist)
|
||||
if err != nil {
|
||||
log.Fatalf("Error reading modlist: %v", err)
|
||||
}
|
||||
defer file.Close()
|
||||
var modList ModList
|
||||
decoder := json.NewDecoder(file)
|
||||
if err := decoder.Decode(&modList); err != nil {
|
||||
log.Fatalf("Error reading JSON: %v", err)
|
||||
}
|
||||
|
||||
for _, mod := range modList.Mods {
|
||||
switch mod.Name {
|
||||
case "base":
|
||||
fmt.Println("Skipping base...")
|
||||
case "elevated-rails":
|
||||
fmt.Println("Skipping elevated-rails...")
|
||||
case "quality":
|
||||
fmt.Println("Skipping quality...")
|
||||
case "space-age":
|
||||
fmt.Println("Skipping space-age...")
|
||||
default:
|
||||
modportalurl := fmt.Sprintf("https://mods.factorio.com/api/mods/%s", mod.Name)
|
||||
resp, err := http.Get(modportalurl)
|
||||
if err != nil {
|
||||
log.Fatalf("Error reading JSON: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
var moddata ModPortal
|
||||
if err := json.NewDecoder(resp.Body).Decode(&moddata); err != nil {
|
||||
log.Fatalf("Error reading JSON: %v", err)
|
||||
}
|
||||
|
||||
fmt.Printf("Mod: %s, Ver: %s, Enabled: %t\n", mod.Name, mod.Version, mod.Enabled)
|
||||
|
||||
accessToken := fmt.Sprintf("?username=%s&token=%s", c.Factoryman.UserName, c.Factoryman.ApiToken)
|
||||
modDownloadUrl := fmt.Sprintf("https://mods.factorio.com%s%s", moddata.Releases[len(moddata.Releases)-1].DownloadUrl, accessToken)
|
||||
fmt.Println(modDownloadUrl)
|
||||
downloadErr := download(string(c.Server.ServDir+"/mods/"+moddata.Releases[len(moddata.Releases)-1].Filename), modDownloadUrl)
|
||||
if downloadErr != nil {
|
||||
log.Fatalf("Error downloading: %v", downloadErr)
|
||||
}
|
||||
fmt.Printf("Downloaded: %s\n", moddata.Releases[len(moddata.Releases)-1].Filename)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user