Backend/servers/minecraft/socketHub.go

52 lines
1.6 KiB
Go

package minecraft
import (
"github.com/gofiber/websocket/v2"
"krakatoa.net/backend/modules/cache"
"krakatoa.net/backend/modules/kraProtocol"
"krakatoa.net/backend/modules/logger"
"krakatoa.net/backend/modules/structs"
serverCommunication "krakatoa.net/backend/serverCommunication"
)
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:
servername := connection.Query("s")
dest := serverCommunication.GenerateDestForNewMinecraftClient()
cache.MinecraftClients[servername] = &structs.MinecraftClient{Name: servername, Dest: dest, Conn: connection}
logger.Minecraft.Debugln("connection registered ", connection.Query("c"), connection, "dest:", dest)
mcClient := serverCommunication.GetMinecraftClientByConn(connection)
raw := kraProtocol.EncodeJavaMessage(kraProtocol.StatusGet, mcClient.GenerateMinecraftCmdID(), 0, kraProtocol.DummyUUID, 33767, mcClient.Dest)
err := mcClient.SendBinaryMessage(raw)
if err != nil {
logger.Minecraft.Warnln("failed to send msg to mc client:", mcClient.Name, "dest:", mcClient.Dest)
}
case data := <-broadcast:
logger.Minecraft.Debugln("message received", data.Msg)
go serverCommunication.HandleMinecraftMessage(data.Conn, data.Msg)
case connection := <-unregister:
for servername, client := range cache.MinecraftClients {
if client.Conn == connection {
delete(cache.MinecraftClients, servername)
logger.Minecraft.Debugln("connection unregistered", servername, connection.Query("s"))
}
}
}
}
}