88 lines
2.1 KiB
Go

package main
import "os"
import "io"
import "fmt"
import "time"
import "bufio"
import "errors"
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)
fmt.Fprintf(os.Stdout, "(i) connected to %s/%s\n", address, room)
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)
if err != nil {
if !errors.Is(err, io.EOF) {
handleErr(1, err)
}
break
}
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)
}
}
fmt.Fprintf(os.Stdout, "(i) disconnected\n")
}
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)
}
}