430 lines
15 KiB
C++
430 lines
15 KiB
C++
#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"}});
|
|
|
|
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"}});
|
|
|
|
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"}});
|
|
|
|
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<QString, BRCategory::BRCategoryStatus> statusTranslations = {
|
|
{"registration_pending", BRCategory::Registration},
|
|
{"registration_active", BRCategory::Registration},
|
|
// TODO {2, BRCategory::Startlist},
|
|
{"active", BRCategory::Result},
|
|
{"finished", BRCategory::Result}
|
|
};
|
|
|
|
QMap<QString, BRCategory::BRDiscipline> 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<int, BRAthlete*> 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<BRRound*> 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);
|
|
}
|
|
}
|