-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
73 lines (64 loc) · 1.31 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package main
import (
"encoding/json"
"fmt"
"log"
"os"
"strings"
"github.com/Tnze/go-mc/bot"
"github.com/Tnze/go-mc/chat"
"github.com/google/uuid"
)
const usage = "Usage: mclist <hostname>[:port]"
type status struct {
Description chat.Message
Players struct {
Max int
Online int
Sample []struct {
ID uuid.UUID
Name string
}
}
Version struct {
Name string
Protocol int
}
}
func main() {
addr := getAddr()
fmt.Printf("%s:\n", addr)
resp, delay, err := bot.PingAndList(addr)
if err != nil {
log.Fatalf("ping failed: %v\n", err)
}
var s status
err = json.Unmarshal(resp, &s)
if err != nil {
log.Fatalf("error unmarshaling response: %v\n", err)
}
fmt.Print(s)
fmt.Println("Delay:", delay)
}
func getAddr() string {
if len(os.Args) < 2 {
fmt.Println("error no server address:", usage)
os.Exit(1)
}
addr := os.Args[1]
if !strings.ContainsRune(addr, ':') {
addr += ":25565"
}
return addr
}
func (s status) String() string {
var b strings.Builder
fmt.Fprintln(&b, "Server:", s.Version.Name)
fmt.Fprintln(&b, "Protocol:", s.Version.Protocol)
fmt.Fprintln(&b, "Description:", s.Description)
fmt.Fprintf(&b, "Players: %d/%d\n", s.Players.Online, s.Players.Max)
for _, v := range s.Players.Sample {
fmt.Fprintf(&b, "- [%s] %v\n", v.Name, v.ID)
}
return b.String()
}