minecraft ack handling

master
Alex 2021-12-29 13:01:57 +01:00
parent 26267c4ffb
commit eaa8d0b142
3 changed files with 46 additions and 15 deletions

View File

@ -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) {

View File

@ -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)

View File

@ -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) {