Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions internal/infra/ws/servewebsockets.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/feelbeatapp/feelbeatserver/internal/infra/auth"
"github.com/feelbeatapp/feelbeatserver/internal/lib/feelbeaterror"
"github.com/feelbeatapp/feelbeatserver/internal/lib/messages"
roomLib "github.com/feelbeatapp/feelbeatserver/internal/lib/room"
"github.com/gorilla/websocket"
)

Expand All @@ -32,6 +33,12 @@ func (w WSHandler) websocketHandler(user auth.User, res http.ResponseWriter, req
return
}

if room.Stage() != roomLib.LobbyStage {
http.Error(res, feelbeaterror.RoomGameStage, feelbeaterror.StatusCode(feelbeaterror.RoomGameStage))
api.LogApiError("user rejected, room in game stage", nil, user.Profile.Id, req)
return
}

conn, err := upgrader.Upgrade(res, req, nil)
if err != nil {
http.Error(res, feelbeaterror.Default, feelbeaterror.StatusCode(feelbeaterror.Default))
Expand Down
41 changes: 37 additions & 4 deletions internal/infra/ws/wshub.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"fmt"
"sync"

"github.com/buger/jsonparser"
"github.com/feelbeatapp/feelbeatserver/internal/infra/fblog"
"github.com/feelbeatapp/feelbeatserver/internal/lib/component"
"github.com/feelbeatapp/feelbeatserver/internal/lib/feelbeaterror"
Expand Down Expand Up @@ -122,20 +123,52 @@ func (h *WSHub) passMessages(ctx context.Context, wg *sync.WaitGroup, from strin
h.unregister <- from
return
}
var message messages.ClientMessage
err := json.Unmarshal(bytes, &message)

msgType, err := jsonparser.GetString(bytes, "type")
if err != nil {
fblog.Error(component.Hub, "Failed to parse client message", "err", err)
continue
}
payload, _, _, err := jsonparser.Get(bytes, "payload")
if err != nil {
fblog.Error(component.Hub, "Failed to parse client message", "err", err)
continue
}
message.From = from

h.rcv <- message
h.rcv <- decodeMessage(from, msgType, payload)
case <-ctx.Done():
return
}
}
}

func decodeMessage(from string, msgType string, payload []byte) messages.ClientMessage {
var settingsUpdate messages.SettingsUpdatePayload

var err error
var result interface{}
switch msgType {
case messages.SettingsUpdate:
err = json.Unmarshal(payload, &settingsUpdate)
result = settingsUpdate
case messages.ReadyStatus:
result, err = jsonparser.GetBoolean(payload)
}

if err != nil {
return messages.ClientMessage{
From: from,
Type: messages.ClientMessageType(msgType),
}
} else {
return messages.ClientMessage{
From: from,
Type: messages.ClientMessageType(msgType),
Payload: result,
}
}
}

func (h *WSHub) sendMessage(message messages.ServerMessage) {
bytes, err := json.Marshal(message.ToUnit())
if err != nil {
Expand Down
3 changes: 3 additions & 0 deletions internal/lib/feelbeaterror/errorcode.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ const (
RoomNotFound = "Room not found"
RoomFull = "Room is full"
EncodingMessageFailed = "Encoding message failed"
RoomGameStage = "Room is already in game mode"
)

func StatusCode(code ErrorCode) int {
Expand All @@ -21,6 +22,8 @@ func StatusCode(code ErrorCode) int {
return http.StatusForbidden
case AuthFailed:
return http.StatusForbidden
case RoomGameStage:
return http.StatusBadRequest
default:
return http.StatusInternalServerError
}
Expand Down
5 changes: 5 additions & 0 deletions internal/lib/interfaces.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package lib

type SpotifyApi interface {
FetchPlaylistData(playlistId string, token string) (PlaylistData, error)
}
15 changes: 11 additions & 4 deletions internal/lib/messages/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,23 @@ import "github.com/feelbeatapp/feelbeatserver/internal/lib"
type ClientMessageType string

const (
JoiningPlayer = "JOIN"
LeavingPlayer = "LEAVE"
JoiningPlayer = "JOIN"
LeavingPlayer = "LEAVE"
SettingsUpdate = "SETTINGS_UPDATE"
ReadyStatus = "READY_STATUS"
)

type ClientMessage struct {
Type ClientMessageType `json:"type"`
From string
Payload interface{} `json:"payload"`
From string `json:"-"`
Payload interface{} `json:"payload"`
}

type JoiningPlayerPayload struct {
User lib.UserProfile
}

type SettingsUpdatePayload struct {
Token string `json:"token"`
Settings lib.RoomSettings `json:"settings"`
}
9 changes: 9 additions & 0 deletions internal/lib/messages/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ const (
InitialMessage = "INITIAL"
NewPlayer = "NEW_PLAYER"
PlayerLeft = "PLAYER_LEFT"
ServerError = "SERVER_ERROR"
RoomStage = "ROOM_STAGE"
PlayerReady = "PLAYER_READY"
)

type InitialGameState struct {
Expand All @@ -37,6 +40,7 @@ type InitialGameState struct {
Playlist PlaylistState `json:"playlist"`
Players []lib.UserProfile `json:"players"`
Settings lib.RoomSettings `json:"settings"`
ReadyMap map[string]bool `json:"readyMap"`
}

type PlaylistState struct {
Expand All @@ -57,3 +61,8 @@ type PlayerLeftPayload struct {
Left string `json:"left"`
Admin string `json:"admin"`
}

type PlayerReadyPayload struct {
Player string `json:"player"`
Ready bool `json:"ready"`
}
13 changes: 13 additions & 0 deletions internal/lib/room/processMessages.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,19 @@ func (r *Room) processMessages() {
}
case messages.LeavingPlayer:
r.removePlayer(message.From)
case messages.SettingsUpdate:
payload, ok := message.Payload.(messages.SettingsUpdatePayload)
if !ok {
logIncorrectPayload("Incorrect payload in settings update", message.Payload, message.From)
} else {
r.updateSettings(message.From, payload)
}
case messages.ReadyStatus:
if ready, ok := message.Payload.(bool); ok {
r.updateReady(message.From, ready)
} else {
logIncorrectPayload("Incorrect paylod in ready status", message.Payload, message.From)
}
default:
fblog.Warn(component.Room, "Received unexpected message", "room", r.id, "from", message.From, "type", message.Type, "payload", message.Payload)
}
Expand Down
Loading
Loading