Improve game specific config options

"platform" and "language" options allow using string to set them.
This allows user to set them more easily without needing to calculate the sum of integer values and makes the config easier to understand later.
For example: this allows setting "language" to English, German and French with "en+de+fr" which is much easier to understand than setting it to "7".

Directory options can be overridden using game specific config file
New options in game specific config file:
 - "subdirectories" - <bool>
 - "directory" - <string>
 - "subdir-game" - <string>
 - "subdir-installers" - <string>
 - "subdir-extras" - <string>
 - "subdir-patches" - <string>
 - "subdir-language-packs" - <string>
 - "subdir-dlc" - <string>
This commit is contained in:
Sude 2016-02-15 14:27:29 +02:00
parent 37577f9a98
commit 4d4aaa1792
6 changed files with 116 additions and 14 deletions

View File

@ -4,6 +4,7 @@
#include "globalconstants.h" #include "globalconstants.h"
#include "gamefile.h" #include "gamefile.h"
#include "config.h" #include "config.h"
#include "util.h"
#include <iostream> #include <iostream>
#include <vector> #include <vector>
@ -23,7 +24,7 @@ class gameDetails
std::string icon; std::string icon;
std::string serials; std::string serials;
void filterWithPriorities(const Config& config); void filterWithPriorities(const Config& config);
void makeFilepaths(const Config& config); void makeFilepaths(const gameSpecificDirectoryConfig& config);
std::string getSerialsFilepath(); std::string getSerialsFilepath();
Json::Value getDetailsAsJson(); Json::Value getDetailsAsJson();
virtual ~gameDetails(); virtual ~gameDetails();

View File

@ -20,12 +20,25 @@
#include <boost/regex.hpp> #include <boost/regex.hpp>
#include <json/json.h> #include <json/json.h>
struct gameSpecificDirectoryConfig
{
bool bSubDirectories;
std::string sDirectory;
std::string sGameSubdir;
std::string sInstallersSubdir;
std::string sExtrasSubdir;
std::string sPatchesSubdir;
std::string sLanguagePackSubdir;
std::string sDLCSubdir;
};
struct gameSpecificConfig struct gameSpecificConfig
{ {
unsigned int iInstallerPlatform; unsigned int iInstallerPlatform;
unsigned int iInstallerLanguage; unsigned int iInstallerLanguage;
bool bDLC; bool bDLC;
bool bIgnoreDLCCount; bool bIgnoreDLCCount;
gameSpecificDirectoryConfig dirConf;
}; };
namespace Util namespace Util

View File

@ -70,17 +70,25 @@ It doesn't have to exist, but if it does exist, it must be readable to lgogdownl
\fI$XDG_CONFIG_HOME/lgogdownloader/gamespecific/gamename.conf\fP \fI$XDG_CONFIG_HOME/lgogdownloader/gamespecific/gamename.conf\fP
JSON formatted file. Sets game specific settings for \fBgamename\fP. JSON formatted file. Sets game specific settings for \fBgamename\fP.
.br .br
Allowed settings are \fBlanguage\fP, \fBplatform\fP, \fBdlc\fP and \fBignore-dlc-count\fP. Allowed settings are \fBlanguage\fP, \fBplatform\fP, \fBdlc\fP, \fBignore-dlc-count\fP \fBsubdirectories\fP, \fBdirectory\fP, \fBsubdir-game\fP, \fBsubdir-installers\fP, \fBsubdir-extras\fP, \fBsubdir-patches\fP, \fBsubdir-language-packs\fP and \fBsubdir-dlc\fP.
.br .br
The \fBdlc\fP option is limited to disabling DLC for specific game. It can't enable DLC listing/downloading if \fB--no-dlc\fP option is used. The \fBdlc\fP option is limited to disabling DLC for specific game. It can't enable DLC listing/downloading if \fB--no-dlc\fP option is used.
.br .br
Must be in the following format: Must be in the following format:
.br .br
{ {
"language" : <int>, "language" : <string>,
"platform" : <int>, "platform" : <string>,
"dlc" : <bool>, "dlc" : <bool>,
"ignore-dlc-count" : <bool> "ignore-dlc-count" : <bool>,
"subdirectories" : <bool>,
"directory" : <string>,
"subdir-game" : <string>,
"subdir-installers" : <string>,
"subdir-extras" : <string>,
"subdir-patches" : <string>,
"subdir-language-packs" : <string>,
"subdir-dlc" : <string>
.br .br
} }

