From 301e5d0d32651fc0ccf10ac17d0b4e6d4b77a632 Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 10 Jan 2025 21:25:56 -0600 Subject: [PATCH 1/2] Update Github Action versions (#1085) * Update CI actions * Update from deprecated Qodana actions version --- .github/workflows/ci.yml | 2 +- .github/workflows/qodana_code_quality.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cadb9d5d4..18fe81326 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: - name: Start MySQL if: ${{ matrix.os.database }} - uses: shogo82148/actions-setup-mysql@v1.14.1 + uses: shogo82148/actions-setup-mysql@v1.40.0 with: mysql-version: '8.0' root-password: ${{ env.DB_PASSWORD }} diff --git a/.github/workflows/qodana_code_quality.yml b/.github/workflows/qodana_code_quality.yml index b3df742ba..e7b9e0893 100644 --- a/.github/workflows/qodana_code_quality.yml +++ b/.github/workflows/qodana_code_quality.yml @@ -22,12 +22,12 @@ jobs: ref: ${{ github.event.pull_request.head.sha }} # to check out the actual pull request commit, not the merge commit fetch-depth: 0 # a full history is required for pull request analysis - name: 'Qodana Scan' - uses: JetBrains/qodana-action@v2024.1 + uses: JetBrains/qodana-action@v2024.3 with: pr-mode: false env: QODANA_TOKEN: ${{ secrets.QODANA_TOKEN_1488465344 }} QODANA_ENDPOINT: 'https://qodana.cloud' - - uses: github/codeql-action/upload-sarif@v2 + - uses: github/codeql-action/upload-sarif@v3 with: sarif_file: ${{ runner.temp }}/qodana/results/qodana.sarif.json From 4f9dc2a52d88765269916b157c1ee6818a097e62 Mon Sep 17 00:00:00 2001 From: Kat <30480654+Metraberryy@users.noreply.github.com> Date: Fri, 10 Jan 2025 19:44:53 -0800 Subject: [PATCH 2/2] Notify a user when their highscore is beaten (#1083) * Notify a user when their highscore is beaten * formatting Co-authored-by: sudokoko * noPrefix -> prefix * documentation and fix closing tag * better documentation --------- Co-authored-by: sudokoko Co-authored-by: Josh --- .../Controllers/Slots/ScoreController.cs | 15 ++++++++++-- .../Database/DatabaseContext.Notifications.cs | 23 +++++++++++-------- .../Types/Entities/Level/SlotEntity.cs | 7 ++++++ .../Types/Entities/Profile/UserEntity.cs | 7 ++++++ 4 files changed, 41 insertions(+), 11 deletions(-) diff --git a/ProjectLighthouse.Servers.GameServer/Controllers/Slots/ScoreController.cs b/ProjectLighthouse.Servers.GameServer/Controllers/Slots/ScoreController.cs index 79ae31632..8a859fd73 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,17 @@ 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..d22af72e4 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. + /// Prepend 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 prefix = true, 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 (prefix) { - 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..07d65c045 100644 --- a/ProjectLighthouse/Types/Entities/Level/SlotEntity.cs +++ b/ProjectLighthouse/Types/Entities/Level/SlotEntity.cs @@ -29,6 +29,13 @@ public class SlotEntity public string IconHash { get; set; } = ""; + /// + /// Markup that displays the level name next to its badge. + /// This can be used everywhere markup works ingame, e.g. news or notifications + /// + [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..6fb653016 100644 --- a/ProjectLighthouse/Types/Entities/Profile/UserEntity.cs +++ b/ProjectLighthouse/Types/Entities/Profile/UserEntity.cs @@ -28,6 +28,13 @@ public class UserEntity public string IconHash { get; set; } + /// + /// Markup that displays the username next to a polaroid with the user's icon. + /// This can be used everywhere markup works ingame, e.g. news or notifications + /// + [NotMapped] + public string InfoXml => $"{this.Username}"; + /// /// A user-customizable biography shown on the profile card ///