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?, _____
This commit is contained in:
Fabio Bas 2014-07-02 21:40:41 +02:00
parent d102733826
commit 06def7f46a
2 changed files with 29 additions and 8 deletions

View file

@ -9,6 +9,9 @@
#include "qt-json/json.h" #include "qt-json/json.h"
#include "priceupdater.h" #include "priceupdater.h"
#include "main.h"
#include "carddatabase.h"
#if QT_VERSION < 0x050000 #if QT_VERSION < 0x050000
// for Qt::escape() // for Qt::escape()
#include <QtGui/qtextdocument.h> #include <QtGui/qtextdocument.h>
@ -120,10 +123,16 @@ void DBPriceUpdater::updatePrices()
{ {
QString q = "https://api.deckbrew.com/mtg/cards"; QString q = "https://api.deckbrew.com/mtg/cards";
QStringList cards = deck->getCardList(); QStringList cards = deck->getCardList();
muidMap.clear();
CardInfo * card;
int muid;
for (int i = 0; i < cards.size(); ++i) { 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)); QNetworkReply *reply = nam->get(QNetworkRequest(url));
connect(reply, SIGNAL(finished()), this, SLOT(downloadFinished())); connect(reply, SIGNAL(finished()), this, SLOT(downloadFinished()));
@ -172,17 +181,24 @@ void DBPriceUpdater::downloadFinished()
} }
QMap<QString, float> cardsPrice; QMap<QString, float> cardsPrice;
QListIterator<QVariant> it(resultList); QListIterator<QVariant> it(resultList);
while (it.hasNext()) { while (it.hasNext()) {
QVariantMap map = it.next().toMap(); QVariantMap cardMap = it.next().toMap();
QString name = map.value("name").toString().toLower();
QList<QVariant> editions = map.value("editions").toList();
// get sets list
QList<QVariant> editions = cardMap.value("editions").toList();
foreach (QVariant ed, editions) foreach (QVariant ed, editions)
{ {
// retrieve card name "as we know it" from the muid
QVariantMap edition = ed.toMap(); QVariantMap edition = ed.toMap();
QString set = edition.value("set_id").toString(); 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 // Prices are in USD cents
float price = edition.value("price").toMap().value("median").toString().toFloat() / 100; float price = edition.value("price").toMap().value("median").toString().toFloat() / 100;
//qDebug() << "card " << name << " set " << set << " price " << price << endl; //qDebug() << "card " << name << " set " << set << " price " << price << endl;
@ -196,7 +212,7 @@ void DBPriceUpdater::downloadFinished()
cardsPrice.insert(name, price); cardsPrice.insert(name, price);
} }
} }
InnerDecklistNode *listRoot = deck->getRoot(); InnerDecklistNode *listRoot = deck->getRoot();
for (int i = 0; i < listRoot->size(); i++) { for (int i = 0; i < listRoot->size(); i++) {
InnerDecklistNode *currentZone = dynamic_cast<InnerDecklistNode *>(listRoot->at(i)); InnerDecklistNode *currentZone = dynamic_cast<InnerDecklistNode *>(listRoot->at(i));
@ -204,7 +220,7 @@ void DBPriceUpdater::downloadFinished()
DecklistCardNode *currentCard = dynamic_cast<DecklistCardNode *>(currentZone->at(j)); DecklistCardNode *currentCard = dynamic_cast<DecklistCardNode *>(currentZone->at(j));
if (!currentCard) if (!currentCard)
continue; continue;
currentCard->setPrice(cardsPrice[currentCard->getName().toLower()]); currentCard->setPrice(cardsPrice[currentCard->getName()]);
} }
} }

View file

@ -6,6 +6,9 @@
class QNetworkAccessManager; class QNetworkAccessManager;
// If we don't typedef this, won't compile on OS X < 10.9
typedef QMap<int, QString> MuidStringMap;
/** /**
* Price Updater. * Price Updater.
* *
@ -41,6 +44,8 @@ public:
class DBPriceUpdater : public AbstractPriceUpdater class DBPriceUpdater : public AbstractPriceUpdater
{ {
Q_OBJECT Q_OBJECT
protected:
MuidStringMap muidMap;
protected: protected:
virtual void downloadFinished(); virtual void downloadFinished();
public: public: