diff options
Diffstat (limited to 'cmd/client/main.go')
| -rw-r--r-- | cmd/client/main.go | 87 |
1 files changed, 58 insertions, 29 deletions
diff --git a/cmd/client/main.go b/cmd/client/main.go index 6e5d996..2612267 100644 --- a/cmd/client/main.go +++ b/cmd/client/main.go @@ -4,58 +4,87 @@ import ( "flag" "log" "net" + "strings" "time" - "git.sr.ht/~rctt/solecd/core" + "git.sr.ht/~rctt/solec/core" + "git.sr.ht/~rctt/solec/prompt" ) -var serverAddr string +var ( + serverAddr string + user string + conn net.Conn +) func main() { + prompt.Commands["*"] = broadcast + flag.StringVar(&serverAddr, "a", "localhost:9999", "Server address:port") + flag.StringVar(&user, "u", "user", "username") flag.Parse() - var d net.Dialer + var ( + d net.Dialer + err error + ) - conn, err := d.Dial("tcp", serverAddr) + log.Println("connecting to " + serverAddr + " as " + user) + + conn, err = d.Dial("tcp", serverAddr) if err != nil { log.Fatal("cannot dial: ", err) } defer conn.Close() - ping(conn) + hs := core.Handshake{0, 1} + if err := core.Send(conn, hs); err != nil { + panic(err) + } + + auth := core.Auth{user, "pass"} + if err := core.Send(conn, auth); err != nil { + panic(err) + } + + go prompt.Read() + + read(conn) } -func ping(conn net.Conn) { +func read(conn net.Conn) { for { - log.Print("ping") - data, err := core.Encode(core.Pong{Timestamp: time.Now()}) + payload, err := core.Read(conn) if err != nil { panic(err) } - if _, err := conn.Write(data); err != nil { - panic(err) - } - test := core.Test{ - Num1: 1, - Time1: time.Now(), - Str1: "test string", - Num2: 2, - Bin1: []byte{0x01, 0x02, 0x03}, - Num3: 3, - Str2: "こんにちは", - Num4: 4, - } + handlePayload(conn, payload) + } +} - data, err = core.Encode(test) - if err != nil { - panic(err) - } - if _, err = conn.Write(data); err != nil { - panic(err) - } +func handlePayload(conn net.Conn, payload any) { + switch v := payload.(type) { + case core.Message: + handleMessage(conn, v) + } +} + +func handleMessage(conn net.Conn, msg core.Message) { + log.Println("received message", msg.Source, "->", msg.Target, msg.Content) +} + +func broadcast(args []string) { + msg := core.Message{ + Source: user, + Target: "*", + Timestamp: time.Now(), + Content: strings.Join(args[0:], " "), + } + + log.Println(msg.Content) - time.Sleep(time.Second) + if err := core.Send(conn, msg); err != nil { + panic(err) } } |
