From b193224a2cfb4a9299c367b858a1c60236486afe Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Fri, 26 Dec 2025 01:08:10 +0800 Subject: [PATCH] :sparkles: Add more data to rewind --- .../Rewind/AccountRewindService.cs | 2 +- DysonNetwork.Pass/Rewind/PassRewindService.cs | 38 +++++++++++++++++-- DysonNetwork.Sphere/Chat/ChatRoomService.cs | 19 +++++++++- .../Rewind/SphereRewindServiceGrpc.cs | 19 +++++----- 4 files changed, 63 insertions(+), 15 deletions(-) diff --git a/DysonNetwork.Pass/Rewind/AccountRewindService.cs b/DysonNetwork.Pass/Rewind/AccountRewindService.cs index d75410a..1da962d 100644 --- a/DysonNetwork.Pass/Rewind/AccountRewindService.cs +++ b/DysonNetwork.Pass/Rewind/AccountRewindService.cs @@ -34,7 +34,7 @@ public class AccountRewindService( private async Task CreateRewindPoint(Guid accountId) { - var currentYear = DateTime.UtcNow.Year; + const int currentYear = 2025; var rewindRequest = new RequestRewindEvent { AccountId = accountId.ToString(), Year = currentYear}; var rewindEventTasks = new List> diff --git a/DysonNetwork.Pass/Rewind/PassRewindService.cs b/DysonNetwork.Pass/Rewind/PassRewindService.cs index a49bf5f..a79bd7e 100644 --- a/DysonNetwork.Pass/Rewind/PassRewindService.cs +++ b/DysonNetwork.Pass/Rewind/PassRewindService.cs @@ -23,19 +23,51 @@ public class PassRewindService(AppDatabase db) .OrderBy(d => d) .ToListAsync(); - var maxCheckInStrike = 0; + var maxCheckInStreak = 0; if (checkInDates.Count != 0) { - maxCheckInStrike = checkInDates + maxCheckInStreak = checkInDates .Select((d, i) => new { Date = d, Index = i }) .GroupBy(x => x.Date.Subtract(new TimeSpan(x.Index, 0, 0, 0))) .Select(g => g.Count()) .Max(); } + var checkInCompleteness = checkInDates.Count / 365.0; + + var actionDates = await db.ActionLogs + .Where(a => a.CreatedAt >= startDate && a.CreatedAt < endDate) + .Where(a => a.AccountId == accountId) + .Select(a => a.CreatedAt.ToDateTimeUtc().Date) + .ToListAsync(); + + var mostActiveDay = actionDates + .GroupBy(d => d) + .Select(g => new { Date = g.Key, Count = g.Count() }) + .OrderByDescending(g => g.Count) + .FirstOrDefault(); + + var mostActiveWeekday = actionDates + .GroupBy(d => d.DayOfWeek) + .Select(g => new { Day = g.Key, Count = g.Count() }) + .OrderByDescending(g => g.Count) + .FirstOrDefault(); + + var actionTimes = await db.ActionLogs + .Where(a => a.CreatedAt >= startDate && a.CreatedAt < endDate) + .Where(a => a.AccountId == accountId) + .Select(a => a.CreatedAt.ToDateTimeUtc()) + .ToListAsync(); + + TimeSpan? latestActiveTime = actionTimes.Any() ? actionTimes.Max(dt => dt.TimeOfDay) : null; + var data = new Dictionary { - ["max_check_in_strike"] = maxCheckInStrike, + ["max_check_in_streak"] = maxCheckInStreak, + ["check_in_completeness"] = checkInCompleteness, + ["most_active_day"] = mostActiveDay?.Date.ToString("yyyy-MM-dd"), + ["most_active_weekday"] = mostActiveWeekday?.Day.ToString(), + ["latest_active_time"] = latestActiveTime?.ToString(@"hh\:mm"), }; return new RewindEvent diff --git a/DysonNetwork.Sphere/Chat/ChatRoomService.cs b/DysonNetwork.Sphere/Chat/ChatRoomService.cs index f9ce4ea..78e6830 100644 --- a/DysonNetwork.Sphere/Chat/ChatRoomService.cs +++ b/DysonNetwork.Sphere/Chat/ChatRoomService.cs @@ -208,7 +208,7 @@ public class ChatRoomService( { var group = $"chatroom:subscribers:{roomId}"; var keys = (await cache.GetGroupKeysAsync(group)).ToList(); - + var memberIds = new List(keys.Count); foreach (var key in keys) { @@ -218,7 +218,22 @@ public class ChatRoomService( memberIds.Add(memberId); } } - + return memberIds; } + + public async Task> GetTopActiveMembers(Guid roomId, Instant startDate, Instant endDate) + { + var topMembers = await db.ChatMessages + .Where(m => m.ChatRoomId == roomId && m.CreatedAt >= startDate && m.CreatedAt < endDate) + .GroupBy(m => m.SenderId) + .Select(g => new { SenderId = g.Key, MessageCount = g.Count() }) + .OrderByDescending(g => g.MessageCount) + .Take(3) + .ToListAsync(); + + var accountIds = topMembers.Select(t => t.SenderId).ToList(); + var accounts = await remoteAccounts.GetAccountBatch(accountIds); + return accounts.Select(SnAccount.FromProtoValue).ToList(); + } } diff --git a/DysonNetwork.Sphere/Rewind/SphereRewindServiceGrpc.cs b/DysonNetwork.Sphere/Rewind/SphereRewindServiceGrpc.cs index 9fe4ca3..d68cf8c 100644 --- a/DysonNetwork.Sphere/Rewind/SphereRewindServiceGrpc.cs +++ b/DysonNetwork.Sphere/Rewind/SphereRewindServiceGrpc.cs @@ -1,5 +1,5 @@ -using System.Collections.Generic; using System.Globalization; +using DysonNetwork.Shared.Models; using DysonNetwork.Shared.Proto; using DysonNetwork.Shared.Registry; using DysonNetwork.Sphere.Chat; @@ -79,7 +79,7 @@ public class SphereRewindServiceGrpc( .Where(m => m.Sender.AccountId == accountId) .AsQueryable(); var mostMessagedChat = await messagesQuery - .Where(m => m.ChatRoom.Type != Shared.Models.ChatRoomType.Group) + .Where(m => m.ChatRoom.Type == Shared.Models.ChatRoomType.Group) .GroupBy(m => m.ChatRoomId) .OrderByDescending(g => g.Count()) .Select(g => g.First().ChatRoom) @@ -102,16 +102,17 @@ public class SphereRewindServiceGrpc( .Where(c => c.Sender.AccountId == accountId) .AsQueryable(); + var now = SystemClock.Instance.GetCurrentInstant(); var mostCalledRoom = await callQuery + .Where(c => c.Room.Type == Shared.Models.ChatRoomType.Group) .GroupBy(c => c.RoomId) - .OrderByDescending(g => g.Count()) + .OrderByDescending(g => g.Sum(c => c.CreatedAt.Minus(c.EndedAt ?? now).Seconds)) .Select(g => g.First().Room) .FirstOrDefaultAsync(); - if (mostCalledRoom != null && mostCalledRoom.Type == Shared.Models.ChatRoomType.DirectMessage) - { - mostCalledRoom = await crs.LoadDirectMessageMembers(mostCalledRoom, accountId); - } + List? mostCalledChatTopMembers = null; + if (mostCalledRoom != null) + mostCalledChatTopMembers = await crs.GetTopActiveMembers(mostCalledRoom.Id, startDate, endDate); var mostCalledDirectRooms = await callQuery .Where(c => c.Room.Type == Shared.Models.ChatRoomType.DirectMessage) @@ -129,9 +130,8 @@ public class SphereRewindServiceGrpc( if (otherMember != null) accountIds.Add(otherMember.AccountId); } - var mostCalledAccounts = await remoteAccounts.GetAccountBatch(accountIds); - + var data = new Dictionary { @@ -161,6 +161,7 @@ public class SphereRewindServiceGrpc( ["most_messaged_chat"] = mostMessagedChat, ["most_messaged_direct_chat"] = mostMessagedDirectChat, ["most_called_chat"] = mostCalledRoom, + ["most_called_chat_top_members"] = mostCalledChatTopMembers, ["most_called_accounts"] = mostCalledAccounts, };