Decider v 0.9
This commit is contained in:
+64
-30
@@ -1,6 +1,6 @@
|
||||
package actors
|
||||
|
||||
import actors.UserActor.GetName
|
||||
import actors.UserActor.{GetName, HostLeaveLobby, RefreshLobbyInfo, SetUserAsHost, SetUserAsSecondPlayer}
|
||||
import akka.actor._
|
||||
import akka.event.LoggingReceive
|
||||
import akka.pattern.ask
|
||||
@@ -18,16 +18,7 @@ class UserActor(out: ActorRef,
|
||||
|
||||
implicit val timeout: Timeout = 3.seconds
|
||||
|
||||
var userStatus: UserStatus = InLobby()
|
||||
|
||||
implicit val lobbyResponseWrites: Writes[List[LobbyInfoResponse]] = new Writes[List[LobbyInfoResponse]] {
|
||||
|
||||
implicit val lobbyWrites: OWrites[LobbyInfoResponse] = Json.writes[LobbyInfoResponse]
|
||||
|
||||
override def writes(o: List[LobbyInfoResponse]): JsValue = {
|
||||
JsArray(o.map(lobby => Json.toJson(lobby)))
|
||||
}
|
||||
}
|
||||
var lobbieActor: Option[ActorRef] = None
|
||||
|
||||
implicit val mapJson: Writes[DeciderMap] = new Writes[DeciderMap] {
|
||||
def writes(deciderMap: DeciderMap): JsValue = {
|
||||
@@ -38,6 +29,15 @@ class UserActor(out: ActorRef,
|
||||
}
|
||||
}
|
||||
|
||||
implicit val lobbyWrites: OWrites[LobbyInfo] = Json.writes[LobbyInfo]
|
||||
|
||||
implicit val lobbyResponseWrites: Writes[List[LobbyInfo]] = new Writes[List[LobbyInfo]] {
|
||||
|
||||
override def writes(o: List[LobbyInfo]): JsValue = {
|
||||
JsArray(o.map(lobby => Json.toJson(lobby)))
|
||||
}
|
||||
}
|
||||
|
||||
var name = ""
|
||||
|
||||
override def preStart(): Unit = {
|
||||
@@ -52,14 +52,29 @@ class UserActor(out: ActorRef,
|
||||
|
||||
override def receive: Receive = LoggingReceive {
|
||||
|
||||
case MapsUpdate(deciderMaps) =>
|
||||
val maps = deciderMaps.map(map => Json.toJson(map))
|
||||
out ! Json.obj("type" -> "maps", "deciderMaps" -> maps)
|
||||
case GetName =>
|
||||
sender ! name
|
||||
|
||||
case SetUserAsHost(lobbyInfo) =>
|
||||
val lobbyActor = sender()
|
||||
logger.info(s"Receive set user ${self.path.name} as host from ${lobbyActor.path.name}")
|
||||
setUserAsJoinedOrCreatedLobby(lobbyActor, lobbyInfo)
|
||||
|
||||
case SetUserAsSecondPlayer(lobbyInfo) =>
|
||||
val lobbyActor = sender()
|
||||
logger.info(s"Receive set user ${self.path.name} as second player from ${lobbyActor.path.name}")
|
||||
setUserAsJoinedOrCreatedLobby(lobbyActor, lobbyInfo)
|
||||
|
||||
case HostLeaveLobby =>
|
||||
logger.info(s"Host leave from lobby ${sender.path.name}")
|
||||
out ! Json.obj("type" -> "hostLeaveLobby")
|
||||
|
||||
case RefreshLobbyInfo(lobbyInfo) =>
|
||||
logger.trace(s"Refresh lobby info: $lobbyInfo")
|
||||
out ! Json.obj("type" -> "refreshLobby", "lobby" -> lobbyInfo)
|
||||
|
||||
case json: JsValue =>
|
||||
// When the user types in a stock in the upper right corner, this is triggered
|
||||
// Обрабатываем запросы с фронта
|
||||
|
||||
val comType = (json \ "type").asOpt[String]
|
||||
comType match {
|
||||
@@ -67,8 +82,8 @@ class UserActor(out: ActorRef,
|
||||
name = (json \ "name").as[String]
|
||||
logger.debug(s"Set user name: $name for actor ${this.self}")
|
||||
case Some("getAllUsers") =>
|
||||
val usersActorFuture = (userParentActor ? UserParentActor.GetAllUsers).mapTo[Iterable[ActorRef]]
|
||||
usersActorFuture.map(actorRefs => {
|
||||
val userActorsFuture = (userParentActor ? UserParentActor.GetAllUsers).mapTo[Iterable[ActorRef]]
|
||||
userActorsFuture.map(actorRefs => {
|
||||
logger.debug(s"There are ${actorRefs.size} users on site")
|
||||
actorRefs.map(userActorRef => userActorRef ? GetName).map(res => {
|
||||
res.onComplete {
|
||||
@@ -81,23 +96,41 @@ class UserActor(out: ActorRef,
|
||||
lobbiesActor ! CreateLobby(name)
|
||||
|
||||
case Some("leaveDecider") =>
|
||||
lobbiesActor ! LeaveLobby(name)
|
||||
lobbieActor.foreach(lobby => lobby ! LeaveLobby)
|
||||
|
||||
case Some("updateDecider") =>
|
||||
lobbiesActor ! BanMap("map1")
|
||||
case Some("setReady") =>
|
||||
lobbieActor.foreach(lobby => lobby ! SetReady)
|
||||
|
||||
case Some("setNotReady") =>
|
||||
lobbieActor.foreach(lobby => lobby ! SetNotReady)
|
||||
|
||||
case Some("joinDecider") =>
|
||||
val lobbyActorName = (json \ "lobbyActorName").as[String]
|
||||
logger.info(s"Player ${self.path.name} join lobby $lobbyActorName")
|
||||
lobbiesActor ! JoinLobbyByActorName(lobbyActorName, name)
|
||||
|
||||
case Some("banMap") =>
|
||||
val map = (json \ "map").as[String]
|
||||
lobbieActor.foreach(lobby => lobby ! BanMap(map))
|
||||
|
||||
case Some("getLobbies") =>
|
||||
logger.debug("Get all lobby request")
|
||||
(lobbiesActor ? GetAllLobbies).mapTo[List[LobbyInfoResponse]] onComplete {
|
||||
(lobbiesActor ? GetAllLobbies).mapTo[List[RefreshLobbyInfo]] onComplete {
|
||||
case Success(lobbies) => {
|
||||
logger.info(s"Received lobbies: $lobbies")
|
||||
out ! Json.obj("type" -> "lobbies", "lobbies" -> lobbies)
|
||||
out ! Json.obj("type" -> "lobbies", "lobbies" -> lobbies.map(res => res.lobbyInfo))
|
||||
}
|
||||
case Failure(ex) => logger.error("Received error", ex)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private def setUserAsJoinedOrCreatedLobby(lobbyActor: ActorRef, lobbyInfo: LobbyInfo): Unit = {
|
||||
this.lobbieActor = Some(lobbyActor)
|
||||
out ! Json.obj("type" -> "switchToLobby", "lobby" -> lobbyInfo)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class UserParentActor(actorSystem: ActorSystem) extends Actor with ActorLogging {
|
||||
@@ -113,14 +146,6 @@ class UserParentActor(actorSystem: ActorSystem) extends Actor with ActorLogging
|
||||
}
|
||||
}
|
||||
|
||||
class UserStatus
|
||||
|
||||
case class InLobby() extends UserStatus
|
||||
|
||||
case class NotReady() extends UserStatus
|
||||
|
||||
case class Ready() extends UserStatus
|
||||
|
||||
|
||||
object UserParentActor {
|
||||
|
||||
@@ -139,7 +164,16 @@ object UserActor {
|
||||
|
||||
case object GetName
|
||||
|
||||
case class RefreshLobbyInfo(lobbyInfo: LobbyInfo)
|
||||
|
||||
case class SetUserAsHost(lobbyInfo: LobbyInfo)
|
||||
|
||||
case class SetUserAsSecondPlayer(lobbyInfo: LobbyInfo)
|
||||
|
||||
case object CreateLobby
|
||||
|
||||
case object HostLeaveLobby
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user