package main import "os" import "fmt" import "time" import "bufio" import "context" import "crypto/tls" import "git.tebibyte.media/sashakoshka/hopp" import "git.tebibyte.media/sashakoshka/hopp/examples/chat" func main() { name := os.Args[0] if len(os.Args) != 3 && len(os.Args) != 4 { fmt.Fprintf(os.Stderr, "Usage: %s HOST:PORT ROOM [NICKNAME]\n", name) os.Exit(2) } address := os.Args[1] room := os.Args[2] nickname := "Anonymous"; if len(os.Args) >= 4 { nickname = os.Args[3] } trans, err := join(address, room, nickname) handleErr(1, err) go func() { reader := bufio.NewReader(os.Stdin) for { line, err := reader.ReadString('\n') if err != nil { break } send(trans, line) } }() for { message, _, err := chat.Receive(trans) handleErr(1, err) switch message := message.(type) { case *chat.MessageChat: fmt.Fprintf(os.Stdout, "%s: %s\n", message.Nickname, message.Content) case *chat.MessageJoinNotify: fmt.Fprintf(os.Stdout, "(i) %s joined the room\n", message.Nickname) case *chat.MessageLeaveNotify: fmt.Fprintf(os.Stdout, "(i) %s left the room\n", message.Nickname) } } } func join(address string, room string, nickname string) (hopp.Trans, error) { ctx, done := context.WithTimeout(context.Background(), 16 * time.Second) defer done() conn, err := hopp.Dial(ctx, "tls", address, &tls.Config { // don't actually do this in real life InsecureSkipVerify: true, }) if err != nil { return nil, err } transRoom, err := conn.OpenTrans() if err != nil { return nil, err } _, err = chat.Send(transRoom, &chat.MessageJoin { Room: room, Nickname: nickname, }) if err != nil { return nil, err } return transRoom, nil } func send(trans hopp.Trans, content string) error { _, err := chat.Send(trans, &chat.MessageChat { Content: content, }) return err } func handleErr(code int, err error) { if err != nil { fmt.Fprintf(os.Stderr, "%s: %v\n", os.Args[0], err) os.Exit(code) } }