package main import ( "flag" "log" "net" "strings" "time" "git.sr.ht/~rctt/solec/core" "git.sr.ht/~rctt/solec/prompt" ) 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 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, "pass"} 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) } } 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) if err := core.Send(conn, msg); err != nil { panic(err) } }