Kick button, show player turn, can't join if 2-nd player alreay join
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
package actors
|
||||
|
||||
import actors.UserActor.{GetName, HostLeaveLobby, RefreshLobbyInfo, SetUserAsHost}
|
||||
import actors.UserActor.{GetName, HostLeaveLobby, LobbyFatal, RefreshLobbyInfo, SecondPlayerLeaveLobby, SetUserAsHost, SetUserAsObs, SetUserAsSecondPlayer}
|
||||
import akka.actor.{Actor, ActorLogging, ActorRef}
|
||||
import akka.event.LoggingReceive
|
||||
import com.typesafe.scalalogging.LazyLogging
|
||||
@@ -49,7 +49,14 @@ class LobbieActor(hostUser: LobbyUser) extends Actor with LazyLogging {
|
||||
}
|
||||
|
||||
hostUser.actorRef.tell(
|
||||
SetUserAsHost(LobbyInfo(hostUser.name, "", firstPlayerReady, secondPlayerReady, self.path.name, status.toString(), mapsLobby)), this.self)
|
||||
SetUserAsHost(LobbyInfo(
|
||||
UserInfo(hostUser.name,firstPlayerReady),
|
||||
UserInfo("", secondPlayerReady),
|
||||
self.path.name,
|
||||
status.toString(),
|
||||
playerTurn,
|
||||
mapsLobby)),
|
||||
this.self)
|
||||
|
||||
implicit val timeout: Timeout = 1.second
|
||||
|
||||
@@ -98,21 +105,38 @@ class LobbieActor(hostUser: LobbyUser) extends Actor with LazyLogging {
|
||||
}
|
||||
users.foreach(_ ! RefreshLobbyInfo(getLobbyInfoResponse))
|
||||
|
||||
case KickSecondPlayer =>
|
||||
if (sender() == host.actorRef) {
|
||||
secondPlayer.foreach(player => player.actorRef ! LobbyFatal("You were kicked from lobby!"))
|
||||
secondPlayerReady = false
|
||||
secondPlayer = None
|
||||
users.foreach(_ ! RefreshLobbyInfo(getLobbyInfoResponse))
|
||||
}
|
||||
case JoinLobbyAsPlayer(sp) =>
|
||||
logger.info(s"User ${sender.path.name} join lobby ${self.path.name} as player")
|
||||
secondPlayer = Some(sp)
|
||||
users = users + sp.actorRef
|
||||
sp.actorRef.tell(
|
||||
SetUserAsHost(LobbyInfo(hostUser.name, sp.name, firstPlayerReady, secondPlayerReady, self.path.name, status.toString(), mapsLobby)), this.self)
|
||||
users.foreach(_ ! RefreshLobbyInfo(getLobbyInfoResponse))
|
||||
if (secondPlayer.isEmpty) {
|
||||
secondPlayer = Some(sp)
|
||||
users = users + sp.actorRef
|
||||
sp.actorRef.tell(
|
||||
SetUserAsSecondPlayer(getLobbyInfoResponse), this.self)
|
||||
users.foreach(_ ! RefreshLobbyInfo(getLobbyInfoResponse))
|
||||
} else {
|
||||
sp.actorRef ! LobbyFatal("Lobby already full")
|
||||
}
|
||||
|
||||
case WatchLobby(_) =>
|
||||
// add the watcher to the list
|
||||
users = users + sender
|
||||
sender ! SetUserAsObs(getLobbyInfoResponse)
|
||||
case LeaveLobby =>
|
||||
users = users - sender
|
||||
if(secondPlayer.exists(sp => sp.actorRef == sender)) secondPlayer = None
|
||||
if(host.actorRef == sender()){
|
||||
users.foreach(_ ! HostLeaveLobby)
|
||||
context.stop(self)
|
||||
}else if(secondPlayer.exists(_.actorRef == sender())){
|
||||
users.foreach(_ ! SecondPlayerLeaveLobby)
|
||||
context.stop(self)
|
||||
}
|
||||
if (users.isEmpty) {
|
||||
logger.info(s"Stop lobby ${self.path.name}")
|
||||
@@ -125,7 +149,13 @@ class LobbieActor(hostUser: LobbyUser) extends Actor with LazyLogging {
|
||||
|
||||
private def getLobbyInfoResponse: LobbyInfo = {
|
||||
val user2Name = secondPlayer.map(_.name).getOrElse("")
|
||||
LobbyInfo(host.name, user2Name, firstPlayerReady, secondPlayerReady, self.path.name, status.toString(), mapsLobby)
|
||||
LobbyInfo(
|
||||
UserInfo(host.name, firstPlayerReady),
|
||||
UserInfo(user2Name, secondPlayerReady),
|
||||
self.path.name,
|
||||
status.toString(),
|
||||
playerTurn,
|
||||
mapsLobby)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -139,6 +169,8 @@ case class WatchLobby(lobbyName: String)
|
||||
|
||||
case class JoinLobbyAsPlayer(lobbyUser: LobbyUser)
|
||||
|
||||
case object KickSecondPlayer
|
||||
|
||||
case object LeaveLobby
|
||||
|
||||
case object SetReady
|
||||
@@ -147,12 +179,13 @@ case object SetNotReady
|
||||
|
||||
case object InfoQuery
|
||||
|
||||
case class LobbyInfo(user1Name: String,
|
||||
user2Name: String,
|
||||
user1Ready: Boolean,
|
||||
user2Ready: Boolean,
|
||||
case class UserInfo(name: String, isReady: Boolean)
|
||||
|
||||
case class LobbyInfo(user1Info: UserInfo,
|
||||
user2Info: UserInfo,
|
||||
lobbyActorName: String,
|
||||
status: String,
|
||||
playerTurn: BigDecimal,
|
||||
maps: Set[DeciderMap])
|
||||
|
||||
class LobbyStatus
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package actors
|
||||
|
||||
import actors.UserActor.{GetName, HostLeaveLobby, RefreshLobbyInfo, SetUserAsHost, SetUserAsSecondPlayer}
|
||||
import actors.UserActor.{GetName, HostLeaveLobby, LobbyFatal, RefreshLobbyInfo, SecondPlayerLeaveLobby, SetUserAsHost, SetUserAsSecondPlayer}
|
||||
import akka.actor._
|
||||
import akka.event.LoggingReceive
|
||||
import akka.pattern.ask
|
||||
@@ -29,6 +29,8 @@ class UserActor(out: ActorRef,
|
||||
}
|
||||
}
|
||||
|
||||
implicit val userInfoWrites: OWrites[UserInfo] = Json.writes[UserInfo]
|
||||
|
||||
implicit val lobbyWrites: OWrites[LobbyInfo] = Json.writes[LobbyInfo]
|
||||
|
||||
implicit val lobbyResponseWrites: Writes[List[LobbyInfo]] = new Writes[List[LobbyInfo]] {
|
||||
@@ -67,12 +69,20 @@ class UserActor(out: ActorRef,
|
||||
|
||||
case HostLeaveLobby =>
|
||||
logger.info(s"Host leave from lobby ${sender.path.name}")
|
||||
out ! Json.obj("type" -> "hostLeaveLobby")
|
||||
out ! Json.obj("type" -> "lobbyError", "error" -> "Host leave lobby")
|
||||
|
||||
case SecondPlayerLeaveLobby =>
|
||||
logger.info(s"Second player lobby ${sender.path.name}")
|
||||
out ! Json.obj("type" -> "lobbyError", "error" -> "Second player leave lobby")
|
||||
|
||||
case RefreshLobbyInfo(lobbyInfo) =>
|
||||
logger.trace(s"Refresh lobby info: $lobbyInfo")
|
||||
out ! Json.obj("type" -> "refreshLobby", "lobby" -> lobbyInfo)
|
||||
|
||||
case LobbyFatal(message) => // После этого сообщения выход из лобби
|
||||
logger.warn(s"Lobby error: $message")
|
||||
out ! Json.obj("type" -> "lobbyError", "error" -> message)
|
||||
|
||||
case json: JsValue =>
|
||||
// Обрабатываем запросы с фронта
|
||||
|
||||
@@ -104,6 +114,9 @@ class UserActor(out: ActorRef,
|
||||
case Some("setNotReady") =>
|
||||
lobbieActor.foreach(lobby => lobby ! SetNotReady)
|
||||
|
||||
case Some("kickSecondPlayer") =>
|
||||
lobbieActor.foreach(lobby => lobby ! KickSecondPlayer)
|
||||
|
||||
case Some("joinDecider") =>
|
||||
val lobbyActorName = (json \ "lobbyActorName").as[String]
|
||||
logger.info(s"Player ${self.path.name} join lobby $lobbyActorName")
|
||||
@@ -122,7 +135,6 @@ class UserActor(out: ActorRef,
|
||||
}
|
||||
case Failure(ex) => logger.error("Received error", ex)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -170,10 +182,14 @@ object UserActor {
|
||||
|
||||
case class SetUserAsSecondPlayer(lobbyInfo: LobbyInfo)
|
||||
|
||||
case class SetUserAsObs(lobbyInfo: LobbyInfo)
|
||||
|
||||
case class LobbyFatal(message: String)
|
||||
|
||||
case object CreateLobby
|
||||
|
||||
case object HostLeaveLobby
|
||||
|
||||
|
||||
case object SecondPlayerLeaveLobby
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user