package net.demilich.metastone.gui.deckbuilder.importer;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.demilich.metastone.game.cards.Card;
import net.demilich.metastone.game.cards.CardCatalogue;
import net.demilich.metastone.game.decks.Deck;
import net.demilich.metastone.game.entities.heroes.HeroClass;
public class IcyVeinsImporter implements IDeckImporter {
private static Logger logger = LoggerFactory.getLogger(IcyVeinsImporter.class);
@Override
public Deck importFrom(String url) {
try {
RequestConfig globalConfig = RequestConfig.custom().setCircularRedirectsAllowed(true).build();
CloseableHttpClient httpclient = HttpClientBuilder.create().build();
String exportUrl = url;
logger.debug("Requesting: " + exportUrl);
HttpGet httpGet = new HttpGet(exportUrl);
httpGet.setConfig(globalConfig);
CloseableHttpResponse response = httpclient.execute(httpGet);
try {
HttpEntity entity = response.getEntity();
String htmlContent = EntityUtils.toString(entity);
EntityUtils.consume(entity);
return parse(htmlContent);
} finally {
response.close();
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private Deck parse(String htmlContent) {
List<Card> cards = new ArrayList<Card>();
HeroClass heroClass = HeroClass.ANY;
Document doc = Jsoup.parse(htmlContent);
String deckName = doc.getElementsByClass("page_breadcrumbs_item").last().text();
Elements cardLines = doc.getElementsByClass("deck_card_list").get(0).getElementsByTag("li");
for (Element e: cardLines){
if (!e.text().startsWith("1") && !e.text().startsWith("2")) {
continue;
}
int count = Integer.parseInt(String.valueOf(e.text().charAt(0)));
String cardName = e.getElementsByTag("a").get(0).text();
for (int i = 0; i < count; i++){
Card card = CardCatalogue.getCardByName(cardName);
if (card != null) {
cards.add(card);
if (card.getHeroClass() != HeroClass.ANY) {
heroClass = card.getHeroClass();
}
} else {
logger.error("Card with name {} could not be found", cardName);
}
}
}
Deck deck = new Deck(heroClass);
deck.setName(deckName);
for (Card card : cards) {
deck.getCards().add(card);
logger.debug("Card added - {}", card.getName());
}
if (!deck.isComplete()) {
logger.error("Deck with name only has {}.", deck.getCards().toList().size());
return null;
}
return deck;
}
}