package main import ( "sync" "time" "go-socket/Enums/ConnectionState" "go-socket/Enums/WsEventType" "github.com/coder/websocket" "github.com/google/uuid" ) type User struct { Mu sync.RWMutex Name string Pronouns string PasswordHash string CreatedAt time.Time WsConn *websocket.Conn Id uuid.UUID Connections map[uuid.UUID]*Connection Color [3]uint8 } type Connection struct { Mu sync.RWMutex `json:"-"` Id uuid.UUID `json:"id"` CreatedAt time.Time `json:"createdAt"` MessagesBuff [MaxDirectMsgCache]*Message `json:"-"` NextBuffIdx uint32 `json:"-"` RequestorId uuid.UUID `json:"requestorId"` RecipientId uuid.UUID `json:"recipientId"` UserWantingToElevate uuid.UUID `json:"userWantingToElevate"` // TODO add to database HaveOverflowed bool `json:"-"` State ConnectionState.ConnectionState `json:"state"` } func (conn *Connection) AddMessageToBuff(message *Message) { conn.Mu.Lock() defer conn.Mu.Unlock() conn.MessagesBuff[conn.NextBuffIdx%MaxDirectMsgCache] = message conn.NextBuffIdx++ if conn.NextBuffIdx >= MaxDirectMsgCache { conn.HaveOverflowed = true } } // GetSortedMessagesBuff returns arr, length func (conn *Connection) GetSortedMessagesBuff() (*[MaxDirectMsgCache]*Message, uint32) { conn.Mu.RLock() defer conn.Mu.RUnlock() if !conn.HaveOverflowed { return &conn.MessagesBuff, conn.NextBuffIdx } sorted := new([MaxDirectMsgCache]*Message) for i := uint32(0); i < MaxDirectMsgCache; i++ { sorted[i] = conn.MessagesBuff[(conn.NextBuffIdx+i)%MaxDirectMsgCache] } return sorted, MaxDirectMsgCache } type ConnectionElevationData struct { Id uuid.UUID `json:"id"` NewState ConnectionState.ConnectionState `json:"newState"` } type Message struct { Id uuid.UUID `json:"id"` Content string `json:"content"` CreatedAt time.Time `json:"createdAt"` Sender uuid.UUID `json:"sender"` Receiver uuid.UUID `json:"receiver"` } type LoginReturn struct { Token string `json:"token"` UserId uuid.UUID `json:"userId"` } type WsEventMessage struct { Type WsEventType.WsEventType `json:"type"` Event any `json:"event"` } type WsAuthMessage struct { Success bool `json:"success"` Error string `json:"error"` }