Pour tout problème contactez-nous par mail : support@froggit.fr | La FAQ :grey_question: | Rejoignez-nous sur le Chat :speech_balloon:

Skip to content
Snippets Groups Projects
Commit 10c0fa69 authored by g4m4's avatar g4m4
Browse files

[CODE] Allow multiple connection settings for eg different build configurations

parent 6cbb526e
No related branches found
No related tags found
No related merge requests found
......@@ -46,8 +46,14 @@ bool UFixItBlueprintLibrary::AreOverrideCredentialsAvailable()
#if PLATFORM_WINDOWS
if (UFixItSubsystem* FixItSubsystem = GEngine->GetEngineSubsystem<UFixItSubsystem>())
{
const UFixItSettings* settings = GetDefault<UFixItSettings>();
if (!settings->Login.IsEmpty() && !settings->Token.IsEmpty())
const UFixItSettings* Settings = GetDefault<UFixItSettings>();
if (Settings == nullptr)
{
UE_LOG(LogFixItGame, Error, TEXT("No settings could be found!"));
return false;
}
FFixItConnectionSettings ConnectionSettings = Settings->GetConnectionSettingsForCurrentBuildConfiguration();
if (!ConnectionSettings.Login.IsEmpty() && !ConnectionSettings.Token.IsEmpty())
{
return true;
}
......
......@@ -20,7 +20,12 @@ void UFixItSubsystem::Initialize(FSubsystemCollectionBase& Collection)
Super::Initialize(Collection);
UE_LOG(LogFixItGame, Log, TEXT("Initialized FixIt subsystem"));
const UFixItSettings* Settings = GetDefault<UFixItSettings>();
Backend = MakeUnique<FFixItBackend>(Settings->Backend);
if (Settings == nullptr)
{
UE_LOG(LogFixItGame, Error, TEXT("No settings could be found!"));
}
FFixItConnectionSettings ConnectionSettings = Settings->GetConnectionSettingsForCurrentBuildConfiguration();
Backend = MakeUnique<FFixItBackend>(ConnectionSettings.Backend);
if (Settings->bLoginAtStartup)
{
Backend->Login(
......
......@@ -104,9 +104,15 @@ bool FFixItBackend::Login(
return false;
}
const UFixItSettings* Settings = GetDefault<UFixItSettings>();
if (Settings == nullptr)
{
UE_LOG(LogFixItCore, Error, TEXT("No settings could be found!"));
return false;
}
FFixItConnectionSettings ConnectionSettings = Settings->GetConnectionSettingsForCurrentBuildConfiguration();
return BackendImpl_->Login(
FFixItTranslationLayer::ToStd(Settings->URL),
FFixItTranslationLayer::ToStd(Settings->ProjectName),
FFixItTranslationLayer::ToStd(ConnectionSettings.URL),
FFixItTranslationLayer::ToStd(ConnectionSettings.ProjectName),
FFixItTranslationLayer::ToStd(Login),
FFixItTranslationLayer::ToStd(Token),
[OnRequestCompleted](bool bResult, const std::string& ErrorMessage) {
......
......@@ -18,6 +18,10 @@ THIRD_PARTY_INCLUDES_END
// This is a special .cpp include so whatever it contains is restricted to this one unique cpp file
#include "FixItDefaultCredentials.cpp"
void FFixItConnectionSettings::SetFromString(const FString& data) {
}
UFixItSettings::UFixItSettings()
:
DefaultLogin(TEXT(kDefaultCredentialsLogin)),
......@@ -44,8 +48,23 @@ bool UFixItSettings::SaveCredentials(const FString& NewLogin, const FString& New
UE_LOG(LogFixItCore, Error, TEXT("Could not save the new credentials: mutable default settings could not be grabbed"));
return false;
}
Instance->Login = NewLogin;
Instance->Token = NewToken;
const EBuildConfiguration BuildConfiguration = FApp::GetBuildConfiguration();
const FString& Key = LexToString(BuildConfiguration);
if (FFixItConnectionSettings* settings = Instance->GrabConnectionSettings(Key, true)) {
settings->Login = NewLogin;
settings->Token = NewToken;
}
#if WITH_EDITOR
Instance->PostEditChange();
#endif // WITH_EDITOR
Instance->SaveConfig();
return true;
}
bool UFixItSettings::SaveReporterName(const FString& NewValue)
{
UFixItSettings* Instance = GetMutableDefault<UFixItSettings>();
......@@ -65,6 +84,41 @@ bool UFixItSettings::SaveReporterName(const FString& NewValue)
return true;
}
FFixItConnectionSettings UFixItSettings::GetConnectionSettings(const FString& Key) const
{
// If the current configuration is not found, none will be created
for (const FFixItConnectionSettings& settings : ConnectionSettings) {
if (settings.Key == Key) {
return settings;
}
}
return {};
}
FFixItConnectionSettings UFixItSettings::GetConnectionSettingsForCurrentBuildConfiguration() const
{
const EBuildConfiguration BuildConfiguration = FApp::GetBuildConfiguration();
const FString& Key = LexToString(BuildConfiguration);
return GetConnectionSettings(Key);
}
FFixItConnectionSettings* UFixItSettings::GrabConnectionSettings(const FString& Key, bool CreateIfMissing)
{
for (FFixItConnectionSettings& settings : ConnectionSettings) {
if (settings.Key == Key) {
return &settings;
}
}
if (CreateIfMissing) {
const int32 Index = ConnectionSettings.Add({ Key });
return &ConnectionSettings[Index];
}
else
{
return nullptr;
}
}
#if WITH_EDITOR
void UFixItSettings::PostEditChangeProperty(struct FPropertyChangedEvent& PropertyChangedEvent)
{
......@@ -95,13 +149,15 @@ void UFixItSettings::CopyToInternal(UFixItSettings* Instance) {
UE_LOG(LogFixItCore, Error, TEXT("Could not save settings to the internal struct: null internal settings"));
return;
}
const FFixItConnectionSettings& settings = Instance->GetConnectionSettingsForCurrentBuildConfiguration();
Instance->Settings->DefaultLogin = FFixItTranslationLayer::ToStd(kDefaultCredentialsLogin);
Instance->Settings->DefaultToken = FFixItTranslationLayer::ToStd(kDefaultCredentialsToken);
Instance->Settings->Login = FFixItTranslationLayer::ToStd(Instance->Login);
Instance->Settings->Token = FFixItTranslationLayer::ToStd(Instance->Token);
Instance->Settings->ProjectName = FFixItTranslationLayer::ToStd(Instance->ProjectName);
Instance->Settings->URL = FFixItTranslationLayer::ToStd(Instance->URL);
Instance->Settings->Backend = FFixItBackend::GetMatchingBackendType(Instance->Backend);
Instance->Settings->Login = FFixItTranslationLayer::ToStd(settings.Login);
Instance->Settings->Token = FFixItTranslationLayer::ToStd(settings.Token);
Instance->Settings->ProjectName = FFixItTranslationLayer::ToStd(settings.ProjectName);
Instance->Settings->URL = FFixItTranslationLayer::ToStd(settings.URL);
Instance->Settings->Backend = FFixItBackend::GetMatchingBackendType(settings.Backend);
Instance->Settings->DefaultLabels = FFixItTranslationLayer::ToStd(Instance->DefaultLabels);
Instance->Settings->MaxTitleLength = Instance->MaxTitleLength;
}
......@@ -116,31 +172,15 @@ void UFixItSettings::ReadSettingsFromConfig() {
auto ReadSettingsFromConfig = [this](const FString& InConfigFilename)
{
GConfig->LoadFile(InConfigFilename);
FString DefaultLogin;
if (GConfig->GetString(TEXT("/Script/FixItCore.FixItSettings"), TEXT("DefaultLogin"), DefaultLogin, InConfigFilename)) {
this->DefaultLogin = DefaultLogin;
}
FString Login;
if (GConfig->GetString(TEXT("/Script/FixItCore.FixItSettings"), TEXT("Login"), Login, InConfigFilename)) {
this->Login = Login;
}
FString Token;
if (GConfig->GetString(TEXT("/Script/FixItCore.FixItSettings"), TEXT("Token"), Token, InConfigFilename)) {
this->Token = Token;
}
FString ProjectName;
if (GConfig->GetString(TEXT("/Script/FixItCore.FixItSettings"), TEXT("ProjectName"), ProjectName, InConfigFilename)) {
this->ProjectName = ProjectName;
}
FString URL;
if (GConfig->GetString(TEXT("/Script/FixItCore.FixItSettings"), TEXT("URL"), URL, InConfigFilename)) {
this->URL = URL;
}
FString Backend;
if (GConfig->GetString(TEXT("/Script/FixItCore.FixItSettings"), TEXT("Backend"), Backend, InConfigFilename)) {
const int32 index = StaticEnum<EFixItBackendType>()->GetIndexByNameString(Backend);
if (index != INDEX_NONE) {
this->Backend = static_cast<EFixItBackendType>(index);
TArray<FString> ConnectionSettings;
if (GConfig->GetArray(TEXT("/Script/FixItCore.FixItSettings"), TEXT("ConnectionSettings"), ConnectionSettings, InConfigFilename)) {
for (const FString& CurrentStr : ConnectionSettings) {
FFixItConnectionSettings CurrentSettings;
if (nullptr != FFixItConnectionSettings::StaticStruct()->ImportText(*CurrentStr, &CurrentSettings, nullptr, EPropertyPortFlags::PPF_None, nullptr, FFixItConnectionSettings::StaticStruct()->GetName(), true)) {
if (FFixItConnectionSettings* settings = this->GrabConnectionSettings(CurrentSettings.Key, true)) {
*settings = CurrentSettings;
}
}
}
}
TArray<FString> DefaultLabels;
......
......@@ -13,6 +13,33 @@ namespace fixit {
class Settings;
} // namespace fixit
/// All connection settings for a FixIt backend
USTRUCT(BlueprintType)
struct FIXITCORE_API FFixItConnectionSettings
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Connection Settings", meta = (ToolTip = "The name of these settings set"))
FString Key;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Connection Settings", meta = (ToolTip = "Login to use with the issue tracking platform (typically an email address), set it to override the default login"))
FString Login;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Connection Settings", meta = (ToolTip = "Token to use with the login (password or personal token depending on the backend), set it to override the default login"))
FString Token;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Connection Settings", meta = (ToolTip = "Project name to use with the issue tracking platform - This is usually case sensitive"))
FString ProjectName;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Connection Settings", meta = (ToolTip = "Base URL for the issue tracking platform"))
FString URL;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Connection Settings", meta = (ToolTip = "The issue tracking platform to be used for this project"))
EFixItBackendType Backend;
void SetFromString(const FString& data);
};
/// All settings pertaining to FixIt
UCLASS(config = FixIt, meta = (DisplayName = "FixIt"))
class FIXITCORE_API UFixItSettings : public UDeveloperSettings
......@@ -47,28 +74,45 @@ public:
*/
UFUNCTION(BlueprintCallable, Category = "FixIt")
static bool SaveReporterName(const FString& NewValue);
// Default identifiers
UPROPERTY(config, BlueprintReadOnly, Category = "Connection Settings", meta = (ToolTip = "Default login as a fallback to connect to the issue tracking platform"))
FString DefaultLogin;
// This is hardcoded so it does not appear in e.g. game files
const FString DefaultToken;
/**
* Get the connection settings for the given identifier
*
* @param Key The settings set identifier
*
* @return The connection settings for this identifier - or an empty one if not found
*/
UFUNCTION(BlueprintCallable, Category = "FixIt")
FFixItConnectionSettings GetConnectionSettings(const FString& Key) const;
// Override identifiers - those can be null, resulting in a fallback on the default login
UPROPERTY(config, EditAnywhere, BlueprintReadWrite, Category = "Connection Settings", meta = (ToolTip = "Login to use with the issue tracking platform (typically an email address), set it to override the default login"))
FString Login;
/**
* Get the connection settings for the current build configuration
*
* @return The connection settings for this build configuration - or an empty one if not found
*/
UFUNCTION(BlueprintCallable, Category = "FixIt")
FFixItConnectionSettings GetConnectionSettingsForCurrentBuildConfiguration() const;
UPROPERTY(config, EditAnywhere, BlueprintReadWrite, Category = "Connection Settings", meta = (ToolTip = "Token to use with the login (password or personal token depending on the backend), set it to override the default login"))
FString Token;
// Same as @see GetConnectionSettings() but this one can modify the configuration, which is why it is not exposed in BP
FFixItConnectionSettings* GrabConnectionSettings(const FString& Key, bool CreateIfMissing);
UPROPERTY(config, EditAnywhere, BlueprintReadOnly, Category = "Connection Settings", meta = (ToolTip = "Project name to use with the issue tracking platform - This is usually case sensitive"))
FString ProjectName;
/**
* Get the default login
*
* @return The default login value - might be empty
*/
UFUNCTION(BlueprintGetter, Category = "FixIt")
FString GetDefaultLogin() const { return DefaultLogin; }
UPROPERTY(config, EditAnywhere, BlueprintReadOnly, Category = "Connection Settings", meta = (ToolTip = "Base URL for the issue tracking platform"))
FString URL;
// Default identifiers - hardcoded so it does not appear in e.g. game files
UPROPERTY(VisibleAnywhere, BlueprintGetter = GetDefaultLogin, Category = "Connection Settings", meta = (ToolTip = "Default login as a fallback to connect to the issue tracking platform"))
FString DefaultLogin;
UPROPERTY(config, EditAnywhere, BlueprintReadOnly, Category = "Connection Settings", meta = (ToolTip = "The issue tracking platform to be used for this project"))
EFixItBackendType Backend;
const FString DefaultToken;
// Override identifiers - those can be null, resulting in a fallback on the default login
UPROPERTY(config, EditAnywhere, BlueprintReadOnly, Category = "Connection Settings", meta = (ToolTip = "All connection settings sets"))
TArray<FFixItConnectionSettings> ConnectionSettings;
UPROPERTY(config, EditAnywhere, BlueprintReadOnly, Category = "Bug Reporting", meta = (ToolTip = "Any labels that should be applied by defaults to any reported bug"))
TArray<FString> DefaultLabels;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment