123 lines
3.3 KiB
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
|
|
}
|