bugfix: leaving room needs to clear votes
This commit is contained in:
parent
867b2f0f20
commit
3158a75f5d
|
@ -122,7 +122,11 @@ class InMemoryRoomService[F[_]: Concurrent](stateRef: Ref[F, Map[RoomID, (Room,
|
||||||
*/
|
*/
|
||||||
override def leaveRoom(roomID: RoomID, playerID: PlayerID): F[Unit] = updateRoom(
|
override def leaveRoom(roomID: RoomID, playerID: PlayerID): F[Unit] = updateRoom(
|
||||||
roomID,
|
roomID,
|
||||||
room => room.copy(players = room.players.filterNot(_.id == playerID))
|
room =>
|
||||||
|
room.copy(
|
||||||
|
players = room.players.filterNot(_.id == playerID),
|
||||||
|
round = room.round.removePlayer(playerID)
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
override def deleteRoom(roomID: RoomID): F[Unit] = {
|
override def deleteRoom(roomID: RoomID): F[Unit] = {
|
||||||
|
@ -159,7 +163,7 @@ class InMemoryRoomService[F[_]: Concurrent](stateRef: Ref[F, Map[RoomID, (Room,
|
||||||
room.players.find(_.name == nickName) match {
|
room.players.find(_.name == nickName) match {
|
||||||
case Some(player) => player.id -> room
|
case Some(player) => player.id -> room
|
||||||
case None => // player is not present, but potentially was previously
|
case None => // player is not present, but potentially was previously
|
||||||
val addingPlayer = Player.create(nickPassword)
|
val addingPlayer = Player.create(nickName)
|
||||||
val roomWithPlayer = room.copy(players = addingPlayer :: room.players)
|
val roomWithPlayer = room.copy(players = addingPlayer :: room.players)
|
||||||
room.playersPasswords.get(nickName) match {
|
room.playersPasswords.get(nickName) match {
|
||||||
case Some(_) => addingPlayer.id -> roomWithPlayer
|
case Some(_) => addingPlayer.id -> roomWithPlayer
|
||||||
|
|
|
@ -83,18 +83,23 @@ object Models {
|
||||||
// no need to send to the front end, no deed to derive codec, cool
|
// no need to send to the front end, no deed to derive codec, cool
|
||||||
sealed trait RoundState {
|
sealed trait RoundState {
|
||||||
def toViewFor(player: PlayerID): RoundStateView
|
def toViewFor(player: PlayerID): RoundStateView
|
||||||
|
def removePlayer(id: PlayerID): RoundState
|
||||||
}
|
}
|
||||||
object RoundState {
|
object RoundState {
|
||||||
final case class Voting(votes: Map[PlayerID, String]) extends RoundState {
|
final case class Voting(votes: Map[PlayerID, String]) extends RoundState {
|
||||||
def toViewFor(playerId: PlayerID): RoundStateView.Voting = RoundStateView.Voting(
|
override def toViewFor(playerId: PlayerID): RoundStateView.Voting = RoundStateView.Voting(
|
||||||
myCard = votes.get(playerId),
|
myCard = votes.get(playerId),
|
||||||
alreadyVoted = votes.filterKeys(id => id != playerId).keys.toList
|
alreadyVoted = votes.filterKeys(id => id != playerId).keys.toList
|
||||||
)
|
)
|
||||||
|
override def removePlayer(id: PlayerID): RoundState.Voting =
|
||||||
|
RoundState.Voting(votes.filterKeys(_ != id).toMap)
|
||||||
}
|
}
|
||||||
|
|
||||||
final case class Viewing(votes: Map[PlayerID, String]) extends RoundState {
|
final case class Viewing(votes: Map[PlayerID, String]) extends RoundState {
|
||||||
def toViewFor(player: PlayerID): RoundStateView.Viewing =
|
override def toViewFor(player: PlayerID): RoundStateView.Viewing =
|
||||||
RoundStateView.Viewing(votes.toList)
|
RoundStateView.Viewing(votes.toList)
|
||||||
|
override def removePlayer(id: PlayerID): RoundState.Viewing =
|
||||||
|
RoundState.Viewing(votes.filterKeys(_ != id).toMap)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue