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])