Backend/modules/structs/WebClient.go

221 lines
8.0 KiB
Go

package structs
import (
"errors"
"sync"
"time"
"github.com/gofiber/websocket/v2"
"krakatoa.net/backend/modules/logger"
)
type WebClientDb struct {
Uuid string
VoiceSessionToken string
MobileSessionToken string
}
type A struct {
WebCmdID int
CmdIDFromMinecraftServer int
DestFromMinecraftServer int
}
type WebClient struct {
Uuid string
MobileConn *websocket.Conn
mobileConnMu sync.Mutex
CurrentMobileSendMessageCmdIDIndexByBackend int
VoiceConn *websocket.Conn
voiceConnMu sync.Mutex
CurrentVoiceSendMessageCmdIDIndexByBackend int
SendVoiceQueueMessages []*SendQueueMessage
sendVoiceQueueMessagesMu sync.Mutex
SendMobileQueueMessages []*SendQueueMessage
sendMobileQueueMessagesMu sync.Mutex
ReceivedVoiceQueueMessages []*ReceivedQueueMessage
receivedVoiceQueueMessagesMu sync.Mutex
ReceivedMobileQueueMessages []*ReceivedQueueMessage
receivedMobileQueueMessagesMu sync.Mutex
}
func (webClient *WebClient) AddMessageToVoiceSendQueue(originDest int, originCmdID int, messageRaw []byte, cmdID int) {
webClient.SendVoiceQueueMessages = append(webClient.SendVoiceQueueMessages, &SendQueueMessage{MessageRaw: messageRaw, CmdID: cmdID, TrySendCount: 0, OriginDest: originDest, OriginCmdID: originCmdID, Time: time.Now()})
}
func (webClient *WebClient) AddMessageToVoiceReceivedQueue(originDest int, originCmdID int, messageRaw []byte) {
webClient.ReceivedVoiceQueueMessages = append(webClient.ReceivedVoiceQueueMessages, &ReceivedQueueMessage{MessageRaw: messageRaw, OriginDest: originDest, OriginCmdID: originCmdID})
}
func (webClient *WebClient) AddMessageToMobileSendQueue(originDest int, originCmdID int, messageRaw []byte, cmdID int) {
webClient.SendMobileQueueMessages = append(webClient.SendMobileQueueMessages, &SendQueueMessage{MessageRaw: messageRaw, CmdID: cmdID, TrySendCount: 0, OriginDest: originDest, OriginCmdID: originCmdID, Time: time.Now()})
}
func (webClient *WebClient) AddMessageToMobileReceivedQueue(originDest int, originCmdID int, messageRaw []byte) {
webClient.ReceivedMobileQueueMessages = append(webClient.ReceivedMobileQueueMessages, &ReceivedQueueMessage{MessageRaw: messageRaw, OriginDest: originDest, OriginCmdID: originCmdID})
}
func (webClient *WebClient) IsCmdIDInSendVoiceMessagesQueue(cmdID int) bool {
return isCmdIDInSendMessagesQueue(webClient.SendVoiceQueueMessages, cmdID)
}
func (webClient *WebClient) IsCmdIDInSendMobileMessagesQueue(cmdID int) bool {
return isCmdIDInSendMessagesQueue(webClient.SendMobileQueueMessages, cmdID)
}
func isCmdIDInSendMessagesQueue(sendMessagesQueue []*SendQueueMessage, cmdID int) bool {
for _, queueMsg := range sendMessagesQueue {
if cmdID == queueMsg.CmdID {
return true
}
}
return false
}
func (webClient *WebClient) IsCmdIDInReceivedVoiceMessagesQueue(cmdID int) bool {
return isCmdIDInReceivedMessagesQueue(webClient.ReceivedVoiceQueueMessages, cmdID)
}
func (webClient *WebClient) IsCmdIDInReceivedMobileMessagesQueue(cmdID int) bool {
return isCmdIDInReceivedMessagesQueue(webClient.ReceivedMobileQueueMessages, cmdID)
}
func isCmdIDInReceivedMessagesQueue(receivedMessagesQueue []*ReceivedQueueMessage, cmdID int) bool {
for _, queueMsg := range receivedMessagesQueue {
if cmdID == queueMsg.OriginCmdID {
return true
}
}
return false
}
func (webClient *WebClient) GetMessageFromSendVoiceQueueByCmdID(cmdID int) (queueMsg SendQueueMessage, err error) {
return getMessageFromSendQueueByCmdID(webClient.SendVoiceQueueMessages, cmdID)
}
func (webClient *WebClient) GetMessageFromSendMobileQueueByCmdID(cmdID int) (queueMsg SendQueueMessage, err error) {
return getMessageFromSendQueueByCmdID(webClient.SendMobileQueueMessages, cmdID)
}
func getMessageFromSendQueueByCmdID(sendQueueMessages []*SendQueueMessage, cmdID int) (queueMsg SendQueueMessage, err error) {
for _, queueMsg := range sendQueueMessages {
if cmdID == queueMsg.CmdID {
return *queueMsg, nil
}
}
return SendQueueMessage{}, errors.New("message from send queue by cmdID not found")
}
func (webClient *WebClient) GetMessageFromReceivedVoiceQueueByCmdID(cmdID int) (queueMsg ReceivedQueueMessage, err error) {
return getMessageFromReceivedQueueByCmdID(webClient.ReceivedVoiceQueueMessages, cmdID)
}
func (webClient *WebClient) GetMessageFromReceivedMobileQueueByCmdID(cmdID int) (queueMsg ReceivedQueueMessage, err error) {
return getMessageFromReceivedQueueByCmdID(webClient.ReceivedMobileQueueMessages, cmdID)
}
func getMessageFromReceivedQueueByCmdID(receivedQueueMessages []*ReceivedQueueMessage, cmdID int) (queueMsg ReceivedQueueMessage, err error) {
for _, queueMsg := range receivedQueueMessages {
if cmdID == queueMsg.OriginCmdID {
return *queueMsg, nil
}
}
return ReceivedQueueMessage{}, errors.New("message from received queue by cmdID not found")
}
func (webClient *WebClient) RemoveMessageFromVoiceSendQueueByCmdID(cmdID int) {
webClient.SendVoiceQueueMessages = removeMessageFromSendQueueByCmdID(webClient.SendVoiceQueueMessages, &webClient.sendVoiceQueueMessagesMu, cmdID)
}
func (webClient *WebClient) RemoveMessageFromMobileSendQueueByCmdID(cmdID int) {
webClient.SendMobileQueueMessages = removeMessageFromSendQueueByCmdID(webClient.SendMobileQueueMessages, &webClient.sendMobileQueueMessagesMu, cmdID)
}
func removeMessageFromSendQueueByCmdID(queueMessages []*SendQueueMessage, mutex *sync.Mutex, cmdID int) []*SendQueueMessage {
mutex.Lock()
defer mutex.Unlock()
for index, message := range queueMessages {
if message.CmdID == cmdID {
logger.Web.Debugln("removeMessageFromSendQueueByCmdID before", queueMessages)
newArr := append(queueMessages[:index], queueMessages[index+1:]...)
queueMessages = newArr
logger.Web.Debugln("removeMessageFromSendQueueByCmdID after", queueMessages)
break
}
}
return queueMessages
}
func (webClient *WebClient) RemoveMessageFromVoiceReceivedQueueByCmdID(cmdID int) {
webClient.ReceivedVoiceQueueMessages = removeMessageFromReceivedQueueByCmdID(webClient.ReceivedVoiceQueueMessages, &webClient.receivedVoiceQueueMessagesMu, cmdID)
}
func (webClient *WebClient) RemoveMessageFromMobileReceivedQueueByCmdID(cmdID int) {
webClient.ReceivedMobileQueueMessages = removeMessageFromReceivedQueueByCmdID(webClient.ReceivedMobileQueueMessages, &webClient.receivedMobileQueueMessagesMu, cmdID)
}
func removeMessageFromReceivedQueueByCmdID(queueMessages []*ReceivedQueueMessage, mutex *sync.Mutex, cmdID int) []*ReceivedQueueMessage {
mutex.Lock()
defer mutex.Unlock()
for index, message := range queueMessages {
if message.OriginCmdID == cmdID {
logger.Web.Debugln("removeMessageFromReceivedQueueByCmdID before", queueMessages)
newArr := append(queueMessages[:index], queueMessages[index+1:]...)
queueMessages = newArr
logger.Web.Debugln("removeMessageFromReceivedQueueByCmdID after", queueMessages)
break
}
}
return queueMessages
}
func (webClient *WebClient) SendBinaryMessage(conn *websocket.Conn, msg []byte) error {
logger.Web.Infoln("SendBinaryMessage")
var err error
if conn == webClient.MobileConn {
webClient.mobileConnMu.Lock()
defer webClient.mobileConnMu.Unlock()
if conn == nil {
logger.WebMobile.Warnln("err conn nil SendBinaryMessage")
return errors.New("conn nil")
}
err = conn.WriteMessage(websocket.BinaryMessage, msg)
if err != nil {
logger.WebMobile.Warnln("err SendBinaryMessage to mobile client")
}
return err
}
webClient.voiceConnMu.Lock()
defer webClient.voiceConnMu.Unlock()
if conn == nil {
logger.WebVoice.Warnln("err conn nil SendBinaryMessage")
return errors.New("conn nil")
}
err = conn.WriteMessage(websocket.BinaryMessage, msg)
if err != nil {
logger.WebVoice.Warnln("err SendBinaryMessage to voice client")
}
return err
}
func GenerateWebCmdID(currentIndex int) int {
if currentIndex >= 250 || currentIndex < 10 {
return 10
}
currentIndex++
return currentIndex
}