/
chatRoomService.go
71 lines (63 loc) · 1.69 KB
/
chatRoomService.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
package service
import (
"encoding/json"
"github.com/anytimesoon/eurovision-party/pkg/dto"
"github.com/anytimesoon/eurovision-party/pkg/enum"
"github.com/google/uuid"
"log"
)
type Room struct {
CommentService CommentService
clients map[uuid.UUID]*ChatClient
broadcastChatMessage chan []byte
BroadcastUpdate chan []byte
Register chan *ChatClient
unregister chan *ChatClient
sendLatesMessagesToUser chan []byte
}
func NewRoom(commentService CommentService) *Room {
return &Room{
CommentService: commentService,
broadcastChatMessage: make(chan []byte),
BroadcastUpdate: make(chan []byte),
Register: make(chan *ChatClient),
unregister: make(chan *ChatClient),
clients: make(map[uuid.UUID]*ChatClient),
}
}
func (r *Room) Run() {
for {
select {
case client := <-r.Register:
r.clients[client.UserId] = client
case client := <-r.unregister:
if _, ok := r.clients[client.UserId]; ok {
delete(r.clients, client.UserId)
close(client.Send)
}
case commentJSON := <-r.broadcastChatMessage:
chatMessage := dto.SocketMessage{
Category: enum.COMMENT,
Body: commentJSON,
}
r.broadcast(chatMessage)
case updateJSON := <-r.BroadcastUpdate:
chatMessage := dto.SocketMessage{
Category: enum.UPDATE_USER,
Body: updateJSON,
}
log.Println("Broadcasting user update")
r.broadcast(chatMessage)
}
}
}
func (r *Room) broadcast(msg dto.SocketMessage) {
message, err := json.Marshal(msg)
if err != nil {
log.Printf("failed to encode message to chatMessage")
return
}
for _, client := range r.clients {
client.Send <- message
}
}