package structs import ( "errors" "sync" "time" "github.com/gofiber/websocket/v2" "krakatoa.net/backend/modules/logger" ) type MinecraftClient struct { Name string Conn *websocket.Conn connMu sync.Mutex CmdIDs []int // cache for received cmdIDs cmdIDMu sync.Mutex CmdIDsByBackend []*A CmdIDsByBackendMu sync.Mutex CurrentCmdIDIndexByBackend int SendQueueMessages []*SendQueueMessage sendQueueMessagesMu 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) RemoveCmdID(cmdID int) { mcClient.cmdIDMu.Lock() defer mcClient.cmdIDMu.Unlock() newArr, err := removeCmdIDFromList(mcClient.CmdIDs, cmdID) if err != nil { logger.Minecraft.Warnln("removeCmdIDFromList:", err) } else { mcClient.CmdIDs = newArr } } func (mcClient *MinecraftClient) GenerateMinecraftCmdID() int { if mcClient.CurrentCmdIDIndexByBackend >= 4294967296 || mcClient.CurrentCmdIDIndexByBackend < 10 { return 10 } mcClient.CurrentCmdIDIndexByBackend++ return mcClient.CurrentCmdIDIndexByBackend } func (mcClient *MinecraftClient) AddMessageToSendQueue(originDest int, originCmdID int, raw []byte, cmdID int) { mcClient.SendQueueMessages = append(mcClient.SendQueueMessages, &SendQueueMessage{MessageRaw: raw, CmdID: cmdID, TrySendCount: 0, OriginDest: originDest, OriginCmdID: originCmdID, Time: time.Now()}) } func (mcClient *MinecraftClient) IsCmdIDInSendMessagesQueue(cmdID int) bool { for _, queueMsg := range mcClient.SendQueueMessages { if cmdID == queueMsg.CmdID { 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) 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 } } }