View File

@ -211,6 +211,16 @@ void Downloader::getGameList()
*/ */
int Downloader::getGameDetails() int Downloader::getGameDetails()
{ {
// Set default game specific directory options to values from config
gameSpecificDirectoryConfig dirConfDefault;
dirConfDefault.sDirectory = config.sDirectory;
dirConfDefault.bSubDirectories = config.bSubDirectories;
dirConfDefault.sGameSubdir = config.sGameSubdir;
dirConfDefault.sInstallersSubdir = config.sInstallersSubdir;
dirConfDefault.sExtrasSubdir = config.sExtrasSubdir;
dirConfDefault.sLanguagePackSubdir = config.sLanguagePackSubdir;
dirConfDefault.sDLCSubdir = config.sDLCSubdir;
if (config.bUseCache && !config.bUpdateCache) if (config.bUseCache && !config.bUpdateCache)
{ {
// GameRegex filter alias for all games // GameRegex filter alias for all games
@ -223,7 +233,12 @@ int Downloader::getGameDetails()
if (result == 0) if (result == 0)
{ {
for (unsigned int i = 0; i < this->games.size(); ++i) for (unsigned int i = 0; i < this->games.size(); ++i)
this->games[i].makeFilepaths(config); {
gameSpecificConfig conf;
conf.dirConf = dirConfDefault;
Util::getGameSpecificConfig(games[i].gamename, &conf);
this->games[i].makeFilepaths(conf.dirConf);
}
return 0; return 0;
} }
else else
@ -254,10 +269,12 @@ int Downloader::getGameDetails()
conf.bIgnoreDLCCount = false; conf.bIgnoreDLCCount = false;
conf.iInstallerLanguage = config.iInstallerLanguage; conf.iInstallerLanguage = config.iInstallerLanguage;
conf.iInstallerPlatform = config.iInstallerPlatform; conf.iInstallerPlatform = config.iInstallerPlatform;
conf.dirConf = dirConfDefault;
if (!config.bUpdateCache) // Disable game specific config files for cache update if (!config.bUpdateCache) // Disable game specific config files for cache update
{ {
if (Util::getGameSpecificConfig(gameItems[i].name, &conf) > 0) int iOptionsOverridden = Util::getGameSpecificConfig(gameItems[i].name, &conf);
std::cout << std::endl << gameItems[i].name << " - Language: " << conf.iInstallerLanguage << ", Platform: " << conf.iInstallerPlatform << ", DLC: " << (conf.bDLC ? "true" : "false") << ", Ignore DLC count: " << (conf.bIgnoreDLCCount ? "true" : "false") << std::endl; if (iOptionsOverridden > 0)
std::cout << std::endl << gameItems[i].name << " - " << iOptionsOverridden << " options overridden with game specific options" << std::endl;
} }
game = gogAPI->getGameDetails(gameItems[i].name, conf.iInstallerPlatform, conf.iInstallerLanguage, config.bDuplicateHandler); game = gogAPI->getGameDetails(gameItems[i].name, conf.iInstallerPlatform, conf.iInstallerLanguage, config.bDuplicateHandler);
@ -346,7 +363,7 @@ int Downloader::getGameDetails()
} }
} }
game.makeFilepaths(config); game.makeFilepaths(conf.dirConf);
if (!config.bUpdateCheck) if (!config.bUpdateCheck)
games.push_back(game); games.push_back(game);

