Add chat
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
package actors
|
||||
|
||||
import actors.UserActor.{GetName, HostLeaveLobby, LobbyFatal, RefreshLobbyInfo, SecondPlayerLeaveLobby, SetUserAsHost, SetUserAsObs, SetUserAsSecondPlayer}
|
||||
import actors.UserActor.{BanMapMessage, GetName, HostLeaveLobby, LobbyFatal, Message, RefreshLobbyInfo, SecondPlayerLeaveLobby, SendBanMapMessage, SendMessage, SetUserAsHost, SetUserAsObs, SetUserAsSecondPlayer}
|
||||
import akka.actor.{Actor, ActorLogging, ActorRef}
|
||||
import akka.event.LoggingReceive
|
||||
import com.typesafe.scalalogging.LazyLogging
|
||||
@@ -65,20 +65,35 @@ class LobbieActor(hostUser: LobbyUser) extends Actor with LazyLogging {
|
||||
case BanMap(mapName: String) =>
|
||||
// notify watchers
|
||||
logger.info(s"Ban map $mapName by ${sender.path.name}")
|
||||
|
||||
if(status == Draft()){
|
||||
if((playerTurn == 1 && sender == host.actorRef) ||
|
||||
(playerTurn == 2 && secondPlayer.exists(_.actorRef == sender))){
|
||||
mapsLobby.find(p => p.map == mapName).foreach(_.isBanned = true)
|
||||
if (playerTurn== 1) playerTurn = 2 else playerTurn = 1
|
||||
if(mapsLobby.count(_.isBanned == false) == 1){
|
||||
status = Finish()
|
||||
mapsLobby.find(p => p.map == mapName) match {
|
||||
case Some(map) =>
|
||||
if(!map.isBanned){
|
||||
map.isBanned = true
|
||||
if (playerTurn== 1) playerTurn = 2 else playerTurn = 1
|
||||
if(mapsLobby.count(_.isBanned == false) == 1){
|
||||
status = Finish()
|
||||
}
|
||||
users.foreach(_ ! RefreshLobbyInfo(getLobbyInfoResponse))
|
||||
|
||||
val senderName: String = if (sender == host.actorRef) {
|
||||
host.name
|
||||
} else secondPlayer.get.name
|
||||
users.foreach(_ ! SendBanMapMessage(BanMapMessage(senderName, mapName)))
|
||||
} else {
|
||||
logger.warn(s"User ban map $mapName, but map already banned")
|
||||
}
|
||||
case None =>
|
||||
logger.error(s"Map $mapName not exist")
|
||||
}
|
||||
users.foreach(_ ! RefreshLobbyInfo(getLobbyInfoResponse))
|
||||
} else{
|
||||
logger.warn(s"Player ${sender.path.name} ban map, but turn is $playerTurn")
|
||||
}
|
||||
} else {
|
||||
logger.warn(s"Player ${sender.path.name} ban map, but it is '$status' status")
|
||||
logger.warn(s"Player ${sender.path.name} ban map, but lobby status is '$status' status")
|
||||
}
|
||||
case SetReady =>
|
||||
// notify watchers
|
||||
@@ -112,6 +127,13 @@ class LobbieActor(hostUser: LobbyUser) extends Actor with LazyLogging {
|
||||
secondPlayer = None
|
||||
users.foreach(_ ! RefreshLobbyInfo(getLobbyInfoResponse))
|
||||
}
|
||||
|
||||
case MessageForLobby(message) =>
|
||||
if (sender() == host.actorRef) {
|
||||
users.foreach(_ ! SendMessage(Message(host.name, message)))
|
||||
}else if (secondPlayer.exists(sp => sp.actorRef == sender())){
|
||||
users.foreach(_ ! SendMessage(Message(secondPlayer.get.name, message)))
|
||||
}
|
||||
case JoinLobbyAsPlayer(sp) =>
|
||||
logger.info(s"User ${sender.path.name} join lobby ${self.path.name} as player")
|
||||
if (secondPlayer.isEmpty) {
|
||||
@@ -177,6 +199,8 @@ case object SetReady
|
||||
|
||||
case object SetNotReady
|
||||
|
||||
case class MessageForLobby(message: String)
|
||||
|
||||
case object InfoQuery
|
||||
|
||||
case class UserInfo(name: String, isReady: Boolean)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package actors
|
||||
|
||||
import actors.UserActor.{GetName, HostLeaveLobby, LobbyFatal, RefreshLobbyInfo, SecondPlayerLeaveLobby, SetUserAsHost, SetUserAsObs, SetUserAsSecondPlayer}
|
||||
import actors.UserActor.{BanMapMessage, GetName, HostLeaveLobby, LobbyFatal, Message, RefreshLobbyInfo, SecondPlayerLeaveLobby, SendBanMapMessage, SendMessage, SetUserAsHost, SetUserAsObs, SetUserAsSecondPlayer}
|
||||
import akka.actor._
|
||||
import akka.event.LoggingReceive
|
||||
import akka.pattern.ask
|
||||
@@ -33,6 +33,10 @@ class UserActor(out: ActorRef,
|
||||
|
||||
implicit val lobbyWrites: OWrites[LobbyInfo] = Json.writes[LobbyInfo]
|
||||
|
||||
implicit val messageWrites: OWrites[Message] = Json.writes[Message]
|
||||
|
||||
implicit val messageBanMapWrites: OWrites[BanMapMessage] = Json.writes[BanMapMessage]
|
||||
|
||||
implicit val lobbyResponseWrites: Writes[List[LobbyInfo]] = new Writes[List[LobbyInfo]] {
|
||||
|
||||
override def writes(o: List[LobbyInfo]): JsValue = {
|
||||
@@ -84,6 +88,14 @@ class UserActor(out: ActorRef,
|
||||
logger.trace(s"Refresh lobby info: $lobbyInfo")
|
||||
out ! Json.obj("type" -> "refreshLobby", "lobby" -> lobbyInfo)
|
||||
|
||||
case SendMessage(message) =>
|
||||
logger.debug(s"Send message $message")
|
||||
out ! Json.obj("type" -> "sendMessage", "message" -> message)
|
||||
|
||||
case SendBanMapMessage(mapBanMessage) =>
|
||||
logger.debug(s"Send ban map message $mapBanMessage")
|
||||
out ! Json.obj("type" -> "sendMapBanMessage", "message" -> mapBanMessage)
|
||||
|
||||
case LobbyFatal(message) => // После этого сообщения выход из лобби
|
||||
logger.warn(s"Lobby error: $message")
|
||||
out ! Json.obj("type" -> "lobbyError", "error" -> message)
|
||||
@@ -119,6 +131,10 @@ class UserActor(out: ActorRef,
|
||||
case Some("setNotReady") =>
|
||||
lobbieActor.foreach(lobby => lobby ! SetNotReady)
|
||||
|
||||
case Some("sendMessage") =>
|
||||
val message = (json \ "message").as[String]
|
||||
lobbieActor.foreach(lobby => lobby ! MessageForLobby(message))
|
||||
|
||||
case Some("kickSecondPlayer") =>
|
||||
lobbieActor.foreach(lobby => lobby ! KickSecondPlayer)
|
||||
|
||||
@@ -186,6 +202,12 @@ object UserActor {
|
||||
|
||||
case object GetName
|
||||
|
||||
case class Message(userName: String, message: String)
|
||||
case class SendMessage(message: Message)
|
||||
|
||||
case class BanMapMessage(user: String, mapTechName: String)
|
||||
case class SendBanMapMessage(message: BanMapMessage)
|
||||
|
||||
case class RefreshLobbyInfo(lobbyInfo: LobbyInfo)
|
||||
|
||||
case class SetUserAsHost(lobbyInfo: LobbyInfo)
|
||||
|
||||
Reference in New Issue
Block a user