From ebf9c8b42110d2980ea93f440b3cbfa26f301fd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=E2=96=88=E2=96=88=E2=96=88=E2=96=88=E2=96=88?= Date: Tue, 4 Mar 2025 17:14:07 -0500 Subject: [PATCH] feat: upserting twitch user records --- .../ChatRules/BestCheapViewersTests.cs | 1 + .../Nullinside.Api.TwitchBot.Tests.csproj | 4 +- .../Model/NullinsideContextExtensions.cs | 38 +++++++------------ .../Nullinside.Api.TwitchBot.csproj | 5 ++- src/nullinside-api | 2 +- 5 files changed, 21 insertions(+), 29 deletions(-) diff --git a/src/Nullinside.Api.TwitchBot.Tests/ChatRules/BestCheapViewersTests.cs b/src/Nullinside.Api.TwitchBot.Tests/ChatRules/BestCheapViewersTests.cs index 4984d8a..7799a91 100644 --- a/src/Nullinside.Api.TwitchBot.Tests/ChatRules/BestCheapViewersTests.cs +++ b/src/Nullinside.Api.TwitchBot.Tests/ChatRules/BestCheapViewersTests.cs @@ -41,6 +41,7 @@ public class BestCheapViewersTests : AChatRuleUnitTestBase { [TestCase("Chea̓p viewers on streamboo. com (remove the space) @ND80DOGe")] [TestCase("Bestͮ vie͐wers ̷on cutt.ly/EeK6Anda")] [TestCase("Bestͮ vie͐wers ̷on viewerszone.online")] + [TestCase("Best viěw\u0310e\u0329rs \u0333o\u032bno\u034en streamboo .com ( remove the space ) @WSZ7tPNI")] public async Task TestKnownStrings(string badString) { var rule = new BestCheapViewers(); var botProxy = new Mock(); diff --git a/src/Nullinside.Api.TwitchBot.Tests/Nullinside.Api.TwitchBot.Tests.csproj b/src/Nullinside.Api.TwitchBot.Tests/Nullinside.Api.TwitchBot.Tests.csproj index f0d82ed..3fb568a 100644 --- a/src/Nullinside.Api.TwitchBot.Tests/Nullinside.Api.TwitchBot.Tests.csproj +++ b/src/Nullinside.Api.TwitchBot.Tests/Nullinside.Api.TwitchBot.Tests.csproj @@ -14,8 +14,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/src/Nullinside.Api.TwitchBot/Model/NullinsideContextExtensions.cs b/src/Nullinside.Api.TwitchBot/Model/NullinsideContextExtensions.cs index 3c92c2f..dc03ed8 100644 --- a/src/Nullinside.Api.TwitchBot/Model/NullinsideContextExtensions.cs +++ b/src/Nullinside.Api.TwitchBot/Model/NullinsideContextExtensions.cs @@ -161,30 +161,20 @@ private static async Task UpdateOAuthInDatabase(this INullinsideContext db, /// The stopping token. public static async Task SaveTwitchBans(this INullinsideContext db, string channelId, IEnumerable<(string Id, string Username)> bannedUsers, string reason, CancellationToken stoppingToken = new()) { - List banUserIds = bannedUsers.Select(b => b.Id).ToHashSet().ToList(); - HashSet existingUsers = db.TwitchUser - .AsNoTracking() - .Where(u => null != u.TwitchId && banUserIds.Contains(u.TwitchId)) - .Select(u => u.TwitchId) - .ToHashSet(); - - List nonExistantUsers = banUserIds - .Where(u => !existingUsers.Contains(u)) - .Select(c => new TwitchUser { - TwitchId = c, - TwitchUsername = bannedUsers.FirstOrDefault(u => string.Equals(u.Id, c)).Username - }) - .ToList(); - - db.TwitchUser.UpdateRange(nonExistantUsers); - db.TwitchBan - .AddRange(banUserIds - .Select(i => new TwitchBan { - ChannelId = channelId, - BannedUserTwitchId = i, - Reason = reason, - Timestamp = DateTime.UtcNow - })); + await db.TwitchUser.UpsertRange( + bannedUsers.Select(c => new TwitchUser { TwitchId = c.Id, TwitchUsername = c.Username }) + .ToList() + ) + .On(v => new { v.TwitchId }) + .RunAsync(stoppingToken); + + db.TwitchBan.AddRange( + bannedUsers.Select(i => new TwitchBan { + ChannelId = channelId, + BannedUserTwitchId = i.Id, + Reason = reason, + Timestamp = DateTime.UtcNow + })); await db.SaveChangesAsync(stoppingToken); } } \ No newline at end of file diff --git a/src/Nullinside.Api.TwitchBot/Nullinside.Api.TwitchBot.csproj b/src/Nullinside.Api.TwitchBot/Nullinside.Api.TwitchBot.csproj index 5229f85..12ee861 100644 --- a/src/Nullinside.Api.TwitchBot/Nullinside.Api.TwitchBot.csproj +++ b/src/Nullinside.Api.TwitchBot/Nullinside.Api.TwitchBot.csproj @@ -21,9 +21,10 @@ + - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/nullinside-api b/src/nullinside-api index aa08d21..221c1c9 160000 --- a/src/nullinside-api +++ b/src/nullinside-api @@ -1 +1 @@ -Subproject commit aa08d219a5cc12fbef0c1a420aee92cde549c7a8 +Subproject commit 221c1c9e96625c1a17defee4c956625f88c54ec8