annotate gara/main.go @ 143:276bb3555034

Should work now.
author June Park <parkjune1995@gmail.com>
date Fri, 09 Jan 2026 13:13:27 -0800
parents c2706ffb442b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
42
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
1 package main
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
2
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
3 import (
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
4 "fmt"
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
5 "bytes"
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
6 "net"
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
7 )
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
8
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
9 type Client struct {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
10 name string
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
11 conn net.Conn
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
12 message []byte
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
13 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
14
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
15 var clients map[string]Client = make(map[string]Client)
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
16 var allowedCharacters = map[byte]bool{
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
17 'a': true, 'b': true, 'c': true, 'd': true, 'e': true,
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
18 'f': true, 'g': true, 'h': true, 'i': true, 'j': true,
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
19 'k': true, 'l': true, 'm': true, 'n': true, 'o': true,
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
20 'p': true, 'q': true, 'r': true, 's': true, 't': true,
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
21 'u': true, 'v': true, 'w': true, 'x': true, 'y': true, 'z': true,
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
22 'A': true, 'B': true, 'C': true, 'D': true, 'E': true,
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
23 'F': true, 'G': true, 'H': true, 'I': true, 'J': true,
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
24 'K': true, 'L': true, 'M': true, 'N': true, 'O': true,
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
25 'P': true, 'Q': true, 'R': true, 'S': true, 'T': true,
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
26 'U': true, 'V': true, 'W': true, 'X': true, 'Y': true, 'Z': true,
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
27 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
28
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
29 func IsChacterAllowed(chars []byte) bool {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
30 for _, b := range chars {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
31 if !allowedCharacters[b] {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
32 return false
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
33 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
34 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
35 return true
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
36 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
37
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
38 func ResetClient(client Client) {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
39 ResetClientMessage(client)
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
40 delete(clients, client.conn.RemoteAddr().String())
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
41 client.conn.Close()
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
42 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
43
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
44 func ResetClientMessage(client Client) {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
45 for i := range client.message {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
46 client.message[i] = 0
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
47 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
48 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
49
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
50 func Loggers(value string) {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
51 fmt.Println(value)
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
52 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
53
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
54 func SendString(client Client, value string) {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
55 fmt.Println("Notifying User: ", client.name)
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
56 client.conn.Write(([]byte)(value+"\n"))
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
57 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
58
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
59 func SendToAll(currentClient Client) {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
60 for key, client := range clients {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
61 if currentClient.conn.RemoteAddr().String() == key {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
62 continue
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
63 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
64 formattedMessage := fmt.Sprintf("%v: %v", currentClient.name, (string)(currentClient.message))
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
65 SendString(client, formattedMessage)
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
66 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
67 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
68
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
69 func HandleConnection(conn net.Conn) {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
70 client := Client{name: "unknown", conn: conn, message: make([]byte, 100)}
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
71 defer ResetClient(client)
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
72
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
73 SendString(client, "Hello good sir. What is your name?(less than 100 character and no special characters)\n")
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
74 for {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
75 _, err := conn.Read(client.message)
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
76 if err != nil {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
77 SendString(client, "Something went wrong. Try again.")
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
78 continue
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
79 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
80
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
81 for i := 0; i < len(client.message) - 1; i++ {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
82 if (string)(client.message[i:i+2]) == "\r\n" {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
83 client.name = (string)(client.message[:i])
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
84 break;
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
85 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
86 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
87
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
88 if !IsChacterAllowed(([]byte)(client.name)) {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
89 SendString(client, "Only allow alphabets.")
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
90 continue
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
91 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
92 if client.name[0] == (byte)('\r') {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
93 continue
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
94 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
95 ResetClientMessage(client)
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
96 break
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
97 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
98
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
99 clients[client.conn.RemoteAddr().String()] = client
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
100
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
101 // Hnadle all messages.
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
102 for {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
103 err_n := 0
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
104
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
105 if err_n > 10 {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
106 break;
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
107 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
108
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
109 _, err := conn.Read(client.message)
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
110 if err != nil {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
111 Loggers("Something went wrong")
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
112 err_n += 1
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
113 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
114 if bytes.Equal(([]byte)("close"), client.message[:5]) {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
115 break
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
116 } else {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
117 fmt.Println("Working....")
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
118 SendToAll(client)
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
119 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
120 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
121 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
122
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
123 func main() {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
124 PORT := ":4200";
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
125 server_conn, err := net.Listen("tcp", PORT)
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
126 fmt.Println("Running on ", server_conn.Addr().String())
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
127
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
128 if err != nil {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
129 Loggers("Couldn't run the server")
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
130 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
131 for {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
132 conn, err := server_conn.Accept()
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
133 if err != nil {
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
134 Loggers("Couldn't accept a client")
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
135 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
136 go HandleConnection(conn)
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
137 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
138 }
c2706ffb442b [Gara] Peer to peer chat terminal app using go.
MrJuneJune <me@mrjunejune.com>
parents:
diff changeset
139