Skip to content

Commit

Permalink
All user to override settings for quick match via INI
Browse files Browse the repository at this point in the history
  • Loading branch information
devo1929 committed May 30, 2022
1 parent d2dfbcb commit 71add0e
Show file tree
Hide file tree
Showing 8 changed files with 160 additions and 72 deletions.
2 changes: 2 additions & 0 deletions ClientCore/ClientConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,8 @@ public string GetThemePath(string themeName)

public string MPMapsIniPath => clientDefinitionsIni.GetStringValue(SETTINGS, "MPMapsPath", "INI/MPMaps.ini");

public string QuickMatchPath => clientDefinitionsIni.GetStringValue(SETTINGS, "QuickMatchPath", "INI/QuickMatch.ini");

public string KeyboardINI => clientDefinitionsIni.GetStringValue(SETTINGS, "KeyboardINI", "Keyboard.ini");

public int MinimumIngameWidth => clientDefinitionsIni.GetIntValue(SETTINGS, "MinimumIngameWidth", 640);
Expand Down
2 changes: 2 additions & 0 deletions DXMainClient/DXMainClient.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,7 @@
<Compile Include="Domain\Multiplayer\CnCNet\QuickMatch\QmLoginEventArgs.cs" />
<Compile Include="Domain\Multiplayer\CnCNet\QuickMatch\QmMapSelectedEventArgs.cs" />
<Compile Include="Domain\Multiplayer\CnCNet\QuickMatch\QmSettings.cs" />
<Compile Include="Domain\Multiplayer\CnCNet\QuickMatch\QmUserSettings.cs" />
<Compile Include="Domain\Multiplayer\CnCNet\QuickMatch\QmData.cs" />
<Compile Include="Domain\Multiplayer\CnCNet\QuickMatch\QmLadder.cs" />
<Compile Include="Domain\Multiplayer\CnCNet\QuickMatch\QmLadderMap.cs" />
Expand All @@ -450,6 +451,7 @@
<Compile Include="Domain\Multiplayer\CnCNet\QuickMatch\QuickMatchApiService.cs" />
<Compile Include="Domain\Multiplayer\CnCNet\QuickMatch\QuickMatchService.cs" />
<Compile Include="Domain\Multiplayer\CnCNet\QuickMatch\QuickMatchSettingsService.cs" />
<Compile Include="Domain\Multiplayer\CnCNet\QuickMatch\QuickMatchUserSettingsService.cs" />
<Compile Include="Domain\Multiplayer\CnCNet\QuickMatch\QuickMatchStatusMessage.cs" />
<Compile Include="Domain\Multiplayer\CoopHouseInfo.cs" />
<Compile Include="Domain\Multiplayer\CoopMapInfo.cs" />
Expand Down
17 changes: 14 additions & 3 deletions DXMainClient/Domain/Multiplayer/CnCNet/QuickMatch/QmSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,20 @@
{
public class QmSettings
{
public string Email { get; set; }
public const string DefaultBaseUrl = "https://ladder.cncnet.org";
public const string DefaultLoginUrl = "/api/v1/auth/login";
public const string DefaultRefreshUrl = "/api/v1/auth/refresh";
public const string DefaultServerStatusUrl = "/api/v1/ping";
public const string DefaultGetUserAccountsUrl = "/api/v1/user/account";
public const string DefaultGetLaddersUrl = "/api/v1/ladder";
public const string DefaultGetLadderMapsUrl = "/api/v1/qm/ladder/{0}/maps";

public string Ladder { get; set; }
public QmAuthData AuthData { get; set; }
public string BaseUrl { get; set; } = DefaultBaseUrl;
public string LoginUrl { get; set; } = DefaultLoginUrl;
public string RefreshUrl { get; set; } = DefaultRefreshUrl;
public string ServerStatusUrl { get; set; } = DefaultServerStatusUrl;
public string GetUserAccountsUrl { get; set; } = DefaultGetUserAccountsUrl;
public string GetLaddersUrl { get; set; } = DefaultGetLaddersUrl;
public string GetLadderMapsUrl { get; set; } = DefaultGetLadderMapsUrl;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace DTAClient.Domain.Multiplayer.CnCNet.QuickMatch
{
public class QmUserSettings
{
public string Email { get; set; }
public string Ladder { get; set; }
public QmAuthData AuthData { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,15 @@ namespace DTAClient.Domain.Multiplayer.CnCNet.QuickMatch
{
public class QuickMatchApiService
{
private const string BaseUrl = "https://ladder.cncnet.org";
private const string RoutePrefix = "/api/v1";
private static readonly string LoginUrl = $"{RoutePrefix}/auth/login";
private static readonly string RefreshUrl = $"{RoutePrefix}/auth/refresh";
private static readonly string ServerStatusUrl = $"{RoutePrefix}/ping";
private static readonly string GetUserAccountsUrl = $"{RoutePrefix}/user/account";
private static readonly string GetLaddersUrl = $"{RoutePrefix}/ladder";
private static readonly string GetLadderMapsUrlFormat = RoutePrefix + "/qm/ladder/{0}/maps";

private readonly QmSettings qmSettings;
private string _token;

public QuickMatchApiService()
{
var settingsService = new QuickMatchSettingsService();
qmSettings = settingsService.LoadSettings();
}

public void SetToken(string token)
{
_token = token;
Expand All @@ -28,7 +26,7 @@ public void SetToken(string token)
public async Task<IEnumerable<QmLadderMap>> FetchLadderMapsForAbbrAsync(string ladderAbbreviation)
{
var httpClient = CreateAuthenticatedClient();
string url = string.Format(GetLadderMapsUrlFormat, ladderAbbreviation);
string url = string.Format(qmSettings.GetLadderMapsUrl, ladderAbbreviation);
var response = await httpClient.GetAsync(url);
if (!response.IsSuccessStatusCode)
throw new ClientException($"Error fetching ladder maps: {response.ReasonPhrase}");
Expand All @@ -39,7 +37,7 @@ public async Task<IEnumerable<QmLadderMap>> FetchLadderMapsForAbbrAsync(string l
public async Task<IEnumerable<QmUserAccount>> FetchUserAccountsAsync()
{
var httpClient = CreateAuthenticatedClient();
var response = await httpClient.GetAsync(GetUserAccountsUrl);
var response = await httpClient.GetAsync(qmSettings.GetUserAccountsUrl);
if (!response.IsSuccessStatusCode)
throw new ClientException($"Error fetching user accounts: {response.ReasonPhrase}");

Expand All @@ -49,7 +47,7 @@ public async Task<IEnumerable<QmUserAccount>> FetchUserAccountsAsync()
public async Task<IEnumerable<QmLadder>> FetchLaddersAsync()
{
var httpClient = CreateAuthenticatedClient();
var response = await httpClient.GetAsync(GetLaddersUrl);
var response = await httpClient.GetAsync(qmSettings.GetLaddersUrl);
if (!response.IsSuccessStatusCode)
throw new ClientException($"Error fetching ladders: {response.ReasonPhrase}");

Expand All @@ -64,7 +62,7 @@ public async Task<QmAuthData> LoginAsync(string email, string password)
Email = email,
Password = password
});
var response = await httpClient.PostAsync(LoginUrl, postBodyContent);
var response = await httpClient.PostAsync(qmSettings.LoginUrl, postBodyContent);
if (!response.IsSuccessStatusCode)
throw new ClientException($"Error logging in: {response.ReasonPhrase}");

Expand All @@ -76,7 +74,7 @@ public async Task<QmAuthData> LoginAsync(string email, string password)
public async Task<QmAuthData> RefreshAsync()
{
var httpClient = CreateAuthenticatedClient();
var response = await httpClient.GetAsync(RefreshUrl);
var response = await httpClient.GetAsync(qmSettings.RefreshUrl);
if (!response.IsSuccessStatusCode)
throw new ClientException($"Error refreshing token: {response.ReasonPhrase}");

Expand All @@ -88,15 +86,15 @@ public async Task<QmAuthData> RefreshAsync()
public bool IsServerAvailable()
{
var httpClient = CreateAuthenticatedClient();
var response = httpClient.GetAsync(ServerStatusUrl).Result;
var response = httpClient.GetAsync(qmSettings.ServerStatusUrl).Result;
return response.IsSuccessStatusCode;
}

private static HttpClient CreateHttpClient()
private HttpClient CreateHttpClient()
{
var httpClient = new HttpClient
{
BaseAddress = new Uri(BaseUrl)
BaseAddress = new Uri(qmSettings.BaseUrl)
};

return httpClient;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ namespace DTAClient.Domain.Multiplayer.CnCNet.QuickMatch
{
public class QuickMatchService
{
private readonly QuickMatchSettingsService settingsService;
private readonly QuickMatchUserSettingsService userSettingsService;
private readonly QuickMatchApiService apiService;
private readonly QmSettings qmSettings;
private readonly QmUserSettings qmUserSettings;
private readonly QmData qmData;

private static QuickMatchService Instance;
Expand All @@ -27,9 +27,9 @@ public class QuickMatchService

private QuickMatchService()
{
settingsService = new QuickMatchSettingsService();
userSettingsService = new QuickMatchUserSettingsService();
apiService = new QuickMatchApiService();
qmSettings = settingsService.LoadSettings();
qmUserSettings = userSettingsService.LoadSettings();
qmData = new QmData();
}

Expand Down Expand Up @@ -67,8 +67,8 @@ public async Task LoginAsync(string email, string password)
/// </summary>
public void Logout()
{
settingsService.ClearAuthData();
settingsService.SaveSettings();
userSettingsService.ClearAuthData();
userSettingsService.SaveSettings();
LoginEvent?.Invoke(this, new QmLoginEventArgs(QmLoginEventStatusEnum.Logout));
}

Expand Down Expand Up @@ -100,20 +100,20 @@ public async Task RefreshAsync()

public QmLadder GetLadderForId(int ladderId) => qmData.Ladders.FirstOrDefault(l => l.Id == ladderId);

public string GetCachedEmail() => qmSettings.Email;
public string GetCachedEmail() => qmUserSettings.Email;

public string GetCachedLadder() => qmSettings.Ladder;
public string GetCachedLadder() => qmUserSettings.Ladder;

public bool IsServerAvailable() => apiService.IsServerAvailable();

public bool IsLoggedIn()
{
if (qmSettings.AuthData == null)
if (qmUserSettings.AuthData == null)
return false;

try
{
DecodeToken(qmSettings.AuthData.Token);
DecodeToken(qmUserSettings.AuthData.Token);
}
catch (TokenExpiredException)
{
Expand All @@ -126,15 +126,15 @@ public bool IsLoggedIn()
return false;
}

apiService.SetToken(qmSettings.AuthData.Token);
apiService.SetToken(qmUserSettings.AuthData.Token);

return true;
}

public void SetLadder(string ladder)
{
qmSettings.Ladder = ladder;
settingsService.SaveSettings();
qmUserSettings.Ladder = ladder;
userSettingsService.SaveSettings();

FetchLadderMapsForAbbrAsync(ladder);
}
Expand Down Expand Up @@ -165,14 +165,14 @@ private async Task FinishLogin(QmAuthData authData, bool refresh, string email =
{
if (authData == null)
{
settingsService.ClearAuthData();
userSettingsService.ClearAuthData();
LoginEvent?.Invoke(this, new QmLoginEventArgs(refresh ? QmLoginEventStatusEnum.FailedRefresh : QmLoginEventStatusEnum.Unauthorized));
return;
}

qmSettings.AuthData = authData;
qmSettings.Email = email ?? qmSettings.Email;
settingsService.SaveSettings();
qmUserSettings.AuthData = authData;
qmUserSettings.Email = email ?? qmUserSettings.Email;
userSettingsService.SaveSettings();
await FetchDataAsync();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
using System;
using System.IO;
using System.IO;
using ClientCore;
using Newtonsoft.Json;
using Rampastring.Tools;

namespace DTAClient.Domain.Multiplayer.CnCNet.QuickMatch
{
public class QuickMatchSettingsService
{
private static readonly string SettingsFile = $"{ProgramConstants.ClientUserFilesPath}QuickMatchSettings.ini";
private static readonly string SettingsFile = ClientConfiguration.Instance.QuickMatchPath;

private const string BasicSectionKey = "Basic";
private const string AuthDataKey = "AuthData";
private const string EmailKey = "Email";
private const string LadderKey = "Ladder";

private const string BaseUrlKey = "BaseUrl";
private const string LoginUrlKey = "LoginUrl";
private const string RefreshUrlKey = "RefreshUrl";
private const string ServerStatusUrlKey = "ServerStatusUrl";
private const string GetUserAccountsUrlKey = "GetUserAccountsUrl";
private const string GetLaddersUrlKey = "GetLaddersUrl";
private const string GetLadderMapsUrlKey = "GetLadderMapsUrlFormat";


private QmSettings qmSettings;

Expand All @@ -24,49 +28,36 @@ public QmSettings LoadSettings()

qmSettings = new QmSettings();
if (!File.Exists(SettingsFile))
return qmSettings;
SaveSettings(); // init the settings file

var iniFile = new IniFile(SettingsFile);
var basicSection = iniFile.GetSection(BasicSectionKey);
if (basicSection == null)
return qmSettings;

qmSettings.AuthData = GetAuthData(basicSection);
qmSettings.Email = basicSection.GetStringValue(EmailKey, null);
qmSettings.Ladder = basicSection.GetStringValue(LadderKey, null);
qmSettings.BaseUrl = basicSection.GetStringValue(BaseUrlKey, QmSettings.DefaultBaseUrl);
qmSettings.LoginUrl = basicSection.GetStringValue(LoginUrlKey, QmSettings.DefaultLoginUrl);
qmSettings.RefreshUrl = basicSection.GetStringValue(RefreshUrlKey, QmSettings.DefaultRefreshUrl);
qmSettings.ServerStatusUrl = basicSection.GetStringValue(ServerStatusUrlKey, QmSettings.DefaultServerStatusUrl);
qmSettings.GetUserAccountsUrl = basicSection.GetStringValue(GetUserAccountsUrlKey, QmSettings.DefaultGetUserAccountsUrl);
qmSettings.GetLaddersUrl = basicSection.GetStringValue(GetLaddersUrlKey, QmSettings.DefaultGetLaddersUrl);
qmSettings.GetLadderMapsUrl = basicSection.GetStringValue(GetLadderMapsUrlKey, QmSettings.DefaultGetLadderMapsUrl);

return qmSettings;
}

private static QmAuthData GetAuthData(IniSection section)
{
if (!section.KeyExists(AuthDataKey))
return null;

string authDataValue = section.GetStringValue(AuthDataKey, null);
if (string.IsNullOrEmpty(authDataValue))
return null;

try
{
return JsonConvert.DeserializeObject<QmAuthData>(authDataValue);
}
catch (Exception e)
{
Logger.Log(e.StackTrace);
return null;
}
}

public void ClearAuthData() => qmSettings.AuthData = null;

public void SaveSettings()
{
var iniFile = new IniFile();
var basicSection = new IniSection(BasicSectionKey);
basicSection.AddKey(EmailKey, qmSettings.Email ?? string.Empty);
basicSection.AddKey(LadderKey, qmSettings.Ladder ?? string.Empty);
basicSection.AddKey(AuthDataKey, JsonConvert.SerializeObject(qmSettings.AuthData) ?? string.Empty);
basicSection.AddKey(BaseUrlKey, qmSettings.BaseUrl);
basicSection.AddKey(LoginUrlKey, qmSettings.LoginUrl);
basicSection.AddKey(RefreshUrlKey, qmSettings.RefreshUrl);
basicSection.AddKey(ServerStatusUrlKey, qmSettings.ServerStatusUrl);
basicSection.AddKey(GetUserAccountsUrlKey, qmSettings.GetUserAccountsUrl);
basicSection.AddKey(GetLaddersUrlKey, qmSettings.GetLaddersUrl);
basicSection.AddKey(GetLadderMapsUrlKey, qmSettings.GetLadderMapsUrl);

iniFile.AddSection(basicSection);
iniFile.WriteIniFile(SettingsFile);
Expand Down
Loading

0 comments on commit 71add0e

Please sign in to comment.