Backend/modules/structs/WebClient.go

112 lines
2.8 KiB
Go

package structs
import (
"errors"
"sync"
"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
MobileCmdIDs []int
mobileCmdIDMu sync.Mutex
VoiceConn *websocket.Conn
voiceConnMu sync.Mutex
VoiceCmdIDs []int
voiceCmdIDMu sync.Mutex
VoiceCMDIDsByBackend []*A // messages from backend to voice, when response from voice then response to target requester
//voiceCMDIDsByBackendMu sync.Mutex
}
func (webClient *WebClient) SendBinaryMessage(conn *websocket.Conn, msg []byte) error {
if conn == webClient.MobileConn {
webClient.mobileConnMu.Lock()
defer webClient.mobileConnMu.Unlock()
return conn.WriteMessage(websocket.BinaryMessage, msg)
}
webClient.voiceConnMu.Lock()
defer webClient.voiceConnMu.Unlock()
return conn.WriteMessage(websocket.BinaryMessage, msg)
}
func (webClient *WebClient) RemoveVoiceCmdID(cmdID int) {
webClient.voiceCmdIDMu.Lock()
defer webClient.voiceCmdIDMu.Unlock()
newArr, err := removeCmdIDFromList(webClient.VoiceCmdIDs, cmdID)
if err != nil {
logger.WebVoice.Warnln("removeCmdIDFromList:", err)
} else {
webClient.VoiceCmdIDs = newArr
}
}
func (webClient *WebClient) RemoveMobileCmdID(cmdID int) {
webClient.mobileCmdIDMu.Lock()
defer webClient.mobileCmdIDMu.Unlock()
newArr, err := removeCmdIDFromList(webClient.MobileCmdIDs, cmdID)
if err != nil {
logger.WebMobile.Warnln("removeCmdIDFromList:", err)
} else {
webClient.MobileCmdIDs = newArr
}
}
func (webClient *WebClient) RemoveVoiceCMDIDsByBackend(cmdID int) {
logger.Web.Debugln("before", webClient.VoiceCMDIDsByBackend)
for i, data := range webClient.VoiceCMDIDsByBackend {
if data.WebCmdID == cmdID {
newArr := append(webClient.VoiceCMDIDsByBackend[:i], webClient.VoiceCMDIDsByBackend[i+1:]...)
webClient.VoiceCMDIDsByBackend = newArr
logger.Web.Debugln("after", webClient.VoiceCMDIDsByBackend)
return
}
}
}
func removeCmdIDFromList(arr []int, cmdID int) ([]int, error) {
index := getCmdIDIndexFromList(arr, cmdID)
if index == -1 {
logger.Web.Warnln("index", index)
return []int{}, errors.New("index not found")
}
logger.Web.Debugln("removeFromList before append", arr)
newArr := append(arr[:index], arr[index+1:]...)
logger.Web.Debugln("removeFromList after append", newArr)
return newArr, nil
}
func getCmdIDIndexFromList(arr []int, cmdID int) int {
for i := 0; i < len(arr); i++ {
if arr[i] == cmdID {
logger.Web.Debugln("getCmdIDIndexFromList", i)
return i
}
}
return -1
}