Files
2026-01-14 02:48:16 +03:00

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)
}
}()
}
}