Backend/serverCommunication/minecraft.go

123 lines
3.3 KiB
Go

package serverCommunication
import (
"errors"
"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"
)
func GetMinecraftClientByName(Name string) *structs.MinecraftClient {
for name, client := range cache.MinecraftClients {
if name == Name {
logger.Minecraft.Debugln("return mc client", client.Name)
return client
}
}
logger.Minecraft.Warnln("mc client nil")
return nil
}
func getMinecraftServerNameByDest(dest int) string {
if dest == kraProtocol.DestProxy {
return "proxy-1"
} else { // get players current server from db if dest is 11
return "lobby-1"
}
}
func HandleMinecraftMessage(conn *websocket.Conn, status int, cmdID int, dest int, playerUuid string, cmdNumber int, args string) {
var raw []byte
var err error
if dest == kraProtocol.DestBackend {
resArgs := minecraftCommandHandler(cmdNumber, playerUuid)
if status == kraProtocol.StatusGet {
raw = kraProtocol.EncodeJavaMessage(kraProtocol.StatusReply, cmdID, 0, playerUuid, cmdNumber, resArgs)
err = conn.WriteMessage(websocket.BinaryMessage, raw)
if err != nil {
logger.Minecraft.Warnln("write:", err)
}
}
} else if dest == kraProtocol.DestVoice || dest == kraProtocol.DestMobile { // forwarding messsage to voice or mobile
destConn := getConnForDest(dest, playerUuid)
if destConn != nil {
raw = kraProtocol.EncodeWebMessage(status, cmdID, cmdNumber, args)
err = destConn.WriteMessage(websocket.BinaryMessage, raw)
if err != nil {
logger.Minecraft.Warnln("write:", err)
}
} else { // conn is not connected
raw = kraProtocol.EncodeJavaMessage(kraProtocol.StatusErrTryAgain, cmdID, dest, playerUuid, cmdNumber, args)
err = conn.WriteMessage(websocket.BinaryMessage, raw)
if err != nil {
logger.Minecraft.Warnln("write:", err)
}
}
} else if dest == kraProtocol.DestProxy {
client := GetMinecraftClientByName("proxy-1")
raw := kraProtocol.EncodeJavaMessage(status, cmdID, dest, playerUuid, cmdNumber, args)
err = client.Connection.WriteMessage(websocket.BinaryMessage, raw)
if err != nil {
logger.Minecraft.Warnln("write:", err)
}
}
}
func minecraftCommandHandler(cmdNumber int, playerUuid string) (args string) {
switch cmdNumber {
case 10: // testing
return IsVoiceAndMobileSocketConnected(playerUuid)
default:
return "default"
}
}
// Deprecated: only for testing, use SendMessageToMinecraftServer instead
func SendMessageToServer(dest int, playerUuid string, args string) {
mcClient := GetMinecraftClientByName(getMinecraftServerNameByDest(dest))
raw := kraProtocol.EncodeJavaMessage(10, 1, 2, playerUuid, 15, args)
if mcClient != nil {
mcClient.Connection.WriteMessage(websocket.BinaryMessage, raw)
}
}
func SendMessageToMinecraftServer(status int, dest int, playerUuid string, cmdNumber int, args string) error {
cmdID := 0
raw := kraProtocol.EncodeJavaMessage(status, cmdID, dest, playerUuid, cmdNumber, args)
serverName := getMinecraftServerNameByDest(dest)
mcClient := GetMinecraftClientByName(serverName)
if mcClient == nil {
return errors.New("mcClient nil")
}
err := mcClient.Connection.WriteMessage(websocket.BinaryMessage, raw)
if err != nil {
logger.Minecraft.Warnln("err", err)
return errors.New("write err: " + err.Error())
}
return nil
}