package org.softeg.slartus.forpdaapi;
import android.net.Uri;
import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URIUtils;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.message.BasicNameValuePair;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.softeg.slartus.forpdaapi.classes.ForumsData;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
/**
* User: slinkin
* Date: 08.06.12
* Time: 13:41
*/
public class ForumsApi extends ArrayList<Forum> {
/**
* Загрузка дерева разделов форума
*/
public static ForumsData loadForums(IHttpClient httpClient, ProgressState progressState)
throws Exception {
ForumsData res = new ForumsData();
String pageBody = httpClient.performGetFullVersion("http://4pda.ru/forum/index.php?act=idx");
Document doc = Jsoup.parse(pageBody, "http://4pda.ru");
Elements categoryElements = doc.select("div.borderwrap[id~=fo_\\d+]");
for (Element catElement : categoryElements) {
progressState.update("Обновление структуры форума...",
res.getItems().size());
Element el = catElement.select("div.maintitle a[href~=showforum=\\d+]").first();
if (el == null) continue;
Uri uri = Uri.parse(el.attr("href"));
Forum forum = new Forum(uri.getQueryParameter("showforum"), el.text());
forum.setHasTopics(false);
forum.setDescription(null);
res.getItems().add(forum);
int c = res.getItems().size();
loadCategoryForums(httpClient, catElement.select("table.ipbtable>tbody").first(), forum,
res, progressState);
if (res.getItems().size() > c)
forum.setIconUrl(res.getItems().get(c).getIconUrl());
}
return res;
}
public static void loadCategoryForums(IHttpClient httpClient, Element boardForumRowElement, Forum parentForum,
ForumsData data, ProgressState progressState) throws Exception {
if (boardForumRowElement == null)
return;
Elements categoryElements = boardForumRowElement.select("tr:has(td)");
if (categoryElements.size() > 0)
parentForum.setHasForums(true);
for (Element trElement : categoryElements) {
progressState.update("Обновление структуры форума...",
data.getItems().size());
Elements tdElements = trElement.children();
if (tdElements.size() < 5) continue;
Element tdElement = tdElements.get(0);
Element el = tdElement.select("img").first();
String iconUrl = null;
if (el != null)
iconUrl = el.attr("src");
tdElement = tdElements.get(1);
el = tdElement.select("b>a").first();
if (el == null)
continue;
Uri uri = Uri.parse(el.absUrl("href"));
Forum forum = new Forum(uri.getQueryParameter("showforum"), el.text());
forum.setIconUrl(iconUrl);
forum.setHasTopics(true);
forum.setParentId(parentForum.getId());
data.getItems().add(forum);
el = tdElement.select("span.forumdesc").first();
if (el != null) {
forum.setDescription(el.ownText());
if (el.select("a[href~=showforum=\\d+]").size() > 0) {
loadSubForums(httpClient, uri.toString(), forum, data, progressState);
}
}
}
}
public static void loadSubForums(IHttpClient httpClient, String url, Forum parentForum,
ForumsData data, ProgressState progressState) throws Exception {
String pageBody = httpClient.performGetFullVersion(url);
Document doc = Jsoup.parse(pageBody, "http://4pda.ru");
Element catElement = doc.select("div.borderwrap[id~=fo_\\d+]").first();
if (catElement == null) return;
Element boardForumRowElement = catElement.select("table.ipbtable>tbody").first();
if (boardForumRowElement == null) return;
Elements categoryElements = boardForumRowElement.select("tr:has(td)");
if (categoryElements.size() > 0)
parentForum.setHasForums(true);
for (Element trElement : categoryElements) {
progressState.update("Обновление структуры форума...",
data.getItems().size());
Elements tdElements = trElement.children();
if (tdElements.size() < 5) continue;
Element tdElement = tdElements.get(0);
Element el = tdElement.select("img").first();
String iconUrl = null;
if (el != null)
iconUrl = el.attr("src");
tdElement = tdElements.get(1);
el = tdElement.select("b>a").first();
if (el == null)
continue;
Uri uri = Uri.parse(el.absUrl("href"));
Forum forum = new Forum(uri.getQueryParameter("showforum"), el.text());
forum.setIconUrl(iconUrl);
forum.setHasTopics(true);
forum.setParentId(parentForum.getId());
data.getItems().add(forum);
el = tdElement.select("span.forumdesc").first();
if (el != null) {
forum.setDescription(el.ownText());
if (el.select("a[href~=showforum=\\d+]").size() > 0) {
loadSubForums(httpClient, uri.toString(), forum, data, progressState);
}
}
}
}
public static void markAllAsRead(IHttpClient httpClient) throws Throwable {
httpClient.performGet("http://4pda.ru/forum/index.php?act=Login&CODE=05", true, false);
}
public static void markForumAsRead(IHttpClient httpClient, CharSequence forumId) throws Throwable {
List<NameValuePair> qparams = new ArrayList<NameValuePair>();
qparams.add(new BasicNameValuePair("act", "login"));
qparams.add(new BasicNameValuePair("CODE", "04"));
qparams.add(new BasicNameValuePair("f", forumId.toString()));
qparams.add(new BasicNameValuePair("fromforum", forumId.toString()));
URI uri = URIUtils.createURI("http", "4pda.ru", -1, "/forum/index.php",
URLEncodedUtils.format(qparams, "UTF-8"), null);
httpClient.performGet(uri.toString());
}
}