package pneumaticCraft.common.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import pneumaticCraft.common.UpdateChecker;
import pneumaticCraft.lib.Log;
public class PastebinHandler extends Thread{
private static String userKey;
private final HttpClient httpclient;
public String username, password, contents, getLink;
private static final String DEV_KEY = "e8b9b06d96deb19afa787604a89dd240";
private static volatile boolean isDone;
private static PastebinHandler runningHandler;
private static volatile Exception exception;
private PastebinHandler(){
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000).build();
httpclient = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).build();
isDone = false;
}
public static boolean isLoggedIn(){
return userKey != null;
}
public static boolean isDone(){
return isDone;
}
public static Exception getException(){
return exception;
}
public static PastebinHandler getHandler(){
if(!isDone) throw new IllegalStateException("Can't access pastebin handler while it's still running");
return runningHandler;
}
@Override
public void run(){
try {
exception = null;
if(username != null) {
loginInternal(username, password);
} else if(contents != null) {
getLink = putInternal(contents);
} else if(getLink != null) {
contents = getInternal(getLink);
}
} catch(Exception e) {
exception = e;
}
isDone = true;
}
public static PastebinHandler getCleanHandler(){
if(runningHandler != null) runningHandler.interrupt();
runningHandler = new PastebinHandler();
return runningHandler;
}
public static void login(String username, String password){
PastebinHandler handler = getCleanHandler();
handler.username = username;
handler.password = password;
handler.start();
}
public static void logout(){
userKey = null;
}
public static void put(String contents){
PastebinHandler handler = getCleanHandler();
handler.contents = contents;
handler.start();
}
public static void get(String pastebinLink){
PastebinHandler handler = getCleanHandler();
handler.getLink = pastebinLink;
handler.start();
}
public boolean loginInternal(String userName, String password){
HttpPost httppost = new HttpPost("http://pastebin.com/api/api_login.php");
List<NameValuePair> params = new ArrayList<NameValuePair>(3);
params.add(new BasicNameValuePair("api_dev_key", DEV_KEY));
params.add(new BasicNameValuePair("api_user_name", userName));
params.add(new BasicNameValuePair("api_user_password", password));
try {
httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
if(entity != null) {
InputStream instream = entity.getContent();
userKey = IOUtils.toString(instream, "UTF-8");
if(userKey.startsWith("Bad API request")) {
Log.warning("User tried to log in into pastebin, it responded with the following: " + userKey);
userKey = null;
return false;
}
return true;
}
} catch(Exception e) {
e.printStackTrace();
}
return false;
}
public String putInternal(String contents){
HttpPost httppost = new HttpPost("http://pastebin.com/api/api_post.php");
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("api_dev_key", DEV_KEY));
params.add(new BasicNameValuePair("api_paste_code", contents));
params.add(new BasicNameValuePair("api_option", "paste"));
if(isLoggedIn()) params.add(new BasicNameValuePair("api_user_key", userKey));
try {
httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
if(entity != null) {
InputStream instream = entity.getContent();
return IOUtils.toString(instream, "UTF-8");
}
} catch(Exception e) {
e.printStackTrace();
}
return null;
}
public String getInternal(String key) throws IOException{
if(key.contains("pastebin")) key = key.substring(key.lastIndexOf('/') + 1);
return UpdateChecker.getPage("http://pastebin.com/raw.php?i=" + key);
}
}