Implement basic RPC configuration API endpoint (#864)

* Implement basic RPC information endpoint with test data

* Implement configuration options for RPC

* Rename RpcConfiguration to RpcResponse

* Rider insists on modifying dataSources.xml

* Implement documentation and fix code quality/gitignore issues

* Use SerializableAttribute instead of UsedImplicitlyAttribute

* Add warning regarding nullable assets

* Prevent precision issues with application ID

* Check asset properties for null/whitespace and return null
This commit is contained in:
koko 2023-08-12 18:27:45 -04:00 committed by GitHub
commit e072201ec7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 123 additions and 20 deletions

View file

@ -0,0 +1,18 @@
using LBPUnion.ProjectLighthouse.Configuration;
using LBPUnion.ProjectLighthouse.Servers.API.Responses;
using Microsoft.AspNetCore.Mvc;
namespace LBPUnion.ProjectLighthouse.Servers.API.Controllers;
public class RpcController : ApiEndpointController
{
/// <summary>
/// Returns basic information that Discord RPC clients can use for self-configuration.
/// </summary>
/// <returns>RpcResponse</returns>
/// <response code="200">The RPC configuration.</response>
[HttpGet("rpc")]
[ProducesResponseType(typeof(RpcResponse), StatusCodes.Status200OK)]
public IActionResult GetRpcConfiguration() =>
this.Ok(RpcResponse.CreateFromConfiguration(ServerConfiguration.Instance.RichPresenceConfiguration));
}

View file

@ -0,0 +1,33 @@
#nullable disable
using LBPUnion.ProjectLighthouse.Configuration.ConfigurationCategories;
namespace LBPUnion.ProjectLighthouse.Servers.API.Responses;
public class RpcResponse
{
public string ApplicationId { get; set; }
public string PartyIdPrefix { get; set; }
public UsernameType UsernameType { get; set; }
public RpcAssets Assets { get; set; }
public static RpcResponse CreateFromConfiguration(RichPresenceConfiguration configuration) =>
new()
{
ApplicationId = configuration.ApplicationId,
PartyIdPrefix = configuration.PartyIdPrefix,
UsernameType = configuration.UsernameType,
Assets = new RpcAssets
{
PodAsset = AssetConvertNull(configuration.Assets.PodAsset),
MoonAsset = AssetConvertNull(configuration.Assets.MoonAsset),
RemoteMoonAsset = AssetConvertNull(configuration.Assets.RemoteMoonAsset),
DeveloperAsset = AssetConvertNull(configuration.Assets.DeveloperAsset),
DeveloperAdventureAsset = AssetConvertNull(configuration.Assets.DeveloperAdventureAsset),
DlcAsset = AssetConvertNull(configuration.Assets.DlcAsset),
FallbackAsset = AssetConvertNull(configuration.Assets.FallbackAsset),
},
};
private static string AssetConvertNull(string asset) => string.IsNullOrWhiteSpace(asset) ? null : asset;
}