Backend/servers/web/socketHub.go

109 lines
3.3 KiB
Go

package web
import (
"context"
"time"
"github.com/gofiber/websocket/v2"
"go.mongodb.org/mongo-driver/bson"
"krakatoa.net/backend/modules/cache"
"krakatoa.net/backend/modules/kraProtocol"
"krakatoa.net/backend/modules/logger"
"krakatoa.net/backend/modules/mongo"
"krakatoa.net/backend/modules/structs"
serverCommunication "krakatoa.net/backend/serverCommunication"
)
//var clients = make(map[string]*structs.Client)
var register = make(chan *websocket.Conn)
var broadcast = make(chan structs.SocketBroadcastData)
var unregister = make(chan *websocket.Conn)
func RunHub() {
for {
select {
case connection := <-register:
token := connection.Cookies("token")
clientDb := structs.WebClientDb{}
err := mongo.PlayersCollection.FindOne(context.TODO(), bson.D{{"$or", bson.A{bson.D{{"voiceSessionToken", token}}, bson.D{{"mobileSessionToken", token}}}}}).Decode(&clientDb)
if err != nil {
logger.Mongo.Println("err", err)
}
logger.Web.Debugln("getClientByUuid", clientDb, token)
client := serverCommunication.GetWebClientOrCreateNewByUuid(clientDb.Uuid)
if token == clientDb.VoiceSessionToken { // voice
client.VoiceConn = connection
logger.Web.Println("voice")
serverCommunication.SendMessageToMinecraftServer(kraProtocol.DestBackend, 0, kraProtocol.StatusGet, 10, clientDb.Uuid, 13337, "")
} else if token == clientDb.MobileSessionToken { // mobile
client.MobileConn = connection
logger.Web.Println("mobile")
serverCommunication.SendMessageToMinecraftServer(kraProtocol.DestBackend, 0, kraProtocol.StatusGet, 10, clientDb.Uuid, 37657, "")
} else { // token invald
logger.Web.Println("invalid")
}
logger.Web.Debugln("finish client", client)
case data := <-broadcast:
logger.Web.Println("message received", data.Msg)
// check if it is a connection from voice or mobile
for _, client := range cache.WebClients {
if client.MobileConn == data.Conn || client.VoiceConn == data.Conn {
go serverCommunication.HandleWebMessage(client.VoiceConn == data.Conn, data.Conn, client.Uuid, data.Msg)
break
}
}
case connection := <-unregister:
for uuid, client := range cache.WebClients {
logger.Web.Println("client unregister", uuid, client)
if client.MobileConn == connection {
client.MobileConn = nil
logger.Web.Println("delete mobileConn", client)
serverCommunication.SendMessageToMinecraftServer(kraProtocol.DestBackend, 0, kraProtocol.StatusGet, 10, uuid, 64247, "")
} else if client.VoiceConn == connection {
client.VoiceConn = nil
logger.Web.Println("delete voiceConn", client)
serverCommunication.SendMessageToMinecraftServer(kraProtocol.DestBackend, 0, kraProtocol.StatusGet, 10, uuid, 22348, "")
}
logger.Web.Println("client after updating", client)
if client.VoiceConn == nil && client.MobileConn == nil {
delete(cache.WebClients, uuid)
logger.Web.Println("delete client", client)
}
}
}
}
}
func Test() {
for {
for _, client := range cache.WebClients {
raw := kraProtocol.EncodeWebMessage(1, 1, 2, "this a test ping")
if client.VoiceConn != nil {
client.SendBinaryMessage(client.VoiceConn, raw)
}
if client.MobileConn != nil {
client.SendBinaryMessage(client.MobileConn, raw)
}
}
time.Sleep(30 * time.Second)
}
}