package ctbrec.sites.chaturbate; import static ctbrec.io.HttpConstants.*; import java.io.IOException; import java.net.URLEncoder; import java.time.Instant; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import ctbrec.Config; import ctbrec.Model; import ctbrec.io.HtmlParser; import ctbrec.io.HttpClient; import ctbrec.sites.AbstractSite; import okhttp3.Request; import okhttp3.Response; public class Chaturbate extends AbstractSite { static String baseUrl = "https://chaturbate.com"; public static final String AFFILIATE_LINK = "https://chaturbate.com/in/?track=default&tour=grq0&campaign=55vTi"; public static final String REGISTRATION_LINK = "https://chaturbate.com/in/?track=default&tour=g4pe&campaign=55vTi"; private ChaturbateHttpClient httpClient; @Override public void init() throws IOException { baseUrl = Config.getInstance().getSettings().chaturbateBaseUrl; } @Override public String getName() { return "Chaturbate"; } @Override public String getBaseUrl() { return baseUrl; } @Override public String getAffiliateLink() { return getBaseUrl() + "/in/?track=default&tour=LQps&campaign=55vTi&room=0xb00bface"; } @Override public Model createModel(String name) { ChaturbateModel m = new ChaturbateModel(this); m.setName(name); m.setUrl(getBaseUrl() + '/' + name + '/'); m.setPreview("https://roomimg.stream.highwebmedia.com/ri/" + name + ".jpg?" + Instant.now().getEpochSecond()); return m; } @Override public Double getTokenBalance() throws IOException { String username = Config.getInstance().getSettings().username; if (username == null || username.trim().isEmpty()) { throw new IOException("Not logged in"); } String url = "https://chaturbate.com/p/" + username + "/"; Request req = new Request.Builder() .url(url) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .build(); Response resp = getHttpClient().execute(req); if (resp.isSuccessful()) { String profilePage = resp.body().string(); String tokenText = HtmlParser.getText(profilePage, "span.tokencount"); int tokens = Integer.parseInt(tokenText); return (double) tokens; } else { throw new IOException("HTTP response: " + resp.code() + " - " + resp.message()); } } @Override public String getBuyTokensLink() { return AFFILIATE_LINK; } @Override public synchronized boolean login() throws IOException { return credentialsAvailable() && getHttpClient().login(); } @Override public HttpClient getHttpClient() { if (httpClient == null) { httpClient = new ChaturbateHttpClient(); } return httpClient; } @Override public void shutdown() { if (httpClient != null) { httpClient.shutdown(); } } @Override public boolean supportsFollow() { return true; } @Override public boolean supportsTips() { return true; } @Override public boolean supportsSearch() { return true; } @Override public List search(String q) throws IOException, InterruptedException { String url = baseUrl + "?keywords=" + URLEncoder.encode(q, "utf-8"); List result = new ArrayList<>(); // search online models Request req = new Request.Builder() .url(url) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .build(); try(Response resp = getHttpClient().execute(req)) { if(resp.isSuccessful()) { result.addAll(ChaturbateModelParser.parseModels(this, resp.body().string())); } } // since chaturbate does not return offline models, we at least try, if the profile page // exists for the search string url = baseUrl + '/' + q; req = new Request.Builder() .url(url) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .build(); try(Response resp = getHttpClient().execute(req)) { if(resp.isSuccessful()) { Model model = createModel(q); result.add(model); } } return result; } @Override public boolean isSiteForModel(Model m) { return m instanceof ChaturbateModel; } @Override public boolean credentialsAvailable() { String username = Config.getInstance().getSettings().username; return username != null && !username.trim().isEmpty(); } @Override public Model createModelFromUrl(String url) { Matcher m = Pattern.compile("https?://.*?chaturbate.com(?:/p)?/([^/]*?)/?").matcher(url); if(m.matches()) { String modelName = m.group(1); return createModel(modelName); } else { return super.createModelFromUrl(url); } } }