mirror of
https://github.com/Luzifer/tsstatus.git
synced 2024-10-18 13:24:22 +00:00
118 lines
2.8 KiB
Go
118 lines
2.8 KiB
Go
package main
|
|
|
|
import (
|
|
"sort"
|
|
|
|
"github.com/multiplay/go-ts3"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
type channel struct {
|
|
ID int `json:"id"`
|
|
Name string `json:"name"`
|
|
Clients []onlineClient `json:"clients"`
|
|
}
|
|
|
|
type onlineClient struct {
|
|
Away bool `json:"away"`
|
|
AwayMessage string `json:"away_message"`
|
|
Nickname string `json:"nickname"`
|
|
}
|
|
|
|
type serverInfo struct {
|
|
ClientsOnline int `json:"clients_online"`
|
|
HostButtonGFXURL string `json:"host_button_gfxurl"`
|
|
HostButtonURL string `json:"host_button_url"`
|
|
MaxClients int `json:"max_clients"`
|
|
Name string `json:"name"`
|
|
Port int `json:"port"`
|
|
Status string `json:"status"`
|
|
Uptime int `json:"uptime"`
|
|
Version string `json:"version"`
|
|
WelcomeMessage string `json:"welcome_message"`
|
|
}
|
|
|
|
func serverInfoFromServer(s *ts3.Server) serverInfo {
|
|
return serverInfo{
|
|
ClientsOnline: s.ClientsOnline,
|
|
HostButtonGFXURL: s.HostButtonGFXURL,
|
|
HostButtonURL: s.HostButtonURL,
|
|
MaxClients: s.MaxClients,
|
|
Name: s.Name,
|
|
Port: s.Port,
|
|
Status: s.Status,
|
|
Uptime: s.Uptime,
|
|
Version: s.Version,
|
|
WelcomeMessage: s.WelcomeMessage,
|
|
}
|
|
}
|
|
|
|
type serverStats struct {
|
|
Server serverInfo `json:"server"`
|
|
Channels []channel `json:"channels"`
|
|
}
|
|
|
|
func getServerStats() (*serverStats, error) {
|
|
var s = &serverStats{}
|
|
|
|
client, err := ts3.NewClient(cfg.ServerAddress)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "Unable to create client")
|
|
}
|
|
defer client.Close()
|
|
|
|
if err = client.Login(cfg.QueryUser, cfg.QueryPass); err != nil {
|
|
return nil, errors.Wrap(err, "Unable to login")
|
|
}
|
|
defer client.Logout()
|
|
|
|
if err = client.Use(cfg.ServerID); err != nil {
|
|
return nil, errors.Wrap(err, "Unable to select server")
|
|
}
|
|
|
|
var server *ts3.Server
|
|
server, err = client.Server.Info()
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "Unable to query server")
|
|
}
|
|
s.Server = serverInfoFromServer(server)
|
|
|
|
chans, err := client.Server.ChannelList()
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "Unable to query channels")
|
|
}
|
|
|
|
sort.Slice(chans, func(i, j int) bool { return chans[i].ChannelOrder < chans[j].ChannelOrder })
|
|
|
|
clients, err := client.Server.ClientList()
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "Unable to query clients")
|
|
}
|
|
|
|
for _, c := range chans {
|
|
ch := channel{
|
|
ID: c.ID,
|
|
Name: c.ChannelName,
|
|
}
|
|
|
|
if c.NeededSubscribePower == 0 {
|
|
for _, cli := range clients {
|
|
if cli.Type == 1 {
|
|
continue
|
|
}
|
|
|
|
if cli.ChannelID == c.ID {
|
|
ch.Clients = append(ch.Clients, onlineClient{
|
|
Away: cli.Away,
|
|
AwayMessage: cli.AwayMessage,
|
|
Nickname: cli.Nickname,
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
s.Channels = append(s.Channels, ch)
|
|
}
|
|
|
|
return s, nil
|
|
}
|