2020-11-15 16:54:46 +03:00

78 lines
2.2 KiB
Scala

package actors
import akka.actor.{Actor, ActorLogging, ActorRef}
import akka.event.LoggingReceive
import com.typesafe.scalalogging.LazyLogging
import scala.collection.immutable.{HashSet, Queue}
import scala.concurrent.duration._
case class DeciderMap(map: String, isBanned: Boolean = false)
/**
* There is one StockActor per stock symbol. The StockActor maintains a list of users watching the stock and the stock
* values. Each StockActor updates a rolling dataset of randomly generated stock values.
*/
class LobbieActor(lobbyName: String, hostUser: ActorRef) extends Actor with LazyLogging {
private val name: String = lobbyName
// user actors
protected[this] var users: HashSet[ActorRef] = HashSet.empty[ActorRef]
private var status = NotStarted
private var maps: List[DeciderMap] = List(DeciderMap("map1"), DeciderMap("map2"), DeciderMap("map3"))
private var secondPlayer: Option[ActorRef] = None
logger.info(s"Create lobby with name $lobbyName")
def receive = LoggingReceive {
case BanMap(mapName: String) =>
// notify watchers
logger.info(s"Ban map $mapName by ${sender.path.name}")
users.foreach(_ ! MapsUpdate( maps))
case JoinLobbyAsPlayer(_) =>
secondPlayer = Some(sender)
case WatchLobby(_) =>
// add the watcher to the list
users = users + sender
case LeaveLobby =>
users = users - sender
if(secondPlayer.contains(sender)) secondPlayer = None
if (users.isEmpty) {
logger.info(s"Stop lobby with name: $name")
context.stop(self)
}
case InfoQuery =>
sender ! LobbyInfoResponse(name, self.path.name, status.toString())
}
}
case class BanMap(mapName: String)
case class MapsUpdate(maps: List[DeciderMap])
case class MapsHistory(symbol: String, maps: List[DeciderMap])
case class CreateLobby(userName: String)
case class JoinLobbyAsPlayer(lobbyName: String)
case class WatchLobby(lobbyName: String)
case class LeaveLobby(lobbyName: String)
case object InfoQuery
case class LobbyInfoResponse(lobbyName: String, lobbyActorName: String, status: String)
class LobbyStatus
sealed case class NotStarted() extends LobbyStatus
sealed case class Draft() extends LobbyStatus
sealed case class Finish() extends LobbyStatus