View File

@ -1,5 +1,4 @@
#include "gamedetails.h" #include "gamedetails.h"
#include "util.h"
gameDetails::gameDetails() gameDetails::gameDetails()
{ {
@ -66,7 +65,7 @@ void gameDetails::filterListWithPriorities(std::vector<gameFile>& list, const Co
} }
} }
void gameDetails::makeFilepaths(const Config& config) void gameDetails::makeFilepaths(const gameSpecificDirectoryConfig& config)
{ {
std::string filepath; std::string filepath;
std::string directory = config.sDirectory + "/" + config.sGameSubdir + "/"; std::string directory = config.sDirectory + "/" + config.sGameSubdir + "/";

View File

@ -240,12 +240,36 @@ int Util::getGameSpecificConfig(std::string gamename, gameSpecificConfig* conf,
{ {
if (root.isMember("language")) if (root.isMember("language"))
{ {
conf->iInstallerLanguage = root["language"].asUInt(); unsigned int language = 0;
if (root["language"].isInt())
language = root["language"].asUInt();
else
{
std::vector<std::string> tokens = Util::tokenize(root["language"].asString(), "+");
for (std::vector<std::string>::iterator it = tokens.begin(); it != tokens.end(); it++)
{
language |= Util::getOptionValue(*it, GlobalConstants::LANGUAGES);
}
}
conf->iInstallerLanguage = language;
res++; res++;
} }
if (root.isMember("platform")) if (root.isMember("platform"))
{ {
conf->iInstallerPlatform = root["platform"].asUInt(); unsigned int platform = 0;
if (root["platform"].isInt())
platform = root["platform"].asUInt();
else
{
std::vector<std::string> tokens = Util::tokenize(root["platform"].asString(), "+");
for (std::vector<std::string>::iterator it = tokens.begin(); it != tokens.end(); it++)
{
platform |= Util::getOptionValue(*it, GlobalConstants::PLATFORMS);
}
}
conf->iInstallerPlatform = platform;
res++; res++;
} }
if (root.isMember("dlc")) if (root.isMember("dlc"))
@ -258,10 +282,50 @@ int Util::getGameSpecificConfig(std::string gamename, gameSpecificConfig* conf,
conf->bIgnoreDLCCount = root["ignore-dlc-count"].asBool(); conf->bIgnoreDLCCount = root["ignore-dlc-count"].asBool();
res++; res++;
} }
if (root.isMember("subdirectories"))
{
conf->dirConf.bSubDirectories = root["subdirectories"].asBool();
res++;
}
if (root.isMember("directory"))
{
conf->dirConf.sDirectory = root["directory"].asString();
res++;
}
if (root.isMember("subdir-game"))
{
conf->dirConf.sGameSubdir = root["subdir-game"].asString();
res++;
}
if (root.isMember("subdir-installers"))
{
conf->dirConf.sInstallersSubdir = root["subdir-installers"].asString();
res++;
}
if (root.isMember("subdir-extras"))
{
conf->dirConf.sExtrasSubdir = root["subdir-extras"].asString();
res++;
}
if (root.isMember("subdir-patches"))
{
conf->dirConf.sPatchesSubdir = root["subdir-patches"].asString();
res++;
}
if (root.isMember("subdir-language-packs"))
{
conf->dirConf.sLanguagePackSubdir = root["subdir-language-packs"].asString();
res++;
}
if (root.isMember("subdir-dlc"))
{
conf->dirConf.sDLCSubdir = root["subdir-dlc"].asString();
res++;
}
} }
else else
{ {
std::cout << "Failed to parse game specific config" << std::endl; std::cout << "Failed to parse game specific config " << filepath << std::endl;
std::cout << jsonparser->getFormattedErrorMessages() << std::endl; std::cout << jsonparser->getFormattedErrorMessages() << std::endl;
} }
delete jsonparser; delete jsonparser;