ctf-server

old server for hosting capture-the-flag

git clone https://9o.is/git/ctf-server.git

Chat.scala

(1406B)


      1 package com.jcabrra
      2 package comet
      3 
      4 import model._
      5 
      6 import net.liftweb._
      7 import http._
      8 import mapper._
      9 import js._
     10 import JsCmds._
     11 import js.jquery.JqJsCmds._
     12 import actor._
     13 import util._
     14 import Helpers._
     15 import xml.NodeSeq
     16 
     17 /**
     18  * The comet chat component
     19  */
     20 class Chat extends CometActor with CometListener {
     21   private var msgs: List[ChatMessage] = Nil
     22 
     23   // register this component
     24   def registerWith = ChatServer
     25 
     26   // listen for messages
     27   override def lowPriority = {
     28     case ChatServerUpdate(value) =>
     29       val update: JsCmd = (value diff msgs).flatMap(line).map(PrependHtml("chat-message-box", _))
     30       partialUpdate(update)
     31       msgs = value
     32   }
     33 
     34   // render the component
     35   def render = ClearClearable & "li *" #> msgs.map(_.toString)
     36   def line(m: ChatMessage): NodeSeq = <li>{m.toString}</li>
     37 }
     38 
     39 /**
     40  * The chat server
     41  */
     42 object ChatServer extends LiftActor with ListenerManager {
     43   private var msgs: List[ChatMessage] = ChatMessage.findAll(PreCache(ChatMessage.user)).reverse
     44 
     45   def createUpdate = ChatServerUpdate(msgs.take(15))
     46 
     47   override def lowPriority = {
     48     case ChatServerMsg(user, msg) if msg.length > 0 =>
     49       val message = ChatMessage.create.user(user).message(msg).date(now)
     50       message.save
     51       msgs = (List(message) ::: msgs).take(50)
     52       updateListeners()
     53 
     54   }
     55 }
     56 
     57 case class ChatServerMsg(user: User, msg: String)
     58 case class ChatServerUpdate(v: List[ChatMessage])