admin-dashboard-backend/socketserver/hub.go

76 lines
2.0 KiB
Go

package socketserver
import (
"encoding/json"
"fmt"
"janex/admin-dashboard-backend/grouptasks"
"janex/admin-dashboard-backend/modules/cache"
"janex/admin-dashboard-backend/modules/database"
"janex/admin-dashboard-backend/modules/structs"
"janex/admin-dashboard-backend/modules/utils"
"janex/admin-dashboard-backend/socketclients"
"github.com/gofiber/websocket/v2"
"github.com/rs/zerolog/log"
)
var register = make(chan *structs.SocketClient)
var broadcast = make(chan structs.SocketMessage)
var unregister = make(chan *websocket.Conn)
func RunHub() {
for {
select {
case newSocketClient := <-register:
userId := fmt.Sprintf("%v", newSocketClient.Conn.Locals("userId"))
sessionId := fmt.Sprintf("%v", newSocketClient.Conn.Locals("sessionId"))
// close connection instantly if sessionId is empty
if sessionId == "<nil>" {
newSocketClient.SendUnauthorizedCloseMessage()
continue
}
newSocketClient.SessionId = sessionId
newSocketClient.UserId = userId
cache.AddSocketClient(sessionId, newSocketClient)
log.Debug().Msgf("clients: %d", len(cache.GetSocketClients()))
log.Debug().Msgf("REGISTER CLIENT: %s", sessionId)
var user structs.User
database.DB.First(&user, "id = ?", userId)
newSocketClient.SendMessage(structs.SendSocketMessage{
Cmd: utils.SentInitUserSocketConnection,
Body: structs.InitUserSocketConnection{
User: structs.UserData{
Username: user.Username,
Email: user.Email,
},
GroupTasks: grouptasks.Groups,
},
})
socketclients.UpdateConnectedUsers()
case data := <-broadcast:
var receivedMessage structs.ReceivedMessage
if err := json.Unmarshal(data.Msg, &receivedMessage); err != nil {
log.Error().Msgf("Failed to unmarshal received msg, err: %s", err)
continue
}
log.Info().Msgf("Received message: %s", receivedMessage)
case connection := <-unregister:
cache.DeleteClientByConn(connection)
socketclients.UpdateConnectedUsers()
}
}
}