package org.softeg.slartus.forpdaapi.qms;
import android.text.Html;
import android.util.Log;
import org.apache.http.cookie.Cookie;
import org.json.JSONObject;
import org.softeg.slartus.forpdaapi.IHttpClient;
import org.softeg.slartus.forpdaapi.ProgressState;
import org.softeg.slartus.forpdacommon.NotReportException;
import org.softeg.slartus.forpdacommon.PatternExtensions;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by slartus on 02.03.14.
*/
public class QmsApi {
public static String getChatPage(IHttpClient httpClient, String mid, String themeId) throws Throwable {
Map<String, String> additionalHeaders = new HashMap<String, String>();
additionalHeaders.put("xhr", "body");
return httpClient.performPost("http://4pda.ru/forum/index.php?act=qms&mid=" + mid + "&t=" + themeId, additionalHeaders);
}
public static String getChat(IHttpClient httpClient, String mid, String themeId) throws Throwable {
return getChat(httpClient, mid, themeId, null);
}
private static void checkChatError(String pageBody) throws Exception {
Matcher m = Pattern.compile("<div class=\"error\">([\\s\\S]*?)</div>").matcher(pageBody);
if (m.find()) {
throw new Exception(Html.fromHtml(m.group(1)).toString());
}
}
public static String getChat(IHttpClient httpClient, String mid, String themeId, Map<String, String> additionalHeaders) throws Throwable {
String pageBody = getChatPage(httpClient, mid, themeId);
checkChatError(pageBody);
if (additionalHeaders != null) {
Matcher m = Pattern.compile("<span class=\"navbar-title\">\\s*?<a href=\"[^\"]*/forum/index.php\\?showuser=\\d+\"[^>]*><strong>(.*?):</strong></a>([\\s\\S]*?)\\s*?</span>")
.matcher(pageBody);
if (m.find()) {
additionalHeaders.put("Nick", Html.fromHtml(m.group(1)).toString());
additionalHeaders.put("ThemeTitle", Html.fromHtml(m.group(2)).toString());
// break;
}
}
return matchChatBody(pageBody);
}
private static String matchChatBody(String pageBody) {
String chatInfo = "";
Matcher m = Pattern.compile("<span class=\"nav-text\"[\\s\\S]*?<a href=\"[^\"]*showuser[^>]*>([^>]*?)</a>:</b>([^<]*)").matcher(pageBody);
if (m.find())
chatInfo = "<span id=\"chatInfo\" style=\"display:none;\">" + m.group(1).trim() + "|:|" + m.group(2).trim() + "</span>";
m = Pattern.compile("<div id=\"thread-inside-top\"><\\/div>([\\s\\S]*)<div id=\"thread-inside-bottom\">").matcher(pageBody);
if (m.find())
return chatInfo + "<div id=\"thread_form\"><div id=\"thread-inside-top\"></div>" + m.group(1) + "</div>";
m = Pattern.compile("<div class=\"list_item\" t_id=([\\s\\S]*?)</form>").matcher(pageBody);
if (m.find())
return chatInfo + "<div id=\"thread_form\"><div class=\"list_item\" t_id=" + m.group(1) + "</div>";
// ни одного сообщения
m = Pattern.compile("</form>\\s*<div class=\"form\">").matcher(pageBody);
if (m.find())
return "<div id=\"thread_form\"></div>";
m = Pattern.compile("<script>try\\{setTimeout \\( function\\(\\)\\{ updateScrollbar \\( \\$\\(\"#thread_container>.scrollbar_wrapper\"\\), \"bottom\" \\); \\}, 1 \\);\\}catch\\(e\\)\\{\\}</script>\\s*</div>")
.matcher(pageBody);
if (m.find())
return "<div id=\"thread_form\"></div>";
else
pageBody = pageBody + "";
return pageBody;
}
public static String sendMessage(IHttpClient httpClient, String mid, String tid, String message
, String encoding) throws Throwable {
Map<String, String> additionalHeaders = new HashMap<String, String>();
additionalHeaders.put("action", "send-message");
additionalHeaders.put("mid", mid);
additionalHeaders.put("t", tid);
additionalHeaders.put("message", message);
httpClient.performPost("http://4pda.ru/forum/index.php?act=qms-xhr&",
additionalHeaders, encoding);
return getChat(httpClient, mid, tid);
}
public static String createThread(IHttpClient httpClient, String userID, String userNick, String title, String message,
Map<String, String> outParams, String encoding) throws IOException {
Map<String, String> additionalHeaders = new HashMap<String, String>();
additionalHeaders.put("action", "create-thread");
additionalHeaders.put("username", userNick);
additionalHeaders.put("title", title);
additionalHeaders.put("message", message);
String pageBody = httpClient.performPost("http://4pda.ru/forum/index.php?act=qms&mid=" + userID + "&xhr=body&do=1", additionalHeaders, encoding);
Matcher m = Pattern.compile("<input\\s*type=\"hidden\"\\s*name=\"mid\"\\s*value=\"(\\d+)\"\\s*/>").matcher(pageBody);
if (m.find())
outParams.put("mid", m.group(1));
m = Pattern.compile("<input\\s*type=\"hidden\"\\s*name=\"t\"\\s*value=\"(\\d+)\"\\s*/>").matcher(pageBody);
if (m.find())
outParams.put("t", m.group(1));
// m = Pattern.compile("<strong>(.*?):\\s*</strong></a>\\s*(.*?)\\s*?</span>").matcher(pageBody);
//if (m.find()) {
outParams.put("user", userNick);
outParams.put("title", title);
//}
if (outParams.size() == 0) {
m = Pattern.compile("<div class=\"form-error\">(.*?)</div>").matcher(pageBody);
if (m.find())
throw new NotReportException(m.group(1));
}
return matchChatBody(pageBody);
}
public static void deleteDialogs(IHttpClient httpClient, String mid, List<String> ids) throws IOException {
Map<String, String> additionalHeaders = new HashMap<String, String>();
additionalHeaders.put("action", "delete-threads");
additionalHeaders.put("title", "");
additionalHeaders.put("message", "");
for (String id : ids) {
additionalHeaders.put("thread-id[" + id + "]", id);
}
httpClient.performPost("http://4pda.ru/forum/index.php?act=qms&xhr=body&do=1&mid=" + mid, additionalHeaders);
}
public static String deleteMessages(IHttpClient httpClient, String mid, String threadId, List<String> ids, String encoding) throws IOException {
Map<String, String> additionalHeaders = new HashMap<String, String>();
additionalHeaders.put("act", "qms");
additionalHeaders.put("mid", mid);
additionalHeaders.put("t", threadId);
additionalHeaders.put("xhr", "body");
additionalHeaders.put("do", "1");
additionalHeaders.put("action", "delete-messages");
additionalHeaders.put("forward-messages-username", "");
additionalHeaders.put("forward-thread-username", "");
additionalHeaders.put("message", "");
for (String id : ids) {
additionalHeaders.put("message-id[" + id + "]", id);
}
return matchChatBody(httpClient.performPost("http://4pda.ru/forum/index.php?act=qms&mid" + mid + "&t=" + threadId + "&xhr=body&do=1", additionalHeaders, encoding));
}
public static ArrayList<QmsUser> getQmsSubscribers(IHttpClient httpClient) throws Throwable {
String pageBody = httpClient.performGet("http://4pda.ru/forum/index.php?&act=qms-xhr&action=userlist");
return parseQmsUsers(pageBody);
}
public static ArrayList<QmsUser> parseQmsUsers(String pageBody) {
ArrayList<QmsUser> res = new ArrayList<>();
Matcher m = Pattern.compile("<a class=\"list-group-item[^>]*=(\\d*)\">[^<]*<div class=\"bage\">([^<]*)[\\s\\S]*?src=\"([^\"]*)\" title=\"([^\"]*)\"", Pattern.CASE_INSENSITIVE).matcher(pageBody);
String count;
QmsUser qmsUser;
while (m.find()) {
qmsUser = new QmsUser();
qmsUser.setId(m.group(1));
String avatar = m.group(3);
if (avatar.substring(0, 2).equals("//")) {
avatar = "http:".concat(avatar);
}
qmsUser.setAvatarUrl(avatar);
qmsUser.setNick(Html.fromHtml(m.group(4)).toString().trim());
count = m.group(2).trim();
if (!count.equals(""))
qmsUser.setNewMessagesCount(count.replace("(", "").replace(")", ""));
res.add(qmsUser);
}
return res;
}
public static QmsUserThemes getQmsUserThemes(IHttpClient httpClient, String mid,
ArrayList<QmsUser> outUsers, Boolean parseNick) throws Throwable {
QmsUserThemes res = new QmsUserThemes();
String pageBody = httpClient.performGet("http://4pda.ru/forum/index.php?act=qms&mid=" + mid);
Pattern newCountPattern = Pattern.compile("([\\s\\S]*?)\\((\\d+)\\s*\\/\\s*(\\d+)\\)\\s*$");
Pattern countPattern = Pattern.compile("([\\s\\S]*?)\\((\\d+)\\)\\s*$");
Pattern strongPattern = Pattern.compile("<strong>([\\s\\S]*?)</strong>");
Matcher matcher = Pattern.compile("<div class=\"list-group\">([\\s\\S]*)<form [^>]*>([\\s\\S]*?)<\\/form>").matcher(pageBody);
if (matcher.find()) {
outUsers.addAll(parseQmsUsers(matcher.group(1)));
matcher = Pattern.compile("<a class=\"list-group-item[^>]*-(\\d*)\">[\\s\\S]*?<div[^>]*>([\\s\\S]*?)<\\/div>([\\s\\S]*?)<\\/a>").matcher(matcher.group(2));
QmsUserTheme item;
Matcher m;
String info;
while (matcher.find()) {
item = new QmsUserTheme();
item.Id = matcher.group(1);
item.Date = matcher.group(2);
info = matcher.group(3);
m = strongPattern.matcher(info);
if (m.find()) {
m = newCountPattern.matcher(m.group(1));
if (m.find()) {
item.Title = m.group(1).trim();
item.Count = m.group(2);
item.NewCount = m.group(3);
} else
item.Title = m.group(2).trim();
} else {
m = countPattern.matcher(info);
if (m.find()) {
item.Title = m.group(1).trim();
item.Count = m.group(2).trim();
} else
item.Title = info.trim();
}
res.add(item);
}
if (parseNick) {
matcher = Pattern.compile("<div class=\"nav\">[\\s\\S]*?showuser[^>]*>([\\s\\S]*?)<\\/a>[\\s\\S]*?<\\/div>").matcher(pageBody);
if (matcher.find()) {
res.Nick = matcher.group(1);
}
}
}
return res;
}
public static int getNewQmsCount(String pageBody) {
final Pattern qms_2_0_Pattern = PatternExtensions.compile("id=\"events-count\"[^>]*>[^\\d]*?(\\d+)<");
Matcher m = qms_2_0_Pattern.matcher(pageBody);
if (m.find()) {
return Integer.parseInt(m.group(1));
}
return 0;
}
public static int getNewQmsCount(IHttpClient client) throws IOException {
String body = client.performGet("http://4pda.ru/forum/index.php?showforum=200");
return getNewQmsCount(body);
}
//Upload file to savepic.ru
public static String attachFile(IHttpClient httpClient,
String newFilePath,
ProgressState progress) throws Exception {
Map<String, String> additionalHeaders = new HashMap<>();
/*additionalHeaders.put("note","");
additionalHeaders.put("font1","decor");
additionalHeaders.put("font2","20");
additionalHeaders.put("orient","h");
additionalHeaders.put("size2","1024x768");
additionalHeaders.put("size1","1");
additionalHeaders.put("rotate","00");
additionalHeaders.put("flip","0");
additionalHeaders.put("mini","300x225");
additionalHeaders.put("opt3[]","zoom");
additionalHeaders.put("email","");*/
additionalHeaders.put("img", "file");
additionalHeaders.put("url", "");
additionalHeaders.put("selected_input", "file");
additionalHeaders.put("size", "640");
additionalHeaders.put("preview_size", "180");
additionalHeaders.put("rotation_type", "0");
Log.d("save", "file " + newFilePath);
for (Cookie cookie : httpClient.getCookieStore().getCookies()) {
Log.d("save", "Cookie name: " + cookie.getName() + "; value: " + cookie.getValue());
}
String res = httpClient.uploadFile("http://savepice.ru/upload", newFilePath, additionalHeaders, progress);
for (Cookie cookie : httpClient.getCookieStore().getCookies()) {
Log.d("save", "Cookie name: " + cookie.getName() + "; value: " + cookie.getValue());
}
Log.d("save", "result " + res);
JSONObject jsonObject = new JSONObject(res);
if (jsonObject.optBoolean("error", false)) {
throw new NotReportException(jsonObject.optString("text"));
}
return jsonObject.optString("redirect_path").replace("/uploaded/", "/uploads/").replace(".html", "");
}
}