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) } }