From e843c843744436ed68b74805721a48bfd49db420 Mon Sep 17 00:00:00 2001 From: Lightczx <1686188646@qq.com> Date: Wed, 26 Jul 2023 23:46:11 +0800 Subject: [PATCH] refactor dailynote service and partial gacha service --- .../Snap.Hutao/Core/Threading/AsyncBarrier.cs | 65 ++++++++++++ .../Snap.Hutao/Extension/NumberExtension.cs | 2 +- .../Snap.Hutao/Extension/SpanExtension.cs | 23 +++++ .../Model/InterChange/GachaLog/UIGFItem.cs | 2 +- .../Snap.Hutao/Model/Metadata/GachaEvent.cs | 4 +- .../Resource/Icon/UI_ItemIcon_210.png | Bin 4417 -> 41498 bytes .../Resource/Icon/UI_ItemIcon_210_256.png | Bin 41498 -> 0 bytes .../Cultivation/ICultivationDbService.cs | 2 + .../Service/DailyNote/DailyNoteDbService.cs | 80 +++++++++++++++ ...r.cs => DailyNoteNotificationOperation.cs} | 32 +++--- .../Service/DailyNote/DailyNoteOptions.cs | 12 ++- .../Service/DailyNote/DailyNoteService.cs | 93 ++++++++---------- .../Service/DailyNote/IDailyNoteDbService.cs | 21 ++++ .../Factory/GachaStatisticsExtension.cs | 25 +---- .../Factory/GachaStatisticsFactory.cs | 18 ++-- .../Factory/HutaoStatisticsFactory.cs | 27 +++-- .../HutaoStatisticsFactoryMetadataContext.cs | 23 +++++ .../Factory/TypedWishSummaryBuilder.cs | 5 +- .../GachaLog/GachaLogServiceContext.cs | 2 +- .../Service/GachaLog/HutaoCloudService.cs | 19 ++-- src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj | 2 - .../Snap.Hutao/View/Card/DailyNoteCard.xaml | 2 +- .../Snap.Hutao/View/Page/DailyNotePage.xaml | 2 +- .../Snap.Hutao/Web/Hoyolab/OssImages.cs | 13 +++ 24 files changed, 328 insertions(+), 146 deletions(-) create mode 100644 src/Snap.Hutao/Snap.Hutao/Core/Threading/AsyncBarrier.cs delete mode 100644 src/Snap.Hutao/Snap.Hutao/Resource/Icon/UI_ItemIcon_210_256.png create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteDbService.cs rename src/Snap.Hutao/Snap.Hutao/Service/DailyNote/{DailyNoteNotifier.cs => DailyNoteNotificationOperation.cs} (90%) create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/DailyNote/IDailyNoteDbService.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HutaoStatisticsFactoryMetadataContext.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/OssImages.cs diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Threading/AsyncBarrier.cs b/src/Snap.Hutao/Snap.Hutao/Core/Threading/AsyncBarrier.cs new file mode 100644 index 00000000..13dfab76 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Core/Threading/AsyncBarrier.cs @@ -0,0 +1,65 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Core.Threading; + +/// +/// An asynchronous barrier that blocks the signaler until all other participants have signaled. +/// +internal class AsyncBarrier +{ + /// + /// The number of participants being synchronized. + /// + private readonly int participantCount; + + /// + /// The set of participants who have reached the barrier, with their awaiters that can resume those participants. + /// + private readonly Stack waiters; + + /// + /// Initializes a new instance of the class. + /// + /// The number of participants. + public AsyncBarrier(int participants) + { + Requires.Range(participants > 0, nameof(participants)); + participantCount = participants; + + // Allocate the stack so no resizing is necessary. + // We don't need space for the last participant, since we never have to store it. + waiters = new Stack(participants - 1); + } + + /// + /// Signals that a participant is ready, and returns a Task + /// that completes when all other participants have also signaled ready. + /// + /// A Task, which will complete (or may already be completed) when the last participant calls this method. + public Task SignalAndWaitAsync() + { + lock (waiters) + { + if (waiters.Count + 1 == participantCount) + { + // This is the last one we were waiting for. + // Unleash everyone that preceded this one. + while (waiters.Count > 0) + { + _ = Task.Factory.StartNew(state => ((TaskCompletionSource)state!).SetResult(), waiters.Pop(), default, TaskCreationOptions.None, TaskScheduler.Default); + } + + // And allow this one to continue immediately. + return Task.CompletedTask; + } + else + { + // We need more folks. So suspend this caller. + TaskCompletionSource tcs = new(); + waiters.Push(tcs); + return tcs.Task; + } + } + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Extension/NumberExtension.cs b/src/Snap.Hutao/Snap.Hutao/Extension/NumberExtension.cs index 268a24ba..ee452223 100644 --- a/src/Snap.Hutao/Snap.Hutao/Extension/NumberExtension.cs +++ b/src/Snap.Hutao/Snap.Hutao/Extension/NumberExtension.cs @@ -17,7 +17,7 @@ internal static class NumberExtension /// 给定的整数 /// 位数 [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static uint Place(in this uint x) + public static uint StringLength(in this uint x) { // Benchmarked and compared as a most optimized solution return (uint)(MathF.Log10(x) + 1); diff --git a/src/Snap.Hutao/Snap.Hutao/Extension/SpanExtension.cs b/src/Snap.Hutao/Snap.Hutao/Extension/SpanExtension.cs index eec2f361..18db77a0 100644 --- a/src/Snap.Hutao/Snap.Hutao/Extension/SpanExtension.cs +++ b/src/Snap.Hutao/Snap.Hutao/Extension/SpanExtension.cs @@ -51,4 +51,27 @@ internal static class SpanExtension right = default; return false; } + + /// + /// 求平均值 + /// + /// 跨度 + /// 平均值 + public static byte Average(this in ReadOnlySpan span) + { + if (span.Length == 0) + { + return 0; + } + + int sum = 0; + int count = 0; + foreach (ref readonly byte b in span) + { + sum += b; + count++; + } + + return unchecked((byte)(sum / count)); + } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Model/InterChange/GachaLog/UIGFItem.cs b/src/Snap.Hutao/Snap.Hutao/Model/InterChange/GachaLog/UIGFItem.cs index 5538f97e..1f7df4fd 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/InterChange/GachaLog/UIGFItem.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/InterChange/GachaLog/UIGFItem.cs @@ -40,7 +40,7 @@ internal sealed class UIGFItem : GachaLogItem, IMappingFrom SH.ModelInterchangeUIGFItemTypeAvatar, 5U => SH.ModelInterchangeUIGFItemTypeWeapon, diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/GachaEvent.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/GachaEvent.cs index 3cbcc597..dac8a7a7 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/GachaEvent.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/GachaEvent.cs @@ -54,10 +54,10 @@ internal sealed class GachaEvent /// /// 五星列表 /// - public List UpOrangeList { get; set; } = default!; + public HashSet UpOrangeList { get; set; } = default!; /// /// 四星列表 /// - public List UpPurpleList { get; set; } = default!; + public HashSet UpPurpleList { get; set; } = default!; } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Icon/UI_ItemIcon_210.png b/src/Snap.Hutao/Snap.Hutao/Resource/Icon/UI_ItemIcon_210.png index ce3e342cd89a930b18ea1f3794ada2a9af42ddc2..636ce0a236476008d2931087727b857fe9f7a8d4 100644 GIT binary patch literal 41498 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
  • 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 diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/ICultivationDbService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/ICultivationDbService.cs index 8717142c..22239f7e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/ICultivationDbService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/ICultivationDbService.cs @@ -12,7 +12,9 @@ internal interface ICultivationDbService ValueTask DeleteCultivateEntryByIdAsync(Guid entryId); ValueTask DeleteCultivateItemRangeByEntryIdAsync(Guid entryId); + ValueTask DeleteCultivateProjectByIdAsync(Guid projectId); + ValueTask GetCultivateEntryByProjectIdAndItemIdAsync(Guid projectId, uint itemId); ValueTask> GetCultivateEntryListByProjectIdAsync(Guid projectId); diff --git a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteDbService.cs b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteDbService.cs new file mode 100644 index 00000000..68fa3d22 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteDbService.cs @@ -0,0 +1,80 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using CommunityToolkit.Mvvm.Messaging; +using Microsoft.EntityFrameworkCore; +using Snap.Hutao.Core.Database; +using Snap.Hutao.Core.DependencyInjection.Abstraction; +using Snap.Hutao.Message; +using Snap.Hutao.Model.Entity; +using Snap.Hutao.Model.Entity.Database; +using Snap.Hutao.Service.Notification; +using Snap.Hutao.Service.User; +using Snap.Hutao.ViewModel.User; +using Snap.Hutao.Web.Hoyolab; +using Snap.Hutao.Web.Hoyolab.Takumi.GameRecord; +using System.Collections.ObjectModel; +using WebDailyNote = Snap.Hutao.Web.Hoyolab.Takumi.GameRecord.DailyNote.DailyNote; + +namespace Snap.Hutao.Service.DailyNote; + +[ConstructorGenerated] +[Injection(InjectAs.Singleton, typeof(IDailyNoteDbService))] +internal sealed partial class DailyNoteDbService : IDailyNoteDbService +{ + private readonly IServiceProvider serviceProvider; + + public bool ContainsUid(string uid) + { + using (IServiceScope scope = serviceProvider.CreateScope()) + { + AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + return appDbContext.DailyNotes.AsNoTracking().Any(n => n.Uid == uid); + } + } + + public async ValueTask AddDailyNoteEntryAsync(DailyNoteEntry entry) + { + using (IServiceScope scope = serviceProvider.CreateScope()) + { + AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + await appDbContext.DailyNotes.AddAndSaveAsync(entry).ConfigureAwait(false); + } + } + + public async ValueTask DeleteDailyNoteEntryByIdAsync(Guid entryId) + { + using (IServiceScope scope = serviceProvider.CreateScope()) + { + AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + await appDbContext.DailyNotes.ExecuteDeleteWhereAsync(d => d.InnerId == entryId).ConfigureAwait(false); + } + } + + public async ValueTask UpdateDailyNoteEntryAsync(DailyNoteEntry entry) + { + using (IServiceScope scope = serviceProvider.CreateScope()) + { + AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + await appDbContext.DailyNotes.UpdateAndSaveAsync(entry).ConfigureAwait(false); + } + } + + public List GetDailyNoteEntryList() + { + using (IServiceScope scope = serviceProvider.CreateScope()) + { + AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + return appDbContext.DailyNotes.AsNoTracking().ToList(); + } + } + + public List GetDailyNoteEntryIncludeUserList() + { + using (IServiceScope scope = serviceProvider.CreateScope()) + { + AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + return appDbContext.DailyNotes.AsNoTracking().Include(n => n.User).ToList(); + } + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteNotifier.cs b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteNotificationOperation.cs similarity index 90% rename from src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteNotifier.cs rename to src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteNotificationOperation.cs index 4f8ec94b..d1890b35 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteNotifier.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteNotificationOperation.cs @@ -18,7 +18,7 @@ namespace Snap.Hutao.Service.DailyNote; /// 实时便笺通知器 /// [HighQuality] -internal sealed class DailyNoteNotifier +internal sealed class DailyNoteNotificationOperation { private const string ToastHeaderIdArgument = "DAILYNOTE"; private const string ToastAttributionUnknown = "Unknown"; @@ -31,7 +31,7 @@ internal sealed class DailyNoteNotifier /// /// 服务提供器 /// 实时便笺入口 - public DailyNoteNotifier(IServiceProvider serviceProvider, DailyNoteEntry entry) + public DailyNoteNotificationOperation(IServiceProvider serviceProvider, DailyNoteEntry entry) { taskContext = serviceProvider.GetRequiredService(); this.serviceProvider = serviceProvider; @@ -42,7 +42,7 @@ internal sealed class DailyNoteNotifier /// 异步通知 /// /// 任务 - public async ValueTask NotifyAsync() + public async ValueTask SendAsync() { if (entry.DailyNote == null) { @@ -131,6 +131,9 @@ internal sealed class DailyNoteNotifier private static void CheckNotifySuppressed(DailyNoteEntry entry, List notifyInfos) { + // https://learn.microsoft.com/en-us/windows/apps/design/shell/tiles-and-notifications/send-local-toast?tabs=uwp#adding-images + // Image limitation. + // NotifySuppressed judge if (entry.DailyNote!.CurrentResin >= entry.ResinNotifyThreshold) { @@ -138,7 +141,7 @@ internal sealed class DailyNoteNotifier { notifyInfos.Add(new( SH.ServiceDailyNoteNotifierResin, - "ms-appx:///Resource/Icon/UI_ItemIcon_210_256.png", + Web.Hoyolab.OssImages.UIItemIcon210, $"{entry.DailyNote.CurrentResin}", string.Format(SH.ServiceDailyNoteNotifierResinCurrent, entry.DailyNote.CurrentResin))); entry.ResinNotifySuppressed = true; @@ -155,7 +158,7 @@ internal sealed class DailyNoteNotifier { notifyInfos.Add(new( SH.ServiceDailyNoteNotifierHomeCoin, - "ms-appx:///Resource/Icon/UI_ItemIcon_204.png", + Web.Hoyolab.OssImages.UIItemIcon204, $"{entry.DailyNote.CurrentHomeCoin}", string.Format(SH.ServiceDailyNoteNotifierHomeCoinCurrent, entry.DailyNote.CurrentHomeCoin))); entry.HomeCoinNotifySuppressed = true; @@ -172,7 +175,7 @@ internal sealed class DailyNoteNotifier { notifyInfos.Add(new( SH.ServiceDailyNoteNotifierDailyTask, - "ms-appx:///Resource/Icon/UI_MarkQuest_Events_Proce.png", + Web.Hoyolab.OssImages.UIMarkQuestEventsProce, SH.ServiceDailyNoteNotifierDailyTaskHint, entry.DailyNote.ExtraTaskRewardDescription)); entry.DailyTaskNotifySuppressed = true; @@ -189,7 +192,7 @@ internal sealed class DailyNoteNotifier { notifyInfos.Add(new( SH.ServiceDailyNoteNotifierTransformer, - "ms-appx:///Resource/Icon/UI_ItemIcon_220021.png", + Web.Hoyolab.OssImages.UIItemIcon220021, SH.ServiceDailyNoteNotifierTransformerAdaptiveHint, SH.ServiceDailyNoteNotifierTransformerHint)); entry.TransformerNotifySuppressed = true; @@ -206,7 +209,7 @@ internal sealed class DailyNoteNotifier { notifyInfos.Add(new( SH.ServiceDailyNoteNotifierExpedition, - Web.HutaoEndpoints.UIAvatarIconSideNone.ToString(), // TODO: embed this + Web.Hoyolab.OssImages.UIIconInteeExplore1, SH.ServiceDailyNoteNotifierExpeditionAdaptiveHint, SH.ServiceDailyNoteNotifierExpeditionHint)); entry.ExpeditionNotifySuppressed = true; @@ -220,17 +223,8 @@ internal sealed class DailyNoteNotifier private bool ShouldSuppressPopup(DailyNoteOptions options) { - bool isGameRunning = serviceProvider.GetRequiredService().IsGameRunning(); - - if (options.IsSilentWhenPlayingGame && isGameRunning) - { - // Prevent notify when we are in game && silent mode. - return true; - } - else - { - return false; - } + // Prevent notify when we are in game && silent mode. + return options.IsSilentWhenPlayingGame && serviceProvider.GetRequiredService().IsGameRunning(); } private readonly struct NotifyInfo diff --git a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteOptions.cs b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteOptions.cs index 549bd83e..0258e1c1 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteOptions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteOptions.cs @@ -15,6 +15,8 @@ namespace Snap.Hutao.Service.DailyNote; [Injection(InjectAs.Singleton)] internal sealed class DailyNoteOptions : DbStoreOptions { + private const int OneMinute = 60; + private readonly IServiceProvider serviceProvider; private readonly IScheduleTaskInterop scheduleTaskInterop; @@ -38,11 +40,11 @@ internal sealed class DailyNoteOptions : DbStoreOptions /// public List> RefreshTimes { get; } = new() { - new(SH.ViewModelDailyNoteRefreshTime4, 240), - new(SH.ViewModelDailyNoteRefreshTime8, 480), - new(SH.ViewModelDailyNoteRefreshTime30, 1800), - new(SH.ViewModelDailyNoteRefreshTime40, 2400), - new(SH.ViewModelDailyNoteRefreshTime60, 3600), + new(SH.ViewModelDailyNoteRefreshTime4, OneMinute * 4), + new(SH.ViewModelDailyNoteRefreshTime8, OneMinute * 8), + new(SH.ViewModelDailyNoteRefreshTime30, OneMinute * 30), + new(SH.ViewModelDailyNoteRefreshTime40, OneMinute * 40), + new(SH.ViewModelDailyNoteRefreshTime60, OneMinute * 60), }; /// diff --git a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs index 6ce0995d..5309043e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/DailyNoteService.cs @@ -4,6 +4,7 @@ using CommunityToolkit.Mvvm.Messaging; using Microsoft.EntityFrameworkCore; using Snap.Hutao.Core.Database; +using Snap.Hutao.Core.DependencyInjection.Abstraction; using Snap.Hutao.Message; using Snap.Hutao.Model.Entity; using Snap.Hutao.Model.Entity.Database; @@ -26,6 +27,7 @@ namespace Snap.Hutao.Service.DailyNote; internal sealed partial class DailyNoteService : IDailyNoteService, IRecipient { private readonly IServiceProvider serviceProvider; + private readonly IDailyNoteDbService dailyNoteDbService; private readonly IUserService userService; private readonly ITaskContext taskContext; @@ -42,30 +44,27 @@ internal sealed partial class DailyNoteService : IDailyNoteService, IRecipient(); + DailyNoteEntry newEntry = DailyNoteEntry.From(role); - if (!appDbContext.DailyNotes.Any(n => n.Uid == roleUid)) + Web.Response.Response dailyNoteResponse = await serviceProvider + .GetRequiredService>() + .Create(PlayerUid.IsOversea(roleUid)) + .GetDailyNoteAsync(role) + .ConfigureAwait(false); + + if (dailyNoteResponse.IsOk()) { - DailyNoteEntry newEntry = DailyNoteEntry.From(role); - - Web.Response.Response dailyNoteResponse = await scope.ServiceProvider - .PickRequiredService(PlayerUid.IsOversea(roleUid)) - .GetDailyNoteAsync(role) - .ConfigureAwait(false); - - if (dailyNoteResponse.IsOk()) - { - newEntry.UpdateDailyNote(dailyNoteResponse.Data); - } - - newEntry.UserGameRole = userService.GetUserGameRoleByUid(roleUid); - await appDbContext.DailyNotes.AddAndSaveAsync(newEntry).ConfigureAwait(false); - - await taskContext.SwitchToMainThreadAsync(); - entries?.Add(newEntry); + newEntry.UpdateDailyNote(dailyNoteResponse.Data); } + + newEntry.UserGameRole = userService.GetUserGameRoleByUid(roleUid); + await dailyNoteDbService.AddDailyNoteEntryAsync(newEntry).ConfigureAwait(false); + + await taskContext.SwitchToMainThreadAsync(); + entries?.Add(newEntry); } } @@ -76,13 +75,9 @@ internal sealed partial class DailyNoteService : IDailyNoteService, IRecipient(); - List entryList = appDbContext.DailyNotes.ToList(); - entryList.ForEach(entry => { entry.UserGameRole = userService.GetUserGameRoleByUid(entry.Uid); }); - entries = new(entryList); - } + List entryList = dailyNoteDbService.GetDailyNoteEntryList(); + entryList.ForEach(entry => { entry.UserGameRole = userService.GetUserGameRoleByUid(entry.Uid); }); + entries = new(entryList); } return entries; @@ -91,31 +86,26 @@ internal sealed partial class DailyNoteService : IDailyNoteService, IRecipient public async ValueTask RefreshDailyNotesAsync() { - using (IServiceScope scope = serviceProvider.CreateScope()) + foreach (DailyNoteEntry entry in dailyNoteDbService.GetDailyNoteEntryIncludeUserList()) { - AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + Web.Response.Response dailyNoteResponse = await serviceProvider + .GetRequiredService>() + .Create(PlayerUid.IsOversea(entry.Uid)) + .GetDailyNoteAsync(new(entry.User, entry.Uid)) + .ConfigureAwait(false); - foreach (DailyNoteEntry entry in appDbContext.DailyNotes.Include(n => n.User)) + if (dailyNoteResponse.IsOk()) { - Web.Response.Response dailyNoteResponse = await scope.ServiceProvider - .PickRequiredService(PlayerUid.IsOversea(entry.Uid)) - .GetDailyNoteAsync(new(entry.User, entry.Uid)) - .ConfigureAwait(false); + WebDailyNote dailyNote = dailyNoteResponse.Data!; - if (dailyNoteResponse.IsOk()) - { - WebDailyNote dailyNote = dailyNoteResponse.Data!; + // cache + await taskContext.SwitchToMainThreadAsync(); + entries?.SingleOrDefault(e => e.UserId == entry.UserId && e.Uid == entry.Uid)?.UpdateDailyNote(dailyNote); - // database - entry.UpdateDailyNote(dailyNote); - - // cache - await taskContext.SwitchToMainThreadAsync(); - entries?.SingleOrDefault(e => e.UserId == entry.UserId && e.Uid == entry.Uid)?.UpdateDailyNote(dailyNote); - - await new DailyNoteNotifier(serviceProvider, entry).NotifyAsync().ConfigureAwait(false); - await appDbContext.DailyNotes.UpdateAndSaveAsync(entry).ConfigureAwait(false); - } + // database + await new DailyNoteNotificationOperation(serviceProvider, entry).SendAsync().ConfigureAwait(false); + entry.DailyNote = dailyNote; + await dailyNoteDbService.UpdateDailyNoteEntryAsync(entry).ConfigureAwait(false); } } } @@ -124,13 +114,10 @@ internal sealed partial class DailyNoteService : IDailyNoteService, IRecipient(); - await appDbContext.DailyNotes.ExecuteDeleteWhereAsync(d => d.InnerId == entry.InnerId).ConfigureAwait(false); - } + await dailyNoteDbService.DeleteDailyNoteEntryByIdAsync(entry.InnerId).ConfigureAwait(false); } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/IDailyNoteDbService.cs b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/IDailyNoteDbService.cs new file mode 100644 index 00000000..1878f37d --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Service/DailyNote/IDailyNoteDbService.cs @@ -0,0 +1,21 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Model.Entity; + +namespace Snap.Hutao.Service.DailyNote; + +internal interface IDailyNoteDbService +{ + ValueTask AddDailyNoteEntryAsync(DailyNoteEntry entry); + + bool ContainsUid(string uid); + + ValueTask DeleteDailyNoteEntryByIdAsync(Guid entryId); + + List GetDailyNoteEntryIncludeUserList(); + + List GetDailyNoteEntryList(); + + ValueTask UpdateDailyNoteEntryAsync(DailyNoteEntry entry); +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsExtension.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsExtension.cs index 46628523..cc34c7ef 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsExtension.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsExtension.cs @@ -14,29 +14,6 @@ namespace Snap.Hutao.Service.GachaLog.Factory; /// internal static class GachaStatisticsExtension { - /// - /// 求平均值 - /// - /// 跨度 - /// 平均值 - public static byte Average(this in Span span) - { - int sum = 0; - int count = 0; - foreach (ref readonly byte b in span) - { - sum += b; - count++; - } - - if (count == 0) - { - return 0; - } - - return unchecked((byte)(sum / count)); - } - /// /// 完成添加 /// @@ -82,7 +59,7 @@ internal static class GachaStatisticsExtension [SuppressMessage("", "IDE0057")] private static Color GetColorByName(string name) { - Span codes = MD5.HashData(Encoding.UTF8.GetBytes(name)); + ReadOnlySpan codes = MD5.HashData(Encoding.UTF8.GetBytes(name)); return Color.FromArgb(255, codes.Slice(0, 5).Average(), codes.Slice(5, 5).Average(), codes.Slice(10, 5).Average()); } } diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsFactory.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsFactory.cs index 4e82867f..c5e8d203 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsFactory.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsFactory.cs @@ -22,11 +22,13 @@ internal sealed partial class GachaStatisticsFactory : IGachaStatisticsFactory { private readonly IServiceProvider serviceProvider; private readonly IMetadataService metadataService; + private readonly ITaskContext taskContext; private readonly AppOptions options; /// public async Task CreateAsync(IOrderedQueryable items, GachaLogServiceContext context) { + await taskContext.SwitchToBackgroundAsync(); List gachaEvents = await metadataService.GetGachaEventsAsync().ConfigureAwait(false); List historyWishBuilders = gachaEvents.SelectList(g => new HistoryWishBuilder(g, context)); @@ -44,23 +46,18 @@ internal sealed partial class GachaStatisticsFactory : IGachaStatisticsFactory serviceProvider, SH.ServiceGachaLogFactoryPermanentWishName, TypedWishSummaryBuilder.IsStandardWish, - Web.Hutao.GachaLog.GachaDistributionType.Standard, - 90, - 10); + Web.Hutao.GachaLog.GachaDistributionType.Standard); TypedWishSummaryBuilder avatarWishBuilder = new( serviceProvider, SH.ServiceGachaLogFactoryAvatarWishName, TypedWishSummaryBuilder.IsAvatarEventWish, - Web.Hutao.GachaLog.GachaDistributionType.AvatarEvent, - 90, - 10); + Web.Hutao.GachaLog.GachaDistributionType.AvatarEvent); TypedWishSummaryBuilder weaponWishBuilder = new( serviceProvider, SH.ServiceGachaLogFactoryWeaponWishName, TypedWishSummaryBuilder.IsWeaponEventWish, Web.Hutao.GachaLog.GachaDistributionType.WeaponEvent, - 80, - 10); + 80); Dictionary orangeAvatarCounter = new(); Dictionary purpleAvatarCounter = new(); @@ -77,8 +74,7 @@ internal sealed partial class GachaStatisticsFactory : IGachaStatisticsFactory .Where(w => w.ConfigType == item.GachaType) .SingleOrDefault(w => w.From <= item.Time && w.To >= item.Time); - // It's an avatar - switch (item.ItemId.Place()) + switch (item.ItemId.StringLength()) { case 8U: { @@ -135,7 +131,7 @@ internal sealed partial class GachaStatisticsFactory : IGachaStatisticsFactory } default: - // ItemId place not correct. + // ItemId string length not correct. ThrowHelper.UserdataCorrupted(string.Format(SH.ServiceGachaStatisticsFactoryItemIdInvalid, item.ItemId), null!); break; } diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HutaoStatisticsFactory.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HutaoStatisticsFactory.cs index 422266c8..506e4eb2 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HutaoStatisticsFactory.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HutaoStatisticsFactory.cs @@ -1,12 +1,10 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. +using Snap.Hutao.Core.ExceptionService; using Snap.Hutao.Model.Intrinsic; using Snap.Hutao.Model.Metadata; using Snap.Hutao.Model.Metadata.Abstraction; -using Snap.Hutao.Model.Metadata.Avatar; -using Snap.Hutao.Model.Metadata.Weapon; -using Snap.Hutao.Model.Primitive; using Snap.Hutao.ViewModel.GachaLog; using Snap.Hutao.Web.Hoyolab.Hk4e.Event.GachaInfo; using Snap.Hutao.Web.Hutao.GachaLog; @@ -16,21 +14,19 @@ namespace Snap.Hutao.Service.GachaLog.Factory; internal sealed class HutaoStatisticsFactory { - private readonly Dictionary idAvatarMap; - private readonly Dictionary idWeaponMap; + private readonly HutaoStatisticsFactoryMetadataContext context; private readonly GachaEvent avatarEvent; private readonly GachaEvent avatarEvent2; private readonly GachaEvent weaponEvent; - public HutaoStatisticsFactory(Dictionary idAvatarMap, Dictionary idWeaponMap, List gachaEvents) + public HutaoStatisticsFactory(in HutaoStatisticsFactoryMetadataContext context) { - this.idAvatarMap = idAvatarMap; - this.idWeaponMap = idWeaponMap; + this.context = context; DateTimeOffset now = DateTimeOffset.Now; - avatarEvent = gachaEvents.Single(g => g.From < now && g.To > now && g.Type == GachaConfigType.AvatarEventWish); - avatarEvent2 = gachaEvents.Single(g => g.From < now && g.To > now && g.Type == GachaConfigType.AvatarEventWish2); - weaponEvent = gachaEvents.Single(g => g.From < now && g.To > now && g.Type == GachaConfigType.WeaponEventWish); + avatarEvent = context.GachaEvents.Single(g => g.From < now && g.To > now && g.Type == GachaConfigType.AvatarEventWish); + avatarEvent2 = context.GachaEvents.Single(g => g.From < now && g.To > now && g.Type == GachaConfigType.AvatarEventWish2); + weaponEvent = context.GachaEvents.Single(g => g.From < now && g.To > now && g.Type == GachaConfigType.WeaponEventWish); } public HutaoStatistics Create(GachaEventStatistics raw) @@ -52,11 +48,11 @@ internal sealed class HutaoStatisticsFactory foreach (ref readonly ItemCount item in CollectionsMarshal.AsSpan(items)) { - IStatisticsItemSource source = item.Item.Place() switch + IStatisticsItemSource source = item.Item.StringLength() switch { - 8U => idAvatarMap[item.Item], - 5U => idWeaponMap[item.Item], - _ => throw Must.NeverHappen($"不支持的物品 Id:{item.Item}"), + 8U => context.IdAvatarMap[item.Item], + 5U => context.IdWeaponMap[item.Item], + _ => throw ThrowHelper.UserdataCorrupted(string.Format(SH.ServiceGachaStatisticsFactoryItemIdInvalid, item.Item), null!), }; StatisticsItem statisticsItem = source.ToStatisticsItem(unchecked((int)item.Count)); @@ -73,6 +69,7 @@ internal sealed class HutaoStatisticsFactory QualityType.QUALITY_BLUE => blueItems, _ => throw Must.NeverHappen("意外的物品等级"), }; + list.Add(statisticsItem); } } diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HutaoStatisticsFactoryMetadataContext.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HutaoStatisticsFactoryMetadataContext.cs new file mode 100644 index 00000000..9076274d --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HutaoStatisticsFactoryMetadataContext.cs @@ -0,0 +1,23 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Model.Metadata; +using Snap.Hutao.Model.Metadata.Avatar; +using Snap.Hutao.Model.Metadata.Weapon; +using Snap.Hutao.Model.Primitive; + +namespace Snap.Hutao.Service.GachaLog.Factory; + +internal readonly struct HutaoStatisticsFactoryMetadataContext +{ + public readonly Dictionary IdAvatarMap; + public readonly Dictionary IdWeaponMap; + public readonly List GachaEvents; + + public HutaoStatisticsFactoryMetadataContext(Dictionary idAvatarMap, Dictionary idWeaponMap, List gachaEvents) + { + IdAvatarMap = idAvatarMap; + IdWeaponMap = idWeaponMap; + GachaEvents = gachaEvents; + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/TypedWishSummaryBuilder.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/TypedWishSummaryBuilder.cs index 595b4652..051271bf 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/TypedWishSummaryBuilder.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/TypedWishSummaryBuilder.cs @@ -68,8 +68,8 @@ internal sealed class TypedWishSummaryBuilder string name, Func typeEvaluator, Web.Hutao.GachaLog.GachaDistributionType distributionType, - int guaranteeOrangeThreshold, - int guaranteePurpleThreshold) + int guaranteeOrangeThreshold = 90, + int guaranteePurpleThreshold = 10) { this.serviceProvider = serviceProvider; this.name = name; @@ -171,6 +171,7 @@ internal sealed class TypedWishSummaryBuilder OrangeList = summaryItems, }; + // TODO: barrier all predictions. new PullPrediction(serviceProvider, summary, distributionType).PredictAsync().SafeForget(); return summary; diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogServiceContext.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogServiceContext.cs index 03cc1665..02980689 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogServiceContext.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/GachaLogServiceContext.cs @@ -106,7 +106,7 @@ internal readonly struct GachaLogServiceContext /// 名称星级 public INameQuality GetNameQualityByItemId(uint id) { - uint place = id.Place(); + uint place = id.StringLength(); return place switch { 8U => IdAvatarMap[id], diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/HutaoCloudService.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/HutaoCloudService.cs index 63fadd86..a71ae389 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/HutaoCloudService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/HutaoCloudService.cs @@ -8,6 +8,7 @@ using Snap.Hutao.Model.Metadata; using Snap.Hutao.Model.Metadata.Avatar; using Snap.Hutao.Model.Metadata.Weapon; using Snap.Hutao.Model.Primitive; +using Snap.Hutao.Service.GachaLog.Factory; using Snap.Hutao.Service.Metadata; using Snap.Hutao.ViewModel.GachaLog; using Snap.Hutao.Web.Hoyolab.Hk4e.Event.GachaInfo; @@ -99,17 +100,19 @@ internal sealed partial class HutaoCloudService : IHutaoCloudService public async Task> GetCurrentEventStatisticsAsync(CancellationToken token = default) { IMetadataService metadataService = serviceProvider.GetRequiredService(); - if (await metadataService.InitializeAsync().ConfigureAwait(false)) - { - Dictionary idAvatarMap = await metadataService.GetIdToAvatarMapAsync(token).ConfigureAwait(false); - Dictionary idWeaponMap = await metadataService.GetIdToWeaponMapAsync(token).ConfigureAwait(false); - List gachaEvents = await metadataService.GetGachaEventsAsync(token).ConfigureAwait(false); - Response response = await homaGachaLogClient.GetGachaEventStatisticsAsync(token).ConfigureAwait(false); - if (response.IsOk()) + Response response = await homaGachaLogClient.GetGachaEventStatisticsAsync(token).ConfigureAwait(false); + if (response.IsOk()) + { + if (await metadataService.InitializeAsync().ConfigureAwait(false)) { + Dictionary idAvatarMap = await metadataService.GetIdToAvatarMapAsync(token).ConfigureAwait(false); + Dictionary idWeaponMap = await metadataService.GetIdToWeaponMapAsync(token).ConfigureAwait(false); + List gachaEvents = await metadataService.GetGachaEventsAsync(token).ConfigureAwait(false); + HutaoStatisticsFactoryMetadataContext context = new(idAvatarMap, idWeaponMap, gachaEvents); + GachaEventStatistics raw = response.Data; - Factory.HutaoStatisticsFactory factory = new(idAvatarMap, idWeaponMap, gachaEvents); + HutaoStatisticsFactory factory = new(context); HutaoStatistics statistics = factory.Create(raw); return new(true, statistics); } diff --git a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj index afeec2e6..c24a6729 100644 --- a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj +++ b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj @@ -99,7 +99,6 @@ - @@ -230,7 +229,6 @@ - diff --git a/src/Snap.Hutao/Snap.Hutao/View/Card/DailyNoteCard.xaml b/src/Snap.Hutao/Snap.Hutao/View/Card/DailyNoteCard.xaml index 9fbbae56..87d3ade6 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Card/DailyNoteCard.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Card/DailyNoteCard.xaml @@ -48,7 +48,7 @@ - + - +
  • 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 literal 4417 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