package edu.umd.rhsmith.diads.meater.modules.tweater.oauth;
import twitter4j.TwitterException;
import twitter4j.TwitterStream;
import twitter4j.TwitterStreamFactory;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;
import edu.umd.rhsmith.diads.meater.core.config.setup.MEaterSetupConsole;
import edu.umd.rhsmith.diads.meater.core.config.setup.ops.SetupConsoleOperation;
import edu.umd.rhsmith.diads.meater.util.console.BooleanPrompter;
public class OAuthSetupOperation extends SetupConsoleOperation {
private OAuthConfig owner;
public OAuthSetupOperation(OAuthConfig owner) {
super("Set up this OAuth configuration", "setup");
this.owner = owner;
}
@Override
public void go(MEaterSetupConsole setup) {
setup.getConsole()
.say("This program will help you acquire the necessary credentials for using the\n"
+ "Twitter Streaming API. There are two kinds of tokens needed: a Consumer Token\n"
+ "and an Access Token. The former may already be present in the configuration file,\n"
+ "but the latter requires that you log in to Twitter and authorize TwEater.\n"
+ "This operation will walk you through the process.\n");
TwitterStream tw = new TwitterStreamFactory().getInstance();
loadConsumerToken(setup, tw);
loadAccessToken(setup, tw);
}
private void loadConsumerToken(MEaterSetupConsole setup, TwitterStream tw) {
boolean missing = owner.getConsumerKey().isEmpty()
|| owner.getConsumerSecret().isEmpty();
boolean reset = false;
if (!missing) {
setup.getConsole().say("An existing Consumer Token was found.");
setup.getConsole().say(
"Do you want to reset the Consumer Token anyway?");
reset = setup.getConsole().prompt(BooleanPrompter.PROMPT_YESNO,
false);
}
if (missing || reset) {
String consumerKey = null;
String consumerSecret = null;
System.out.print("Please enter the application's Consumer Key: ");
consumerKey = setup.getConsole().prompt(false);
System.out
.print("Please enter the application's Consumer Secret: ");
consumerSecret = setup.getConsole().prompt(false);
owner.setConsumerInfo(consumerKey, consumerSecret);
}
tw.setOAuthConsumer(owner.getConsumerKey(), owner.getConsumerSecret());
}
private void loadAccessToken(MEaterSetupConsole setup, TwitterStream tw) {
AccessToken accessToken = null;
final boolean missing = owner.getAccessToken().isEmpty()
|| owner.getAccessTokenSecret().isEmpty();
boolean reset = false;
if (!missing) {
setup.getConsole().say("An existing Access Token was found.");
setup.getConsole().say(
"Do you want to reset the Access Token anyway?");
reset = setup.getConsole().prompt(BooleanPrompter.PROMPT_YESNO,
false);
}
if (missing || reset) {
RequestToken requestToken = null;
try {
requestToken = tw.getOAuthRequestToken();
} catch (final TwitterException ex) {
setup.getConsole().error(
"Unable to get OAuth request token --\n%s",
ex.getMessage());
return;
}
setup.getConsole()
.say("To create an Access Token, you must first log in to Twitter.");
setup.getConsole()
.say("Next, load the following site to grant access to this application: ");
setup.getConsole().say("%s", requestToken.getAuthorizationURL());
setup.getConsole().say(
"Enter the PIN and press enter to continue: ");
try {
final String pin = setup.getConsole().prompt(true);
if (pin.length() > 0) {
accessToken = tw.getOAuthAccessToken(requestToken, pin);
} else {
accessToken = tw.getOAuthAccessToken();
}
} catch (final TwitterException ex) {
setup.getConsole().error(
"Unable to get OAuth request token --\n%s",
ex.getMessage());
return;
}
owner.setAccessInfo(accessToken.getToken(), accessToken
.getTokenSecret());
} else {
accessToken = new AccessToken(owner.getAccessToken(), owner
.getAccessTokenSecret());
}
tw.setOAuthAccessToken(accessToken);
}
}