package we.love.pluto.twitter;
import java.util.Collections;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import cloudone.C1Services;
import com.google.common.collect.Lists;
import com.twitter.hbc.ClientBuilder;
import com.twitter.hbc.core.Constants;
import com.twitter.hbc.core.endpoint.StatusesFilterEndpoint;
import com.twitter.hbc.core.processor.StringDelimitedProcessor;
import com.twitter.hbc.httpclient.auth.Authentication;
import com.twitter.hbc.httpclient.auth.OAuth1;
import com.twitter.hbc.twitter4j.Twitter4jStatusClient;
import twitter4j.Status;
import twitter4j.StatusAdapter;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* @author Michal Gajdos
*/
final class TwitterAggregator extends AbstractAggregator {
private final String consumerKey;
private final String consumerSecret;
private final String token;
private final String tokenSecret;
private volatile Twitter4jStatusClient client;
public TwitterAggregator(final String consumerKey,
final String consumerSecret,
final String token,
final String tokenSecret) {
checkNotNull(consumerKey);
checkNotNull(consumerSecret);
checkNotNull(token);
checkNotNull(tokenSecret);
this.consumerKey = consumerKey;
this.consumerSecret = consumerSecret;
this.token = token;
this.tokenSecret = tokenSecret;
}
@Override
public TwitterAggregator start(final String... keywords) {
final BlockingQueue<String> queue = new LinkedBlockingQueue<>(10000);
final Authentication auth = new OAuth1(
consumerKey,
consumerSecret,
token,
tokenSecret);
// Create a new BasicClient. By default gzip is enabled.
final ClientBuilder builder = new ClientBuilder()
.hosts(Constants.STREAM_HOST)
.endpoint(new StatusesFilterEndpoint().trackTerms(Lists.newArrayList(keywords)))
.authentication(auth)
.processor(new StringDelimitedProcessor(queue));
// Wrap our BasicClient with the twitter4j client
client = new Twitter4jStatusClient(
builder.build(),
queue,
Collections.singletonList(new TwitterMessageListener()),
C1Services.getInstance().getExecutorService());
client.connect();
client.process();
return this;
}
@Override
public void stop() {
if (client != null) {
client.stop();
}
}
private class TwitterMessageListener extends StatusAdapter {
@Override
public void onStatus(final Status status) {
message(status.getText(), status.getUser().getName());
}
}
}