package org.softeg.slartus.forpdaapi;/* * Created by slinkin on 23.04.2014. */ 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.ReputationsListData; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; 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; public class ReputationsApi { /** * Загружает историю репутации пользователя * * @param httpClient * @param self - действия пользователя с репутацией других пользователей * @throws java.io.IOException */ public static ReputationsListData loadReputation(IHttpClient httpClient, String userId, Boolean self, ListInfo listInfo, String plusImage) throws IOException, URISyntaxException { List<NameValuePair> qparams = new ArrayList<>(); qparams.add(new BasicNameValuePair("act", "rep")); qparams.add(new BasicNameValuePair("type", "history")); qparams.add(new BasicNameValuePair("mid", userId)); qparams.add(new BasicNameValuePair("st", Integer.toString(listInfo.getFrom()))); if (self)// свои действия qparams.add(new BasicNameValuePair("mode", "from")); URI uri = URIUtils.createURI("http", "4pda.ru", -1, "/forum/index.php", URLEncodedUtils.format(qparams, "UTF-8"), null); String body = httpClient.performGet(uri.toString()); Document doc = Jsoup.parse(body); Element el = doc.select("div.maintitle").first(); ReputationsListData res = new ReputationsListData(); if (el != null) { Matcher userMatcher = Pattern.compile("\\(.*?\\)\\s*(.*?)\\s*(\\S*)\\s*\\[(\\+\\d+\\/-\\d+)\\]", Pattern.CASE_INSENSITIVE).matcher(el.text()); if (userMatcher.find()) { res.setTitle(userMatcher.group(1)); res.setUser(userMatcher.group(2)); res.setRep(userMatcher.group(3)); } } el = doc.select("div.pagination").first(); if (el != null) { Element pel = el.select("a[href=#]").first(); if (pel != null) { Matcher m = Pattern.compile("(\\d+)").matcher(pel.text()); if (m.find()) res.setPagesCount(Integer.parseInt(m.group(1))); } pel = el.select("span.pagecurrent").first(); if (pel != null) { res.setCurrentPage(Integer.parseInt(pel.text())); } } for (Element trElement : doc.select("table.ipbtable").first().select("tr")) { Elements tdElements = trElement.select("td"); if (tdElements.size() != 5) continue; ReputationEvent rep = new ReputationEvent(); Element tdElement = tdElements.get(0); Element l = tdElement.select("a").first(); if (l != null) { Uri ur = Uri.parse(l.attr("href")); rep.setUserId(ur.getQueryParameter("showuser")); rep.setUser(l.text()); } tdElement = tdElements.get(1); l = tdElement.select("a").first(); if (l != null) { rep.setSourceUrl(l.attr("href")); rep.setSource(l.text()); } else { rep.setSourceUrl(null); rep.setSource(tdElement.text()); } tdElement = tdElements.get(2); rep.setDescription(tdElement.text()); tdElement = tdElements.get(3); rep.setState(tdElement.html().contains(plusImage) ? IListItem.STATE_GREEN : IListItem.STATE_RED); tdElement = tdElements.get(4); rep.setDate(tdElement.text()); res.getItems().add(rep); } return res; } /** * Изменение репутации пользователя * * @param httpClient * @param postId Идентификатор поста, за который поднимаем репутацию. 0 - "в профиле" * @param userId * @param type "add" - поднять, "minus" - опустить * @param message * @return Текст ошибки или пустая строка в случае успеха * @throws IOException */ public static Boolean changeReputation(IHttpClient httpClient, String postId, String userId, String type, String message, Map<String, String> outParams) throws IOException { Map<String, String> additionalHeaders = new HashMap<String, String>(); additionalHeaders.put("act", "rep"); additionalHeaders.put("p", postId); additionalHeaders.put("mid", userId); additionalHeaders.put("type", type); additionalHeaders.put("message", message); String res = httpClient.performPost("http://4pda.ru/forum/index.php", additionalHeaders); Pattern p = Pattern.compile("<title>(.*?)</title>"); Matcher m = p.matcher(res); if (m.find()) { if (m.group(1) != null && m.group(1).contains("Ошибка")) { Document doc = Jsoup.parse(res); Element element = doc.select("div.content").first(); if (element != null) { outParams.put("Result", element.text()); } else { outParams.put("Result", doc.text()); } return false; } outParams.put("Result", "Репутация: " + m.group(1)); return true; } outParams.put("Result", "Репутация изменена"); return true; } }