add import support for mtgjson deck files

This commit is contained in:
Tim Haering 2020-04-29 14:14:01 +02:00
parent 4e8d423bca
commit 17c40ead3c
7 changed files with 4772 additions and 2 deletions

View file

@ -34,6 +34,8 @@ public abstract class DeckImporter {
return new CodDeckImporter();
} else if (file.toLowerCase(Locale.ENGLISH).endsWith("o8d")) {
return new O8dDeckImporter();
} else if (file.toLowerCase(Locale.ENGLISH).endsWith("json")) {
return new MtgjsonDeckImporter();
} else if (file.toLowerCase(Locale.ENGLISH).endsWith("draft")) {
return new DraftLogImporter();
} else if (file.toLowerCase(Locale.ENGLISH).endsWith("mtga")) {

View file

@ -0,0 +1,70 @@
package mage.cards.decks.importer;
import java.io.File;
import java.io.FileReader;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import mage.cards.decks.DeckCardLists;
/**
* @author github: timhae
*/
public abstract class JsonDeckImporter extends DeckImporter {
protected StringBuilder sbMessage = new StringBuilder();
/**
*
* @param file file to import
* @param errorMessages you can setup output messages to showup to user
* @return decks list
*/
public DeckCardLists importDeck(String file, StringBuilder errorMessages) {
File f = new File(file);
DeckCardLists deckList = new DeckCardLists();
if (!f.exists()) {
logger.warn("Deckfile " + file + " not found.");
return deckList;
}
sbMessage.setLength(0);
try {
try (FileReader reader = new FileReader(f)) {
try { // Json parsing
JSONParser parser = new JSONParser();
JSONObject rootObj = (JSONObject) parser.parse(reader);
deckList.setName((String) rootObj.get("name"));
readJson(rootObj, deckList);
if (sbMessage.length() > 0) {
if (errorMessages != null) {
// normal output for user
errorMessages.append(sbMessage);
} else {
// fatal error
logger.fatal(sbMessage);
}
}
} catch (ParseException ex) {
logger.fatal(null, ex);
}
} catch (Exception ex) {
logger.fatal(null, ex);
}
} catch (Exception ex) {
logger.fatal(null, ex);
}
return deckList;
}
@Override
public DeckCardLists importDeck(String file) {
return importDeck(file, null);
}
protected abstract void readJson(JSONObject line, DeckCardLists decklist);
}

View file

@ -0,0 +1,51 @@
package mage.cards.decks.importer;
import java.util.Optional;
import java.util.List;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import mage.cards.decks.DeckCardInfo;
import mage.cards.decks.DeckCardLists;
import mage.cards.repository.CardInfo;
import mage.cards.repository.CardRepository;
/**
*
* @author github: timhae
*/
public class MtgjsonDeckImporter extends JsonDeckImporter {
@Override
protected void readJson(JSONObject rootObj, DeckCardLists deckList) {
// set
String set = (String) rootObj.get("code");
// mainboard
JSONArray mainBoard = (JSONArray) rootObj.get("mainBoard");
List<mage.cards.decks.DeckCardInfo> mainDeckList = deckList.getCards();
addBoardToList(mainBoard, mainDeckList, set);
// sideboard
JSONArray sideBoard = (JSONArray) rootObj.get("sideBoard");
List<mage.cards.decks.DeckCardInfo> sideDeckList = deckList.getSideboard();
addBoardToList(sideBoard, sideDeckList, set);
}
private void addBoardToList(JSONArray board, List<mage.cards.decks.DeckCardInfo> list, String set) {
board.forEach(arrayCard -> {
JSONObject card = (JSONObject) arrayCard;
String name = (String) card.get("name");
int num = ((Number) card.get("count")).intValue();
Optional<CardInfo> cardLookup = getCardLookup().lookupCardInfo(name, set);
if (!cardLookup.isPresent()) {
sbMessage.append("Could not find card: '").append(name).append("'\n");
} else {
CardInfo cardInfo = cardLookup.get();
for (int i = 0; i < num; i++) {
list.add(new DeckCardInfo(cardInfo.getName(), cardInfo.getCardNumber(), cardInfo.getSetCode()));
}
}
});
}
}