package com.jgoetsch.eventtrader.source;
import java.util.Collection;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jgoetsch.eventtrader.Msg;
import com.jgoetsch.eventtrader.source.parser.BufferedMsgParser;
import com.jgoetsch.eventtrader.source.parser.MsgParseException;
import com.pusher.client.Pusher;
import com.pusher.client.PusherOptions;
import com.pusher.client.channel.Channel;
import com.pusher.client.channel.PresenceChannelEventListener;
import com.pusher.client.channel.SubscriptionEventListener;
import com.pusher.client.channel.User;
import com.pusher.client.connection.ConnectionEventListener;
import com.pusher.client.connection.ConnectionState;
import com.pusher.client.connection.ConnectionStateChange;
public class PusherMsgSource extends MsgSource {
private Logger log = LoggerFactory.getLogger(getClass());
private String appKey;
private PusherOptions pusherOptions;
private BufferedMsgParser msgParser;
private Collection<String> channels;
@Override
protected void receiveMsgs() {
Pusher pusher = pusherOptions != null ? new Pusher(appKey, pusherOptions) : new Pusher(appKey);
pusher.connect(new ConnectionEventListener() {
public void onConnectionStateChange(ConnectionStateChange change) {
log.info("State changed to " + change.getCurrentState() + " from " + change.getPreviousState());
if (change.getCurrentState().equals(ConnectionState.DISCONNECTED) && change.getPreviousState().equals(ConnectionState.CONNECTED)) {
newMsg(new Msg("system", "PusherMsgSource is " + change.getCurrentState()));
}
}
public void onError(String message, String code, Exception e) {
log.info("There was a problem connecting!");
}
}, ConnectionState.ALL);
SubscriptionEventListener messageListener = new PresenceChannelEventListener() {
public void onEvent(String channel, String event, String data) {
log.debug(data);
//JSONObject json = (JSONObject)JSONValue.parse(data);
try {
//msgParser.parseData((String)json.get("command"), (JSONObject)json.get("message"), PusherMsgSource.this);
msgParser.parseContent(data, event, PusherMsgSource.this);
} catch (MsgParseException e) {
log.error("Message parse error, content was:\n" + data, e);
}
}
public void onSubscriptionSucceeded(String message) {
log.info("Subscribed: " + message);
}
public void onAuthenticationFailure(String message, Exception e) {
log.error("Failed to subscribe: " + message, e);
}
public void onUsersInformationReceived(String channelName, Set<User> users) {
}
public void userSubscribed(String channelName, User user) {
}
public void userUnsubscribed(String channelName, User user) {
}
};
for (String channelName : channels) {
Channel channel;
if(channelName.startsWith("private-"))
channel = pusher.subscribePrivate(channelName);
else if (channelName.startsWith("presence-"))
channel = pusher.subscribePresence(channelName);
else
channel = pusher.subscribe(channelName);
channel.bind("message", messageListener);
channel.bind("Msg", messageListener);
channel.bind("TradeSignal", messageListener);
}
for (;;) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
}
}
}
public String getAppKey() {
return appKey;
}
public void setAppKey(String appKey) {
this.appKey = appKey;
}
public PusherOptions getPusherOptions() {
return pusherOptions;
}
public void setPusherOptions(PusherOptions pusherOptions) {
this.pusherOptions = pusherOptions;
}
public BufferedMsgParser getMsgParser() {
return msgParser;
}
public void setMsgParser(BufferedMsgParser msgParser) {
this.msgParser = msgParser;
}
public Collection<String> getChannels() {
return channels;
}
public void setChannels(Collection<String> channels) {
this.channels = channels;
}
}