From ec519889dc9d8382fcaa1d3abe0a9b7408b180ca Mon Sep 17 00:00:00 2001 From: Anibus Date: Sat, 28 Nov 2020 19:27:33 +0300 Subject: [PATCH] Autum cup 2 decider --- app/actors/LobbieActor.scala | 6 +++--- app/actors/LobbiesActor.scala | 9 +++++++++ app/actors/UserActor.scala | 12 +++++++++++- app/assets/javascripts/index.js | 17 ++++++++++++----- app/assets/stylesheets/main.less | 15 +++++++++++++++ app/views/index.scala.html | 2 +- 6 files changed, 51 insertions(+), 10 deletions(-) diff --git a/app/actors/LobbieActor.scala b/app/actors/LobbieActor.scala index 82c6f0b..e01a0d0 100644 --- a/app/actors/LobbieActor.scala +++ b/app/actors/LobbieActor.scala @@ -130,12 +130,12 @@ class LobbieActor(hostUser: LobbyUser) extends Actor with LazyLogging { 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) + secondPlayer = None context.stop(self) } if (users.isEmpty) { @@ -165,12 +165,12 @@ case class MapsUpdate(maps: Set[String]) case class CreateLobby(userName: String) -case class WatchLobby(lobbyName: String) - case class JoinLobbyAsPlayer(lobbyUser: LobbyUser) case object KickSecondPlayer +case class WatchLobby(lobbyName: String) + case object LeaveLobby case object SetReady diff --git a/app/actors/LobbiesActor.scala b/app/actors/LobbiesActor.scala index bb0e0c0..388ba75 100644 --- a/app/actors/LobbiesActor.scala +++ b/app/actors/LobbiesActor.scala @@ -30,6 +30,13 @@ class LobbiesActor extends Actor with LazyLogging { case Some(lobbyActor) => lobbyActor ! JoinLobbyAsPlayer(LobbyUser(userName, user)) case None => logger.error(s"Can't watch lobby $lobbyName - lobby not exists") } + case ObserveLobbyByActorName(lobbyName) => + // get or create the StockActor for the symbol and forward this message + val user = sender + context.child(lobbyName) match { + case Some(lobbyActor) => lobbyActor.tell(WatchLobby("watchIt"), user) + case None => logger.error(s"Can't watch lobby $lobbyName - lobby not exists") + } case watchLobby@WatchLobby(lobbyName) => // get or create the StockActor for the symbol and forward this message context.child(lobbyName) match { @@ -50,4 +57,6 @@ case object GetAllLobbies case class JoinLobbyByActorName(actorName: String, userName: String) +case class ObserveLobbyByActorName(actorName: String) + case object UnWatchAllLobbies \ No newline at end of file diff --git a/app/actors/UserActor.scala b/app/actors/UserActor.scala index 04031c2..6ea30a6 100644 --- a/app/actors/UserActor.scala +++ b/app/actors/UserActor.scala @@ -1,6 +1,6 @@ package actors -import actors.UserActor.{GetName, HostLeaveLobby, LobbyFatal, RefreshLobbyInfo, SecondPlayerLeaveLobby, SetUserAsHost, SetUserAsSecondPlayer} +import actors.UserActor.{GetName, HostLeaveLobby, LobbyFatal, RefreshLobbyInfo, SecondPlayerLeaveLobby, SetUserAsHost, SetUserAsObs, SetUserAsSecondPlayer} import akka.actor._ import akka.event.LoggingReceive import akka.pattern.ask @@ -67,6 +67,11 @@ class UserActor(out: ActorRef, logger.info(s"Receive set user ${self.path.name} as second player from ${lobbyActor.path.name}") setUserAsJoinedOrCreatedLobby(lobbyActor, lobbyInfo) + case SetUserAsObs(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" -> "lobbyError", "error" -> "Host leave lobby") @@ -122,6 +127,11 @@ class UserActor(out: ActorRef, logger.info(s"Player ${self.path.name} join lobby $lobbyActorName") lobbiesActor ! JoinLobbyByActorName(lobbyActorName, name) + case Some("observerDecider") => + val lobbyActorName = (json \ "lobbyActorName").as[String] + logger.info(s"Player ${self.path.name} observe lobby $lobbyActorName") + lobbiesActor ! ObserveLobbyByActorName(lobbyActorName) + case Some("banMap") => val map = (json \ "map").as[String] lobbieActor.foreach(lobby => lobby ! BanMap(map)) diff --git a/app/assets/javascripts/index.js b/app/assets/javascripts/index.js index 19e5a44..84323e4 100644 --- a/app/assets/javascripts/index.js +++ b/app/assets/javascripts/index.js @@ -40,7 +40,7 @@ window.onload = function() { var joinButton = (lobby.status === "NotStarted()") ? '' : ""; - var observerButton = ''; @@ -105,7 +105,7 @@ window.onload = function() { }); if($.cookie('user')=== undefined){ - var result = prompt("Введите ник", ); + var result = prompt("Enter nickname: ", ); $.cookie('user', result, { expires: 7 }); userName = result; }else{ @@ -211,12 +211,13 @@ function renderPlayersAndStats(lobby) { var player2ReadyBtn = ""; var readyImg = ""; var notReadyImg = ""; + var warningClass = (lobby.user2Info.name !== "") ? "warningButton" : ""; if(lobby.user1Info.name === userName){ if(lobby.user1Info.isReady){ player1ReadyBtn = "" }else{ - player1ReadyBtn = "" + player1ReadyBtn = "" } }else{ if(lobby.user1Info.isReady){ @@ -230,7 +231,7 @@ function renderPlayersAndStats(lobby) { if(lobby.user2Info.isReady){ player2ReadyBtn = "" }else{ - player2ReadyBtn = "" + player2ReadyBtn = "" } } else { if(lobby.user2Info.isReady){ @@ -290,13 +291,19 @@ function setNotReady(){ } function joinDecider(actorName){ - console.log(actorName); ws.send(JSON.stringify({ type: "joinDecider", lobbyActorName: actorName })); } +function observerDecider(actorName){ + ws.send(JSON.stringify({ + type: "observerDecider", + lobbyActorName: actorName + })); +} + function kickSecondPlayer(){ ws.send(JSON.stringify({ type: "kickSecondPlayer" diff --git a/app/assets/stylesheets/main.less b/app/assets/stylesheets/main.less index d462e46..6ee35d2 100644 --- a/app/assets/stylesheets/main.less +++ b/app/assets/stylesheets/main.less @@ -97,6 +97,21 @@ body { overflow: hidden; } +@keyframes glowing { + 0% { + box-shadow: 0 0 2px #074673; + } + 50% { + box-shadow: 0 0 9px #0e87de; + } + 100% { + box-shadow: 0 0 2px #094d7d; + } +} +.warningButton { + animation: glowing 1300ms infinite; +} + .chart-holder, .details-holder { position: absolute; width: 100%; diff --git a/app/views/index.scala.html b/app/views/index.scala.html index 2164667..6de79d7 100644 --- a/app/views/index.scala.html +++ b/app/views/index.scala.html @@ -3,7 +3,7 @@ - Reactive Stock News Dashboard + Second Autumn Cup decider