summaryrefslogtreecommitdiffstats
path: root/cmd/client/main.go
blob: 26122678d6cd4dbe2e35a55ce301de992d6552b6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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)
	}
}