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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
package main
import (
"bufio"
"flag"
"fmt"
"log"
"os"
"os/signal"
"strings"
"syscall"
"github.com/osm/quake/client"
"github.com/osm/quake/client/quake"
"github.com/osm/quake/common/ascii"
"github.com/osm/quake/packet"
"github.com/osm/quake/packet/command"
"github.com/osm/quake/packet/command/print"
"github.com/osm/quake/packet/command/stringcmd"
"github.com/osm/quake/packet/svc"
)
func main() {
addrPort := flag.String("addr", "172.236.100.99:28501", "address and port to connect to")
name := flag.String("name", "player", "name")
team := flag.String("team", "red", "team")
flag.Parse()
logger := log.New(os.Stdout, "INFO: ", log.Ldate|log.Ltime)
if *addrPort == "" {
logger.Fatalf("-addr is required")
}
var client client.Client
var err error
client, err = quake.New(
*name,
*team,
[]quake.Option{
quake.WithSpectator(true),
quake.WithLogger(logger),
}...,
)
if err != nil {
logger.Fatalf("unable to create new client, %v", err)
}
signalCh := make(chan os.Signal, 1)
signal.Notify(signalCh, syscall.SIGINT, syscall.SIGTERM)
go func() {
<-signalCh
client.Quit()
os.Exit(0)
}()
go func() {
reader := bufio.NewReader(os.Stdin)
for {
input, _ := reader.ReadString('\n')
client.Enqueue([]command.Command{
&stringcmd.Command{String: strings.TrimSpace(input)},
})
}
}()
client.HandleFunc(func(packet packet.Packet) []command.Command {
gameData, ok := packet.(*svc.GameData)
if !ok {
return []command.Command{}
}
for _, cmd := range gameData.Commands {
switch c := cmd.(type) {
case *print.Command:
fmt.Printf("%s", ascii.Parse(c.String))
}
}
return nil
})
logger.Printf("connecting to %s", *addrPort)
if err := client.Connect(*addrPort); err != nil {
logger.Fatal(err)
}
}
|