Created
October 21, 2011 01:26
-
-
Save soc/1302880 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package oxnrtr.chat | |
import collection.mutable.{ArrayBuffer, HashSet, Buffer} | |
import akka.actor.{ActorRef, Actor} | |
import akka.event.EventHandler | |
sealed trait Event | |
/**Join tells the peer that there is a new peer and requests a list of known peers and messages. */ | |
case class Join(user: String, ipAddress: String) extends Event | |
/**Join tells the peer that there is a new peer. */ | |
case class Register(user: String, ipAddress: String) extends Event | |
case class Leave(user: String, ipAddress: String) extends Event | |
case object GetChatLog extends Event | |
case object GetPeers extends Event | |
case class ChatLog(log: Seq[Message]) extends Event | |
case class Peers(peers: Seq[Peer]) extends Event | |
case class Message(sender: String, time: Long, message: String) extends Event | |
class ChatClient(val name: String, ipAddress: String) extends Actor { | |
val chat = Actor.remote.actorFor("chat:service", ipAddress, 2552) | |
val messages = ArrayBuffer[Message]() | |
val peers = HashSet[Peer]() | |
def join = { | |
(chat ? Join(name)).as[(Seq[Peer], Seq[Message])] | |
} | |
def register = chat ! Register(name) | |
def leave = chat ! Leave | |
def send(message: String) = { | |
val msg = Message(name, System.currentTimeMillis(), message) | |
messages += msg | |
chat ! msg | |
} | |
def getMessages = (chat ? GetChatLog).as[ChatLog] | |
.getOrElse(throw new Exception("Couldn't get the chat log from ChatServer")) | |
def getPeers = (chat ? GetPeers).as[Peers] | |
.getOrElse(throw new Exception("Couldn't get the peers from ChatServer")) | |
def receive = { | |
case msg@Message(from, time, message) => | |
messages += msg | |
case GetChatLog => | |
self reply messages | |
case GetPeers => | |
self reply peers | |
case Join => | |
peers += Peer(user, ipAddress) | |
self reply ((peers, messages)) | |
case Register(user, ipAddress) => | |
peers += Peer(user, ipAddress) | |
case Leave(user, ipAddress) => | |
peers -= Peer(user, ipAddress) | |
} | |
} | |
case class Peer(name: String, ipAddress: String) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment