#include "brprovidervl.h" BRProviderVl::BRProviderVl(QObject *parent) : BRProvider(parent) { } BRWidget::BRWidgetStatusCode BRProviderVl::getWidgetData(BRCalendar::BRCalendarData* calendarData) { // load some data QString requestUrl = "https://ifsc.results.info/api/v1/"; QVariantMap ret = this->serverRequest(QUrl(requestUrl), {{"x-auth-token", "cc7375f680648e7e6171e035e70351eb"}, {"Referer", "https://ifsc.results.info/"}}); if(ret["status"] != 200){ // request was a failure return BRWidget::BRWidgetStatusCode(ret["status"].toInt()); } QVariantMap data = QJsonDocument::fromJson(ret["text"].toString().toUtf8()).toVariant().toMap(); // create seasons QVariantList seasons = data["seasons"].toList(); for(QVariant seasonVar : seasons) { QVariantMap seasonMap = seasonVar.toMap(); int seasonId = seasonMap["name"].toInt(); BRSeason* season = this->getSeason( calendarData->calendar->getFederation(), seasonId, this->parseSeasonData(seasonMap) ); calendarData->seasons.append(season); qDebug() << "Inserted season:" << season->getName(); if(seasonId == data["current"].toMap()["season"].toInt()) calendarData->currentSeason = season; } // load default league of current season calendarData->currentSeason->getLeagues()[0]->load(); return BRWidget::Success; } BRWidget::BRWidgetStatusCode BRProviderVl::getWidgetData(BRSeason::BRSeasonData* seasonData) { if(seasonData->season->getLeagues().length() > 0) { // leagues are already loaded // load default league seasonData->season->getLeagues()[0]->load(); return BRWidget::Success; } else { // should never happen return BRWidget::NotImplementedError; } } BRSeason::BRSeasonData BRProviderVl::parseSeasonData(QVariantMap rawData) { BRSeason::BRSeasonData data; data.year = rawData["name"].toInt(); data.name = rawData["name"].toString(); data.nativeMultiLeagueSupport = false; // insert the leagues for(QVariant leagueVar : rawData["leagues"].toList()) { QVariantMap leagueMap = leagueVar.toMap(); BRLeague::BRLeagueData leagueData; leagueData.name = leagueMap["name"].toString(); int leagueId = leagueMap["url"].toString().split("/").last().toInt(); BRLeague* league = this->getLeague(BRWidget::IFSC, leagueId, leagueData); data.leagues.append(league); } return data; } BRWidget::BRWidgetStatusCode BRProviderVl::getWidgetData(BRLeague::BRLeagueData* leagueData) { // load some data QString requestUrl = "https://ifsc.results.info/api/v1/season_leagues/" + QString::number(leagueData->league->getId()); QVariantMap ret = this->serverRequest(QUrl(requestUrl), {{"x-auth-token", "cc7375f680648e7e6171e035e70351eb"}, {"Referer", "https://ifsc.results.info/"}}); if(ret["status"] != 200){ // request was a failure return BRWidget::BRWidgetStatusCode(ret["status"].toInt()); } QVariantMap data = QJsonDocument::fromJson(ret["text"].toString().toUtf8()).toVariant().toMap(); this->parseLeagueData(leagueData, data); return BRWidget::Success; } void BRProviderVl::parseLeagueData(BRLeague::BRLeagueData* data, QVariantMap rawData) { BRWidget::BRFederation federation = BRWidget::BRFederation(rawData["federation"].toInt(0)); data->name = rawData["league"].toString(); data->color = QColor("#ffffff"); // TODO data->enabled = true; qDebug() << "Adding league: " << data->name; // parse competitions QVariantList competitionsVar = rawData["events"].toList(); for(QVariant competitionVar : competitionsVar) { QVariantMap competitionMap = competitionVar.toMap(); qDebug() << "- Adding competition: " << competitionMap["event"].toString(); BRCompetition* competition = this->getCompetition(federation, competitionVar.toMap()["event_id"].toInt(), this->parseCompetitionData(competitionMap, rawData["d_cats"].toList(), federation)); data->competitions.append(competition); } // parse cups QVariantList cupsVar = rawData["cups"].toList(); for(QVariant cupVar : cupsVar) { QVariantMap cupMap = cupVar.toMap(); BRCup* cup = this->getCup(federation, cupMap["cup_id"].toInt(), this->parseCupData(cupMap, rawData["d_cats"].toList())); data->cups.append(cup); } } BRWidget::BRWidgetStatusCode BRProviderVl::getWidgetData(BRCompetition::BRCompetitionData* competitionData) { if(competitionData->competition->getCurrentCategory() == nullptr) return BRWidget::OpeationNotSupportedError; BRCategory* currentCategory = competitionData->competition->getCurrentCategory(); if(currentCategory->getCurrentRound() == nullptr) return BRWidget::OpeationNotSupportedError; BRRound* currentRound = currentCategory->getCurrentRound(); BRRound::BRRoundData roundData = currentRound->getData(); qDebug() << "LOADING ROUND DATA"; // load round data QString competitionId = QString::number(roundData.round->getCategory()->getCompetition()->getId()); QString categoryId = QString::number(roundData.round->getCategory()->getId()); QString roundId = QString::number(roundData.round->getId()); QString requestUrl; if(roundId == "-1") { requestUrl = "https://ifsc.results.info/api/v1/events/" + competitionId + "/result/" + categoryId; } else { requestUrl = "https://ifsc.results.info/api/v1/category_rounds/" + roundId + "/results"; } QVariantMap ret = this->serverRequest(QUrl(requestUrl), {{"x-auth-token", "cc7375f680648e7e6171e035e70351eb"}, {"Referer", "https://ifsc.results.info/"}}); if(ret["status"] != 200){ // request was a failure return BRWidget::BRWidgetStatusCode(ret["status"].toInt()); } QVariantMap data = QJsonDocument::fromJson(ret["text"].toString().toUtf8()).toVariant().toMap(); // TODO: reload all rounds, as they may change! // (load category instead of competition) this->parseRoundData(&roundData, data); this->setRoundData(currentRound, roundData); return BRWidget::Success; } BRCompetition::BRCompetitionData BRProviderVl::parseCompetitionData(QVariantMap rawData, QVariantList globalCategoriesList, BRWidget::BRFederation federation) { BRCompetition::BRCompetitionData data; data.name = rawData["event"].toString(); data.startDate = QDate::fromString(rawData["starts_at"].toString().split(" ")[0], "yyyy-MM-dd"); data.endDate = QDate::fromString(rawData["ends_at"].toString().split(" ")[0], "yyyy-MM-dd"); data.eventWebsiteUrl = ""; for(int i = 0; i < 2; i++) { QString infosheetName = QStringList({"infosheet_url", "additional_info_url"})[i]; if(rawData.contains(infosheetName) && !rawData[infosheetName].isNull()) { data.infosheetUrls.append("https://ifsc.results.info" + rawData[infosheetName].toString()); } } QVariantList categoriesList = rawData["d_cats"].toList(); for(QVariant categoryVar : categoriesList) { QVariantMap categoryMap = categoryVar.toMap(); // search category in global categories list for(QVariant globalCategoryVar : globalCategoriesList) { QVariantMap globalCategoryMap = globalCategoryVar.toMap(); if(categoryMap["id"].toInt() == globalCategoryMap["id"].toInt()) { categoryMap.insert("discipline", globalCategoryMap["discipline"].toString()); break; } } BRCategory* category = this->getCategory(federation, categoryMap["id"].toInt(), this->parseCategoryData(categoryMap)); data.categories.append(category); } data.currentCategory = nullptr; return data; } BRCup::BRCupData BRProviderVl::parseCupData(QVariantMap rawData, QVariantList globalCategoriesList) { BRCup::BRCupData data; data.name = rawData["cup"].toString(); // parse categories for(QVariant categoryVar : rawData["d_cats"].toList()) { // find category name in cats: QVariantMap categoryMap = categoryVar.toMap(); int categoryId = categoryMap["ranking_url"].toString().split("/").last().toInt(); // search category in global categories list for(QVariant globalCategoryVar : globalCategoriesList) { QVariantMap globalCategoryMap = globalCategoryVar.toMap(); if(categoryId == globalCategoryMap["id"].toInt()) { categoryMap.insert("discipline", globalCategoryMap["discipline"].toString()); break; } } BRCategory* category = this->getCategory(BRWidget::IFSC, categoryId, this->parseCategoryData(categoryMap)); data.categories.append(category); } return data; } BRCategory::BRCategoryData BRProviderVl::parseCategoryData(QVariantMap rawData) { BRCategory::BRCategoryData data; data.name = rawData["name"].toString(); // TODO: gender // parse status and discipline QMap statusTranslations = { {"registration_pending", BRCategory::Registration}, {"registration_active", BRCategory::Registration}, // TODO {2, BRCategory::Startlist}, {"active", BRCategory::Result}, {"finished", BRCategory::Result} }; QMap disciplineTranslations = { {"Boulder", BRCategory::Boulder}, {"Lead", BRCategory::Lead}, {"Speed", BRCategory::Speed} }; if(disciplineTranslations.contains(rawData["discipline"].toString())) data.discipline = disciplineTranslations[rawData["discipline"].toString()]; else data.discipline = BRCategory::UnknownDiscipline; if(statusTranslations.contains(rawData["status"].toString())) data.status = statusTranslations[rawData["status"].toString()]; else data.status = BRCategory::UnknownStatus; qDebug() << "-- Parsing category: " << data.name << " with discipline: " << data.discipline << " and status: " << data.status; data.currentRound = nullptr; BRRound::BRRoundData roundData; roundData.name = "General result"; qDebug() << "--- Adding round: " << roundData.name; data.generalResult = this->getRound(BRWidget::IFSC, -1, roundData, true); // load rounds QVariantList roundsList = rawData["category_rounds"].toList(); // insert general result for(QVariant roundVar : roundsList) { QVariantMap roundMap = roundVar.toMap(); BRRound::BRRoundData roundData; roundData.name = roundMap["name"].toString(); qDebug() << "--- Adding round: " << roundData.name; BRRound* round = this->getRound(BRWidget::IFSC, roundMap["category_round_id"].toInt(), roundData); data.rounds.append(round); } data.currentRound = data.generalResult; return data; } /*void BRProviderVl::parseCategoryData(BRCategory::BRCategoryData* categoryData, QVariantMap rawData) { // no need to load rounds, they were already loaded when the whole competition was loaded! qDebug() << "INITIALLY PARSING CATEGORY"; // load athletes QVariantList atheletList = rawData["ranking"].toList(); QMap tmpAthletes; // load general result BRRound::BRRoundData roundData; // TODO status roundData.name = tr("General result"); // parse Ranking QVariantList resultList = rawData["ranking"].toList(); for(QVariant resultVar : resultList) { QVariantMap resultMap = resultVar.toMap(); int athleteId = resultMap["athlete_id"].toInt(); if(!tmpAthletes.contains(athleteId)) continue; qDebug() << "Adding result: rank: " << resultMap["rank"]; BRResult::BRResultData resultData; resultData.rank = resultMap["rank"].toInt(); resultData.athlete = tmpAthletes[athleteId]; BRResult* result = this->getResult(resultData); roundData.results.append(result); } BRRound* generalResultRound = this->getRound(BRWidget::IFSC, -1, roundData); qDebug() << "General result round: " << generalResultRound; categoryData->rounds.insert(0, generalResultRound); categoryData->currentRound = generalResultRound; }*/ BRRound::BRRoundData BRProviderVl::parseRoundData(QVariantMap rawData) { BRRound::BRRoundData data; this->parseRoundData(&data, rawData); return data; } void BRProviderVl::parseRoundData(BRRound::BRRoundData* roundData, QVariantMap rawData) { // TODO status // clear up qDebug() << "clearing"; QList clearRounds; clearRounds.append(roundData->round); if(roundData->round->isGeneralResult()) { // if we are parsing a general result -> clear all rounds clearRounds.append(roundData->round->getCategory()->getRounds()); } for(BRRound* round : clearRounds) { for(BRResult* result : round->getResults()) result->deleteLater(); BRRound::BRRoundData roundData = round->getData(); roundData.results.clear(); this->setRoundData(round, roundData); } roundData->results.clear(); qDebug() << "finished clearing"; // parse Ranking QVariantList resultList = rawData["ranking"].toList(); for(QVariant resultVar : resultList) { QVariantMap resultMap = resultVar.toMap(); // load athlete BRAthlete::BRAthleteData athleteData; // TODO: start number athleteData.firstName = resultMap["firstname"].toString(); athleteData.lastName = resultMap["lastname"].toString(); athleteData.federation = resultMap["country"].toString(); athleteData.nation = resultMap["country"].toString(); qDebug() << "--- Adding athlete: " << athleteData.firstName << " " << athleteData.lastName; BRAthlete* athlete = this->getAthlete(BRWidget::IFSC, resultMap["athlete_id"].toInt(), athleteData); // load result qDebug() << "Adding result: rank: " << resultMap["rank"]; BRResult::BRResultData resultData; resultData.rank = resultMap["rank"].toInt(); resultData.athlete = athlete; // if this is the general result -> parse all other rounds as well if(roundData->round->isGeneralResult()) { qDebug() << "THIS is general result!!"; resultData.details = new BRResultDetailsGeneralResult(); // add results of other rounds for(QVariant subRoundVar : resultMap["rounds"].toList()) { QVariantMap subRoundMap = subRoundVar.toMap(); for(BRRound* subRound : roundData->round->getCategory()->getRounds(false)) { if(subRound->getId() == subRoundMap["category_round_id"].toInt()) { BRResult::BRResultData subResultData; subResultData.rank = subRoundMap["rank"].toInt(); subResultData.athlete = athlete; subResultData.details = new BRResultDetailsUnknown(subRoundMap["score"].toString()); qDebug() << "Adding subResult: rank: " << resultMap["rank"]; BRRound::BRRoundData subRoundData = subRound->getData(); subRoundData.results.append(this->getResult(subResultData)); this->setRoundData(subRound, subRoundData); } } } } else resultData.details = new BRResultDetailsUnknown(resultMap["score"].toString()); BRResult* result = this->getResult(resultData); roundData->results.append(result); } }