diff --git a/go.mod b/go.mod index 2cd5884..3b41b9e 100644 --- a/go.mod +++ b/go.mod @@ -1,2 +1,3 @@ -module git.skdevstudios.com/specCon18/reforgerds-updater -go 1.16 +module git.skdevstudios.com/specCon18/reforgerds-updater + +go 1.18 diff --git a/internal/a2s/players.go b/internal/a2s/players.go index 6d6e54b..419d6d5 100644 --- a/internal/a2s/players.go +++ b/internal/a2s/players.go @@ -5,7 +5,7 @@ import ( "fmt" "time" - "reforgerds-updater/internal/bread" + "git.skdevstudios.com/specCon18/reforgerds-updater/internal/a2s/bread" ) // https://developer.valvesoftware.com/wiki/Server_queries#Response_Format_2 diff --git a/main.go b/main.go index 77065c8..1e0e8da 100644 --- a/main.go +++ b/main.go @@ -8,6 +8,8 @@ import ( "os" "os/exec" "strings" + "time" + "git.skdevstudios.com/specCon18/reforgerds-updater/internal/a2s" ) @@ -18,9 +20,13 @@ type Update struct { } const ( - updateURL = "http://127.0.0.1:3000/updates" - stateFilePath = "latest_version.txt" + updateURL = "http://127.0.0.1:3000/updates" + stateFilePath = "latest_version.txt" + + serverIP = "127.0.0.1" + serverPort = 17777 ) + func main() { resp, err := http.Get(updateURL) if err != nil { @@ -59,19 +65,38 @@ func main() { if versionCompare(latest, prevVersion) > 0 { fmt.Printf("New version found! %s > %s\n", latest, prevVersion) - // Run steamcmd with reforger_update script - fmt.Println("Running update command...") + // Always update the state file + err := os.WriteFile(stateFilePath, []byte(latest), 0644) + if err != nil { + fmt.Printf("Failed to write version file: %v\n", err) + } + + // Check for online players + players, err := fetchPlayers(serverIP, serverPort) + if err != nil { + fmt.Printf("Error checking players: %v\n", err) + return + } + + if len(players) > 0 { + fmt.Printf("Players are currently online (%d):\n", len(players)) + for _, p := range players { + fmt.Printf("- %-16s | Score: %d | Time: %s\n", p.Name, p.Score, formatDuration(p.Duration)) + } + fmt.Println("Skipping update while players are online.") + return + } + + // No players — run steamcmd + fmt.Println("No players online. Running update command...") cmd := exec.Command("./steamcmd.sh", "+runscript", "reforger_update") cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr - err := cmd.Run() + err = cmd.Run() if err != nil { fmt.Printf("Update command failed: %v\n", err) return } - - // Store the new latest version - _ = os.WriteFile(stateFilePath, []byte(latest), 0644) } else { fmt.Printf("No new version. Latest seen: %s\n", prevVersion) } @@ -105,3 +130,26 @@ func versionCompare(a, b string) int { return 0 } +func fetchPlayers(ip string, port int) ([]a2s.Player, error) { + client, err := a2s.New(ip, port) + if err != nil { + return nil, fmt.Errorf("create client: %w", err) + } + defer client.Close() + + client.SetBufferSize(2048) + client.SetDeadlineTimeout(3) + + players, err := client.GetPlayers() + if err != nil { + return nil, fmt.Errorf("get players: %w", err) + } + + return *players, nil +} + +func formatDuration(d time.Duration) string { + minutes := int(d.Minutes()) + seconds := int(d.Seconds()) % 60 + return fmt.Sprintf("%02d:%02d", minutes, seconds) +}