package main import ( "flag" "fmt" "log" "net" "strings" "time" "git.rctt.net/solec/core" "git.rctt.net/solec/prompt" ) var ( serverAddr string user string conn net.Conn ) func main() { prompt.Commands["send"] = sendMessage flag.StringVar(&serverAddr, "a", "localhost:9999", "Server address:port") flag.StringVar(&user, "u", "user", "username") flag.Parse() var ( d net.Dialer err error ) log.Println("connecting to " + serverAddr + " as " + user) conn, err = d.Dial("tcp", serverAddr) if err != nil { log.Fatal("cannot dial: ", err) } defer conn.Close() hs := core.Handshake{0, 1} if err := core.Send(conn, hs); err != nil { panic(err) } auth := core.Auth{user, "valid"} if err := core.Send(conn, auth); err != nil { panic(err) } go prompt.Read() read(conn) } func read(conn net.Conn) { for { payload, err := core.Read(conn) if err != nil { panic(err) } handlePayload(conn, payload) } } func handlePayload(conn net.Conn, payload any) { switch v := payload.(type) { case core.Message: handleMessage(conn, v) default: fmt.Println(payload) } } func handleMessage(conn net.Conn, msg core.Message) { log.Println("received message", msg.Source, "->", msg.Target, msg.Content) } func sendMessage(args []string) { msg := core.Message{ Source: user, Target: args[0], Timestamp: time.Now(), Content: strings.Join(args[1:], " "), } if err := core.Send(conn, msg); err != nil { panic(err) } }