114 lines
3.9 KiB
Go
114 lines
3.9 KiB
Go
package structs
|
|
|
|
import (
|
|
"errors"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/gofiber/websocket/v2"
|
|
"krakatoa.net/backend/modules/logger"
|
|
)
|
|
|
|
type MinecraftClient struct {
|
|
Name string
|
|
Dest int
|
|
Conn *websocket.Conn
|
|
connMu sync.Mutex
|
|
CurrentCmdID int // cmdID for the messages sent to the mc servers from backend
|
|
SendQueueMessages []*SendQueueMessage
|
|
sendQueueMessagesMu sync.Mutex
|
|
ReceivedQueueMessages []*ReceivedQueueMessage
|
|
receivedQueueMessagesMu sync.Mutex
|
|
}
|
|
|
|
func (mcClient *MinecraftClient) SendBinaryMessage(msg []byte) error {
|
|
mcClient.connMu.Lock()
|
|
defer mcClient.connMu.Unlock()
|
|
logger.Minecraft.Infoln("SendBinaryMessage")
|
|
return mcClient.Conn.WriteMessage(websocket.BinaryMessage, msg)
|
|
}
|
|
|
|
func (mcClient *MinecraftClient) GenerateMinecraftCmdID() int {
|
|
if mcClient.CurrentCmdID >= 4294967296 || mcClient.CurrentCmdID < 10 {
|
|
return 10
|
|
}
|
|
|
|
mcClient.CurrentCmdID++
|
|
|
|
return mcClient.CurrentCmdID
|
|
}
|
|
|
|
func (mcClient *MinecraftClient) AddMessageToSendQueue(originDest int, originCmdID int, messageRaw []byte, cmdID int) {
|
|
mcClient.SendQueueMessages = append(mcClient.SendQueueMessages, &SendQueueMessage{MessageRaw: messageRaw, CmdID: cmdID, TrySendCount: 0, OriginDest: originDest, OriginCmdID: originCmdID, Time: time.Now()})
|
|
}
|
|
|
|
func (mcClient *MinecraftClient) AddMessageToReceivedQueue(originDest int, originCmdID int, messageRaw []byte) {
|
|
mcClient.ReceivedQueueMessages = append(mcClient.ReceivedQueueMessages, &ReceivedQueueMessage{MessageRaw: messageRaw, OriginDest: originCmdID, OriginCmdID: originCmdID})
|
|
}
|
|
|
|
func (mcClient *MinecraftClient) IsCmdIDInSendMessagesQueue(cmdID int) bool {
|
|
for _, queueMsg := range mcClient.SendQueueMessages {
|
|
if cmdID == queueMsg.CmdID {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (mcClient *MinecraftClient) IsCmdIDInReceivedMessagesQueue(cmdID int) bool {
|
|
for _, queueMsg := range mcClient.ReceivedQueueMessages {
|
|
if cmdID == queueMsg.OriginCmdID {
|
|
return true
|
|
}
|
|
}
|
|
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) GetMessageFromReceivedQueueByCmdID(cmdID int) (queueMsg ReceivedQueueMessage, err error) {
|
|
for _, queueMsg := range mcClient.ReceivedQueueMessages {
|
|
if cmdID == queueMsg.OriginCmdID {
|
|
return *queueMsg, nil
|
|
}
|
|
}
|
|
return ReceivedQueueMessage{}, errors.New("message from received queue by cmdID not found")
|
|
}
|
|
|
|
func (mcClient *MinecraftClient) RemoveMessageFromSendQueueByCmdID(cmdID int) {
|
|
mcClient.sendQueueMessagesMu.Lock()
|
|
defer mcClient.sendQueueMessagesMu.Unlock()
|
|
|
|
for index, message := range mcClient.SendQueueMessages {
|
|
if message.CmdID == cmdID {
|
|
logger.Minecraft.Debugln("RemoveMessageFromSendQueueByCmdID before", mcClient.SendQueueMessages)
|
|
newArr := append(mcClient.SendQueueMessages[:index], mcClient.SendQueueMessages[index+1:]...)
|
|
mcClient.SendQueueMessages = newArr
|
|
logger.Minecraft.Debugln("RemoveMessageFromSendQueueByCmdID after", mcClient.SendQueueMessages)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
func (mcClient *MinecraftClient) RemoveMessageFromReceivedQueueByCmdID(cmdID int) {
|
|
mcClient.receivedQueueMessagesMu.Lock()
|
|
defer mcClient.receivedQueueMessagesMu.Unlock()
|
|
|
|
for index, message := range mcClient.ReceivedQueueMessages {
|
|
if message.OriginCmdID == cmdID {
|
|
logger.Minecraft.Debugln("RemoveMessageFromReceivedQueueByCmdID before", mcClient.ReceivedQueueMessages)
|
|
newArr := append(mcClient.ReceivedQueueMessages[:index], mcClient.ReceivedQueueMessages[index+1:]...)
|
|
mcClient.ReceivedQueueMessages = newArr
|
|
logger.Minecraft.Debugln("RemoveMessageFromReceivedQueueByCmdID after", mcClient.ReceivedQueueMessages)
|
|
break
|
|
}
|
|
}
|
|
}
|