78 lines
2.2 KiB
Scala
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
|