Files
tf2stats/main.go
2024-04-21 22:17:02 +02:00

78 lines
1.8 KiB
Go

package main
import (
"encoding/json"
"flag"
"fmt"
"github.com/influxdata/line-protocol/v2/lineprotocol"
log "github.com/sirupsen/logrus"
"os/exec"
"strings"
"time"
)
type TF2Stat struct {
Name string `json:"name"`
Map string `json:"map"`
Password bool `json:"password"`
MaxPlayers int `json:"maxplayers"`
NumPlayers int `json:"numplayers"`
QueryPort int `json:"queryPort"`
Ping int `json:"ping"`
Error *string `json:"error,omitempty"`
}
type TF2Server string
var (
server = flag.String("server", "", "comma seperated list of addresses to query")
)
func main() {
flag.Parse()
servers := strings.Split(*server, ",")
var tServer []TF2Server
for _, srv := range servers {
tServer = append(tServer, TF2Server(strings.TrimSpace(srv)))
}
for _, ip := range tServer {
tStat, err := ip.Stats()
if err != nil {
log.Debugf("error retrieving stats for %s: %v", ip, err)
continue
}
var enc lineprotocol.Encoder
enc.StartLine("tf2server")
enc.AddTag("address", string(ip))
enc.AddTag("map", tStat.Map)
enc.AddTag("name", tStat.Name)
enc.AddField("player", lineprotocol.IntValue(int64(tStat.NumPlayers)))
enc.AddField("maxplayer", lineprotocol.IntValue(int64(tStat.MaxPlayers)))
enc.AddField("ping", lineprotocol.IntValue(int64(tStat.Ping)))
enc.EndLine(time.Now())
fmt.Print(string(enc.Bytes()))
}
}
func (ip TF2Server) Stats() (*TF2Stat, error) {
cmd := exec.Command("gamedig", "--type", "teamfortress2", string(ip))
bOut, err := cmd.CombinedOutput()
if err != nil {
return nil, err
}
nStat := new(TF2Stat)
if err = json.Unmarshal(bOut, &nStat); err != nil {
return nil, err
}
if nStat.Error != nil {
return nil, fmt.Errorf("gamedig returned error: %v", *nStat.Error)
}
return nStat, nil
}