i slapped some code together to spit out the currently-connected players on an Arma 3 server.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"flag" | |
"fmt" | |
steam "github.com/kidoman/go-steam" | |
"sort" | |
) | |
var addresses = []string{ | |
"public.2-75thrangers.com:2303", | |
} | |
type SteamPlayers steam.PlayersInfoResponse | |
// implement the sort interface on a steam.PlayersInfoResponse-like type | |
// we can't add the sort interface to steam.PlayersInfoResponse because we're not part of the go-steam package, and | |
// so have to use SteamPlayers, which is a new type we created of type steam.PlayersInfoResponse for sort() purposes. | |
// len | |
func (d SteamPlayers) Len() int { | |
return len(d.Players) | |
} | |
// swap | |
func (d SteamPlayers) Swap(i, j int) { | |
d.Players[i], d.Players[j] = d.Players[j], d.Players[i] | |
} | |
// less | |
func (d SteamPlayers) Less(i, j int) bool { | |
return d.Players[i].Score < d.Players[j].Score | |
} | |
func main() { | |
// not really needed because i got lazy and put the IP in a slice as a global var <for shame> | |
flag.Parse() | |
// range through our list of IPs | |
for _, addr := range addresses { | |
// connect to the server | |
server, err := steam.Connect(addr) | |
if err != nil { | |
panic(err) | |
} | |
// save for later | |
defer server.Close() | |
// ping the server. if no ping, something is wrong | |
ping, err := server.Ping() | |
if err != nil { | |
fmt.Printf("steam: could not ping %v: %v", addr, err) | |
continue | |
} | |
// we're good so far. lets get the server info | |
info, err := server.Info() | |
if err != nil { | |
fmt.Printf("steam: could not get server info from %v: %v", addr, err) | |
continue | |
} | |
// still good, phew! lets get the player info | |
playersInfo, err := server.PlayersInfo() | |
if err != nil { | |
fmt.Printf("steam: could not get players info from %v: %v", addr, err) | |
continue | |
} | |
// we've got all the info we need from the server. lets print out some stuff. | |
fmt.Printf(" Server | %v\n", info.Name) | |
fmt.Printf(" Name | %s\n", info.Game) | |
fmt.Printf(" Ping | %s\n", ping) | |
fmt.Printf(" Type | %s\n", info.ServerType) | |
fmt.Printf("Version | %s\n", info.Version) | |
fmt.Printf("Players | %d/%d\n", info.Players, info.MaxPlayers) | |
fmt.Printf(" Map | %s\n", info.Map) | |
fmt.Printf(" IP | %s\n", addr) | |
// if there's at least 1x player, lets print out their info | |
if len(playersInfo.Players) > 0 { | |
fmt.Printf("——–|—————————————–\n") | |
fmt.Printf(" Score | Time On | Player Name\n") | |
fmt.Printf("——–|—————————————–\n") | |
var temp SteamPlayers | |
temp.Players = playersInfo.Players | |
sort.Sort(sort.Reverse(temp)) | |
for _, player := range temp.Players { | |
fmt.Printf("%7d | %7d | %s\n", player.Score, int(player.Duration / 60), player.Name) | |
} | |
fmt.Printf("\n") | |
} | |
} | |
} | |
func must(err error) { | |
if err != nil { | |
panic(err) | |
} | |
} |