package com.malmstein.yahnac.data;
import com.malmstein.yahnac.data.updater.LoginSharedPreferences;
import com.squareup.okhttp.FormEncodingBuilder;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
public class ConnectionProvider {
public static final String BASE_URL = "https://news.ycombinator.com";
public static final String LOGIN_URL_EXTENSION = "/login?go_to=news";
public static final String LOGIN_BASE_URL = "/login";
public static final String ITEM_BASE_URL = "/item?id=";
public static final String REPLY_BASE_URL = "/reply?id=";
public static final String REPLY_GOTO = "&goto=item%3Fid%3D";
public static final String SEND_COMMENT_BASE_URL = "/comment";
public static final String USER_AGENT = System.getProperty("http.agent");
public static final int TIMEOUT_MILLIS = 40 * 1000;
private final LoginSharedPreferences loginSharedPreferences;
public ConnectionProvider() {
this.loginSharedPreferences = LoginSharedPreferences.newInstance().newInstance();
}
private static Connection defaultConnection(String baseUrlExtension) {
Connection conn = Jsoup.connect(BASE_URL + baseUrlExtension)
.timeout(TIMEOUT_MILLIS)
.userAgent(USER_AGENT);
conn.header("Accept-Encoding", "gzip");
return conn;
}
private static Connection authorisedConnection(String baseUrlExtension, String userCookie) {
return defaultConnection(baseUrlExtension).cookie("user", userCookie);
}
private Connection connection(String baseUrlExtension) {
if (loginSharedPreferences.isLoggedIn()) {
return authorisedConnection(baseUrlExtension, loginSharedPreferences.getCookie());
} else {
return defaultConnection(baseUrlExtension);
}
}
public Connection commentsConnection(Long storyId) {
return connection(ITEM_BASE_URL + storyId);
}
public Connection loginConnection(String username, String password) {
Connection login = connection(LOGIN_BASE_URL);
return login
.data("go_to", "news")
.data("acct", username)
.data("pw", password)
.header("Origin", ConnectionProvider.BASE_URL)
.followRedirects(true)
.referrer(ConnectionProvider.BASE_URL + ConnectionProvider.LOGIN_URL_EXTENSION)
.method(Connection.Method.POST);
}
public Connection voteConnection(String voteUrl) {
return connection(voteUrl);
}
public Connection replyCommentConnection(Long storyId, Long commentId) {
return connection(REPLY_BASE_URL + commentId + REPLY_GOTO + storyId);
}
public Request commentOnStoryRequest(String itemId, String comment, String hmac) {
RequestBody requestBody = (new FormEncodingBuilder())
.add("parent", itemId)
.add("goto", (new StringBuilder()).append("item?id=").append(itemId).toString())
.add("text", comment)
.add("hmac", hmac)
.build();
return createAuthRequest(requestBody);
}
public Request replyToCommentRequest(String itemId, String commentId, String comment, String hmac) {
RequestBody requestBody = (new FormEncodingBuilder())
.add("parent", commentId)
.add("goto", (new StringBuilder()).append("item?id=").append(itemId).toString())
.add("text", comment)
.add("hmac", hmac)
.build();
return createAuthRequest(requestBody);
}
private Request createAuthRequest(RequestBody requestBody) {
return (new Request.Builder())
.addHeader("cookie", (new StringBuilder()).append("user=").append(loginSharedPreferences.getCookie()).toString())
.url(ConnectionProvider.BASE_URL + ConnectionProvider.SEND_COMMENT_BASE_URL)
.post(requestBody)
.build();
}
}