103 lines
2.0 KiB
Go
103 lines
2.0 KiB
Go
package minecraft
|
|
|
|
import (
|
|
"github.com/influxdata/telegraf"
|
|
"github.com/influxdata/telegraf/plugins/inputs"
|
|
)
|
|
|
|
const sampleConfig = `
|
|
## Address of the Minecraft server.
|
|
# server = "localhost"
|
|
|
|
## Server RCON Port.
|
|
# port = "25575"
|
|
|
|
## Server RCON Password.
|
|
password = ""
|
|
|
|
## Uncomment to remove deprecated metric components.
|
|
# tagdrop = ["server"]
|
|
`
|
|
|
|
// Client is a client for the Minecraft server.
|
|
type Client interface {
|
|
// Connect establishes a connection to the server.
|
|
Connect() error
|
|
|
|
// Players returns the players on the scoreboard.
|
|
Players() ([]string, error)
|
|
|
|
// Scores return the objective scores for a player.
|
|
Scores(player string) ([]Score, error)
|
|
}
|
|
|
|
// Minecraft is the plugin type.
|
|
type Minecraft struct {
|
|
Server string `toml:"server"`
|
|
Port string `toml:"port"`
|
|
Password string `toml:"password"`
|
|
|
|
client Client
|
|
}
|
|
|
|
func (s *Minecraft) Description() string {
|
|
return "Collects scores from a Minecraft server's scoreboard using the RCON protocol"
|
|
}
|
|
|
|
func (s *Minecraft) SampleConfig() string {
|
|
return sampleConfig
|
|
}
|
|
|
|
func (s *Minecraft) Gather(acc telegraf.Accumulator) error {
|
|
if s.client == nil {
|
|
connector, err := NewConnector(s.Server, s.Port, s.Password)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
client, err := NewClient(connector)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
s.client = client
|
|
}
|
|
|
|
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",
|
|
}
|
|
})
|
|
}
|