From 5bdc21ebc59e40e5c9f65beb8bf3fd4b933b2e07 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Wed, 2 Jul 2025 21:09:35 +0800 Subject: [PATCH] :lipstick: Optimize activity service --- .../Activity/ActivityService.cs | 34 +++++++++++++------ .../Connection/WebReader/WebFeedService.cs | 8 ++--- DysonNetwork.sln.DotSettings.user | 1 + 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/DysonNetwork.Sphere/Activity/ActivityService.cs b/DysonNetwork.Sphere/Activity/ActivityService.cs index a7c49fd..a3a5afe 100644 --- a/DysonNetwork.Sphere/Activity/ActivityService.cs +++ b/DysonNetwork.Sphere/Activity/ActivityService.cs @@ -42,17 +42,31 @@ public class ActivityService( if (debugInclude.Contains("articles") || Random.Shared.NextDouble() < 0.2) { - var recentArticlesQuery = db.WebArticles - .Include(a => a.Feed) - .Take(20); // Get a larger pool for randomization + var recentFeedIds = await db.WebArticles + .GroupBy(a => a.FeedId) + .OrderByDescending(g => g.Max(a => a.PublishedAt)) + .Take(10) // Get recent 10 distinct feeds + .Select(g => g.Key) + .ToListAsync(); - // Apply random ordering 50% of the time - if (Random.Shared.NextDouble() < 0.5) - recentArticlesQuery = recentArticlesQuery.OrderBy(_ => EF.Functions.Random()); - else - recentArticlesQuery = recentArticlesQuery.OrderByDescending(a => a.PublishedAt); - - var recentArticles = await recentArticlesQuery.Take(5).ToListAsync(); + // For each feed, get one random article + var recentArticles = new List(); + var random = new Random(); + + foreach (var feedId in recentFeedIds.OrderBy(_ => random.Next())) + { + var article = await db.WebArticles + .Include(a => a.Feed) + .Where(a => a.FeedId == feedId) + .OrderBy(_ => EF.Functions.Random()) + .FirstOrDefaultAsync(); + + if (article != null) + { + recentArticles.Add(article); + if (recentArticles.Count >= 5) break; // Limit to 5 articles + } + } if (recentArticles.Count > 0) { diff --git a/DysonNetwork.Sphere/Connection/WebReader/WebFeedService.cs b/DysonNetwork.Sphere/Connection/WebReader/WebFeedService.cs index 17c540c..fe8273b 100644 --- a/DysonNetwork.Sphere/Connection/WebReader/WebFeedService.cs +++ b/DysonNetwork.Sphere/Connection/WebReader/WebFeedService.cs @@ -93,17 +93,13 @@ public class WebFeedService( { var itemUrl = item.Links.FirstOrDefault()?.Uri.ToString(); if (string.IsNullOrEmpty(itemUrl)) - { continue; - } var articleExists = await database.Set() .AnyAsync(a => a.FeedId == feed.Id && a.Url == itemUrl, cancellationToken); if (articleExists) - { continue; - } var content = (item.Content as TextSyndicationContent)?.Text ?? item.Summary.Text; LinkEmbed preview; @@ -127,11 +123,11 @@ public class WebFeedService( Url = itemUrl, Author = item.Authors.FirstOrDefault()?.Name, Content = content, - PublishedAt = item.PublishDate.UtcDateTime, + PublishedAt = item.LastUpdatedTime.UtcDateTime, Preview = preview, }; - database.Set().Add(newArticle); + database.WebArticles.Add(newArticle); } await database.SaveChangesAsync(cancellationToken); diff --git a/DysonNetwork.sln.DotSettings.user b/DysonNetwork.sln.DotSettings.user index f1fc2c9..3e4ba5d 100644 --- a/DysonNetwork.sln.DotSettings.user +++ b/DysonNetwork.sln.DotSettings.user @@ -83,6 +83,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded