From eaa8d0b142f0a6f5f6617d37c4d994bcb8bdddb4 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 29 Dec 2021 13:01:57 +0100 Subject: [PATCH] minecraft ack handling --- modules/structs/MinecraftClient.go | 14 ++++++------ serverCommunication/minecraft.go | 36 +++++++++++++++++++++++++++--- serverCommunication/web.go | 11 ++++----- 3 files changed, 46 insertions(+), 15 deletions(-) diff --git a/modules/structs/MinecraftClient.go b/modules/structs/MinecraftClient.go index c6278fe..dbf0dff 100644 --- a/modules/structs/MinecraftClient.go +++ b/modules/structs/MinecraftClient.go @@ -8,17 +8,17 @@ import ( ) type MinecraftClient struct { - Name string - Connection *websocket.Conn - connMu sync.Mutex - CmdIDs []int - cmdIDMu sync.Mutex + Name string + Conn *websocket.Conn + connMu sync.Mutex + CmdIDs []int + cmdIDMu sync.Mutex } -func (mcClient *MinecraftClient) SendBinaryMessage(conn *websocket.Conn, msg []byte) error { +func (mcClient *MinecraftClient) SendBinaryMessage(msg []byte) error { mcClient.connMu.Lock() defer mcClient.connMu.Unlock() - return conn.WriteMessage(websocket.BinaryMessage, msg) + return mcClient.Conn.WriteMessage(websocket.BinaryMessage, msg) } func (mcClient *MinecraftClient) RemoveCmdID(cmdID int) { diff --git a/serverCommunication/minecraft.go b/serverCommunication/minecraft.go index 388ab4c..b21c289 100644 --- a/serverCommunication/minecraft.go +++ b/serverCommunication/minecraft.go @@ -44,6 +44,36 @@ func HandleMinecraftMessage(conn *websocket.Conn, status int, cmdID int, dest in var raw []byte var err error + mcClient := GetMinecraftClientByConn(conn) + + if mcClient == nil { + raw := kraProtocol.EncodeJavaMessage(kraProtocol.StatusErrTryAgain, cmdID, 0, playerUuid, cmdNumber, "") + + err = conn.WriteMessage(websocket.BinaryMessage, raw) + + if err != nil { + logger.Minecraft.Warnln("write err:", err) + } + return + } + + if status == kraProtocol.StatusGet { + // cmdID already in queue + if isCmdIDInList(mcClient.CmdIDs, cmdID) { + raw := kraProtocol.EncodeJavaMessage(kraProtocol.StatusMessageAlreadyInQueue, cmdID, dest, playerUuid, cmdNumber, args) + + err = mcClient.SendBinaryMessage(raw) + + if err != nil { + logger.Minecraft.Warnln("write err", err) + } + return + } + + // not in queue, add to queue + mcClient.CmdIDs = append(mcClient.CmdIDs, cmdID) + } + if dest == kraProtocol.DestBackend { resArgs := minecraftCommandHandler(cmdNumber, playerUuid) @@ -81,7 +111,7 @@ func HandleMinecraftMessage(conn *websocket.Conn, status int, cmdID int, dest in raw := kraProtocol.EncodeJavaMessage(status, cmdID, dest, playerUuid, cmdNumber, args) - err = client.Connection.WriteMessage(websocket.BinaryMessage, raw) + err = client.SendBinaryMessage(raw) if err != nil { logger.Minecraft.Warnln("write:", err) @@ -107,7 +137,7 @@ func SendMessageToServer(dest int, playerUuid string, args string) { raw := kraProtocol.EncodeJavaMessage(10, 1, 2, playerUuid, 15, args) if mcClient != nil { - mcClient.Connection.WriteMessage(websocket.BinaryMessage, raw) + mcClient.SendBinaryMessage(raw) } } @@ -123,7 +153,7 @@ func SendMessageToMinecraftServer(status int, dest int, playerUuid string, cmdNu return errors.New("mcClient nil") } - err := mcClient.Connection.WriteMessage(websocket.BinaryMessage, raw) + err := mcClient.SendBinaryMessage(raw) if err != nil { logger.Minecraft.Warnln("err", err) diff --git a/serverCommunication/web.go b/serverCommunication/web.go index fb56ffc..ce2e98e 100644 --- a/serverCommunication/web.go +++ b/serverCommunication/web.go @@ -27,6 +27,7 @@ func HandleWebMessage(isVoice bool, conn *websocket.Conn, uuid string, status in return } + // ack if status == kraProtocol.StatusGet { var cmdIDInList bool @@ -50,7 +51,6 @@ func HandleWebMessage(isVoice bool, conn *websocket.Conn, uuid string, status in } // add cmdID to list - if isVoice { logger.Web.Debugln("voiceCmdIDs", webClient.VoiceCmdIDs) webClient.VoiceCmdIDs = append(webClient.VoiceCmdIDs, cmdID) @@ -60,9 +60,9 @@ func HandleWebMessage(isVoice bool, conn *websocket.Conn, uuid string, status in webClient.MobileCmdIDs = append(webClient.MobileCmdIDs, cmdID) logger.Web.Debugln("after MobileCmdIDs", webClient.MobileCmdIDs) } + return } - - logger.Minecraft.Debugln("dest", dest, dest == kraProtocol.DestProxy) + // no ack if dest == kraProtocol.DestProxy || dest == kraProtocol.DestPlayersCurrentServer { // forwarding message to java / minecraft err = SendMessageToMinecraftServer(status, dest, uuid, cmdNumber, args) @@ -154,6 +154,7 @@ func HandleWebMessage(isVoice bool, conn *websocket.Conn, uuid string, status in } } + /* TODO: delete cmdID if ack was answered if webClient != nil { // remove cmdID from list if isVoice { webClient.RemoveVoiceCmdID(cmdID) @@ -178,8 +179,8 @@ func HandleWebMessage(isVoice bool, conn *websocket.Conn, uuid string, status in } else { client.MobileCmdIDs = newArr } - } */ - } + } + } */ } func voiceCommandHandler(cmdNumber int, uuid string) (args string) {