aboutsummaryrefslogtreecommitdiffstats
path: root/example/client/main.go
blob: 3d2e6d9a78892d54954a6c5f718af9d041f2a96c (plain) (blame)
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)
	}
}