From ab2d9176b6ddd88d61816d72c7ec489f7c1411e6 Mon Sep 17 00:00:00 2001 From: Kat Date: Thu, 2 Jan 2025 13:32:08 -0800 Subject: [PATCH] Notify a user when their highscore is beaten --- .../Controllers/Slots/ScoreController.cs | 14 +++++++++-- .../Database/DatabaseContext.Notifications.cs | 23 +++++++++++-------- .../Types/Entities/Level/SlotEntity.cs | 3 +++ .../Types/Entities/Profile/UserEntity.cs | 3 +++ 4 files changed, 32 insertions(+), 11 deletions(-) diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/ScoreController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/ScoreController.cs index 79ae31632..d80d2cbc5 100644 --- a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/ScoreController.cs +++ b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/ScoreController.cs @@ -5,6 +5,7 @@ using LBPUnion.ProjectLighthouse.Logging; using LBPUnion.ProjectLighthouse.StorableLists.Stores; using LBPUnion.ProjectLighthouse.Types.Entities.Level; +using LBPUnion.ProjectLighthouse.Types.Entities.Profile; using LBPUnion.ProjectLighthouse.Types.Entities.Token; using LBPUnion.ProjectLighthouse.Types.Levels; using LBPUnion.ProjectLighthouse.Types.Logging; @@ -159,7 +160,7 @@ public async Task SubmitScore(string slotType, int id, int childI await this.database.SaveChangesAsync(); - return this.Ok(await this.GetScores(new LeaderboardOptions + ScoreboardResponse scores = await this.GetScores(new LeaderboardOptions { RootName = "scoreboardSegment", PageSize = 5, @@ -169,7 +170,16 @@ public async Task SubmitScore(string slotType, int id, int childI ScoreType = score.Type, TargetUser = token.UserId, TargetPlayerIds = null, - })); + }); + + if (score.Type == 1 && scores.YourRank == 1 && scores.Total > 1) + { + GameScore? second = scores.Scores[1]; + UserEntity? user = await this.database.UserFromGameToken(token); + await this.database.SendNotification(second.UserId, $"{user?.InfoXml} beat your highscore ({second.Points}) on {slot.InfoXml} with a score of {score.Points}.", true); + } + + return this.Ok(scores); } [HttpGet("scoreboard/{slotType}/{id:int}")] diff --git a/ProjectLighthouse/Database/DatabaseContext.Notifications.cs b/ProjectLighthouse/Database/DatabaseContext.Notifications.cs index 8fefaec86..9ba8b20ee 100644 --- a/ProjectLighthouse/Database/DatabaseContext.Notifications.cs +++ b/ProjectLighthouse/Database/DatabaseContext.Notifications.cs @@ -15,9 +15,10 @@ public partial class DatabaseContext /// /// The user ID of the target user. /// The message to send. + /// Ignore the prepended server name/timestamp. /// The for the notification. Defaults to ModerationNotification. public async Task SendNotification - (int userId, string text, NotificationType type = NotificationType.ModerationNotification) + (int userId, string text, bool noPrefix = false, NotificationType type = NotificationType.ModerationNotification) { if (!await this.Users.AnyAsync(u => u.UserId == userId)) { @@ -31,15 +32,19 @@ public async Task SendNotification StringBuilder builder = new(text); - // Prepend server name to notification text if enabled - if (ServerConfiguration.Instance.NotificationConfiguration.ShowServerNameInText) + if (!noPrefix) { - builder.Insert(0, $"[{ServerConfiguration.Instance.Customization.ServerName}] "); - } - // Prepend timestamp to notification text if enabled - if (ServerConfiguration.Instance.NotificationConfiguration.ShowTimestampInText) - { - builder.Insert(0, $"[{DateTime.Now:g}] "); + // Prepend server name to notification text if enabled + if (ServerConfiguration.Instance.NotificationConfiguration.ShowServerNameInText) + { + builder.Insert(0, $"[{ServerConfiguration.Instance.Customization.ServerName}] "); + } + + // Prepend timestamp to notification text if enabled + if (ServerConfiguration.Instance.NotificationConfiguration.ShowTimestampInText) + { + builder.Insert(0, $"[{DateTime.Now:g}] "); + } } NotificationEntity notification = new() diff --git a/ProjectLighthouse/Types/Entities/Level/SlotEntity.cs b/ProjectLighthouse/Types/Entities/Level/SlotEntity.cs index 693bf4aa4..bd6a7bb07 100644 --- a/ProjectLighthouse/Types/Entities/Level/SlotEntity.cs +++ b/ProjectLighthouse/Types/Entities/Level/SlotEntity.cs @@ -29,6 +29,9 @@ public class SlotEntity public string IconHash { get; set; } = ""; + [NotMapped] + public string InfoXml => $"{this.Name}"; + public bool IsAdventurePlanet { get; set; } public string RootLevel { get; set; } = ""; diff --git a/ProjectLighthouse/Types/Entities/Profile/UserEntity.cs b/ProjectLighthouse/Types/Entities/Profile/UserEntity.cs index 998c63b84..fb4950349 100644 --- a/ProjectLighthouse/Types/Entities/Profile/UserEntity.cs +++ b/ProjectLighthouse/Types/Entities/Profile/UserEntity.cs @@ -28,6 +28,9 @@ public class UserEntity public string IconHash { get; set; } + [NotMapped] + public string InfoXml => $"{this.Username}"; + /// /// A user-customizable biography shown on the profile card ///