diff --git a/src/Snap.Hutao/Snap.Hutao/Core/CoreEnvironment.cs b/src/Snap.Hutao/Snap.Hutao/Core/CoreEnvironment.cs
index 53c5eb77..845c79c7 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/CoreEnvironment.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/CoreEnvironment.cs
@@ -8,6 +8,7 @@ using Snap.Hutao.Extension;
using Snap.Hutao.Web.Hoyolab.DynamicSecret;
using System.Collections.Immutable;
using System.IO;
+using System.Text.Encodings.Web;
using System.Text.Json.Serialization.Metadata;
using Windows.ApplicationModel;
@@ -87,7 +88,7 @@ internal static class CoreEnvironment
public static readonly JsonSerializerOptions JsonOptions = new()
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
- Encoder = new JsonTextEncoder(),
+ Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
PropertyNameCaseInsensitive = true,
WriteIndented = true,
TypeInfoResolver = new DefaultJsonTypeInfoResolver()
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs
index 172de3c2..e2f91506 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs
@@ -37,6 +37,11 @@ internal static class Activation
/// 是否提升了权限
public static bool GetElevated()
{
+ if (System.Diagnostics.Debugger.IsAttached)
+ {
+ return true;
+ }
+
using (WindowsIdentity identity = WindowsIdentity.GetCurrent())
{
WindowsPrincipal principal = new(identity);
diff --git a/src/Snap.Hutao/Snap.Hutao/LaunchGameWindow.xaml b/src/Snap.Hutao/Snap.Hutao/LaunchGameWindow.xaml
index 941e594d..e3d1c358 100644
--- a/src/Snap.Hutao/Snap.Hutao/LaunchGameWindow.xaml
+++ b/src/Snap.Hutao/Snap.Hutao/LaunchGameWindow.xaml
@@ -6,6 +6,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:mxi="using:Microsoft.Xaml.Interactivity"
xmlns:shcb="using:Snap.Hutao.Control.Behavior"
+ xmlns:shcm="using:Snap.Hutao.Control.Markup"
xmlns:shv="using:Snap.Hutao.ViewModel"
mc:Ignorable="d">
@@ -28,7 +29,7 @@
Margin="12,0,0,0"
VerticalAlignment="Center"
Style="{StaticResource CaptionTextBlockStyle}"
- Text="选择账号并启动"
+ Text="{shcm:ResourceString Name=LaunchGameTitle}"
TextWrapping="NoWrap"/>
@@ -44,7 +45,7 @@
+ Text="{Binding AttachUid, TargetNullValue={shcm:ResourceString Name=ViewPageLaunchGameSwitchAccountAttachUidNull}}"/>
@@ -56,6 +57,6 @@
Margin="16"
HorizontalAlignment="Stretch"
Command="{Binding LaunchCommand}"
- Content="启动游戏"/>
+ Content="{shcm:ResourceString Name=ViewPageLaunchGameAction}"/>
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/CultivateEntry.cs b/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/CultivateEntry.cs
index d8b56b93..f4d3b33d 100644
--- a/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/CultivateEntry.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/CultivateEntry.cs
@@ -41,4 +41,17 @@ public class CultivateEntry : ItemBase
/// 实体
///
public List Items { get; set; } = default!;
+
+ ///
+ /// 是否为今日的材料
+ ///
+ public bool IsToday { get => Items.Any(i => i.IsToday); }
+
+ ///
+ /// 星期中的日期
+ ///
+ public DaysOfWeek DaysOfWeek
+ {
+ get => Items.FirstOrDefault(i => i.DaysOfWeek != DaysOfWeek.Any)?.DaysOfWeek ?? DaysOfWeek.Any;
+ }
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/CultivateItem.cs b/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/CultivateItem.cs
index 05ebfb3a..19c1519c 100644
--- a/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/CultivateItem.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/CultivateItem.cs
@@ -24,9 +24,6 @@ public class CultivateItem : ObservableObject
Inner = inner;
Entity = entity;
isFinished = Entity.IsFinished;
- IsToday = inner.IsTodaysItem();
-
- FinishStateCommand = new RelayCommand(FlipIsFinished);
}
///
@@ -39,11 +36,6 @@ public class CultivateItem : ObservableObject
///
public Entity.CultivateItem Entity { get; }
- ///
- /// 调整完成状态命令
- ///
- public ICommand FinishStateCommand { get; }
-
///
/// 是否完成此项
///
@@ -61,15 +53,10 @@ public class CultivateItem : ObservableObject
///
/// 是否为今日物品
///
- public bool IsToday { get; }
+ public bool IsToday { get => Inner.IsTodaysItem(); }
///
- /// 对应背包物品的个数
+ /// 星期中的日期
///
- public uint InventoryItemCount { get; set; }
-
- private void FlipIsFinished()
- {
- IsFinished = !IsFinished;
- }
+ public DaysOfWeek DaysOfWeek { get => Inner.GetDaysOfWeek(); }
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/DaysOfWeek.cs b/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/DaysOfWeek.cs
new file mode 100644
index 00000000..287b66ba
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/DaysOfWeek.cs
@@ -0,0 +1,35 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+using Snap.Hutao.Core.Annotation;
+
+namespace Snap.Hutao.Model.Binding.Cultivation;
+
+///
+/// 游戏内星期中的天
+///
+public enum DaysOfWeek
+{
+ ///
+ /// 任意
+ ///
+ Any,
+
+ ///
+ /// 周一/周四/周日
+ ///
+ [LocalizationKey("ModelBindingCultivationDaysOfWeek14")]
+ MondayAndThursday,
+
+ ///
+ /// 周二/周五/周日
+ ///
+ [LocalizationKey("ModelBindingCultivationDaysOfWeek25")]
+ TuesdayAndFriday,
+
+ ///
+ /// 周三/周六/周日
+ ///
+ [LocalizationKey("ModelBindingCultivationDaysOfWeek36")]
+ WednesdayAndSaturday,
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Material.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Material.cs
index 79dac9ef..1f510e89 100644
--- a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Material.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Material.cs
@@ -143,4 +143,28 @@ public class Material
_ => false,
};
}
+
+ ///
+ /// 获取物品对应的 DaysOfWeek
+ ///
+ /// DaysOfWeek
+ public Binding.Cultivation.DaysOfWeek GetDaysOfWeek()
+ {
+ if (MondayThursdayItems.Contains(Id))
+ {
+ return Binding.Cultivation.DaysOfWeek.MondayAndThursday;
+ }
+
+ if (TuesdayFridayItems.Contains(Id))
+ {
+ return Binding.Cultivation.DaysOfWeek.TuesdayAndFriday;
+ }
+
+ if (WednesdaySaturdayItems.Contains(Id))
+ {
+ return Binding.Cultivation.DaysOfWeek.WednesdayAndSaturday;
+ }
+
+ return Binding.Cultivation.DaysOfWeek.Any;
+ }
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs
index ce4382f5..8b71a4e4 100644
--- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs
@@ -267,6 +267,42 @@ namespace Snap.Hutao.Resource.Localization {
}
}
+ ///
+ /// 查找类似 选择账号并启动 的本地化字符串。
+ ///
+ internal static string LaunchGameTitle {
+ get {
+ return ResourceManager.GetString("LaunchGameTitle", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 周一/周四/周日 的本地化字符串。
+ ///
+ internal static string ModelBindingCultivationDaysOfWeek14 {
+ get {
+ return ResourceManager.GetString("ModelBindingCultivationDaysOfWeek14", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 周二/周五/周日 的本地化字符串。
+ ///
+ internal static string ModelBindingCultivationDaysOfWeek25 {
+ get {
+ return ResourceManager.GetString("ModelBindingCultivationDaysOfWeek25", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 周三/周六/周日 的本地化字符串。
+ ///
+ internal static string ModelBindingCultivationDaysOfWeek36 {
+ get {
+ return ResourceManager.GetString("ModelBindingCultivationDaysOfWeek36", resourceCulture);
+ }
+ }
+
///
/// 查找类似 第 {0} 层 的本地化字符串。
///
diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx
index c7e329b2..5e5b8880 100644
--- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx
+++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx
@@ -186,6 +186,18 @@
导入
+
+ 选择账号并启动
+
+
+ 周一/周四/周日
+
+
+ 周二/周五/周日
+
+
+ 周三/周六/周日
+
第 {0} 层
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs
index fd1e78f4..fe224a48 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs
@@ -187,7 +187,7 @@ internal class CultivationService : ICultivationService
}
return results
- .OrderByDescending(e => e.Items.Any(i => i.IsToday))
+ .OrderByDescending(e => e.IsToday)
.ToObservableCollection();
}
}
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs
index 1c03c6ea..a67c05bf 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs
@@ -245,8 +245,8 @@ internal class PackageConverter
return false;
}
- // Ensure cache folder
- string cacheFolder = Path.Combine(gameFolder, "Screenshot", "HutaoCache");
+ // Cache folder
+ string cacheFolder = Path.Combine(Core.CoreEnvironment.DataFolder, "ServerCache");
// 执行下载与移动操作
foreach (ItemOperationInfo info in operations)
diff --git a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj
index 7f154c47..2cced7f3 100644
--- a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj
+++ b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj
@@ -90,7 +90,6 @@
-
@@ -267,11 +266,6 @@
MSBuild:Compile
-
-
- MSBuild:Compile
-
-
MSBuild:Compile
diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/LoginMihoyoBBSDialog.xaml b/src/Snap.Hutao/Snap.Hutao/View/Dialog/LoginMihoyoBBSDialog.xaml
deleted file mode 100644
index 0773cf7a..00000000
--- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/LoginMihoyoBBSDialog.xaml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/LoginMihoyoBBSDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/LoginMihoyoBBSDialog.xaml.cs
deleted file mode 100644
index f3a78b66..00000000
--- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/LoginMihoyoBBSDialog.xaml.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See LICENSE in the project root for license information.
-
-using Microsoft.UI.Xaml.Controls;
-using Snap.Hutao.Web.Hoyolab.Passport;
-
-namespace Snap.Hutao.View.Dialog;
-
-///
-/// ¼Ի
-///
-public sealed partial class LoginMihoyoBBSDialog : ContentDialog
-{
- ///
- /// һµĵ¼Ի
- ///
- ///
- public LoginMihoyoBBSDialog()
- {
- InitializeComponent();
- XamlRoot = Ioc.Default.GetRequiredService().Content.XamlRoot;
- }
-
- ///
- /// 첽ȡû˺
- ///
- /// ˺
- public async Task>> GetInputAccountPasswordAsync()
- {
- await ThreadHelper.SwitchToMainThreadAsync();
- bool result = await ShowAsync() == ContentDialogResult.Primary;
-
- Dictionary data = new()
- {
- { "account", RSAEncryptedString.Encrypt(AccountTextBox.Text) },
- { "password", RSAEncryptedString.Encrypt(PasswordTextBox.Password) },
- };
-
- return new(result, data);
- }
-}
diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/CultivationPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/CultivationPage.xaml
index 9f2cd33f..ea5cf113 100644
--- a/src/Snap.Hutao/Snap.Hutao/View/Page/CultivationPage.xaml
+++ b/src/Snap.Hutao/Snap.Hutao/View/Page/CultivationPage.xaml
@@ -37,6 +37,12 @@
x:Key="BoolToStyleSelector"
FalseValue="{StaticResource BodyTextBlockStyle}"
TrueValue="{StaticResource BaseTextBlockStyle}"/>
+
+
+
+
+
+
@@ -165,7 +171,7 @@
Margin="6,0,0,0"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
- Background="Transparent"
+ Background="{Binding IsToday, Converter={StaticResource BoolToBrushSelector}}"
Command="{Binding Path=DataContext.FinishStateCommand, Source={StaticResource BindingProxy}}"
CommandParameter="{Binding}"
Style="{StaticResource ButtonRevealStyle}">
diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/CultivationViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/CultivationViewModel.cs
index b0e20eda..3358901e 100644
--- a/src/Snap.Hutao/Snap.Hutao/ViewModel/CultivationViewModel.cs
+++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/CultivationViewModel.cs
@@ -2,7 +2,10 @@
// Licensed under the MIT license.
using CommunityToolkit.Mvvm.Input;
+using CommunityToolkit.WinUI.UI;
using Microsoft.Extensions.DependencyInjection;
+using Snap.Hutao.Extension;
+using Snap.Hutao.Model;
using Snap.Hutao.Model.Binding.Cultivation;
using Snap.Hutao.Model.Entity;
using Snap.Hutao.Service.Abstraction;
@@ -186,8 +189,6 @@ internal class CultivationViewModel : Abstraction.ViewModel
if (project != null)
{
List materials = await metadataService.GetMaterialsAsync().ConfigureAwait(false);
- Dictionary idAvatarMap = await metadataService.GetIdToAvatarMapAsync().ConfigureAwait(false);
- Dictionary idWeaponMap = await metadataService.GetIdToWeaponMapAsync().ConfigureAwait(false);
ObservableCollection entries = await cultivationService
.GetCultivateEntriesAsync(project)
diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/TestViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/TestViewModel.cs
index 9e83d848..15739654 100644
--- a/src/Snap.Hutao/Snap.Hutao/ViewModel/TestViewModel.cs
+++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/TestViewModel.cs
@@ -31,7 +31,6 @@ internal class TestViewModel : Abstraction.ViewModel
ShowCommunityGameRecordDialogCommand = new AsyncRelayCommand(ShowCommunityGameRecordDialogAsync);
ShowAdoptCalculatorDialogCommand = new AsyncRelayCommand(ShowAdoptCalculatorDialogAsync);
- DangerousLoginMihoyoBbsCommand = new AsyncRelayCommand(DangerousLoginMihoyoBbsAsync);
DownloadStaticFileCommand = new AsyncRelayCommand(DownloadStaticFileAsync);
}
@@ -45,11 +44,6 @@ internal class TestViewModel : Abstraction.ViewModel
///
public ICommand ShowAdoptCalculatorDialogCommand { get; }
- ///
- /// Dangerous 登录米游社命令
- ///
- public ICommand DangerousLoginMihoyoBbsCommand { get; }
-
///
/// 下载资源文件命令
///
@@ -69,38 +63,6 @@ internal class TestViewModel : Abstraction.ViewModel
await new AdoptCalculatorDialog().ShowAsync();
}
- private async Task DangerousLoginMihoyoBbsAsync()
- {
- // ContentDialog must be created by main thread.
- await ThreadHelper.SwitchToMainThreadAsync();
- (bool isOk, Dictionary? data) = await new LoginMihoyoBBSDialog().GetInputAccountPasswordAsync().ConfigureAwait(false);
-
- if (isOk)
- {
- (Response? resp, Aigis? aigis) = await serviceProvider
- .GetRequiredService()
- .LoginByPasswordAsync(data, CancellationToken.None)
- .ConfigureAwait(false);
-
- if (resp != null)
- {
- if (resp.IsOk())
- {
- Cookie cookie = Cookie.FromLoginResult(resp.Data);
-
- await serviceProvider
- .GetRequiredService()
- .ProcessInputCookieAsync(cookie)
- .ConfigureAwait(false);
- }
-
- if (resp.ReturnCode == (int)KnownReturnCode.RET_NEED_AIGIS)
- {
- }
- }
- }
- }
-
private async Task DownloadStaticFileAsync()
{
BitsManager bitsManager = serviceProvider.GetRequiredService();
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/PassportClient2.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/PassportClient2.cs
index 81d2ad9f..6ce1be1f 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/PassportClient2.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/PassportClient2.cs
@@ -35,28 +35,6 @@ internal class PassportClient2
this.logger = logger;
}
- ///
- /// 异步账密登录
- ///
- /// 账密数据
- /// 取消令牌
- /// 登录数据
- [ApiInformation(Salt = SaltType.PROD)]
- public async Task?, Aigis?>> LoginByPasswordAsync(Dictionary data, CancellationToken token)
- {
- HttpResponseMessage resp = await httpClient
- .UseDynamicSecret(DynamicSecretVersion.Gen2, SaltType.PROD, true)
- .PostAsJsonAsync(ApiEndpoints.AccountLoginByPassword, data, options, token)
- .ConfigureAwait(false);
-
- _ = resp.Headers.TryGetValues("X-Rpc-Aigis", out IEnumerable? values);
-
- Aigis? aigis = values != null && values.Any() ? JsonSerializer.Deserialize(values.Single(), options) : null;
- Response? body = await resp.Content.ReadFromJsonAsync>(options, token).ConfigureAwait(false);
-
- return new(body, aigis);
- }
-
///
/// V1Stoken 登录
///
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/RSAEncryptedString.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/RSAEncryptedString.cs
deleted file mode 100644
index 3c1c0d29..00000000
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/RSAEncryptedString.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (c) DGP Studio. All rights reserved.
-// Licensed under the MIT license.
-
-using System.Security.Cryptography;
-using System.Text;
-
-namespace Snap.Hutao.Web.Hoyolab.Passport;
-
-///
-/// 支持RSA转换
-///
-internal class RSAEncryptedString
-{
- private const string RsaPublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDvekdPMHN3AYhm/vktJT+YJr7cI5DcsNKqdsx5DZX0gDuWFuIjzdwButrIYPNmRJ1G8ybDIF7oDW2eEpm5sMbL9zs\n9ExXCdvqrn51qELbqj0XxtMTIpaCHFSI50PfPpTFV9Xt/hmyVwokoOXFlAEgCn+Q\nCgGs52bFoYMtyi+xEQIDAQAB\n";
-
- private readonly string encryptedSource;
-
- private RSAEncryptedString(string encryptedSource)
- {
- this.encryptedSource = encryptedSource;
- }
-
- public static implicit operator string(RSAEncryptedString encryptedString)
- {
- return encryptedString.encryptedSource;
- }
-
- ///
- /// 加密
- ///
- /// 源
- /// 字节数组
- public static RSAEncryptedString Encrypt(string source)
- {
- RSA rsa = RSA.Create();
- rsa.ImportFromPem($"-----BEGIN PUBLIC KEY-----\n{RsaPublicKey}-----END PUBLIC KEY-----");
- byte[] bytes = Encoding.UTF8.GetBytes(source);
- string encrypted = Convert.ToBase64String(rsa.Encrypt(bytes, RSAEncryptionPadding.Pkcs1));
-
- return new(encrypted);
- }
-}
\ No newline at end of file