60 lines
1.2 KiB
Go
60 lines
1.2 KiB
Go
package api
|
|
|
|
import (
|
|
"log"
|
|
"net/http"
|
|
"shagram/internal/db"
|
|
"shagram/internal/websocket"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
gws "github.com/gorilla/websocket"
|
|
)
|
|
|
|
var upgrader = gws.Upgrader{
|
|
CheckOrigin: func(r *http.Request) bool { return true },
|
|
}
|
|
|
|
func WebSocketHandler(hub *websocket.Hub, database *db.DB) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
roomID := c.Param("room")
|
|
room := hub.GetOrCreateRoom(roomID)
|
|
|
|
conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
client := &websocket.Client{Conn: conn, Room: room}
|
|
room.Register(client)
|
|
|
|
go func() {
|
|
defer func() {
|
|
room.Unregister(client)
|
|
hub.CleanupRoom(roomID)
|
|
}()
|
|
|
|
for {
|
|
var msg map[string]string
|
|
err := client.Conn.ReadJSON(&msg)
|
|
if err != nil {
|
|
break
|
|
}
|
|
user := msg["user"]
|
|
if user == "" {
|
|
user = "Anonymous"
|
|
}
|
|
_, err = database.Exec(`
|
|
INSERT INTO messages (room_id, user, text)
|
|
VALUES (?, ?, ?)`, roomID, user, msg["text"])
|
|
if err != nil {
|
|
log.Printf("Save message error: %v", err)
|
|
}
|
|
formattedMsg := user + ": " + msg["text"]
|
|
message := []byte(formattedMsg)
|
|
room.Broadcast(message)
|
|
}
|
|
}()
|
|
}
|
|
|
|
}
|