Skip to content

Instantly share code, notes, and snippets.

@bruinbrown
Created June 1, 2015 10:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bruinbrown/f8a45074f5bc114d1b69 to your computer and use it in GitHub Desktop.
Save bruinbrown/f8a45074f5bc114d1b69 to your computer and use it in GitHub Desktop.
A demonstration of an area where Akka.Net shines
using Akka.Actor;
using Akka.Dispatch;
using CallCentre.Messages.CallInitiatorMessages;
using CallCentre.Messages.OperatorMessages;
using CallCentre.Messages.RouterMessages;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
namespace CallCentre.Actors
{
public class CallCentreOperator : ReceiveActor
{
private ActorSelection _callInitiator;
private ActorSelection _callRouter;
private string OperatorContactNumber { get { return String.Format("client:{0}", Self.Path.Name); } }
public CallCentreOperator()
{
_callInitiator = Context.ActorSelection("/user/twiliocallinitiator");
_callRouter = Context.ActorSelection("/user/callrouter");
Become(Idle);
}
public void Offline()
{
Receive<AgentConnected>(m => { Become(Idle); });
}
public void Idle()
{
Receive<AgentDisconnected>(m => { Become(Offline); });
Receive<IncomingCallMessage>(m =>
{
string url = String.Format("/twilio/client_connected?conference={0}", m.ConferenceId);
_callInitiator.Tell(new CreateCall(OperatorContactNumber, url));
_callRouter.Tell(new OperatorUnavailable());
Become(InCall);
});
}
public void InCall()
{
Receive<AgentDisconnected>(m => { Become(Offline); });
Receive<CallCompleteMessage>(m =>
{
Become(Wrapup);
Context.System.Scheduler.ScheduleTellOnce(TimeSpan.FromSeconds(10.0), Self, new OperatorReadyUp(), Sender);
});
}
public void Wrapup()
{
Receive<AgentDisconnected>(m => { Become(Offline); });
Receive<OperatorReadyUp>(m =>
{
Become(Idle);
_callRouter.Tell(new OperatorAvailable());
});
}
public void Busy()
{
Receive<AgentDisconnected>(m => { Become(Offline); });
Receive<OperatorReadyUp>(_ => { Become(Idle); });
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment