ctf-server

old server for hosting capture-the-flag

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

Broadcast.scala

(3151B)


      1 package com.jcabrra
      2 package comet
      3 
      4 import model._, BroadcastMessageType._
      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 Broadcast extends CometActor with CometListener {
     21   private var msgs: List[BroadcastMessage] = Nil
     22 
     23   // register this component
     24   def registerWith = BroadcastServer
     25 
     26   // listen for messages
     27   override def lowPriority = {
     28     case BroadcastServerUpdate(value) =>
     29       val update: JsCmd = (value diff msgs).flatMap(line).map(PrependHtml("broadcast-message-box", _))
     30       partialUpdate(update)
     31       msgs = value
     32   }
     33 
     34   // render the component
     35   def render = ClearClearable & "li *" #> msgs.map(line)
     36   def line(m: BroadcastMessage) = <li class={"text-"+m.messageType.toString}>{m.toString}</li>
     37 }
     38 
     39 /**
     40  * The chat server
     41  */
     42 object BroadcastServer extends LiftActor with ListenerManager {
     43   private var msgs: List[BroadcastMessage] = BroadcastMessage.findAll(PreCache(BroadcastMessage.user)).reverse
     44 
     45   def createUpdate = BroadcastServerUpdate(msgs.take(15))
     46 
     47   override def lowPriority = {
     48 
     49     case BroadcastUserJoined(user, ip) =>     
     50       val msg = BroadcastMessage.create.
     51       user(user).ipAddress(ip).messageType(UserJoined).
     52       message(user.nickName+" joined the competition. WELCOME!")
     53       add(msg) 
     54      
     55     case BroadcastCorrectGuess(user, ip, flag, challenge) =>
     56       val msg = BroadcastMessage.create.
     57       user(user).ipAddress(ip).messageType(CorrectGuess).
     58       message(user.nickName+" captured the flag in "+challenge.name)
     59       add(msg)
     60       this ! BroadcastUnlockedChallenges(user, ip, flag.unlocks)
     61       this ! BroadcastChallengesToWin(user, ip)
     62       
     63     case BroadcastWrongGuess(user, ip, challenge) =>
     64       val msg = BroadcastMessage.create.
     65       user(user).ipAddress(ip).messageType(WrongGuess).
     66       message(user.nickName+" guessed the wrong flag for "+challenge.name)
     67       add(msg)
     68       
     69     case BroadcastUnlockedChallenges(user, ip, challenges) =>
     70       val msg = BroadcastMessage.create.
     71       user(user).ipAddress(ip).messageType(CorrectGuess).
     72       message(user.nickName+" unlocked "+challenges.size+" challenges: "+
     73           challenges.map(_.name.get).mkString(", "))
     74       add(msg)  
     75       
     76     case BroadcastChallengesToWin(user, ip) =>
     77       val msg = BroadcastMessage.create.
     78       user(user).ipAddress(ip).messageType(CorrectGuess).
     79       message(user.nickName+" is "+user.howManyToWin()+" challenges away from winning")
     80       add(msg)    
     81   }
     82       
     83   def add(m: BroadcastMessage) {
     84     m.save
     85     msgs = (List(m) ::: msgs).take(50)
     86     updateListeners()
     87   }
     88 }
     89 
     90 case class BroadcastServerUpdate(v: List[BroadcastMessage])
     91 
     92 case class BroadcastUserJoined(user: User, ip: String)
     93 case class BroadcastCorrectGuess(user: User, ip: String, flag: Flag, challenge: Challenge)
     94 case class BroadcastUnlockedChallenges(user: User, ip: String, challenges: List[Challenge])
     95 case class BroadcastChallengesToWin(user: User, ip: String)
     96 case class BroadcastWrongGuess(user: User, ip: String, challenge: Challenge)
     97