Advertisement
Zvezdochet

UserSession

Apr 17th, 2011
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 3.42 KB | None | 0 0
  1. class UserSession(val userId:String) extends Actor{
  2.     implicit val formats = Serialization.formats(NoTypeHints)
  3.  
  4.     var waitRequest:Option[RequestContext] = None
  5.     var filters:Seq[String] = Nil
  6.     var messagesQueue = List.empty[ChatMessage]
  7.     var lastAccess:Long = System.currentTimeMillis()
  8.  
  9.     val okResponse = write(Map("ok"->true))
  10.     val timeout = 1000*60*10L
  11.  
  12.     protected def receive = {
  13.         case Request(ctx) => {
  14.             lastAccess = System.currentTimeMillis()
  15.             val action = ctx.param("action")
  16.             action match {
  17.                 case "sendMessage" => {
  18.                     val msg = ctx.param("message")
  19.                     Chat.instance ! ChatMessage(prepareMessage(msg))
  20.                     ctx.writeAndComplete(okResponse)
  21.                 }
  22.                 case "changeFilter" => {
  23.                     val filterString = ctx.param("filter")
  24.                     val newFilters = filterString.split(' ') .map(_.trim)
  25.                         .filter(s => s.startsWith("#"))
  26.                     filters = newFilters
  27.                     ctx.writeAndComplete(okResponse)
  28.                 }
  29.                 case "getMessages" =>{
  30.                     closeLastRequest()
  31.                     if(messagesQueue.isEmpty){
  32.                         waitRequest = Some(ctx)
  33.                     } else{
  34.                         sendMessagesToClient(ctx)
  35.                     }
  36.                 }
  37.                 case "getUserId" => {
  38.                     val json: String = write(Map("ok" -> true, "userId" -> userId))
  39.                     ctx.writeAndComplete(json)
  40.                 }
  41.             }
  42.         }
  43.  
  44.         case msg @ ChatMessage(_,_) => {
  45.             if(checkFilter(msg)){
  46.                 messagesQueue = msg :: messagesQueue
  47.                 if(waitRequest.isDefined){
  48.                     sendMessagesToClient(waitRequest.get)
  49.                     waitRequest = None
  50.                 }
  51.             }
  52.             checkTimeOut()
  53.         }
  54.  
  55.         case CloseRequest() =>{
  56.             waitRequest = None
  57.         }
  58.     }
  59.  
  60.     override def preStart {
  61.         Chat.instance ! Subscribe(self)
  62.     }
  63.  
  64.  
  65.     override def postStop {
  66.         closeLastRequest()
  67.         Chat.instance ! UnSubscribe(self)
  68.     }
  69.  
  70.  
  71.     override def preRestart(reason: Throwable) {
  72.         postStop
  73.     }
  74.  
  75.     private def closeLastRequest() {
  76.         try {
  77.             waitRequest.foreach(r => {
  78.                 r.writeAndComplete(write((Map("ok" -> false))))
  79.             })
  80.         }
  81.         catch {
  82.             case _ => {}
  83.         }
  84.         waitRequest = None
  85.     }
  86.  
  87.     private def sendMessagesToClient(ctx:RequestContext){
  88.         val msgs =  messagesQueue.reverse.map(m => Map("msg" -> m.msg, "time" -> m.time))
  89.         val response = Map("ok" -> true,
  90.                             "messages"-> msgs)
  91.  
  92.         var json = write(response)
  93.         ctx.writeAndComplete(json)
  94.         messagesQueue = List.empty[ChatMessage]
  95.     }
  96.  
  97.     private def prepareMessage(m:String):String = {
  98.         val m1 = m.replaceAll("\n", "\\\\n")
  99.         Jsoup.parse(m1).text().take(200)
  100.     }
  101.  
  102.     private def checkFilter(msg:ChatMessage) = {
  103.         if(filters.isEmpty) true
  104.         else filters.exists(f => msg.tags.contains(f))
  105.     }
  106.  
  107.     private def checkTimeOut(){
  108.         if(System.currentTimeMillis - lastAccess > timeout)
  109.             RequestDispatcher.instance ! CloseSession(userId)
  110.     }
  111.  
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement