SourceForge: tilescape/tilescape: changeset 22:6a6d2069d68c
tilescapeSendMessageToServer(msg) to send messages only to current game
author"Juha Litola <juha.litola@iki.fi>"
Wed Apr 01 23:20:05 2009 +0300 (7 months ago)
changeset 226a6d2069d68c
parent 21d70676016431
child 24ad80d0da68d5
tilescapeSendMessageToServer(msg) to send messages only to current game
src/main/scala/net/inapt/tilescape/comet/GameActor.scala
src/main/scala/net/inapt/tilescape/comet/GameServer.scala
src/main/scala/net/inapt/tilescape/model/Game.scala
     1.1 --- a/src/main/scala/net/inapt/tilescape/comet/GameActor.scala	Wed Apr 01 22:00:38 2009 +0300
     1.2 +++ b/src/main/scala/net/inapt/tilescape/comet/GameActor.scala	Wed Apr 01 23:20:05 2009 +0300
     1.3 @@ -44,8 +44,8 @@
     1.4    }
     1.5  
     1.6    override def lowPriority = {
     1.7 -    case GameServerUpdate(value) =>
     1.8 -			val v = value.foldLeft(Noop)((a,b) => a & Run(invocationFunction(b.msg)))
     1.9 +    case GameUpdate(value) =>
    1.10 +			val v = value.foldLeft(Noop)((a,b) => a & Run(invocationFunction(b.toMsg)))
    1.11  			partialUpdate(v)
    1.12  		case AnnounceNewUser(u) =>
    1.13  			partialUpdate(AppendHtml(usersId, userLine(u)))
    1.14 @@ -68,14 +68,18 @@
    1.15  	}
    1.16  
    1.17  	private def sendChatMessage(name : String, msg: String) {
    1.18 -		Log.info("Sending message "+msg+" to chat server")
    1.19  		ChatServer ! ChatServerMsg(name, msg)
    1.20  	}
    1.21  
    1.22  	private def invocationFunction(s : String) = "tilescapeReceiveServerMessage('"+urlEncode(s)+"')"
    1.23  
    1.24 -  override lazy val fixedRender: Box[NodeSeq] = {
    1.25 -		Script(Function("tilescapeSendMessageToServer", List("msg"), ajaxCall(JsVar("msg"), jsSendMessage _)._2))
    1.26 +  override def fixedRender: Box[NodeSeq] = {
    1.27 +		user.currentGame match {
    1.28 +			case Some(game) =>
    1.29 +				Script(Function("tilescapeSendMessageToServer", List("msg"), ajaxCall(JsVar("msg"), jsSendMessage (game, _))._2))
    1.30 +			case None =>
    1.31 +				Script(Function("tilescapeSendMessageToServer", List("msg"), Run("alert('Not connected to server')")))
    1.32 +		}
    1.33    }
    1.34  
    1.35  	override def render = {
    1.36 @@ -132,9 +136,10 @@
    1.37  		AppendHtml(errorId, Text(e.msg))
    1.38  	}
    1.39  
    1.40 -	def jsSendMessage(msg: String) = { sendMessage(msg); Noop }
    1.41 -
    1.42 -  def sendMessage(msg: String) = server ! GameServerMsg(this, msg.trim)
    1.43 +	def jsSendMessage(game: Game, msg: String) = {
    1.44 +		server ! GameEventMessage(this, game, msg.trim)
    1.45 +		Noop
    1.46 +	}
    1.47  
    1.48  	def jsJoinGame(game : Game) = { server ! JoinGame(this, game) ; Noop }
    1.49  
     2.1 --- a/src/main/scala/net/inapt/tilescape/comet/GameServer.scala	Wed Apr 01 22:00:38 2009 +0300
     2.2 +++ b/src/main/scala/net/inapt/tilescape/comet/GameServer.scala	Wed Apr 01 23:20:05 2009 +0300
     2.3 @@ -23,10 +23,9 @@
     2.4  
     2.5    def act = loop {
     2.6      react {
     2.7 -      case GameServerMsg(sender, msg) if msg.length > 0 =>
     2.8 -				val m = GameMessage(sender, msg)
     2.9 -				messages ::= m
    2.10 -				listeners.foreach (_ ! GameServerUpdate(List(m)))
    2.11 +      case GameEventMessage(sender, game, msg) =>
    2.12 +				val l = game.process(msg)
    2.13 +				listeners.foreach (_ ! GameUpdate(l))
    2.14  
    2.15  			case GetUserList =>
    2.16  				reply(UserList(listeners.map(_.user)))
    2.17 @@ -59,7 +58,6 @@
    2.18  				listeners.foreach (_ ! AnnounceLeftPlayer(game, sender.user) )
    2.19  
    2.20        case GameServerAdd(me) =>
    2.21 -				me ! GameServerUpdate(messages)
    2.22  				listeners.foreach (_ ! AnnounceNewUser(me.user))
    2.23  				listeners ::= me
    2.24  
    2.25 @@ -73,10 +71,11 @@
    2.26    this.start
    2.27  }
    2.28  
    2.29 +case class GameEventMessage(sender : Actor, game: Game, msg: String)
    2.30  case class GameServerError(msg: String)
    2.31  case class GameMessage(sender : Actor, msg: String)
    2.32  case class GameServerMsg(sender: GameActor, msg: String)
    2.33 -case class GameServerUpdate(msg: List[GameMessage])
    2.34 +case class GameUpdate(msg: List[GameEvent])
    2.35  case class GameServerAdd(me: GameActor)
    2.36  case class AnnounceNewUser(user : User)
    2.37  case class GameServerRemove(me: GameActor)
     3.1 --- a/src/main/scala/net/inapt/tilescape/model/Game.scala	Wed Apr 01 22:00:38 2009 +0300
     3.2 +++ b/src/main/scala/net/inapt/tilescape/model/Game.scala	Wed Apr 01 23:20:05 2009 +0300
     3.3 @@ -8,14 +8,14 @@
     3.4  import net.inapt.tilescape.comet.GameActor
     3.5  
     3.6  abstract class RuleSet {
     3.7 -	def process(msg : GameMessage)
     3.8 +	def process(msg : String) : List[GameEvent] {}
     3.9  }
    3.10  
    3.11  /** 
    3.12   * Just passes through the messages from clients
    3.13   */
    3.14  class ClientRuleSet extends RuleSet {
    3.15 -	def process(msg : GameMessage) { }
    3.16 +	def process(msg : String) : List[GameEvent] = new StringGameEvent(msg) :: Nil
    3.17  }
    3.18  
    3.19  object GameStatus extends Enumeration {
    3.20 @@ -23,7 +23,12 @@
    3.21  	val PreGame, Ongoing, Finished = Value
    3.22  }
    3.23  
    3.24 -case class GameMessage
    3.25 +abstract case class GameEvent {
    3.26 +	def toMsg : String
    3.27 +}
    3.28 +case class StringGameEvent(val msg: String) extends GameEvent {
    3.29 +	override def toMsg = msg
    3.30 +}
    3.31  
    3.32  class Game (val name : String, val ruleset : RuleSet, var initiator : User) {
    3.33  	private var players = List[User]()
    3.34 @@ -34,5 +39,5 @@
    3.35  
    3.36  	def leave(player : User) { players -= player }
    3.37  
    3.38 -	def process(msg : GameMessage) { ruleset.process(msg) }
    3.39 +	def process(msg : String) : List[GameEvent] = { ruleset.process(msg) }
    3.40  }
    3.41 \ No newline at end of file