-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmain.go
127 lines (110 loc) · 2.68 KB
/
main.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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package main
import (
"fmt"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{ReadBufferSize: 4096, WriteBufferSize: 4096} // For upgrading regular HTTP connections to WebSocket
type Message struct {
Type string `json:"type"`
IsGroupMsg bool `json:"isGroupMsg"`
Group string `json:"group,omitempty"`
To string `json:"to"`
Content string `json:"content"`
FileData []byte `json:"fileData,omitempty"`
From string `json:"From"`
}
var clients = make(map[string]*websocket.Conn) // To store client connections with usernames
var groups = make(map[string][]string)
func handleWebSocket(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil) // Upgrade connection
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
// Read initial username
var initMsg Message
err = conn.ReadJSON(&initMsg)
if err != nil {
fmt.Println(err)
return
}
clients[initMsg.From] = conn // Register client with username
fmt.Println(initMsg.From, " joined")
for {
var msg Message
err := conn.ReadJSON(&msg)
if err != nil {
fmt.Println(err)
delete(clients, initMsg.From) // Remove client on error
break
}
if msg.Type == "message" || msg.Type == "file" {
if msg.IsGroupMsg {
forwardGroupMsg(&msg)
} else {
forwardDirectMsg(&msg)
}
} else if msg.Type == "cmd" {
if msg.Content == "create group" {
createGroup(&msg)
} else if msg.Content == "join group" {
joinGroup(&msg)
}
}
}
}
func createGroup(msg *Message) {
if _, ok := groups[msg.Group]; ok {
println("Group already present.")
} else {
groups[msg.Group] = append(groups[msg.Group], msg.From)
}
}
func joinGroup(msg *Message) {
if _, ok := groups[msg.Group]; !ok {
println("Group doesn't exist: ", msg.Group)
} else {
groups[msg.Group] = append(groups[msg.Group], msg.From)
}
}
func forwardDirectMsg(msg *Message) {
if _, ok := clients[msg.To]; ok {
err := clients[msg.To].WriteJSON(msg)
if err != nil {
fmt.Println(err)
delete(clients, msg.To)
}
}
}
func forwardGroupMsg(msg *Message) {
if _, ok := groups[msg.Group]; !ok {
fmt.Println("Group doesn't exist: ", msg.Group)
return
}
group := groups[msg.Group]
flag := false
for _, i := range group {
if i == msg.From {
flag = true
}
}
if !flag {
fmt.Println(msg.From, " not belong to Group: ", msg.Group)
return
}
for _, client := range groups[msg.Group] {
if client != msg.From { // Skip sending to self
err := clients[client].WriteJSON(msg)
if err != nil {
fmt.Println(err)
delete(clients, client)
}
}
}
}
func main() {
http.HandleFunc("/ws", handleWebSocket)
http.ListenAndServe(":8080", nil)
}