From e702bd61b431eecc72c8ff4070e567eed863037b Mon Sep 17 00:00:00 2001 From: Viktor Kholodov Date: Sat, 9 Jan 2021 02:09:00 +0300 Subject: [PATCH] Admin controller draft --- app/actors/LobbieActor.scala | 9 ++++- app/actors/LobbiesActor.scala | 15 ++++--- app/actors/UserActor.scala | 17 ++++---- app/assets/images/maps/2p_faceoff.jpg | Bin 17985 -> 47331 bytes app/assets/images/maps/allMaps.json | 1 + app/assets/javascripts/index.js | 21 +++++----- app/controllers/AdminController.scala | 54 ++++++++++++++++++++++++++ app/controllers/HomeController.scala | 7 ++-- app/views/admin.scala.html | 6 +++ app/views/index.scala.html | 4 +- conf/application.conf | 2 +- conf/logback.xml | 12 +++++- conf/routes | 8 ++-- 13 files changed, 119 insertions(+), 37 deletions(-) create mode 100644 app/controllers/AdminController.scala create mode 100644 app/views/admin.scala.html diff --git a/app/actors/LobbieActor.scala b/app/actors/LobbieActor.scala index 564fd5f..004024b 100644 --- a/app/actors/LobbieActor.scala +++ b/app/actors/LobbieActor.scala @@ -172,9 +172,14 @@ class LobbieActor(hostUser: LobbyUser) extends Actor with LazyLogging { users.foreach(_ ! HostLeaveLobby) context.stop(self) }else if(secondPlayer.exists(_.actorRef == sender())){ - users.foreach(_ ! SecondPlayerLeaveLobby) + secondPlayerReady = false secondPlayer = None - context.stop(self) + if(status == Draft()){ + users.foreach(_ ! SecondPlayerLeaveLobby) + context.stop(self) + }else { + users.foreach(_ ! RefreshLobbyInfo(getLobbyInfoResponse)) + } } if (users.isEmpty) { logger.info(s"Stop lobby ${self.path.name}") diff --git a/app/actors/LobbiesActor.scala b/app/actors/LobbiesActor.scala index 388ba75..327083d 100644 --- a/app/actors/LobbiesActor.scala +++ b/app/actors/LobbiesActor.scala @@ -1,6 +1,6 @@ package actors -import akka.actor.{Actor, ActorLogging, Props} +import akka.actor.{Actor, ActorLogging, ActorRef, ActorSystem, Props} import akka.event.LoggingReceive import akka.pattern.ask import akka.util.Timeout @@ -20,8 +20,8 @@ class LobbiesActor extends Actor with LazyLogging { case CreateLobby(hostName) => val hostActorRef = sender logger.info(s"Player ${hostActorRef.path.name} create lobby.") - val lobbyActor = context.actorOf(Props(new LobbieActor(LobbyUser(hostName,hostActorRef))), - s"lobbyActor-${(math.random*100000000L).toLong}") + val lobbyActor = context.actorOf(Props(new LobbieActor(LobbyUser(hostName, hostActorRef))), + s"lobbyActor-${(math.random * 100000000L).toLong}") lobbyActor.tell(WatchLobby("watchIt"), hostActorRef) case JoinLobbyByActorName(lobbyName, userName) => // get or create the StockActor for the symbol and forward this message @@ -44,7 +44,7 @@ class LobbiesActor extends Actor with LazyLogging { case None => logger.error(s"Can't watch lobby $lobbyName - lobby not exists") } case UnWatchAllLobbies => - context.children.foreach( _.tell(LeaveLobby, sender)) + context.children.foreach(_.tell(LeaveLobby, sender)) case GetAllLobbies => sender ! context.children.toList.map(lobbyActor => Await.result(lobbyActor ? InfoQuery, 1.second)) @@ -59,4 +59,9 @@ case class JoinLobbyByActorName(actorName: String, userName: String) case class ObserveLobbyByActorName(actorName: String) -case object UnWatchAllLobbies \ No newline at end of file +case object UnWatchAllLobbies + +object LobbiesActor { + implicit val actorSystem: ActorSystem = ActorSystem() + val actor: ActorRef = actorSystem.actorOf(Props[LobbiesActor]()) +} diff --git a/app/actors/UserActor.scala b/app/actors/UserActor.scala index 1b0916a..dd2cf8f 100644 --- a/app/actors/UserActor.scala +++ b/app/actors/UserActor.scala @@ -13,8 +13,7 @@ import scala.concurrent.duration.DurationInt import scala.util.{Failure, Success} class UserActor(out: ActorRef, - userParentActor: ActorRef, - lobbiesActor: ActorRef) extends Actor with LazyLogging { + userParentActor: ActorRef) extends Actor with LazyLogging { implicit val timeout: Timeout = 3.seconds @@ -138,7 +137,7 @@ class UserActor(out: ActorRef, }) case Some("createDecider") => - lobbiesActor ! CreateLobby(name) + LobbiesActor.actor ! CreateLobby(name) case Some("leaveDecider") => lobbieActor.foreach(lobby => lobby ! LeaveLobby) @@ -163,12 +162,12 @@ class UserActor(out: ActorRef, case Some("joinDecider") => val lobbyActorName = (json \ "lobbyActorName").as[String] logger.info(s"Player ${self.path.name} join lobby $lobbyActorName") - lobbiesActor ! JoinLobbyByActorName(lobbyActorName, name) + LobbiesActor.actor ! 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) + LobbiesActor.actor ! ObserveLobbyByActorName(lobbyActorName) case Some("banMap") => val map = (json \ "map").as[String] @@ -176,7 +175,7 @@ class UserActor(out: ActorRef, case Some("getLobbies") => logger.debug("Get all lobby request") - (lobbiesActor ? GetAllLobbies).mapTo[List[RefreshLobbyInfo]] onComplete { + (LobbiesActor.actor ? GetAllLobbies).mapTo[List[RefreshLobbyInfo]] onComplete { case Success(lobbies) => { logger.info(s"Received lobbies: $lobbies") out ! Json.obj("type" -> "lobbies", "lobbies" -> lobbies.map(res => res.lobbyInfo)) @@ -198,8 +197,8 @@ class UserParentActor(actorSystem: ActorSystem) extends Actor with ActorLogging import UserParentActor._ override def receive: Receive = LoggingReceive { - case Create(id, out, lobbiesActor) => - val child: ActorRef = actorSystem.actorOf(Props(classOf[UserActor], out, self, lobbiesActor), s"userActor-$id") + case Create(id, out) => + val child: ActorRef = actorSystem.actorOf(Props(classOf[UserActor], out, self), s"userActor-$id") sender() ! child case GetAllUsers => sender() ! context.children @@ -209,7 +208,7 @@ class UserParentActor(actorSystem: ActorSystem) extends Actor with ActorLogging object UserParentActor { - case class Create(id: String, out: ActorRef, lobbiesActor: ActorRef) + case class Create(id: String, out: ActorRef) case object GetAllUsers diff --git a/app/assets/images/maps/2p_faceoff.jpg b/app/assets/images/maps/2p_faceoff.jpg index 3ade6f43702e5dabc1ad269031fc664fb0384dee..3d86069b4b5d21a3e6d68c459f4a38c6d2594645 100644 GIT binary patch literal 47331 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 Wk9ko!6GN~HSbQv7Z;K70pa0otfl?v> literal 17985 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 QMpxOZYM%Yt+wMRA*+>KXB>(^b diff --git a/app/assets/images/maps/allMaps.json b/app/assets/images/maps/allMaps.json index 87a57f7..474a7cd 100644 --- a/app/assets/images/maps/allMaps.json +++ b/app/assets/images/maps/allMaps.json @@ -54,6 +54,7 @@ "2p_velvet_duress": "Velvet Duress (2)", "2p_fraziersdemise": "Fraziers Demise (2)", "2p_vortex_plateau": "Vortex Plateau (2)", + "2p_chaos_gate": "Chaos gate (2)", "2p_valley_of_khorne": "Valley of Khorne (2)", "2p_tiboraxx":"Tiboraxx (2)", "3p_fortress": "Fortress (3)", diff --git a/app/assets/javascripts/index.js b/app/assets/javascripts/index.js index 98850bc..51bfdf2 100644 --- a/app/assets/javascripts/index.js +++ b/app/assets/javascripts/index.js @@ -45,8 +45,8 @@ window.onload = function() { ''; return memo + '\n' + - ' '+ lobby.user1Info.name +'\n' + - ' '+ lobby.user2Info.name +'\n' + + ' '+ lobby.user1Info.name.substring(0, 20) +'\n' + + ' '+ lobby.user2Info.name.substring(0, 20) +'\n' + ' '+ lobby.status +'\n' + ' ' + joinButton + ' ' + observerButton + ' ' + @@ -81,13 +81,6 @@ window.onload = function() { })); }); - $("#updateDecider").click(function(event) { - event.preventDefault(); - ws.send(JSON.stringify({ - type: "updateDecider" - })); - }); - $("#submitmsg").click(function(event) { sendMessage(); }); @@ -105,6 +98,7 @@ window.onload = function() { })); $("#decider").hide(); $("#lobbies").show(); + $(".navbar").show(); }); if($.cookie('user')=== undefined){ @@ -157,9 +151,12 @@ window.onload = function() { type: "userName", name: $.cookie('user') })); + ws.send(JSON.stringify({ + type: "getLobbies" + })); } - let timerId = setInterval(() => + var timerId = setInterval(() => ws.send(JSON.stringify({ type: "getLobbies" })), 2000); @@ -168,6 +165,7 @@ window.onload = function() { function changeNick() { result = prompt("Введите ник", $.cookie('user')); if(result == null) return; + result = result.substr(0, 20); $.cookie('user', result, { expires: 7 }); ws.send(JSON.stringify({ type: "userName", @@ -195,6 +193,9 @@ function disconnectLobby(error) { $("#decider").hide(); $(".navbar").show(); $("#lobbies").show(); + ws.send(JSON.stringify({ + type: "getLobbies" + })); alert(error); } diff --git a/app/controllers/AdminController.scala b/app/controllers/AdminController.scala new file mode 100644 index 0000000..e8d39ce --- /dev/null +++ b/app/controllers/AdminController.scala @@ -0,0 +1,54 @@ +package controllers + +import actors._ +import akka.NotUsed +import akka.actor._ +import akka.event.Logging +import akka.pattern.ask +import akka.stream._ +import akka.stream.scaladsl._ +import akka.util.Timeout +import javax.inject._ +import org.reactivestreams.Publisher +import play.api.libs.json._ +import play.api.mvc._ + +import scala.concurrent.duration._ +import scala.concurrent.{ExecutionContext, Future} + +/** + * This class creates the actions and the websocket needed. + */ +@Singleton +class AdminController @Inject()(cc: ControllerComponents) extends AbstractController(cc) { + + implicit val actorSystem: ActorSystem = ActorSystem() + implicit val ec: ExecutionContext = defaultExecutionContext + + // Use a direct reference to SLF4J + private val logger = org.slf4j.LoggerFactory.getLogger("controllers.HomeController") + + val lobbiesActror: ActorRef = actorSystem.actorOf(Props[LobbiesActor]()) + val userParentActor: ActorRef = actorSystem.actorOf(Props(classOf[UserParentActor], actorSystem)) + + // Home page that renders template + def viewAllLobbies() = Action { implicit request => + logger.info(s"Received request from: ${request.remoteAddress}") + Ok(views.html.admin()) + } + + def banLobby(lobbyActorName: String): Unit = { + + } + + + /** + * Returns true if the value of the Origin header contains an acceptable value. + */ + def originMatches(origin: String): Boolean = { + origin.contains("139.59.210.74") || origin.contains("localhost") || origin.contains("localhost:9000") || origin.contains("localhost:19001") + } + + + +} diff --git a/app/controllers/HomeController.scala b/app/controllers/HomeController.scala index fef46c3..16bdb8c 100644 --- a/app/controllers/HomeController.scala +++ b/app/controllers/HomeController.scala @@ -28,11 +28,12 @@ class HomeController @Inject()(cc: ControllerComponents) extends AbstractControl // Use a direct reference to SLF4J private val logger = org.slf4j.LoggerFactory.getLogger("controllers.HomeController") - val lobbiesActror: ActorRef = actorSystem.actorOf(Props[LobbiesActor]()) + val userParentActor: ActorRef = actorSystem.actorOf(Props(classOf[UserParentActor], actorSystem)) // Home page that renders template def index() = Action { implicit request => + logger.info(s"Received request from: ${request.remoteAddress}") Ok(views.html.index()) } @@ -161,7 +162,7 @@ class HomeController @Inject()(cc: ControllerComponents) extends AbstractControl val flowWatch: Flow[JsValue, JsValue, NotUsed] = flow.watchTermination() { (_, termination) => termination.foreach { done => logger.info(s"Terminating actor $userActor") - lobbiesActror.tell(UnWatchAllLobbies, userActor) + LobbiesActor.actor.tell(UnWatchAllLobbies, userActor) actorSystem.stop(userActor) } NotUsed @@ -181,7 +182,7 @@ class HomeController @Inject()(cc: ControllerComponents) extends AbstractControl // Use guice assisted injection to instantiate and configure the child actor. val userActorFuture = { implicit val timeout = Timeout(100.millis) - (userParentActor ? UserParentActor.Create(name, webSocketOut, lobbiesActror)).mapTo[ActorRef] + (userParentActor ? UserParentActor.Create(name, webSocketOut)).mapTo[ActorRef] } userActorFuture } diff --git a/app/views/admin.scala.html b/app/views/admin.scala.html new file mode 100644 index 0000000..f681e07 --- /dev/null +++ b/app/views/admin.scala.html @@ -0,0 +1,6 @@ +@()(implicit r: Request[_]) + + + + + diff --git a/app/views/index.scala.html b/app/views/index.scala.html index 1e82942..4fe3f7b 100644 --- a/app/views/index.scala.html +++ b/app/views/index.scala.html @@ -3,7 +3,7 @@ - Second Autumn Cup decider + Soulstorm tournament decider @@ -13,7 +13,7 @@ - +