From 06def7f46ae74fbce5020dc7317e9459ef28cada Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Wed, 2 Jul 2014 21:40:41 +0200 Subject: [PATCH] Ensure all card prices are retrieved correctly Query card database to get a multiverseis for a card. Get card price using that id instead of card name. Tested Aether, split cards, question elemental?, _____ --- cockatrice/src/priceupdater.cpp | 32 ++++++++++++++++++++++++-------- cockatrice/src/priceupdater.h | 5 +++++ 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/cockatrice/src/priceupdater.cpp b/cockatrice/src/priceupdater.cpp index e5b359df..1cf2b064 100644 --- a/cockatrice/src/priceupdater.cpp +++ b/cockatrice/src/priceupdater.cpp @@ -9,6 +9,9 @@ #include "qt-json/json.h" #include "priceupdater.h" +#include "main.h" +#include "carddatabase.h" + #if QT_VERSION < 0x050000 // for Qt::escape() #include @@ -120,10 +123,16 @@ void DBPriceUpdater::updatePrices() { QString q = "https://api.deckbrew.com/mtg/cards"; QStringList cards = deck->getCardList(); + muidMap.clear(); + CardInfo * card; + int muid; for (int i = 0; i < cards.size(); ++i) { - q += (i ? "&" : "?") + QString("name=") + cards[i].toLower(); + card = db->getCard(cards[i], false); + muid=card->getPreferredMuId(); + q += (i ? "&" : "?") + QString("multiverseid=%1").arg(muid); + muidMap.insert(muid, cards[i]); } - QUrl url(q.replace(' ', '+')); + QUrl url(q); QNetworkReply *reply = nam->get(QNetworkRequest(url)); connect(reply, SIGNAL(finished()), this, SLOT(downloadFinished())); @@ -172,17 +181,24 @@ void DBPriceUpdater::downloadFinished() } QMap cardsPrice; - QListIterator it(resultList); while (it.hasNext()) { - QVariantMap map = it.next().toMap(); - QString name = map.value("name").toString().toLower(); + QVariantMap cardMap = it.next().toMap(); - QList editions = map.value("editions").toList(); + + // get sets list + QList editions = cardMap.value("editions").toList(); foreach (QVariant ed, editions) { + // retrieve card name "as we know it" from the muid QVariantMap edition = ed.toMap(); QString set = edition.value("set_id").toString(); + + int muid = edition.value("multiverse_id").toString().toInt(); + if(!muidMap.contains(muid)) + continue; + + QString name=muidMap.value(muid); // Prices are in USD cents float price = edition.value("price").toMap().value("median").toString().toFloat() / 100; //qDebug() << "card " << name << " set " << set << " price " << price << endl; @@ -196,7 +212,7 @@ void DBPriceUpdater::downloadFinished() cardsPrice.insert(name, price); } } - + InnerDecklistNode *listRoot = deck->getRoot(); for (int i = 0; i < listRoot->size(); i++) { InnerDecklistNode *currentZone = dynamic_cast(listRoot->at(i)); @@ -204,7 +220,7 @@ void DBPriceUpdater::downloadFinished() DecklistCardNode *currentCard = dynamic_cast(currentZone->at(j)); if (!currentCard) continue; - currentCard->setPrice(cardsPrice[currentCard->getName().toLower()]); + currentCard->setPrice(cardsPrice[currentCard->getName()]); } } diff --git a/cockatrice/src/priceupdater.h b/cockatrice/src/priceupdater.h index 642c75c7..076d9663 100644 --- a/cockatrice/src/priceupdater.h +++ b/cockatrice/src/priceupdater.h @@ -6,6 +6,9 @@ class QNetworkAccessManager; +// If we don't typedef this, won't compile on OS X < 10.9 +typedef QMap MuidStringMap; + /** * Price Updater. * @@ -41,6 +44,8 @@ public: class DBPriceUpdater : public AbstractPriceUpdater { Q_OBJECT +protected: + MuidStringMap muidMap; protected: virtual void downloadFinished(); public: