package global;
import java.util.concurrent.TimeUnit;
import models.Proposal;
import play.Application;
import play.GlobalSettings;
import play.Play;
import play.libs.Akka;
import play.libs.F;
import play.libs.F.Callback;
import play.libs.F.Promise;
import play.mvc.Http.RequestHeader;
import play.mvc.Results;
import play.mvc.SimpleResult;
import scala.concurrent.duration.Duration;
import actors.EventPublisher;
import actors.messages.RandomlySelectedTalkEvent;
import akka.actor.ActorRef;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Provider;
import external.services.OAuthService;
import external.services.TwitterOAuthService;
public class PlayConfGlobal extends GlobalSettings {
public Injector injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(ActorRef.class).toProvider(new Provider<ActorRef>() {
@Override
public ActorRef get() {
return EventPublisher.ref;
}
});
bind(OAuthService.class).toProvider(new Provider<OAuthService>() {
@Override
public OAuthService get() {
return new TwitterOAuthService(
Play.application().configuration().getString("twitter.consumer.key"),
Play.application().configuration().getString("twitter.consumer.secret"));
}
});
}
});
@Override
public <A> A getControllerInstance(Class<A> clazz) throws Exception {
return injector.getInstance(clazz);
}
@Override
public void onStart(Application arg0) {
super.onStart(arg0);
Akka.system()
.scheduler()
.schedule(Duration.create(1, TimeUnit.SECONDS),
Duration.create(10, TimeUnit.SECONDS),
selectRandomTalks(), Akka.system().dispatcher());
}
private Runnable selectRandomTalks() {
return new Runnable() {
@Override
public void run() {
Promise<Proposal> proposal = Proposal.selectRandomTalk();
proposal.onRedeem(new Callback<Proposal>() {
public void invoke(Proposal p) {
EventPublisher.ref.tell(new RandomlySelectedTalkEvent(p), ActorRef.noSender());
}
});
}
};
}
@Override
public Promise<SimpleResult> onHandlerNotFound(RequestHeader arg0) {
return F.Promise.<SimpleResult>pure(Results.notFound(views.html.error.render()));
}
@Override
public Promise<SimpleResult> onError(RequestHeader arg0, Throwable arg1) {
return F.Promise.<SimpleResult>pure(Results.internalServerError(views.html.error.render()));
}
}