From 7f2ee4c8604eab273a962652f7a2475a87801dc1 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 12 Feb 2022 21:08:11 +0100 Subject: [PATCH] origin dest added to reply the sender after successful reply of the target dest --- modules/structs/MinecraftClient.go | 10 ++++++++++ modules/structs/QueueMessage.go | 1 + serverCommunication/minecraft.go | 24 ++++++++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/modules/structs/MinecraftClient.go b/modules/structs/MinecraftClient.go index 7441470..654d2d1 100644 --- a/modules/structs/MinecraftClient.go +++ b/modules/structs/MinecraftClient.go @@ -1,6 +1,7 @@ package structs import ( + "errors" "sync" "time" @@ -64,6 +65,15 @@ func (mcClient *MinecraftClient) IsCmdIDInSendMessagesQueue(cmdID int) bool { return false } +func (mcClient *MinecraftClient) GetMessageFromSendQueueByCmdID(cmdID int) (queueMsg SendQueueMessage, err error) { + for _, queueMsg := range mcClient.SendQueueMessages { + if cmdID == queueMsg.CmdID { + return *queueMsg, nil + } + } + return SendQueueMessage{}, errors.New("message from send queue by cmdID not found") +} + func (mcClient *MinecraftClient) RemoveMessageFromSendQueueByCmdID(cmdID int) { mcClient.sendQueueMessagesMu.Lock() defer mcClient.sendQueueMessagesMu.Unlock() diff --git a/modules/structs/QueueMessage.go b/modules/structs/QueueMessage.go index 246b525..aee8ca9 100644 --- a/modules/structs/QueueMessage.go +++ b/modules/structs/QueueMessage.go @@ -7,5 +7,6 @@ type SendQueueMessage struct { CmdID int TrySendCount int OriginDest int // This value tells from which destination this message was sent. (example: voice, mobile, backend) + OriginCmdID int Time time.Time } diff --git a/serverCommunication/minecraft.go b/serverCommunication/minecraft.go index 222f39b..bcab78d 100644 --- a/serverCommunication/minecraft.go +++ b/serverCommunication/minecraft.go @@ -29,6 +29,30 @@ func HandleMinecraftMessage(conn *websocket.Conn, msg []byte) { logger.Minecraft.Debugln(mcClient.IsCmdIDInSendMessagesQueue(cmdID)) if mcClient.IsCmdIDInSendMessagesQueue(cmdID) { + queueMsg, err := mcClient.GetMessageFromSendQueueByCmdID(cmdID) + + if err != nil { + return + } + + if queueMsg.OriginDest == kraProtocol.DestVoice || queueMsg.OriginDest == kraProtocol.DestMobile { + webClient := GetWebClientByUuid(playerUuid) + + raw := kraProtocol.EncodeWebMessage(kraProtocol.StatusReply, queueMsg.OriginCmdID, cmdNumber, args) + + var err error + + if queueMsg.OriginDest == kraProtocol.DestVoice { + err = webClient.SendBinaryMessage(webClient.VoiceConn, raw) + } else { + err = webClient.SendBinaryMessage(webClient.MobileConn, raw) + } + + if err != nil { + logger.Minecraft.Println("failed to send message") + } + } + mcClient.RemoveMessageFromSendQueueByCmdID(cmdID) // TODO: handle ack answer (send answer to mobile or handle her)