diff --git a/app/controllers/AppC.scala b/app/controllers/AppC.scala index cdf9521eb0..ce70b6af41 100644 --- a/app/controllers/AppC.scala +++ b/app/controllers/AppC.scala @@ -20,7 +20,7 @@ object AppC extends LilaController { def socket = WebSocket.async[JsValue] { implicit request ⇒ env.siteSocket.join( - uid = get("uid") err "Socket UID missing", + uidOption = get("uid"), username = get("username")) } @@ -29,8 +29,8 @@ object AppC extends LilaController { env.gameSocket.join( gameId = gameId, colorName = color, - uid = get("uid") err "Socket UID missing", - version = getInt("version") err "Socket version missing", + uidOption = get("uid"), + versionOption = getInt("version"), playerId = get("playerId")).unsafePerformIO } diff --git a/app/controllers/LobbyC.scala b/app/controllers/LobbyC.scala index 13e523b653..32d369adfd 100644 --- a/app/controllers/LobbyC.scala +++ b/app/controllers/LobbyC.scala @@ -19,8 +19,8 @@ object LobbyC extends LilaController { def socket = WebSocket.async[JsValue] { implicit request ⇒ env.lobbySocket.join( - uid = get("uid") err "Socket UID missing", - version = getInt("version") err "Socket version missing", + uidOption = get("uid"), + versionOption = getInt("version"), hook = get("hook") ) } diff --git a/app/game/Socket.scala b/app/game/Socket.scala index 79d40ed7ba..4d077e452b 100644 --- a/app/game/Socket.scala +++ b/app/game/Socket.scala @@ -15,6 +15,7 @@ import scalaz.effects._ import chess.Color import model.{ DbGame, Pov, PovRef, Progress, Event } +import socket.Util import RichJs._ final class Socket( @@ -67,13 +68,15 @@ final class Socket( def join( gameId: String, colorName: String, - uid: String, - version: Int, + uidOption: Option[String], + versionOption: Option[Int], playerId: Option[String]): IO[SocketPromise] = getGame(gameId) map { gameOption ⇒ val promise: Option[SocketPromise] = for { game ← gameOption color ← Color(colorName) + uid ← uidOption + version ← versionOption hub = hubMemo get gameId } yield (hub ? Join( uid = uid, @@ -90,7 +93,7 @@ final class Socket( }, member.channel) } - promise | connectionFail + promise | Util.connectionFail } private def scheduleForDeletion(hub: ActorRef, gameId: String) { @@ -98,10 +101,4 @@ final class Socket( hub ! IfEmpty(hubMemo remove gameId) } } - - private def connectionFail = Promise.pure { - Done[JsValue, Unit]((), Input.EOF) -> (Enumerator[JsValue]( - JsObject(Seq("error" -> JsString("Invalid request"))) - ) andThen Enumerator.enumInput(Input.EOF)) - } } diff --git a/app/lobby/Socket.scala b/app/lobby/Socket.scala index a501fd4aed..3880daa8be 100644 --- a/app/lobby/Socket.scala +++ b/app/lobby/Socket.scala @@ -11,16 +11,20 @@ import play.api.libs.concurrent._ import scalaz.effects._ import RichJs._ +import socket.Util final class Socket(hub: ActorRef) { implicit val timeout = Timeout(1 second) def join( - uid: String, - version: Int, - hook: Option[String]): SocketPromise = - (hub ? Join(uid, version, hook)).asPromise map { + uidOption: Option[String], + versionOption: Option[Int], + hook: Option[String]): SocketPromise = { + val socket = for { + uid ← uidOption + version ← versionOption + } yield (hub ? Join(uid, version, hook)).asPromise map { case Connected(channel) ⇒ val iteratee = Iteratee.foreach[JsValue] { e ⇒ e str "t" match { @@ -35,7 +39,9 @@ final class Socket(hub: ActorRef) { hub ! Quit(uid) } (iteratee, channel) - } + }: SocketPromise + socket | Util.connectionFail + } def addEntry(entry: model.Entry): IO[Unit] = io { hub ! Entry(entry) diff --git a/app/site/Socket.scala b/app/site/Socket.scala index e6f0dc02aa..ef827f0fa5 100644 --- a/app/site/Socket.scala +++ b/app/site/Socket.scala @@ -5,20 +5,23 @@ import akka.actor._ import akka.pattern.ask import akka.util.duration._ import akka.util.Timeout - -import play.api._ import play.api.libs.json._ import play.api.libs.iteratee._ import play.api.libs.concurrent._ - import scalaz.effects._ +import socket.Util + final class Socket(hub: ActorRef) { implicit val timeout = Timeout(1 second) - def join(uid: String, username: Option[String]): SocketPromise = - (hub ? Join(uid, username)).asPromise map { + def join( + uidOption: Option[String], + username: Option[String]): SocketPromise = { + val socket = for { + uid ← uidOption + } yield (hub ? Join(uid, username)).asPromise map { case Connected(channel) ⇒ val iteratee = Iteratee.foreach[JsValue] { _ ⇒ Unit @@ -26,5 +29,7 @@ final class Socket(hub: ActorRef) { hub ! Quit(uid) } (iteratee, channel) - } + } : SocketPromise + socket | Util.connectionFail + } } diff --git a/app/socket/Util.scala b/app/socket/Util.scala new file mode 100644 index 0000000000..d6be4a4748 --- /dev/null +++ b/app/socket/Util.scala @@ -0,0 +1,16 @@ +package lila +package socket + +import play.api.libs.concurrent._ +import play.api.libs.json._ +import play.api.libs.iteratee._ + +object Util { + + val connectionFail: SocketPromise = Promise.pure { + Done[JsValue, Unit]((), Input.EOF) -> (Enumerator[JsValue]( + JsObject(Seq("error" -> JsString("Invalid request"))) + ) andThen Enumerator.enumInput(Input.EOF)) + } + +} diff --git a/todo b/todo index a0d2f1cfde..e8f6b3e7e7 100644 --- a/todo +++ b/todo @@ -1 +1,5 @@ ping nbm +games played scrolling +chat username case +back button +all players ()