diff --git a/include/api.h b/include/api.h index 9624f6e..93872d9 100644 --- a/include/api.h +++ b/include/api.h @@ -7,6 +7,8 @@ #ifndef API_H #define API_H +#include "globalconstants.h" + #include <iostream> #include <vector> #include <curl/curl.h> @@ -15,31 +17,9 @@ extern "C" { } #include <cstring> -#define CONSUMER_KEY "1f444d14ea8ec776585524a33f6ecc1c413ed4a5" -#define CONSUMER_SECRET "20d175147f9db9a10fc0584aa128090217b9cf88" -#define OAUTH_VERIFIER_LENGTH 14 -#define OAUTH_TOKEN_LENGTH 11 -#define OAUTH_SECRET_LENGTH 18 - -#define INSTALLER_WINDOWS 1 -#define INSTALLER_MAC 2 - -#define LANGUAGE_EN 1 -#define LANGUAGE_DE 2 -#define LANGUAGE_FR 4 -#define LANGUAGE_PL 8 -#define LANGUAGE_RU 16 -#define LANGUAGE_CN 32 -#define LANGUAGE_CZ 64 -#define LANGUAGE_ES 128 -#define LANGUAGE_HU 256 -#define LANGUAGE_IT 512 -#define LANGUAGE_JP 1024 -#define LANGUAGE_TR 2048 - class gameFile { public: - gameFile(const bool& t_updated, const std::string& t_id, const std::string& t_name, const std::string& t_path, const std::string& t_size, const unsigned int& t_language = LANGUAGE_EN); + gameFile(const bool& t_updated, const std::string& t_id, const std::string& t_name, const std::string& t_path, const std::string& t_size, const unsigned int& t_language = GlobalConstants::LANGUAGE_EN); bool updated; std::string id; std::string name; @@ -101,7 +81,7 @@ class API std::string getResponseOAuth(const std::string& url); int getUserDetails(); int getGames(); - gameDetails getGameDetails(const std::string& game_name, const unsigned int& type = INSTALLER_WINDOWS, const unsigned int& lang = LANGUAGE_EN); + gameDetails getGameDetails(const std::string& game_name, const unsigned int& type = GlobalConstants::INSTALLER_WINDOWS, const unsigned int& lang = GlobalConstants::LANGUAGE_EN); std::string getInstallerLink(const std::string& game_name, const std::string& id); std::string getExtraLink(const std::string& game_name, const std::string& id); std::string getXML(const std::string& game_name, const std::string& id); diff --git a/include/globalconstants.h b/include/globalconstants.h new file mode 100644 index 0000000..5660978 --- /dev/null +++ b/include/globalconstants.h @@ -0,0 +1,65 @@ +/* This program is free software. It comes without any warranty, to + * the extent permitted by applicable law. You can redistribute it + * and/or modify it under the terms of the Do What The Fuck You Want + * To Public License, Version 2, as published by Sam Hocevar. See + * http://sam.zoy.org/wtfpl/COPYING for more details. */ + +#ifndef GLOBALCONSTANTS_H_INCLUDED +#define GLOBALCONSTANTS_H_INCLUDED + +#include <iostream> +#include <vector> + +namespace GlobalConstants +{ + // API constants + const std::string CONSUMER_KEY = "1f444d14ea8ec776585524a33f6ecc1c413ed4a5"; + const std::string CONSUMER_SECRET = "20d175147f9db9a10fc0584aa128090217b9cf88"; + const int OAUTH_VERIFIER_LENGTH = 14; + const int OAUTH_TOKEN_LENGTH = 11; + const int OAUTH_SECRET_LENGTH = 18; + + // Language constants + const unsigned int LANGUAGE_EN = 1; + const unsigned int LANGUAGE_DE = 2; + const unsigned int LANGUAGE_FR = 4; + const unsigned int LANGUAGE_PL = 8; + const unsigned int LANGUAGE_RU = 16; + const unsigned int LANGUAGE_CN = 32; + const unsigned int LANGUAGE_CZ = 64; + const unsigned int LANGUAGE_ES = 128; + const unsigned int LANGUAGE_HU = 256; + const unsigned int LANGUAGE_IT = 512; + const unsigned int LANGUAGE_JP = 1024; + const unsigned int LANGUAGE_TR = 2048; + + struct languageStruct {const unsigned int languageId; const std::string languageCode; const std::string languageString;}; + const std::vector<languageStruct> LANGUAGES = + { + { LANGUAGE_EN, "en", "English" }, + { LANGUAGE_DE, "de", "German" }, + { LANGUAGE_FR, "fr", "French" }, + { LANGUAGE_PL, "pl", "Polish" }, + { LANGUAGE_RU, "ru", "Russian" }, + { LANGUAGE_CN, "cn", "Chinese" }, + { LANGUAGE_CZ, "cz", "Czech" }, + { LANGUAGE_ES, "es", "Spanish" }, + { LANGUAGE_HU, "hu", "Hungarian" }, + { LANGUAGE_IT, "it", "Italian" }, + { LANGUAGE_JP, "jp", "Japanese" }, + { LANGUAGE_TR, "tr", "Turkish" } + }; + + // Installer constants + const unsigned int INSTALLER_WINDOWS = 1; + const unsigned int INSTALLER_MAC = 2; + + struct installerStruct {const unsigned int installerId; const std::string installerCode; const std::string installerString;}; + const std::vector<installerStruct> INSTALLERS = + { + { INSTALLER_WINDOWS, "win", "Windows" }, + { INSTALLER_MAC, "mac", "Mac" } + }; +}; + +#endif // GLOBALCONSTANTS_H_INCLUDED diff --git a/lgogdownloader.cbp b/lgogdownloader.cbp index 94911c8..acc6f66 100644 --- a/lgogdownloader.cbp +++ b/lgogdownloader.cbp @@ -51,6 +51,7 @@ <Unit filename="include/api.h" /> <Unit filename="include/config.h" /> <Unit filename="include/downloader.h" /> + <Unit filename="include/globalconstants.h" /> <Unit filename="include/progressbar.h" /> <Unit filename="include/util.h" /> <Unit filename="main.cpp" /> diff --git a/main.cpp b/main.cpp index b64f55f..4ec8620 100644 --- a/main.cpp +++ b/main.cpp @@ -7,6 +7,7 @@ #include "downloader.h" #include "config.h" #include "util.h" +#include "globalconstants.h" #include "version.h" // generated by Makefile #include <fstream> @@ -50,27 +51,25 @@ int main(int argc, char *argv[]) } // Create help text for --platform option - std::string platform_text = "Select which installers are downloaded\n" - + std::to_string(INSTALLER_WINDOWS) + " = Windows\n" - + std::to_string(INSTALLER_MAC) + " = Mac\n" - + std::to_string(INSTALLER_WINDOWS | INSTALLER_MAC) + " = Both"; + std::string platform_text = "Select which installers are downloaded\n"; + unsigned int platform_sum = 0; + for (unsigned int i = 0; i < GlobalConstants::INSTALLERS.size(); ++i) + { + platform_text += std::to_string(GlobalConstants::INSTALLERS[i].installerId) + " = " + GlobalConstants::INSTALLERS[i].installerString + "\n"; + platform_sum += GlobalConstants::LANGUAGES[i].languageId; + } + platform_text += std::to_string(platform_sum) + " = All"; + // Create help text for --language option - std::string language_text = "Select which language installers are downloaded\n" - + std::to_string(LANGUAGE_EN) + " = English\n" - + std::to_string(LANGUAGE_DE) + " = German\n" - + std::to_string(LANGUAGE_FR) + " = French\n" - + std::to_string(LANGUAGE_PL) + " = Polish\n" - + std::to_string(LANGUAGE_RU) + " = Russian\n" - + std::to_string(LANGUAGE_CN) + " = Chinese\n" - + std::to_string(LANGUAGE_CZ) + " = Czech\n" - + std::to_string(LANGUAGE_ES) + " = Spanish\n" - + std::to_string(LANGUAGE_HU) + " = Hungarian\n" - + std::to_string(LANGUAGE_IT) + " = Italian\n" - + std::to_string(LANGUAGE_JP) + " = Japanese\n" - + std::to_string(LANGUAGE_TR) + " = Turkish\n" - + "Add the values to download multiple languages\n" - + "All = " + std::to_string(LANGUAGE_EN | LANGUAGE_DE | LANGUAGE_FR | LANGUAGE_PL | LANGUAGE_RU | LANGUAGE_CN | LANGUAGE_CZ | LANGUAGE_ES | LANGUAGE_HU | LANGUAGE_IT | LANGUAGE_JP | LANGUAGE_TR) + "\n" - + "French + Polish = " + std::to_string(LANGUAGE_FR) + "+" + std::to_string(LANGUAGE_PL) + " = " + std::to_string(LANGUAGE_FR | LANGUAGE_PL); + std::string language_text = "Select which language installers are downloaded\n"; + unsigned int language_sum = 0; + for (unsigned int i = 0; i < GlobalConstants::LANGUAGES.size(); ++i) + { + language_text += std::to_string(GlobalConstants::LANGUAGES[i].languageId) + " = " + GlobalConstants::LANGUAGES[i].languageString + "\n"; + language_sum += GlobalConstants::LANGUAGES[i].languageId; + } + language_text += "Add the values to download multiple languages\nAll = " + std::to_string(language_sum) + "\n" + + "French + Polish = " + std::to_string(GlobalConstants::LANGUAGE_FR) + "+" + std::to_string(GlobalConstants::LANGUAGE_PL) + " = " + std::to_string(GlobalConstants::LANGUAGE_FR | GlobalConstants::LANGUAGE_PL); bpo::variables_map vm; bpo::options_description desc("Options"); @@ -93,8 +92,8 @@ int main(int argc, char *argv[]) ("xml-directory", bpo::value<std::string>(&config.sXMLDirectory), "Set directory for GOG XML files") ("chunk-size", bpo::value<size_t>(&config.iChunkSize)->default_value(10), "Chunk size (in MB) when creating XML") ("update-check", bpo::value<bool>(&config.bUpdateCheck)->zero_tokens()->default_value(false), "Check for update notifications") - ("platform", bpo::value<unsigned int>(&config.iInstallerType)->default_value(INSTALLER_WINDOWS), platform_text.c_str()) - ("language", bpo::value<unsigned int>(&config.iInstallerLanguage)->default_value(LANGUAGE_EN), language_text.c_str()) + ("platform", bpo::value<unsigned int>(&config.iInstallerType)->default_value(GlobalConstants::INSTALLER_WINDOWS), platform_text.c_str()) + ("language", bpo::value<unsigned int>(&config.iInstallerLanguage)->default_value(GlobalConstants::LANGUAGE_EN), language_text.c_str()) ("no-installers", bpo::value<bool>(&config.bNoInstallers)->zero_tokens()->default_value(false), "Don't download/list/repair installers") ("no-extras", bpo::value<bool>(&config.bNoExtras)->zero_tokens()->default_value(false), "Don't download/list/repair extras") ("no-cover", bpo::value<bool>(&config.bNoCover)->zero_tokens()->default_value(false), "Don't download cover images") @@ -153,12 +152,18 @@ int main(int argc, char *argv[]) return 1; } - if (config.iInstallerType < INSTALLER_WINDOWS || config.iInstallerType > (INSTALLER_WINDOWS | INSTALLER_MAC)) + if (config.iInstallerType < GlobalConstants::INSTALLER_WINDOWS || config.iInstallerType > platform_sum) { std::cout << "Invalid value for --platform" << std::endl; return 1; } + if (config.iInstallerType < GlobalConstants::LANGUAGE_EN || config.iInstallerType > language_sum) + { + std::cout << "Invalid value for --language" << std::endl; + return 1; + } + if (!config.sXMLDirectory.empty()) { // Make sure that xml directory doesn't have trailing slash diff --git a/src/api.cpp b/src/api.cpp index 567e920..4e8240c 100644 --- a/src/api.cpp +++ b/src/api.cpp @@ -121,16 +121,16 @@ int API::login(const std::string& email, const std::string& password) std::string token, secret; // Get temporary request token - url = oauth_sign_url2(this->config.oauth_get_temp_token.c_str(), NULL, OA_HMAC, NULL, CONSUMER_KEY, CONSUMER_SECRET, NULL /* token */, NULL /* secret */); + url = oauth_sign_url2(this->config.oauth_get_temp_token.c_str(), NULL, OA_HMAC, NULL, GlobalConstants::CONSUMER_KEY.c_str(), GlobalConstants::CONSUMER_SECRET.c_str(), NULL /* token */, NULL /* secret */); std::string request_token_resp = this->getResponse(url); char **rv = NULL; int rc = oauth_split_url_parameters(request_token_resp.c_str(), &rv); qsort(rv, rc, sizeof(char *), oauth_cmpstringp); - if (rc == 3 && !strncmp(rv[1], "oauth_token=", OAUTH_TOKEN_LENGTH) && !strncmp(rv[2], "oauth_token_secret=", OAUTH_SECRET_LENGTH)) { - token = rv[1]+OAUTH_TOKEN_LENGTH+1; - secret = rv[2]+OAUTH_SECRET_LENGTH+1; + if (rc == 3 && !strncmp(rv[1], "oauth_token=", GlobalConstants::OAUTH_TOKEN_LENGTH) && !strncmp(rv[2], "oauth_token_secret=", GlobalConstants::OAUTH_SECRET_LENGTH)) { + token = rv[1]+GlobalConstants::OAUTH_TOKEN_LENGTH+1; + secret = rv[2]+GlobalConstants::OAUTH_SECRET_LENGTH+1; rv = NULL; } else @@ -140,14 +140,14 @@ int API::login(const std::string& email, const std::string& password) // Authorize temporary token and get verifier url = this->config.oauth_authorize_temp_token + "?username=" + oauth_url_escape(email.c_str()) + "&password=" + oauth_url_escape(password.c_str()); - url = oauth_sign_url2(url.c_str(), NULL, OA_HMAC, NULL, CONSUMER_KEY, CONSUMER_SECRET, token.c_str(), secret.c_str()); + url = oauth_sign_url2(url.c_str(), NULL, OA_HMAC, NULL, GlobalConstants::CONSUMER_KEY.c_str(), GlobalConstants::CONSUMER_SECRET.c_str(), token.c_str(), secret.c_str()); std::string authorize_resp = this->getResponse(url); std::string verifier; rc = oauth_split_url_parameters(authorize_resp.c_str(), &rv); qsort(rv, rc, sizeof(char *), oauth_cmpstringp); - if (rc == 2 && !strncmp(rv[1], "oauth_verifier=", OAUTH_VERIFIER_LENGTH)) { - verifier = rv[1]+OAUTH_VERIFIER_LENGTH+1; + if (rc == 2 && !strncmp(rv[1], "oauth_verifier=", GlobalConstants::OAUTH_VERIFIER_LENGTH)) { + verifier = rv[1]+GlobalConstants::OAUTH_VERIFIER_LENGTH+1; rv = NULL; } else @@ -157,14 +157,14 @@ int API::login(const std::string& email, const std::string& password) // Get final token and secret url = this->config.oauth_get_token + "?oauth_verifier=" + verifier; - url = oauth_sign_url2(url.c_str(), NULL, OA_HMAC, NULL, CONSUMER_KEY, CONSUMER_SECRET, token.c_str(), secret.c_str()); + url = oauth_sign_url2(url.c_str(), NULL, OA_HMAC, NULL, GlobalConstants::CONSUMER_KEY.c_str(), GlobalConstants::CONSUMER_SECRET.c_str(), token.c_str(), secret.c_str()); std::string token_resp = this->getResponse(url); rc = oauth_split_url_parameters(token_resp.c_str(), &rv); qsort(rv, rc, sizeof(char *), oauth_cmpstringp); - if (rc == 2 && !strncmp(rv[0], "oauth_token=", OAUTH_TOKEN_LENGTH) && !strncmp(rv[1], "oauth_token_secret=", OAUTH_SECRET_LENGTH)) { - this->config.oauth_token = rv[0]+OAUTH_TOKEN_LENGTH+1; - this->config.oauth_secret = rv[1]+OAUTH_SECRET_LENGTH+1; + if (rc == 2 && !strncmp(rv[0], "oauth_token=", GlobalConstants::OAUTH_TOKEN_LENGTH) && !strncmp(rv[1], "oauth_token_secret=", GlobalConstants::OAUTH_SECRET_LENGTH)) { + this->config.oauth_token = rv[0]+GlobalConstants::OAUTH_TOKEN_LENGTH+1; + this->config.oauth_secret = rv[1]+GlobalConstants::OAUTH_SECRET_LENGTH+1; free(rv); res = 1; } @@ -260,7 +260,7 @@ std::string API::getResponseOAuth(const std::string& url) #ifdef DEBUG std::cerr << "DEBUG INFO (API::getResponseOAuth)" << std::endl << "URL: " << url << std::endl; #endif - std::string url_oauth = oauth_sign_url2(url.c_str(), NULL, OA_HMAC, NULL, CONSUMER_KEY, CONSUMER_SECRET, this->config.oauth_token.c_str(), this->config.oauth_secret.c_str()); + std::string url_oauth = oauth_sign_url2(url.c_str(), NULL, OA_HMAC, NULL, GlobalConstants::CONSUMER_KEY.c_str(), GlobalConstants::CONSUMER_SECRET.c_str(), this->config.oauth_token.c_str(), this->config.oauth_secret.c_str()); std::string response = this->getResponse(url_oauth); return response; @@ -289,60 +289,21 @@ gameDetails API::getGameDetails(const std::string& game_name, const unsigned int // Installer details std::vector<std::pair<Json::Value,unsigned int>> installers; - if (type & INSTALLER_WINDOWS) + for (unsigned int i = 0; i < GlobalConstants::INSTALLERS.size(); ++i) { - if (lang & LANGUAGE_EN) - installers.push_back(std::make_pair(root["game"]["installer_win_en"],LANGUAGE_EN)); - if (lang & LANGUAGE_DE) - installers.push_back(std::make_pair(root["game"]["installer_win_de"],LANGUAGE_DE)); - if (lang & LANGUAGE_FR) - installers.push_back(std::make_pair(root["game"]["installer_win_fr"],LANGUAGE_FR)); - if (lang & LANGUAGE_PL) - installers.push_back(std::make_pair(root["game"]["installer_win_pl"],LANGUAGE_PL)); - if (lang & LANGUAGE_RU) - installers.push_back(std::make_pair(root["game"]["installer_win_ru"],LANGUAGE_RU)); - if (lang & LANGUAGE_CN) - installers.push_back(std::make_pair(root["game"]["installer_win_cn"],LANGUAGE_CN)); - if (lang & LANGUAGE_CZ) - installers.push_back(std::make_pair(root["game"]["installer_win_cz"],LANGUAGE_CZ)); - if (lang & LANGUAGE_ES) - installers.push_back(std::make_pair(root["game"]["installer_win_es"],LANGUAGE_ES)); - if (lang & LANGUAGE_HU) - installers.push_back(std::make_pair(root["game"]["installer_win_hu"],LANGUAGE_HU)); - if (lang & LANGUAGE_IT) - installers.push_back(std::make_pair(root["game"]["installer_win_it"],LANGUAGE_IT)); - if (lang & LANGUAGE_JP) - installers.push_back(std::make_pair(root["game"]["installer_win_jp"],LANGUAGE_JP)); - if (lang & LANGUAGE_TR) - installers.push_back(std::make_pair(root["game"]["installer_win_tr"],LANGUAGE_TR)); - } - if (type & INSTALLER_MAC) - { - if (lang & LANGUAGE_EN) - installers.push_back(std::make_pair(root["game"]["installer_mac_en"],LANGUAGE_EN)); - if (lang & LANGUAGE_DE) - installers.push_back(std::make_pair(root["game"]["installer_mac_de"],LANGUAGE_DE)); - if (lang & LANGUAGE_FR) - installers.push_back(std::make_pair(root["game"]["installer_mac_fr"],LANGUAGE_FR)); - if (lang & LANGUAGE_PL) - installers.push_back(std::make_pair(root["game"]["installer_mac_pl"],LANGUAGE_PL)); - if (lang & LANGUAGE_RU) - installers.push_back(std::make_pair(root["game"]["installer_mac_ru"],LANGUAGE_RU)); - if (lang & LANGUAGE_CN) - installers.push_back(std::make_pair(root["game"]["installer_mac_cn"],LANGUAGE_CN)); - if (lang & LANGUAGE_CZ) - installers.push_back(std::make_pair(root["game"]["installer_mac_cz"],LANGUAGE_CZ)); - if (lang & LANGUAGE_ES) - installers.push_back(std::make_pair(root["game"]["installer_mac_es"],LANGUAGE_ES)); - if (lang & LANGUAGE_HU) - installers.push_back(std::make_pair(root["game"]["installer_mac_hu"],LANGUAGE_HU)); - if (lang & LANGUAGE_IT) - installers.push_back(std::make_pair(root["game"]["installer_mac_it"],LANGUAGE_IT)); - if (lang & LANGUAGE_JP) - installers.push_back(std::make_pair(root["game"]["installer_mac_jp"],LANGUAGE_JP)); - if (lang & LANGUAGE_TR) - installers.push_back(std::make_pair(root["game"]["installer_mac_tr"],LANGUAGE_TR)); + if (type & GlobalConstants::INSTALLERS[i].installerId) + { + std::string installer = "installer_" + GlobalConstants::INSTALLERS[i].installerCode + "_"; + for (unsigned int j = 0; j < GlobalConstants::LANGUAGES.size(); ++j) + { + if (lang & GlobalConstants::LANGUAGES[j].languageId) + { + installers.push_back(std::make_pair(root["game"][installer+GlobalConstants::LANGUAGES[j].languageCode],GlobalConstants::LANGUAGES[j].languageId)); + } + } + } } + for ( unsigned int i = 0; i < installers.size(); ++i ) { for ( unsigned int index = 0; index < installers[i].first.size(); ++index ) diff --git a/src/downloader.cpp b/src/downloader.cpp index 808237e..0a7dd9b 100644 --- a/src/downloader.cpp +++ b/src/downloader.cpp @@ -6,6 +6,7 @@ #include "downloader.h" #include "util.h" +#include "globalconstants.h" #include <cstdio> #include <cstdlib> @@ -264,31 +265,17 @@ void Downloader::fixInstallerLanguagePath(gameDetails& game) { for (unsigned int i = 0; i < game.installers.size(); ++i) { - if (game.installers[i].language != LANGUAGE_EN) + if (game.installers[i].language != GlobalConstants::LANGUAGE_EN) { std::string lang; - if (game.installers[i].language == LANGUAGE_DE) - lang = "_de_"; - else if (game.installers[i].language == LANGUAGE_FR) - lang = "_fr_"; - else if (game.installers[i].language == LANGUAGE_PL) - lang = "_pl_"; - else if (game.installers[i].language == LANGUAGE_RU) - lang = "_ru_"; - else if (game.installers[i].language == LANGUAGE_CN) - lang = "_cn_"; - else if (game.installers[i].language == LANGUAGE_CZ) - lang = "_cz_"; - else if (game.installers[i].language == LANGUAGE_ES) - lang = "_es_"; - else if (game.installers[i].language == LANGUAGE_HU) - lang = "_hu_"; - else if (game.installers[i].language == LANGUAGE_IT) - lang = "_it_"; - else if (game.installers[i].language == LANGUAGE_JP) - lang = "_jp_"; - else if (game.installers[i].language == LANGUAGE_TR) - lang = "_tr_"; + for (unsigned int j = 0; j < GlobalConstants::LANGUAGES.size(); ++j) + { + if (game.installers[i].language == GlobalConstants::LANGUAGES[j].languageId) + { + lang = "_" + GlobalConstants::LANGUAGES[j].languageCode + "_"; + break; + } + } boost::match_results<std::string::const_iterator> what; boost::regex expression(lang, boost::regex::perl | boost::regex::icase); if (!boost::regex_search(game.installers[i].path, what, expression))