79 lines
1.9 KiB
Go
79 lines
1.9 KiB
Go
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)
|
|
}
|
|
}
|