Skip to content

Commit 9ec2e6e

Browse files
committed
Broadcast messages to chatroom
1 parent b7ae05b commit 9ec2e6e

File tree

4 files changed

+47
-23
lines changed

4 files changed

+47
-23
lines changed

api.http

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Content-Type: application/json
2020

2121
> {% client.global.set("token", response.body.token) %}
2222

23-
### Post Chat Message
23+
### Post Question Chat Message
2424
POST {{baseUrl}}/messages
2525
Authorization: Bearer {{token}}
2626
Content-Type: application/json
@@ -29,6 +29,15 @@ Content-Type: application/json
2929
"content": "Hi, I'm a new student. How do I check my grades?"
3030
}
3131

32+
### Post Reply Chat Message
33+
POST {{baseUrl}}/messages
34+
Authorization: Bearer {{token}}
35+
Content-Type: application/json
36+
37+
{
38+
"content": "Go to the Home Page, click on My Profile and then on Grades"
39+
}
40+
3241
### Get Last 50 Messages
3342
GET {{baseUrl}}/messages
3443
Authorization: Bearer {{token}}

cmd/server/main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func fetchStockQuote(stockCode string) (string, error) {
5959
}
6060

6161
func runBot(cmdClient *mq.RabbitMQ, msgClient *mq.RabbitMQ) {
62-
msgs, err := cmdClient.Consume(false) // manual ack
62+
msgs, err := cmdClient.Consume(false)
6363
if err != nil {
6464
log.Fatalf("Bot: Failed to consume command queue: %v", err)
6565
}
@@ -167,7 +167,7 @@ func main() {
167167
log.Println("Saving bot message")
168168
chat.SaveMessage(message)
169169

170-
chat.BroadcastMessageToClients(msg.Content, "bot", message.CreatedAt)
170+
chat.BroadcastMessageToClients(msg.Content, "bot", BOT_ID, message.CreatedAt)
171171
d.Ack(false)
172172
}
173173
}()

internal/chat/handler.go

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,6 @@ type StockCommand struct {
2323
StockCode string `json:"stock_code"`
2424
}
2525

26-
type BroadcastMessage struct {
27-
Content string `json:"content"`
28-
User string `json:"user"`
29-
Timestamp time.Time `json:"timestamp"`
30-
}
31-
3226
var rabbitCmd, rabbitMsgs *mq.RabbitMQ
3327

3428
func getUserID(username string) (int, error) {
@@ -92,7 +86,9 @@ func PostMessage(c *gin.Context) {
9286
log.Printf("Failed to save message: %v", err)
9387
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to save message"})
9488
}
95-
89+
90+
BroadcastMessageToClients(msg.Content, username.(string), userID, msg.CreatedAt)
91+
9692
c.JSON(http.StatusCreated, gin.H{"message": "Message saved."})
9793
}
9894

@@ -132,16 +128,13 @@ func SaveMessage(message models.Message) error {
132128
return nil
133129
}
134130

135-
func BroadcastMessageToClients(content, user string, timestamp time.Time) {
136-
msg := BroadcastMessage{
131+
func BroadcastMessageToClients(content, user string, userID int, timestamp time.Time) {
132+
msg := websocket.BroadcastMessage{
137133
Content: content,
138134
User: user,
135+
UserID: userID,
139136
Timestamp: timestamp,
140137
}
141-
msgBytes, err := json.Marshal(msg)
142-
if err != nil {
143-
log.Printf("Failed to marshal broadcast message: %v", err)
144-
}
145138

146-
websocket.Broadcast <- msgBytes
139+
websocket.Broadcast <- msg
147140
}

internal/websocket/websocket.go

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,32 @@
11
package websocket
22

33
import (
4+
"encoding/json"
45
"log"
56
"net/http"
67
"sync"
8+
"time"
79

810
"github.com/gin-gonic/gin"
911
"github.com/gorilla/websocket"
1012
)
1113

1214
type Client struct {
13-
Conn *websocket.Conn
14-
Send chan []byte
15+
Conn *websocket.Conn
16+
Send chan BroadcastMessage
17+
UserID int
18+
}
19+
20+
type BroadcastMessage struct {
21+
Content string `json:"content"`
22+
User string `json:"user"`
23+
UserID int `json:"user_id"`
24+
Timestamp time.Time `json:"timestamp"`
1525
}
1626

1727
var (
1828
clients = make(map[*Client]bool)
19-
Broadcast = make(chan []byte)
29+
Broadcast = make(chan BroadcastMessage)
2030
mutex = &sync.Mutex{}
2131
upgrader = websocket.Upgrader{
2232
CheckOrigin: func(r *http.Request) bool { return true },
@@ -31,14 +41,18 @@ func HandleConnections(c *gin.Context) {
3141
}
3242
defer ws.Close()
3343

34-
client := &Client{Conn: ws, Send: make(chan []byte)}
44+
client := &Client{Conn: ws, Send: make(chan BroadcastMessage), UserID: -1}
3545
mutex.Lock()
3646
clients[client] = true
3747
mutex.Unlock()
3848

3949
go func() {
4050
for msg := range client.Send {
41-
err := client.Conn.WriteMessage(websocket.TextMessage, msg)
51+
msgBytes, err := json.Marshal(msg)
52+
if err != nil {
53+
log.Printf("Failed to marshal broadcast message: %v", err)
54+
}
55+
err = client.Conn.WriteMessage(websocket.TextMessage, msgBytes)
4256
if err != nil {
4357
log.Printf("Write error: %v", err)
4458
break
@@ -54,7 +68,12 @@ func HandleConnections(c *gin.Context) {
5468
mutex.Unlock()
5569
break
5670
}
57-
Broadcast <- msg
71+
var broadcastMessage BroadcastMessage
72+
err = json.Unmarshal(msg, &broadcastMessage)
73+
if err != nil {
74+
log.Printf("Failed to unmarshal broadcast message: %v", err)
75+
}
76+
Broadcast <- broadcastMessage
5877
}
5978
}
6079

@@ -63,6 +82,9 @@ func HandleMessages() {
6382
msg := <-Broadcast
6483
mutex.Lock()
6584
for client := range clients {
85+
if client.UserID == msg.UserID {
86+
continue
87+
}
6688
select {
6789
case client.Send <- msg:
6890
default:

0 commit comments

Comments
 (0)