-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclient_connection.go
91 lines (74 loc) · 1.68 KB
/
client_connection.go
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
91
package main
import (
"bufio"
"fmt"
"net"
"os"
)
var ServerCapacity = 10
var ClientList = []Client{}
type Client struct {
Name string
Connection net.Conn
}
func NewClient(connecion net.Conn) {
client := createClient(connecion)
defer removeClient(client)
if len(ClientList) >= ServerCapacity {
connecion.Write([]byte("Cant join, server is full, sorry!!"))
connecion.Close()
return
}
sendHistoryToClient(client)
ClientList = append(ClientList, client)
ClientJoined(client)
scanner := bufio.NewScanner(connecion)
for scanner.Scan() {
HandleMessage(client, scanner.Text())
}
if scanner.Err() != nil {
fmt.Println(scanner.Err())
}
}
func createClient(connection net.Conn) (client Client) {
client.Connection = connection
// Read greeting from the file
// Consider whether you care about this been changeable at runtime
// or mb just have a simple text backup
greeting, err := os.ReadFile("greeting.txt")
if err != nil {
connection.Write([]byte("Error: " + err.Error()))
connection.Close()
panic(err)
}
connection.Write(greeting)
// Read client's name
scanner := bufio.NewScanner(connection)
for {
scanner.Scan()
name := scanner.Text()
// verify name
if len(name) >= 3 {
client.Name = name
break
}
connection.Write([]byte("atleast 3 characters\n"))
}
return client
}
func removeClient(client Client) {
client.Connection.Close()
c_index := -1
for i, c := range ClientList {
if c == client {
c_index = i
break
}
}
if c_index != -1 {
ClientList = append(ClientList[:c_index], ClientList[c_index+1:]...)
}
// Notify others that this client has left the chat
ClientLeft(client)
fmt.Println("Exit:", client.Name, c_index)
}