Implement basic privacy settings (#392)

* Add ability for clients to submit and retrieve privacy settings data

* Make slot pages and user pages respect user's privacy settings

* Prevent webhook from publishing new levels if user's privacy settings disallow it

* Hide levels/profiles from respective pages depending on privacy settings

* Apply suggestions from review
This commit is contained in:
Jayden 2022-08-02 18:22:56 -04:00 committed by GitHub
commit 2ab1e72037
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 210 additions and 12 deletions

View file

@ -1,7 +1,9 @@
#nullable enable
using System.Diagnostics.CodeAnalysis;
using System.Xml.Serialization;
using LBPUnion.ProjectLighthouse.Configuration;
using LBPUnion.ProjectLighthouse.PlayerData;
using LBPUnion.ProjectLighthouse.PlayerData.Profiles;
using LBPUnion.ProjectLighthouse.Types;
using Microsoft.AspNetCore.Mvc;
@ -45,12 +47,56 @@ public class ClientConfigurationController : ControllerBase
[HttpGet("privacySettings")]
[Produces("text/xml")]
public IActionResult PrivacySettings()
public async Task<IActionResult> GetPrivacySettings()
{
User? user = await this.database.UserFromGameRequest(this.Request);
if (user == null) return this.StatusCode(403, "");
PrivacySettings ps = new()
{
LevelVisibility = "all",
ProfileVisibility = "all",
LevelVisibility = user.LevelVisibility.ToSerializedString(),
ProfileVisibility = user.ProfileVisibility.ToSerializedString(),
};
return this.Ok(ps.Serialize());
}
[HttpPost("privacySettings")]
[Produces("text/xml")]
public async Task<IActionResult> SetPrivacySetting()
{
User? user = await this.database.UserFromGameRequest(this.Request);
if (user == null) return this.StatusCode(403, "");
this.Request.Body.Position = 0;
string bodyString = await new StreamReader(this.Request.Body).ReadToEndAsync();
XmlSerializer serializer = new(typeof(PrivacySettings));
PrivacySettings? settings = (PrivacySettings?)serializer.Deserialize(new StringReader(bodyString));
if (settings == null) return this.BadRequest();
if (settings.LevelVisibility != null)
{
PrivacyType? type = PrivacyTypeExtensions.FromSerializedString(settings.LevelVisibility);
if (type == null) return this.BadRequest();
user.LevelVisibility = (PrivacyType)type;
}
if (settings.ProfileVisibility != null)
{
PrivacyType? type = PrivacyTypeExtensions.FromSerializedString(settings.ProfileVisibility);
if (type == null) return this.BadRequest();
user.ProfileVisibility = (PrivacyType)type;
}
await this.database.SaveChangesAsync();
PrivacySettings ps = new()
{
LevelVisibility = user.LevelVisibility.ToSerializedString(),
ProfileVisibility = user.ProfileVisibility.ToSerializedString(),
};
return this.Ok(ps.Serialize());

View file

@ -234,13 +234,13 @@ public class PublishController : ControllerBase
this.database.Slots.Add(slot);
await this.database.SaveChangesAsync();
await WebhookHelper.SendWebhook
(
"New level published!",
$"**{user.Username}** just published a new level: [**{slot.Name}**]({ServerConfiguration.Instance.ExternalUrl}/slot/{slot.SlotId})\n{slot.Description}"
);
if (user.LevelVisibility == PrivacyType.All)
{
await WebhookHelper.SendWebhook("New level published!",
$"**{user.Username}** just published a new level: [**{slot.Name}**]({ServerConfiguration.Instance.ExternalUrl}/slot/{slot.SlotId})\n{slot.Description}");
}
Logger.Success($"Successfully published level {slot.Name} (id: {slot.SlotId}) by {user.Username} (id: {user.UserId})", LogArea.Publish);
return this.Ok(slot.Serialize(gameToken.GameVersion));