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