1
0
Fork 0
telegraf/plugins/inputs/minecraft/minecraft.go

81 lines
1.5 KiB
Go
Raw Permalink Normal View History

//go:generate ../../../tools/readme_config_includer/generator
package minecraft
import (
_ "embed"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/plugins/inputs"
)
//go:embed sample.conf
var sampleConfig string
type Minecraft struct {
Server string `toml:"server"`
Port string `toml:"port"`
Password string `toml:"password"`
client cli
}
// cli is a client for the Minecraft server.
type cli interface {
// connect establishes a connection to the server.
connect() error
// players returns the players on the scoreboard.
players() ([]string, error)
// scores returns the objective scores for a player.
scores(player string) ([]score, error)
}
func (*Minecraft) SampleConfig() string {
return sampleConfig
}
func (s *Minecraft) Gather(acc telegraf.Accumulator) error {
if s.client == nil {
connector := newConnector(s.Server, s.Port, s.Password)
s.client = newClient(connector)
}
players, err := s.client.players()
if err != nil {
return err
}
for _, player := range players {
scores, err := s.client.scores(player)
if err != nil {
return err
}
tags := map[string]string{
"player": player,
"server": s.Server + ":" + s.Port,
"source": s.Server,
"port": s.Port,
}
var fields = make(map[string]interface{}, len(scores))
for _, score := range scores {
fields[score.name] = score.value
}
acc.AddFields("minecraft", fields, tags)
}
return nil
}
func init() {
inputs.Add("minecraft", func() telegraf.Input {
return &Minecraft{
Server: "localhost",
Port: "25575",
}
})
}