From 230f454d2c05220ae1f4ae159a97c2d45a5b24a8 Mon Sep 17 00:00:00 2001 From: Scighost Date: Mon, 16 Sep 2024 20:03:38 +0800 Subject: [PATCH] change type of gacha_type --- src/Starward.Core/EnumExtension.cs | 205 +----------------- .../Gacha/GachaItemIdJsonConverter.cs | 29 +++ src/Starward.Core/Gacha/GachaLogClient.cs | 25 ++- src/Starward.Core/Gacha/GachaLogItem.cs | 77 +------ src/Starward.Core/Gacha/GachaLogQuery.cs | 23 +- src/Starward.Core/Gacha/GachaType.cs | 100 --------- .../Gacha/Genshin/GenshinGachaClient.cs | 6 +- .../Gacha/Genshin/GenshinGachaItem.cs | 4 + .../Gacha/Genshin/GenshinGachaType.cs | 65 ++++++ src/Starward.Core/Gacha/IGachaType.cs | 11 + .../Gacha/StarRail/StarRailGachaClient.cs | 6 +- .../Gacha/StarRail/StarRailGachaItem.cs | 4 + .../Gacha/StarRail/StarRailGachaType.cs | 54 +++++ src/Starward.Core/Gacha/UndefinedGachaType.cs | 14 ++ src/Starward.Core/Gacha/ZZZ/ZZZGachaClient.cs | 8 +- src/Starward.Core/Gacha/ZZZ/ZZZGachaItem.cs | 2 +- src/Starward.Core/Gacha/ZZZ/ZZZGachaType.cs | 51 +++++ src/Starward.Core/GameBizEnum.cs | 120 ---------- .../ImaginariumTheaterInfo.cs | 2 +- .../TrailblazeCalendarDetailItem.cs | 2 +- src/Starward.Core/GameRegistry.cs | 7 +- .../JsonConverter/DateTimeJsonConverter.cs | 25 +++ .../SelfQuery/GenshinQueryItem.cs | 2 +- .../SelfQuery/StarRailQueryItem.cs | 2 +- src/Starward.Core/SelfQuery/ZZZQueryItem.cs | 2 +- ...chaPityProgressBackgroundBrushConverter.cs | 7 +- src/Starward/Models/GachaLogItemEx.cs | 5 +- src/Starward/Models/GachaTypeStats.cs | 5 +- src/Starward/Pages/GachaLogPage.xaml.cs | 6 +- src/Starward/Pages/LauncherPage.xaml.cs | 17 +- .../Services/Gacha/GachaLogService.cs | 43 ++-- .../Services/Gacha/GenshinGachaService.cs | 19 +- .../Services/Gacha/StarRailGachaService.cs | 11 +- .../Services/Gacha/ZZZGachaService.cs | 29 ++- 34 files changed, 378 insertions(+), 610 deletions(-) create mode 100644 src/Starward.Core/Gacha/GachaItemIdJsonConverter.cs delete mode 100644 src/Starward.Core/Gacha/GachaType.cs create mode 100644 src/Starward.Core/Gacha/Genshin/GenshinGachaType.cs create mode 100644 src/Starward.Core/Gacha/IGachaType.cs create mode 100644 src/Starward.Core/Gacha/StarRail/StarRailGachaType.cs create mode 100644 src/Starward.Core/Gacha/UndefinedGachaType.cs create mode 100644 src/Starward.Core/Gacha/ZZZ/ZZZGachaType.cs delete mode 100644 src/Starward.Core/GameBizEnum.cs create mode 100644 src/Starward.Core/JsonConverter/DateTimeJsonConverter.cs diff --git a/src/Starward.Core/EnumExtension.cs b/src/Starward.Core/EnumExtension.cs index 28fc14172..43697aa69 100644 --- a/src/Starward.Core/EnumExtension.cs +++ b/src/Starward.Core/EnumExtension.cs @@ -1,5 +1,4 @@ -using Starward.Core.Gacha; -using Starward.Core.Launcher; +using Starward.Core.Launcher; using Starward.Core.SelfQuery; using System.ComponentModel; using System.Reflection; @@ -25,208 +24,6 @@ public static string ToDescription(this Enum @enum) } - public static GameBizEnum ToGame(this GameBizEnum biz) - { - return (int)biz switch - { - 11 or 12 or 13 or 14 => GameBizEnum.GenshinImpact, - 21 or 22 or 24 => GameBizEnum.StarRail, - >= 31 and <= 37 => GameBizEnum.Honkai3rd, - 41 or 42 or 44 => GameBizEnum.ZZZ, - _ => GameBizEnum.None, - }; - } - - - public static string ToGameName(this GameBizEnum biz) - { - return biz.ToGame() switch - { - GameBizEnum.GenshinImpact => CoreLang.Game_GenshinImpact, - GameBizEnum.StarRail => CoreLang.Game_HonkaiStarRail, - GameBizEnum.Honkai3rd => CoreLang.Game_HonkaiImpact3rd, - GameBizEnum.ZZZ => CoreLang.Game_ZZZ, - _ => "", - }; - } - - - public static string ToGameServer(this GameBizEnum biz) - { - return biz switch - { - GameBizEnum.hk4e_cn => CoreLang.GameServer_ChinaOfficial, - GameBizEnum.hk4e_global => CoreLang.GameServer_GlobalOfficial, - GameBizEnum.hk4e_cloud => CoreLang.GameServer_ChinaCloud, - GameBizEnum.hk4e_bilibili => CoreLang.GameServer_Bilibili, - GameBizEnum.hkrpg_cn => CoreLang.GameServer_ChinaOfficial, - GameBizEnum.hkrpg_global => CoreLang.GameServer_GlobalOfficial, - GameBizEnum.hkrpg_bilibili => CoreLang.GameServer_Bilibili, - GameBizEnum.bh3_cn => CoreLang.GameServer_ChinaOfficial, - GameBizEnum.bh3_global => CoreLang.GameServer_EuropeAmericas, - GameBizEnum.bh3_jp => CoreLang.GameServer_Japan, - GameBizEnum.bh3_kr => CoreLang.GameServer_Korea, - GameBizEnum.bh3_overseas => CoreLang.GameServer_SoutheastAsia, - GameBizEnum.bh3_tw => CoreLang.GameServer_TraditionalChinese, - GameBizEnum.nap_cn => CoreLang.GameServer_ChinaOfficial, - GameBizEnum.nap_global => CoreLang.GameServer_GlobalOfficial, - GameBizEnum.nap_bilibili => CoreLang.GameServer_Bilibili, - _ => "", - }; - } - - - public static bool IsChinaServer(this GameBizEnum biz) - { - return (int)biz switch - { - 11 or 13 or 14 or 21 or 24 or 31 or 41 => true, - _ => false, - }; - } - - - public static bool IsGlobalServer(this GameBizEnum biz) - { - return (int)biz switch - { - 12 or 22 or (>= 32 and <= 36) or 42 => true, - _ => false, - }; - } - - - public static bool IsBilibiliServer(this GameBizEnum biz) - { - return (int)biz switch - { - 14 or 24 or 44 => true, - _ => false, - }; - } - - - - public static bool IsChinaOfficial(this GameBizEnum biz) - { - return biz switch - { - GameBizEnum.hk4e_cn or GameBizEnum.hkrpg_cn or GameBizEnum.bh3_cn or GameBizEnum.nap_cn => true, - _ => false, - }; - } - - - public static bool IsGlobalOfficial(this GameBizEnum biz) - { - return biz switch - { - GameBizEnum.hk4e_global or GameBizEnum.hkrpg_global or GameBizEnum.bh3_global or GameBizEnum.nap_global => true, - GameBizEnum.bh3_jp or GameBizEnum.bh3_kr or GameBizEnum.bh3_overseas or GameBizEnum.bh3_tw => true, - _ => false, - }; - } - - - public static bool IsBilibili(this GameBizEnum biz) - { - return biz switch - { - GameBizEnum.hk4e_bilibili or GameBizEnum.hkrpg_bilibili or GameBizEnum.nap_bilibili => true, - _ => false, - }; - } - - - public static bool IsChinaCloud(this GameBizEnum biz) - { - return biz switch - { - GameBizEnum.hk4e_cloud => true, - _ => false, - }; - } - - - - - public static string GetLauncherRegistryKey(this GameBizEnum biz) - { - return biz switch - { - GameBizEnum.hk4e_cn or GameBizEnum.hk4e_bilibili => GameRegistry.LauncherPath_hk4e_cn, - GameBizEnum.hk4e_global => GameRegistry.LauncherPath_hk4e_global, - GameBizEnum.hk4e_cloud => GameRegistry.LauncherPath_hk4e_cloud, - GameBizEnum.hkrpg_cn or GameBizEnum.hkrpg_bilibili => GameRegistry.LauncherPath_hkrpg_cn, - GameBizEnum.hkrpg_global => GameRegistry.LauncherPath_hkrpg_global, - GameBizEnum.bh3_cn => GameRegistry.LauncherPath_bh3_cn, - GameBizEnum.bh3_global => GameRegistry.LauncherPath_bh3_global, - GameBizEnum.bh3_jp => GameRegistry.LauncherPath_bh3_jp, - GameBizEnum.bh3_kr => GameRegistry.LauncherPath_bh3_kr, - GameBizEnum.bh3_overseas => GameRegistry.LauncherPath_bh3_overseas, - GameBizEnum.bh3_tw => GameRegistry.LauncherPath_bh3_tw, - GameBizEnum.nap_cn or GameBizEnum.nap_bilibili => GameRegistry.LauncherPath_HYP_cn, - GameBizEnum.nap_global => GameRegistry.LauncherPath_HYP_os, - _ => "HKEY_LOCAL_MACHINE", - }; - } - - - - public static string GetGameRegistryKey(this GameBizEnum biz) - { - return biz switch - { - GameBizEnum.hk4e_cn or GameBizEnum.hk4e_bilibili => GameRegistry.GamePath_hk4e_cn, - GameBizEnum.hk4e_global => GameRegistry.GamePath_hk4e_global, - GameBizEnum.hk4e_cloud => GameRegistry.GamePath_hk4e_cloud, - GameBizEnum.hkrpg_cn or GameBizEnum.hkrpg_bilibili => GameRegistry.GamePath_hkrpg_cn, - GameBizEnum.hkrpg_global => GameRegistry.GamePath_hkrpg_global, - GameBizEnum.bh3_cn => GameRegistry.GamePath_bh3_cn, - GameBizEnum.bh3_global => GameRegistry.GamePath_bh3_global, - GameBizEnum.bh3_jp => GameRegistry.GamePath_bh3_jp, - GameBizEnum.bh3_kr => GameRegistry.GamePath_bh3_kr, - GameBizEnum.bh3_overseas => GameRegistry.GamePath_bh3_overseas, - GameBizEnum.bh3_tw => GameRegistry.GamePath_bh3_tw, - GameBizEnum.nap_cn or GameBizEnum.nap_bilibili => GameRegistry.GamePath_nap_cn, - GameBizEnum.nap_global => GameRegistry.GamePath_nap_global, - _ => "HKEY_CURRENT_USER", - }; - } - - - public static string ToLocalization(this GachaType gachaType) - { - return gachaType switch - { - GachaType.StellarWarp => CoreLang.GachaType_StellarWarp, - GachaType.DepartureWarp => CoreLang.GachaType_DepartureWarp, - GachaType.CharacterEventWarp => CoreLang.GachaType_CharacterEventWarp, - GachaType.LightConeEventWarp => CoreLang.GachaType_LightConeEventWarp, - GachaType.NoviceWish => CoreLang.GachaType_NoviceWish, - GachaType.PermanentWish => CoreLang.GachaType_PermanentWish, - GachaType.CharacterEventWish => CoreLang.GachaType_CharacterEventWish, - GachaType.CharacterEventWish_2 => CoreLang.GachaType_CharacterEventWish_2, - GachaType.WeaponEventWish => CoreLang.GachaType_WeaponEventWish, - GachaType.ChronicledWish => CoreLang.GachaType_ChronicledWish, - _ => "", - }; - } - - - public static string ToZZZLocalization(this GachaType gachaType) - { - return gachaType switch - { - GachaType.StandardChannel => CoreLang.GachaType_StandardChannel, - GachaType.ExclusiveChannel => CoreLang.GachaType_ExclusiveChannel, - GachaType.WEngineChannel => CoreLang.GachaType_WEngineChannel, - GachaType.BangbooChannel => CoreLang.GachaType_BangbooChannel, - _ => "", - }; - } - - public static string ToLocalization(this PostType postType) { diff --git a/src/Starward.Core/Gacha/GachaItemIdJsonConverter.cs b/src/Starward.Core/Gacha/GachaItemIdJsonConverter.cs new file mode 100644 index 000000000..0203c54d0 --- /dev/null +++ b/src/Starward.Core/Gacha/GachaItemIdJsonConverter.cs @@ -0,0 +1,29 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Starward.Core.Gacha; + +internal class GachaItemIdJsonConverter : JsonConverter +{ + public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType is JsonTokenType.Number) + { + return reader.GetInt32(); + } + if ((reader.TokenType is JsonTokenType.String)) + { + var str = reader.GetString(); + if (int.TryParse(str, out var id)) + { + return id; + } + } + return 0; + } + + public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options) + { + writer.WriteStringValue(value.ToString()); + } +} diff --git a/src/Starward.Core/Gacha/GachaLogClient.cs b/src/Starward.Core/Gacha/GachaLogClient.cs index 09dcacd53..616f9bf89 100644 --- a/src/Starward.Core/Gacha/GachaLogClient.cs +++ b/src/Starward.Core/Gacha/GachaLogClient.cs @@ -64,7 +64,7 @@ public abstract class GachaLogClient protected readonly HttpClient _httpClient; - protected abstract IReadOnlyCollection GachaTypes { get; init; } + public abstract IReadOnlyCollection QueryGachaTypes { get; init; } @@ -89,7 +89,7 @@ public GachaLogClient(HttpClient? httpClient = null) public async Task GetUidByGachaUrlAsync(string gachaUrl) { var prefix = GetGachaUrlPrefix(gachaUrl); - foreach (var gachaType in GachaTypes) + foreach (var gachaType in QueryGachaTypes) { var param = new GachaLogQuery(gachaType, 1, 1, 0); var list = await GetGachaLogByQueryAsync(prefix, param); @@ -103,10 +103,10 @@ public async Task GetUidByGachaUrlAsync(string gachaUrl) - public abstract Task> GetGachaLogAsync(string gachaUrl, long endId = 0, string? lang = null, IProgress<(GachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default); + public abstract Task> GetGachaLogAsync(string gachaUrl, long endId = 0, string? lang = null, IProgress<(IGachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default); - public abstract Task> GetGachaLogAsync(string gachaUrl, GachaType gachaType, long endId = 0, string? lang = null, IProgress<(GachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default); + public abstract Task> GetGachaLogAsync(string gachaUrl, IGachaType gachaType, long endId = 0, string? lang = null, IProgress<(IGachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default); public abstract Task> GetGachaLogAsync(string gachaUrl, GachaLogQuery query, CancellationToken cancellationToken = default); @@ -249,12 +249,12 @@ protected async Task CommonGetAsync(string url, CancellationToken cancella - protected async Task> GetGachaLogAsync(string gachaUrl, long endId = 0, string? lang = null, IProgress<(GachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default) where T : GachaLogItem + protected async Task> GetGachaLogAsync(string gachaUrl, long endId = 0, string? lang = null, IProgress<(IGachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default) where T : GachaLogItem { endId = Math.Clamp(endId, 0, long.MaxValue); var prefix = GetGachaUrlPrefix(gachaUrl, lang); var result = new List(); - foreach (var gachaType in GachaTypes) + foreach (var gachaType in QueryGachaTypes) { result.AddRange(await GetGachaLogByTypeAsync(prefix, gachaType, endId, progress, cancellationToken)); } @@ -264,7 +264,7 @@ protected async Task> GetGachaLogAsync(string gachaUrl, long endId = - protected async Task> GetGachaLogAsync(string gachaUrl, GachaType gachaType, long endId = 0, string? lang = null, IProgress<(GachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default) where T : GachaLogItem + protected async Task> GetGachaLogAsync(string gachaUrl, IGachaType gachaType, long endId = 0, string? lang = null, IProgress<(IGachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default) where T : GachaLogItem { endId = Math.Clamp(endId, 0, long.MaxValue); var prefix = GetGachaUrlPrefix(gachaUrl, lang); @@ -296,7 +296,7 @@ protected virtual async Task> GetGachaLogByQueryAsync(string gachaUrl - private async Task> GetGachaLogByTypeAsync(string prefix, GachaType gachaType, long endId = 0, IProgress<(GachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default) where T : GachaLogItem + private async Task> GetGachaLogByTypeAsync(string prefix, IGachaType gachaType, long endId = 0, IProgress<(IGachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default) where T : GachaLogItem { var param = new GachaLogQuery(gachaType, 1, 20, 0); var result = new List(); @@ -358,6 +358,10 @@ private async Task> GetGachaLogByTypeAsync(string prefix, GachaType g + + #region Gacha Info + + public async Task GetGenshinGachaInfoAsync(GameBiz gameBiz, string lang, CancellationToken cancellationToken = default) { lang = LanguageUtil.FilterLanguage(lang); @@ -415,7 +419,6 @@ public async Task GetStarRailGachaInfoAsync(GameBiz gameBiz, } - // todo [Obsolete("Not finished", true)] public async Task GetZZZGachaInfoAsync(GameBiz gameBiz, string lang, CancellationToken cancellationToken = default) @@ -438,4 +441,8 @@ public async Task GetZZZGachaInfoAsync(GameBiz gameBiz, string + #endregion + + + } diff --git a/src/Starward.Core/Gacha/GachaLogItem.cs b/src/Starward.Core/Gacha/GachaLogItem.cs index 907de6990..e51adaa49 100644 --- a/src/Starward.Core/Gacha/GachaLogItem.cs +++ b/src/Starward.Core/Gacha/GachaLogItem.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using Starward.Core.JsonConverter; using System.Text.Json.Serialization; namespace Starward.Core.Gacha; @@ -17,8 +17,8 @@ public class GachaLogItem [JsonPropertyName("gacha_type")] - [JsonConverter(typeof(GachaTypeJsonConverter))] - public GachaType GachaType { get; set; } + [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)] + public int GachaType { get; set; } [JsonPropertyName("name")] @@ -40,7 +40,7 @@ public class GachaLogItem [JsonPropertyName("item_id")] - [JsonConverter(typeof(ItemIdJsonConverter))] + [JsonConverter(typeof(GachaItemIdJsonConverter))] public int ItemId { get; set; } @@ -53,75 +53,8 @@ public class GachaLogItem public string Lang { get; set; } -} - -internal class DateTimeJsonConverter : JsonConverter -{ - public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - var str = reader.GetString(); - if (DateTime.TryParse(str, out var time)) - { - return time; - } - else - { - return DateTime.MinValue; - } - } - - public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) - { - writer.WriteStringValue(value.ToString("yyyy-MM-dd HH:mm:ss")); - } -} + public virtual IGachaType GetGachaType() => new UndefinedGachaType(GachaType); -internal class ItemIdJsonConverter : JsonConverter -{ - public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - if (reader.TokenType is JsonTokenType.Number) - { - return reader.GetInt32(); - } - if ((reader.TokenType is JsonTokenType.String)) - { - var str = reader.GetString(); - if (int.TryParse(str, out var id)) - { - return id; - } - } - return 0; - } - - public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options) - { - writer.WriteStringValue(value.ToString()); - } } - - - -internal class GachaTypeJsonConverter : JsonConverter -{ - public override GachaType Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - var str = reader.GetString(); - if (int.TryParse(str, out int value)) - { - return (GachaType)value; - } - else - { - return 0; - } - } - - public override void Write(Utf8JsonWriter writer, GachaType value, JsonSerializerOptions options) - { - writer.WriteStringValue(((int)value).ToString()); - } -} \ No newline at end of file diff --git a/src/Starward.Core/Gacha/GachaLogQuery.cs b/src/Starward.Core/Gacha/GachaLogQuery.cs index 69ed050c8..c3b2b33ec 100644 --- a/src/Starward.Core/Gacha/GachaLogQuery.cs +++ b/src/Starward.Core/Gacha/GachaLogQuery.cs @@ -1,9 +1,11 @@ -namespace Starward.Core.Gacha; +using Starward.Core.Gacha.ZZZ; + +namespace Starward.Core.Gacha; public struct GachaLogQuery { - public GachaType GachaType { get; set; } + public IGachaType GachaType { get; set; } public int Page { get; set; } @@ -13,7 +15,7 @@ public struct GachaLogQuery - public GachaLogQuery(GachaType gachaType, int page, int size, long endId) + public GachaLogQuery(IGachaType gachaType, int page, int size, long endId) { GachaType = gachaType; Page = page; @@ -21,15 +23,20 @@ public GachaLogQuery(GachaType gachaType, int page, int size, long endId) EndId = endId; } + public override string ToString() { - return $"gacha_type={(int)GachaType}&page={Page}&size={Size}&end_id={EndId}"; + if (GachaType is ZZZGachaType) + { + return $"real_gacha_type={GachaType}&page={Page}&size={Size}&end_id={EndId}"; + } + else + { + return $"gacha_type={GachaType}&page={Page}&size={Size}&end_id={EndId}"; + } } - public string ToZZZString() - { - return $"real_gacha_type={(int)GachaType}&page={Page}&size={Size}&end_id={EndId}"; - } + } diff --git a/src/Starward.Core/Gacha/GachaType.cs b/src/Starward.Core/Gacha/GachaType.cs deleted file mode 100644 index 3367f6d2d..000000000 --- a/src/Starward.Core/Gacha/GachaType.cs +++ /dev/null @@ -1,100 +0,0 @@ -using System.ComponentModel; - -namespace Starward.Core.Gacha; - -public enum GachaType -{ - - /// - /// 群星跃迁 - /// - [Description("群星跃迁")] - StellarWarp = 1, - - - /// - /// 始发跃迁 - /// - [Description("始发跃迁")] - DepartureWarp = 2, - - - /// - /// 角色活动跃迁 - /// - [Description("角色活动跃迁")] - CharacterEventWarp = 11, - - - /// - /// 光锥活动跃迁 - /// - [Description("光锥活动跃迁")] - LightConeEventWarp = 12, - - - /// - /// 新手祈愿 - /// - [Description("新手祈愿")] - NoviceWish = 100, - - /// - /// 常驻祈愿 - /// - [Description("常驻祈愿")] - PermanentWish = 200, - - /// - /// 角色活动祈愿 - /// - [Description("角色活动祈愿")] - CharacterEventWish = 301, - - /// - /// 武器活动祈愿 - /// - [Description("武器活动祈愿")] - WeaponEventWish = 302, - - /// - /// 角色活动祈愿-2 - /// - [Description("角色活动祈愿-2")] - CharacterEventWish_2 = 400, - - /// - /// 集录祈愿 - /// - [Description("集录祈愿")] - ChronicledWish = 500, - - - /// - /// 常驻频段 - /// - [Description("常驻频段")] - StandardChannel = 1, - - /// - /// 独家频段 - /// - [Description("独家频段")] - ExclusiveChannel = 2, - - /// - /// 音擎频段 - /// - [Description("音擎频段")] - WEngineChannel = 3, - - /// - /// 邦布频段 - /// - [Description("邦布频段")] - BangbooChannel = 5, - - -} - - diff --git a/src/Starward.Core/Gacha/Genshin/GenshinGachaClient.cs b/src/Starward.Core/Gacha/Genshin/GenshinGachaClient.cs index 0ba18768d..6d02adb6d 100644 --- a/src/Starward.Core/Gacha/Genshin/GenshinGachaClient.cs +++ b/src/Starward.Core/Gacha/Genshin/GenshinGachaClient.cs @@ -7,7 +7,7 @@ public class GenshinGachaClient : GachaLogClient - protected override IReadOnlyCollection GachaTypes { get; init; } = new GachaType[] { (GachaType)100, (GachaType)200, (GachaType)301, (GachaType)302, (GachaType)500 }.AsReadOnly(); + public override IReadOnlyCollection QueryGachaTypes { get; init; } = new GenshinGachaType[] { 100, 200, 301, 302, 500 }.Cast().ToList().AsReadOnly(); @@ -64,7 +64,7 @@ protected override string GetGachaUrlPrefix(string gachaUrl, string? lang = null - public override async Task> GetGachaLogAsync(string gachaUrl, long endId = 0, string? lang = null, IProgress<(GachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default) + public override async Task> GetGachaLogAsync(string gachaUrl, long endId = 0, string? lang = null, IProgress<(IGachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default) { return await GetGachaLogAsync(gachaUrl, endId, lang, progress, cancellationToken); } @@ -72,7 +72,7 @@ public override async Task> GetGachaLogAsync(string ga - public override async Task> GetGachaLogAsync(string gachaUrl, GachaType gachaType, long endId = 0, string? lang = null, IProgress<(GachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default) + public override async Task> GetGachaLogAsync(string gachaUrl, IGachaType gachaType, long endId = 0, string? lang = null, IProgress<(IGachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default) { return await GetGachaLogAsync(gachaUrl, gachaType, endId, lang, progress, cancellationToken); } diff --git a/src/Starward.Core/Gacha/Genshin/GenshinGachaItem.cs b/src/Starward.Core/Gacha/Genshin/GenshinGachaItem.cs index 40f2dc3fe..58e3b5613 100644 --- a/src/Starward.Core/Gacha/Genshin/GenshinGachaItem.cs +++ b/src/Starward.Core/Gacha/Genshin/GenshinGachaItem.cs @@ -3,4 +3,8 @@ public class GenshinGachaItem : GachaLogItem { + + public override IGachaType GetGachaType() => new GenshinGachaType(GachaType); + + } diff --git a/src/Starward.Core/Gacha/Genshin/GenshinGachaType.cs b/src/Starward.Core/Gacha/Genshin/GenshinGachaType.cs new file mode 100644 index 000000000..ff45845f3 --- /dev/null +++ b/src/Starward.Core/Gacha/Genshin/GenshinGachaType.cs @@ -0,0 +1,65 @@ +using System.ComponentModel; + +namespace Starward.Core.Gacha.Genshin; + +public readonly record struct GenshinGachaType(int Value) : IGachaType +{ + + + /// + /// 新手祈愿 + /// + [Description("新手祈愿")] + public const int NoviceWish = 100; + + /// + /// 常驻祈愿 + /// + [Description("常驻祈愿")] + public const int PermanentWish = 200; + + /// + /// 角色活动祈愿 + /// + [Description("角色活动祈愿")] + public const int CharacterEventWish = 301; + + /// + /// 武器活动祈愿 + /// + [Description("武器活动祈愿")] + public const int WeaponEventWish = 302; + + /// + /// 角色活动祈愿-2 + /// + [Description("角色活动祈愿-2")] + public const int CharacterEventWish_2 = 400; + + /// + /// 集录祈愿 + /// + [Description("集录祈愿")] + public const int ChronicledWish = 500; + + + + public string ToLocalization() => Value switch + { + NoviceWish => CoreLang.GachaType_NoviceWish, + PermanentWish => CoreLang.GachaType_PermanentWish, + CharacterEventWish => CoreLang.GachaType_CharacterEventWish, + CharacterEventWish_2 => CoreLang.GachaType_CharacterEventWish_2, + WeaponEventWish => CoreLang.GachaType_WeaponEventWish, + ChronicledWish => CoreLang.GachaType_ChronicledWish, + _ => "", + }; + + + + public override string ToString() => Value.ToString(); + public static implicit operator GenshinGachaType(int value) => new(value); + public static implicit operator int(GenshinGachaType value) => value.Value; + + +} diff --git a/src/Starward.Core/Gacha/IGachaType.cs b/src/Starward.Core/Gacha/IGachaType.cs new file mode 100644 index 000000000..345a2c326 --- /dev/null +++ b/src/Starward.Core/Gacha/IGachaType.cs @@ -0,0 +1,11 @@ +namespace Starward.Core.Gacha; + +public interface IGachaType +{ + + public int Value { get; init; } + + + public string ToLocalization(); + +} diff --git a/src/Starward.Core/Gacha/StarRail/StarRailGachaClient.cs b/src/Starward.Core/Gacha/StarRail/StarRailGachaClient.cs index 45240d9bb..00aae76f0 100644 --- a/src/Starward.Core/Gacha/StarRail/StarRailGachaClient.cs +++ b/src/Starward.Core/Gacha/StarRail/StarRailGachaClient.cs @@ -7,7 +7,7 @@ public class StarRailGachaClient : GachaLogClient - protected override IReadOnlyCollection GachaTypes { get; init; } = new GachaType[] { (GachaType)1, (GachaType)2, (GachaType)11, (GachaType)12 }.AsReadOnly(); + public override IReadOnlyCollection QueryGachaTypes { get; init; } = new StarRailGachaType[] { 1, 2, 11, 12 }.Cast().ToList().AsReadOnly(); @@ -66,14 +66,14 @@ protected override string GetGachaUrlPrefix(string gachaUrl, string? lang = null - public override async Task> GetGachaLogAsync(string gachaUrl, long endId = 0, string? lang = null, IProgress<(GachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default) + public override async Task> GetGachaLogAsync(string gachaUrl, long endId = 0, string? lang = null, IProgress<(IGachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default) { return await GetGachaLogAsync(gachaUrl, endId, lang, progress, cancellationToken); } - public override async Task> GetGachaLogAsync(string gachaUrl, GachaType gachaType, long endId = 0, string? lang = null, IProgress<(GachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default) + public override async Task> GetGachaLogAsync(string gachaUrl, IGachaType gachaType, long endId = 0, string? lang = null, IProgress<(IGachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default) { return await GetGachaLogAsync(gachaUrl, gachaType, endId, lang, progress, cancellationToken); } diff --git a/src/Starward.Core/Gacha/StarRail/StarRailGachaItem.cs b/src/Starward.Core/Gacha/StarRail/StarRailGachaItem.cs index 411596efe..b94bc7a31 100644 --- a/src/Starward.Core/Gacha/StarRail/StarRailGachaItem.cs +++ b/src/Starward.Core/Gacha/StarRail/StarRailGachaItem.cs @@ -9,5 +9,9 @@ public class StarRailGachaItem : GachaLogItem [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)] public int GachaId { get; set; } + + public override IGachaType GetGachaType() => new StarRailGachaType(GachaType); + + } diff --git a/src/Starward.Core/Gacha/StarRail/StarRailGachaType.cs b/src/Starward.Core/Gacha/StarRail/StarRailGachaType.cs new file mode 100644 index 000000000..cf34f13d3 --- /dev/null +++ b/src/Starward.Core/Gacha/StarRail/StarRailGachaType.cs @@ -0,0 +1,54 @@ +using System.ComponentModel; + +namespace Starward.Core.Gacha.StarRail; + +public readonly record struct StarRailGachaType(int Value) : IGachaType +{ + + + /// + /// 群星跃迁 + /// + [Description("群星跃迁")] + public const int StellarWarp = 1; + + + /// + /// 始发跃迁 + /// + [Description("始发跃迁")] + public const int DepartureWarp = 2; + + + /// + /// 角色活动跃迁 + /// + [Description("角色活动跃迁")] + public const int CharacterEventWarp = 11; + + + /// + /// 光锥活动跃迁 + /// + [Description("光锥活动跃迁")] + public const int LightConeEventWarp = 12; + + + + public string ToLocalization() => Value switch + { + StellarWarp => CoreLang.GachaType_StellarWarp, + DepartureWarp => CoreLang.GachaType_DepartureWarp, + CharacterEventWarp => CoreLang.GachaType_CharacterEventWarp, + LightConeEventWarp => CoreLang.GachaType_LightConeEventWarp, + _ => "", + }; + + + + public override string ToString() => Value.ToString(); + public static implicit operator StarRailGachaType(int value) => new(value); + public static implicit operator int(StarRailGachaType gachaType) => gachaType.Value; + + +} diff --git a/src/Starward.Core/Gacha/UndefinedGachaType.cs b/src/Starward.Core/Gacha/UndefinedGachaType.cs new file mode 100644 index 000000000..5ce982787 --- /dev/null +++ b/src/Starward.Core/Gacha/UndefinedGachaType.cs @@ -0,0 +1,14 @@ +namespace Starward.Core.Gacha; + +public readonly record struct UndefinedGachaType(int Value) : IGachaType +{ + + public string ToLocalization() => Value.ToString(); + + public override string ToString() => Value.ToString(); + + + public static implicit operator UndefinedGachaType(int value) => new(value); + public static implicit operator int(UndefinedGachaType value) => value.Value; + +} diff --git a/src/Starward.Core/Gacha/ZZZ/ZZZGachaClient.cs b/src/Starward.Core/Gacha/ZZZ/ZZZGachaClient.cs index 80a7873a9..1150cb36b 100644 --- a/src/Starward.Core/Gacha/ZZZ/ZZZGachaClient.cs +++ b/src/Starward.Core/Gacha/ZZZ/ZZZGachaClient.cs @@ -8,7 +8,7 @@ public class ZZZGachaClient : GachaLogClient - protected override IReadOnlyCollection GachaTypes { get; init; } = new GachaType[] { (GachaType)1, (GachaType)2, (GachaType)3, (GachaType)5 }.AsReadOnly(); + public override IReadOnlyCollection QueryGachaTypes { get; init; } = new ZZZGachaType[] { 1, 2, 3, 5 }.Cast().ToList().AsReadOnly(); @@ -65,7 +65,7 @@ protected override string GetGachaUrlPrefix(string gachaUrl, string? lang = null - public override async Task> GetGachaLogAsync(string gachaUrl, long endId = 0, string? lang = null, IProgress<(GachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default) + public override async Task> GetGachaLogAsync(string gachaUrl, long endId = 0, string? lang = null, IProgress<(IGachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default) { return await GetGachaLogAsync(gachaUrl, endId, lang, progress, cancellationToken); } @@ -73,7 +73,7 @@ public override async Task> GetGachaLogAsync(string ga - public override async Task> GetGachaLogAsync(string gachaUrl, GachaType gachaType, long endId = 0, string? lang = null, IProgress<(GachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default) + public override async Task> GetGachaLogAsync(string gachaUrl, IGachaType gachaType, long endId = 0, string? lang = null, IProgress<(IGachaType GachaType, int Page)>? progress = null, CancellationToken cancellationToken = default) { return await GetGachaLogAsync(gachaUrl, gachaType, endId, lang, progress, cancellationToken); } @@ -91,7 +91,7 @@ public override async Task> GetGachaLogAsync(string ga protected override async Task> GetGachaLogByQueryAsync(string gachaUrlPrefix, GachaLogQuery param, CancellationToken cancellationToken = default) { await Task.Delay(Random.Shared.Next(200, 300)); - var url = $"{gachaUrlPrefix}&{param.ToZZZString()}"; + var url = $"{gachaUrlPrefix}&{param}"; var wrapper = await _httpClient.GetFromJsonAsync(url, typeof(miHoYoApiWrapper>), GachaLogJsonContext.Default, cancellationToken) as miHoYoApiWrapper>; if (wrapper is null) { diff --git a/src/Starward.Core/Gacha/ZZZ/ZZZGachaItem.cs b/src/Starward.Core/Gacha/ZZZ/ZZZGachaItem.cs index fde8b7e3a..1bb98dbfe 100644 --- a/src/Starward.Core/Gacha/ZZZ/ZZZGachaItem.cs +++ b/src/Starward.Core/Gacha/ZZZ/ZZZGachaItem.cs @@ -3,6 +3,6 @@ public class ZZZGachaItem : GachaLogItem { - + public override IGachaType GetGachaType() => new ZZZGachaType(GachaType); } diff --git a/src/Starward.Core/Gacha/ZZZ/ZZZGachaType.cs b/src/Starward.Core/Gacha/ZZZ/ZZZGachaType.cs new file mode 100644 index 000000000..4c5979f1b --- /dev/null +++ b/src/Starward.Core/Gacha/ZZZ/ZZZGachaType.cs @@ -0,0 +1,51 @@ +using System.ComponentModel; + +namespace Starward.Core.Gacha.ZZZ; + +public readonly record struct ZZZGachaType(int Value) : IGachaType +{ + + + /// + /// 常驻频段 + /// + [Description("常驻频段")] + public const int StandardChannel = 1; + + /// + /// 独家频段 + /// + [Description("独家频段")] + public const int ExclusiveChannel = 2; + + /// + /// 音擎频段 + /// + [Description("音擎频段")] + public const int WEngineChannel = 3; + + /// + /// 邦布频段 + /// + [Description("邦布频段")] + public const int BangbooChannel = 5; + + + + public string ToLocalization() => Value switch + { + StandardChannel => CoreLang.GachaType_StandardChannel, + ExclusiveChannel => CoreLang.GachaType_ExclusiveChannel, + WEngineChannel => CoreLang.GachaType_WEngineChannel, + BangbooChannel => CoreLang.GachaType_BangbooChannel, + _ => "", + }; + + + + public override string ToString() => Value.ToString(); + public static implicit operator ZZZGachaType(int value) => new(value); + public static implicit operator int(ZZZGachaType gachaType) => gachaType.Value; + + +} \ No newline at end of file diff --git a/src/Starward.Core/GameBizEnum.cs b/src/Starward.Core/GameBizEnum.cs deleted file mode 100644 index 490bce34c..000000000 --- a/src/Starward.Core/GameBizEnum.cs +++ /dev/null @@ -1,120 +0,0 @@ -namespace Starward.Core; - -[Obsolete("GameBizEnum")] -public enum GameBizEnum -{ - - None = 0, - - All = 1, - - - /// - /// Genshin Impact - /// - GenshinImpact = 10, - - /// - /// Genshin Impact China - /// - hk4e_cn = 11, - - /// - /// Genshin Impact Global - /// - hk4e_global = 12, - - /// - /// Genshin Impact Cloud - /// - hk4e_cloud = 13, - - /// - /// Genshin Impact Bilibili - /// - hk4e_bilibili = 14, - - - /// - /// Star Rail - /// - StarRail = 20, - - /// - /// Star Rail China - /// - hkrpg_cn = 21, - - /// - /// Star Rail Global - /// - hkrpg_global = 22, - - /// - /// Star Rail Cloud - /// - //hkrpg_cloud = 23, - - /// - /// Star Rail Bilibili - /// - hkrpg_bilibili = 24, - - - /// - /// Honkai Impact 3rd - /// - Honkai3rd = 30, - - /// - /// Honkai Impact 3rd China - /// - bh3_cn = 31, - - /// - /// Honkai Impact 3rd Global - /// - bh3_global = 32, - - /// - /// Honkai Impact 3rd Japan - /// - bh3_jp = 33, - - /// - /// Honkai Impact 3rd Korea - /// - bh3_kr = 34, - - /// - /// Honkai Impact 3rd Southeast Asia - /// - bh3_overseas = 35, - - /// - /// Honkai Impact 3rd Traditional Chinese - /// - bh3_tw = 36, - - - /// - /// Zenless Zone Zero - /// - ZZZ = 40, - - /// - /// Zenless Zone Zero China - /// - nap_cn = 41, - - /// - /// Zenless Zone Zero Global - /// - nap_global = 42, - - /// - /// Zenless Zone Zero Bilibili - /// - nap_bilibili = 44, - -} diff --git a/src/Starward.Core/GameRecord/Genshin/ImaginariumTheater/ImaginariumTheaterInfo.cs b/src/Starward.Core/GameRecord/Genshin/ImaginariumTheater/ImaginariumTheaterInfo.cs index 5c7f0125a..f84ef7df5 100644 --- a/src/Starward.Core/GameRecord/Genshin/ImaginariumTheater/ImaginariumTheaterInfo.cs +++ b/src/Starward.Core/GameRecord/Genshin/ImaginariumTheater/ImaginariumTheaterInfo.cs @@ -1,4 +1,4 @@ -using Starward.Core.Gacha; +using Starward.Core.JsonConverter; using System.Text.Json.Serialization; namespace Starward.Core.GameRecord.Genshin.ImaginariumTheater; diff --git a/src/Starward.Core/GameRecord/StarRail/TrailblazeCalendar/TrailblazeCalendarDetailItem.cs b/src/Starward.Core/GameRecord/StarRail/TrailblazeCalendar/TrailblazeCalendarDetailItem.cs index 6a5f6fb03..1436dad2e 100644 --- a/src/Starward.Core/GameRecord/StarRail/TrailblazeCalendar/TrailblazeCalendarDetailItem.cs +++ b/src/Starward.Core/GameRecord/StarRail/TrailblazeCalendar/TrailblazeCalendarDetailItem.cs @@ -1,4 +1,4 @@ -using Starward.Core.Gacha; +using Starward.Core.JsonConverter; using System.Text.Json.Serialization; namespace Starward.Core.GameRecord.StarRail.TrailblazeCalendar; diff --git a/src/Starward.Core/GameRegistry.cs b/src/Starward.Core/GameRegistry.cs index cbea99d34..012e6764d 100644 --- a/src/Starward.Core/GameRegistry.cs +++ b/src/Starward.Core/GameRegistry.cs @@ -4,8 +4,6 @@ public class GameRegistry { - public const string InstallPath = "InstallPath"; - // Outdated launcher public const string LauncherPath_hk4e_cn = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\原神"; public const string LauncherPath_hk4e_global = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Genshin Impact"; @@ -21,7 +19,7 @@ public class GameRegistry public const string LauncherPath_bh3_kr = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\붕괴3rd"; public const string LauncherPath_bh3_jp = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\崩壊3rd"; - public const string LauncherPath_nap_cbt3 = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\HYP_standalone_1_1_nap_cn"; + // New launcher public const string LauncherPath_HYP_cn = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\HYP_1_1_cn"; @@ -44,10 +42,11 @@ public class GameRegistry public const string GamePath_bh3_kr = @"HKEY_CURRENT_USER\Software\miHoYo\붕괴3rd"; public const string GamePath_bh3_jp = @"HKEY_CURRENT_USER\Software\miHoYo\崩壊3rd"; - public const string GamePath_nap_cbt3 = @"HKEY_CURRENT_USER\Software\miHoYo\绝区零(Beta)"; public const string GamePath_nap_cn = @"HKEY_CURRENT_USER\Software\miHoYo\绝区零"; public const string GamePath_nap_global = @"HKEY_CURRENT_USER\Software\miHoYo\ZenlessZoneZero"; + + // Launcher Config public const string GamePath_HYP_cn = @"HKEY_CURRENT_USER\SOFTWARE\miHoYo\HYP\1_1"; public const string GamePath_HYP_os = @"HKEY_CURRENT_USER\SOFTWARE\Cognosphere\HYP\1_0"; diff --git a/src/Starward.Core/JsonConverter/DateTimeJsonConverter.cs b/src/Starward.Core/JsonConverter/DateTimeJsonConverter.cs new file mode 100644 index 000000000..eac650ad9 --- /dev/null +++ b/src/Starward.Core/JsonConverter/DateTimeJsonConverter.cs @@ -0,0 +1,25 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Starward.Core.JsonConverter; + +internal class DateTimeJsonConverter : JsonConverter +{ + public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var str = reader.GetString(); + if (DateTime.TryParse(str, out var time)) + { + return time; + } + else + { + return DateTime.MinValue; + } + } + + public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) + { + writer.WriteStringValue(value.ToString("yyyy-MM-dd HH:mm:ss")); + } +} diff --git a/src/Starward.Core/SelfQuery/GenshinQueryItem.cs b/src/Starward.Core/SelfQuery/GenshinQueryItem.cs index 6ee129eb2..8191a1f34 100644 --- a/src/Starward.Core/SelfQuery/GenshinQueryItem.cs +++ b/src/Starward.Core/SelfQuery/GenshinQueryItem.cs @@ -1,4 +1,4 @@ -using Starward.Core.Gacha; +using Starward.Core.JsonConverter; using System.Text.Json.Serialization; namespace Starward.Core.SelfQuery; diff --git a/src/Starward.Core/SelfQuery/StarRailQueryItem.cs b/src/Starward.Core/SelfQuery/StarRailQueryItem.cs index 09d66d825..6d8e47269 100644 --- a/src/Starward.Core/SelfQuery/StarRailQueryItem.cs +++ b/src/Starward.Core/SelfQuery/StarRailQueryItem.cs @@ -1,4 +1,4 @@ -using Starward.Core.Gacha; +using Starward.Core.JsonConverter; using System.Text.Json.Serialization; namespace Starward.Core.SelfQuery; diff --git a/src/Starward.Core/SelfQuery/ZZZQueryItem.cs b/src/Starward.Core/SelfQuery/ZZZQueryItem.cs index a5cf993aa..b00a22573 100644 --- a/src/Starward.Core/SelfQuery/ZZZQueryItem.cs +++ b/src/Starward.Core/SelfQuery/ZZZQueryItem.cs @@ -1,4 +1,4 @@ -using Starward.Core.Gacha; +using Starward.Core.JsonConverter; using System.Text.Json.Serialization; namespace Starward.Core.SelfQuery; diff --git a/src/Starward/Converters/GachaPityProgressBackgroundBrushConverter.cs b/src/Starward/Converters/GachaPityProgressBackgroundBrushConverter.cs index 75db02ffd..0ce6ababa 100644 --- a/src/Starward/Converters/GachaPityProgressBackgroundBrushConverter.cs +++ b/src/Starward/Converters/GachaPityProgressBackgroundBrushConverter.cs @@ -1,7 +1,9 @@ using Microsoft.UI; using Microsoft.UI.Xaml.Data; using Microsoft.UI.Xaml.Media; -using Starward.Core.Gacha; +using Starward.Core.Gacha.Genshin; +using Starward.Core.Gacha.StarRail; +using Starward.Core.Gacha.ZZZ; using Starward.Models; using System; using Windows.Foundation; @@ -20,11 +22,10 @@ public object Convert(object value, Type targetType, object parameter, string la if (value is GachaLogItemEx item) { int pity = item.Pity; - GachaType type = item.GachaType; var brush = new LinearGradientBrush { StartPoint = new Point(0, 0), EndPoint = new Point(1, 0), Opacity = 0.4 }; int point = 74; double guarantee = 90; - if (type is GachaType.WeaponEventWish or GachaType.LightConeEventWarp or GachaType.WEngineChannel) + if (item.GachaType is GenshinGachaType.WeaponEventWish or StarRailGachaType.LightConeEventWarp or ZZZGachaType.WEngineChannel) { point = 63; guarantee = 80; diff --git a/src/Starward/Models/GachaLogItemEx.cs b/src/Starward/Models/GachaLogItemEx.cs index 17d19fa83..39152e21a 100644 --- a/src/Starward/Models/GachaLogItemEx.cs +++ b/src/Starward/Models/GachaLogItemEx.cs @@ -1,6 +1,9 @@  using CommunityToolkit.Mvvm.ComponentModel; using Starward.Core.Gacha; +using Starward.Core.Gacha.Genshin; +using Starward.Core.Gacha.StarRail; +using Starward.Core.Gacha.ZZZ; namespace Starward.Models; @@ -19,7 +22,7 @@ public partial class GachaLogItemEx : GachaLogItem public string Icon { get; set; } - public double Progress => (double)Pity / (((int)GachaType is 12 or 302 or 3) ? 80 : 90) * 100; + public double Progress => (double)Pity / ((GachaType is GenshinGachaType.WeaponEventWish or StarRailGachaType.LightConeEventWarp or ZZZGachaType.WEngineChannel) ? 80 : 90) * 100; private bool _IsPointerIn; diff --git a/src/Starward/Models/GachaTypeStats.cs b/src/Starward/Models/GachaTypeStats.cs index 1077073f3..1dc84dbee 100644 --- a/src/Starward/Models/GachaTypeStats.cs +++ b/src/Starward/Models/GachaTypeStats.cs @@ -1,5 +1,4 @@ -using Starward.Core.Gacha; -using System; +using System; using System.Collections.Generic; namespace Starward.Models; @@ -7,7 +6,7 @@ namespace Starward.Models; public class GachaTypeStats { - public GachaType GachaType { get; set; } + public int GachaType { get; set; } public string GachaTypeText { get; set; } diff --git a/src/Starward/Pages/GachaLogPage.xaml.cs b/src/Starward/Pages/GachaLogPage.xaml.cs index 580e8d030..ddfcc0a12 100644 --- a/src/Starward/Pages/GachaLogPage.xaml.cs +++ b/src/Starward/Pages/GachaLogPage.xaml.cs @@ -13,6 +13,8 @@ using Microsoft.UI.Xaml.Navigation; using Starward.Core; using Starward.Core.Gacha; +using Starward.Core.Gacha.Genshin; +using Starward.Core.Gacha.StarRail; using Starward.Helpers; using Starward.Messages; using Starward.Models; @@ -253,8 +255,8 @@ private void UpdateGachaTypeStats(long? uid) (var gachaStats, var itemStats) = _gachaLogService.GetGachaTypeStats(uid.Value); if (CurrentGameBiz.ToGame().Value is GameBiz.hk4e or GameBiz.hkrpg) { - noviceGachaTypeStats = gachaStats.FirstOrDefault(x => x.GachaType == GachaType.NoviceWish || x.GachaType == GachaType.DepartureWarp); - chronicledWishStats = gachaStats.FirstOrDefault(x => x.GachaType == GachaType.ChronicledWish); + noviceGachaTypeStats = gachaStats.FirstOrDefault(x => x.GachaType == GenshinGachaType.NoviceWish || x.GachaType == StarRailGachaType.DepartureWarp); + chronicledWishStats = gachaStats.FirstOrDefault(x => x.GachaType == GenshinGachaType.ChronicledWish); } if (noviceGachaTypeStats != null && !ShowNoviceGacha) { diff --git a/src/Starward/Pages/LauncherPage.xaml.cs b/src/Starward/Pages/LauncherPage.xaml.cs index 355515716..312428f3a 100644 --- a/src/Starward/Pages/LauncherPage.xaml.cs +++ b/src/Starward/Pages/LauncherPage.xaml.cs @@ -10,7 +10,6 @@ using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Input; using Microsoft.UI.Xaml.Media; -using Microsoft.Win32; using Starward.Controls; using Starward.Core; using Starward.Core.Launcher; @@ -1152,21 +1151,7 @@ private async Task DownloadGameAsync() private async Task LauncherZZZCBTLauncherAsync() { - string? launcherFolder = Registry.GetValue(GameRegistry.LauncherPath_nap_cbt3, GameRegistry.InstallPath, null) as string; - string? launcher = Path.Join(launcherFolder, "launcher.exe"); - if (File.Exists(launcher)) - { - Process.Start(new ProcessStartInfo - { - FileName = launcher, - UseShellExecute = true, - Verb = "runas", - }); - } - else - { - await Launcher.LaunchUriAsync(new Uri("https://zzz.mihoyo.com/")); - } + } diff --git a/src/Starward/Services/Gacha/GachaLogService.cs b/src/Starward/Services/Gacha/GachaLogService.cs index abe793289..3abad8e77 100644 --- a/src/Starward/Services/Gacha/GachaLogService.cs +++ b/src/Starward/Services/Gacha/GachaLogService.cs @@ -3,6 +3,8 @@ using MiniExcelLibs; using Starward.Core; using Starward.Core.Gacha; +using Starward.Core.Gacha.Genshin; +using Starward.Core.Gacha.StarRail; using Starward.Models; using System; using System.Collections.Generic; @@ -34,24 +36,23 @@ protected GachaLogService(ILogger logger, DatabaseService datab - protected abstract GameBiz GameBiz { get; } + protected abstract GameBiz CurrentGameBiz { get; } protected abstract string GachaTableName { get; } - protected abstract IReadOnlyCollection GachaTypes { get; } + protected abstract List GetGachaLogItemsByQueryType(IEnumerable items, IGachaType type); - - protected abstract List GetGroupGachaLogItems(IEnumerable items, GachaType type); + protected IReadOnlyCollection QueryGachaTypes => _client.QueryGachaTypes; public static string GetGachaLogText(GameBiz biz) { - return biz.Value switch + return biz.ToGame().Value switch { - GameBiz.hk4e_cn or GameBiz.hk4e_global or GameBiz.clgm_cn => Lang.GachaLogService_WishRecords, - GameBiz.hkrpg_cn or GameBiz.hkrpg_global => Lang.GachaLogService_WarpRecords, - GameBiz.nap_cn or GameBiz.nap_global or GameBiz.nap_bilibili => Lang.GachaLogService_SignalSearchRecords, + GameBiz.hk4e => Lang.GachaLogService_WishRecords, + GameBiz.hkrpg => Lang.GachaLogService_WarpRecords, + GameBiz.nap => Lang.GachaLogService_SignalSearchRecords, _ => "" }; } @@ -70,9 +71,9 @@ public virtual List GetGachaLogItemEx(long uid) { using var dapper = _database.CreateConnection(); var list = dapper.Query($"SELECT * FROM {GachaTableName} WHERE Uid = @uid ORDER BY Id;", new { uid }).ToList(); - foreach (var type in GachaTypes) + foreach (IGachaType type in QueryGachaTypes) { - var l = GetGroupGachaLogItems(list, (GachaType)type); + var l = GetGachaLogItemsByQueryType(list, type); int index = 0; int pity = 0; foreach (var item in l) @@ -104,7 +105,7 @@ public virtual async Task GetUidFromGachaLogUrl(string url) if (uid > 0) { using var dapper = _database.CreateConnection(); - dapper.Execute("INSERT OR REPLACE INTO GachaLogUrl (GameBiz, Uid, Url, Time) VALUES (@GameBiz, @Uid, @Url, @Time);", new GachaLogUrl(GameBiz, uid, url)); + dapper.Execute("INSERT OR REPLACE INTO GachaLogUrl (GameBiz, Uid, Url, Time) VALUES (@GameBiz, @Uid, @Url, @Time);", new GachaLogUrl(CurrentGameBiz, uid, url)); } return uid; } @@ -114,7 +115,7 @@ public virtual async Task GetUidFromGachaLogUrl(string url) public virtual string? GetGachaLogUrlByUid(long uid) { using var dapper = _database.CreateConnection(); - return dapper.QueryFirstOrDefault("SELECT Url FROM GachaLogUrl WHERE Uid = @uid AND GameBiz = @GameBiz LIMIT 1;", new { uid, GameBiz }); + return dapper.QueryFirstOrDefault("SELECT Url FROM GachaLogUrl WHERE Uid = @uid AND GameBiz = @GameBiz LIMIT 1;", new { uid, CurrentGameBiz }); } @@ -143,7 +144,7 @@ public virtual async Task GetGachaLogAsync(string url, bool all, string? l _logger.LogInformation($"Last gacha log id of uid {uid} is {endId}"); } - var internalProgress = new Progress<(GachaType GachaType, int Page)>((x) => progress?.Report(string.Format(Lang.GachaLogService_GetGachaProgressText, x.GachaType.ToLocalization(), x.Page))); + var internalProgress = new Progress<(IGachaType GachaType, int Page)>((x) => progress?.Report(string.Format(Lang.GachaLogService_GetGachaProgressText, x.GachaType.ToLocalization(), x.Page))); var list = (await _client.GetGachaLogAsync(url, endId, lang, internalProgress, cancellationToken)).ToList(); if (cancellationToken.IsCancellationRequested) { @@ -171,17 +172,17 @@ public virtual (List GachaStats, List ItemStats) var allItems = GetGachaLogItemEx(uid); if (allItems.Count > 0) { - foreach (int type in GachaTypes) + foreach (IGachaType type in QueryGachaTypes) { - var list = GetGroupGachaLogItems(allItems, (GachaType)type); + var list = GetGachaLogItemsByQueryType(allItems, type); if (list.Count == 0) { continue; } var stats = new GachaTypeStats { - GachaType = (GachaType)type, - GachaTypeText = ((GachaType)type).ToLocalization(), + GachaType = type.Value, + GachaTypeText = type.ToLocalization(), Count = list.Count, Count_5 = list.Count(x => x.RankType == 5), Count_4 = list.Count(x => x.RankType == 4), @@ -214,11 +215,11 @@ public virtual (List GachaStats, List ItemStats) } statsList.Add(stats); - if ((GachaType)type == GachaType.NoviceWish && stats.Count == 20) + if (CurrentGameBiz == GameBiz.hk4e && type.Value == GenshinGachaType.NoviceWish && stats.Count == 20) { continue; } - else if ((GachaType)type == GachaType.DepartureWarp && stats.Count == 50) + else if (CurrentGameBiz == GameBiz.hkrpg && type.Value == StarRailGachaType.DepartureWarp && stats.Count == 50) { continue; } @@ -226,14 +227,14 @@ public virtual (List GachaStats, List ItemStats) { stats.List_5.Insert(0, new GachaLogItemEx { - GachaType = (GachaType)type, + GachaType = type.Value, Name = Lang.GachaStatsCard_Pity, Pity = stats.Pity_5, Time = list.Last().Time, }); stats.List_4.Insert(0, new GachaLogItemEx { - GachaType = (GachaType)type, + GachaType = type.Value, Name = Lang.GachaStatsCard_Pity, Pity = stats.Pity_4, Time = list.Last().Time, diff --git a/src/Starward/Services/Gacha/GenshinGachaService.cs b/src/Starward/Services/Gacha/GenshinGachaService.cs index 9a3cdd664..f4e53216a 100644 --- a/src/Starward/Services/Gacha/GenshinGachaService.cs +++ b/src/Starward/Services/Gacha/GenshinGachaService.cs @@ -22,11 +22,10 @@ internal class GenshinGachaService : GachaLogService - protected override GameBiz GameBiz { get; } = GameBiz.hk4e; + protected override GameBiz CurrentGameBiz { get; } = GameBiz.hk4e; protected override string GachaTableName { get; } = "GenshinGachaItem"; - protected override IReadOnlyCollection GachaTypes { get; } = new int[] { 200, 301, 302, 500, 100 }.AsReadOnly(); @@ -37,12 +36,12 @@ public GenshinGachaService(ILogger logger, DatabaseService - protected override List GetGroupGachaLogItems(IEnumerable items, GachaType type) + protected override List GetGachaLogItemsByQueryType(IEnumerable items, IGachaType type) { - return type switch + return type.Value switch { - GachaType.CharacterEventWish => items.Where(x => x.GachaType == GachaType.CharacterEventWish || x.GachaType == GachaType.CharacterEventWish_2).ToList(), - _ => items.Where(x => x.GachaType == type).ToList(), + GenshinGachaType.CharacterEventWish => items.Where(x => x.GachaType == GenshinGachaType.CharacterEventWish || x.GachaType == GenshinGachaType.CharacterEventWish_2).ToList(), + _ => items.Where(x => x.GachaType == type.Value).ToList(), }; } @@ -53,9 +52,9 @@ public override List GetGachaLogItemEx(long uid) var list = dapper.Query(""" SELECT item.*, info.Icon FROM GenshinGachaItem item LEFT JOIN GenshinGachaInfo info ON item.ItemId=info.Id WHERE Uid=@uid ORDER BY item.Id; """, new { uid }).ToList(); - foreach (var type in GachaTypes) + foreach (var type in QueryGachaTypes) { - var l = GetGroupGachaLogItems(list, (GachaType)type); + var l = GetGachaLogItemsByQueryType(list, (IGachaType)type); int index = 0; int pity = 0; foreach (var item in l) @@ -206,8 +205,8 @@ public UIGFObj(long uid, List list) { item.uigf_gacha_type = item.GachaType switch { - GachaType.CharacterEventWish_2 => ((int)GachaType.CharacterEventWish).ToString(), - _ => ((int)item.GachaType).ToString(), + GenshinGachaType.CharacterEventWish_2 => GenshinGachaType.CharacterEventWish.ToString(), + _ => item.GachaType.ToString(), }; } this.list = list; diff --git a/src/Starward/Services/Gacha/StarRailGachaService.cs b/src/Starward/Services/Gacha/StarRailGachaService.cs index f287431bc..3afdb1651 100644 --- a/src/Starward/Services/Gacha/StarRailGachaService.cs +++ b/src/Starward/Services/Gacha/StarRailGachaService.cs @@ -21,11 +21,10 @@ internal class StarRailGachaService : GachaLogService { - protected override GameBiz GameBiz { get; } = GameBiz.hkrpg; + protected override GameBiz CurrentGameBiz { get; } = GameBiz.hkrpg; protected override string GachaTableName { get; } = "StarRailGachaItem"; - protected override IReadOnlyCollection GachaTypes { get; } = new int[] { 1, 11, 12, 2 }.AsReadOnly(); public StarRailGachaService(ILogger logger, DatabaseService database, StarRailGachaClient client) : base(logger, database, client) @@ -35,11 +34,11 @@ public StarRailGachaService(ILogger logger, DatabaseServic - protected override List GetGroupGachaLogItems(IEnumerable items, GachaType type) + protected override List GetGachaLogItemsByQueryType(IEnumerable items, IGachaType type) { return type switch { - _ => items.Where(x => x.GachaType == type).ToList(), + _ => items.Where(x => x.GachaType == type.Value).ToList(), }; } @@ -51,9 +50,9 @@ public override List GetGachaLogItemEx(long uid) var list = dapper.Query(""" SELECT item.*, info.IconUrl Icon FROM StarRailGachaItem item LEFT JOIN StarRailGachaInfo info ON item.ItemId=info.ItemId WHERE Uid=@uid ORDER BY item.Id; """, new { uid }).ToList(); - foreach (var type in GachaTypes) + foreach (var type in QueryGachaTypes) { - var l = GetGroupGachaLogItems(list, (GachaType)type); + var l = GetGachaLogItemsByQueryType(list, type); int index = 0; int pity = 0; foreach (var item in l) diff --git a/src/Starward/Services/Gacha/ZZZGachaService.cs b/src/Starward/Services/Gacha/ZZZGachaService.cs index 293c4ccf2..0e5b4c19e 100644 --- a/src/Starward/Services/Gacha/ZZZGachaService.cs +++ b/src/Starward/Services/Gacha/ZZZGachaService.cs @@ -2,6 +2,8 @@ using Microsoft.Extensions.Logging; using Starward.Core; using Starward.Core.Gacha; +using Starward.Core.Gacha.Genshin; +using Starward.Core.Gacha.StarRail; using Starward.Core.Gacha.ZZZ; using Starward.Models; using System; @@ -16,13 +18,10 @@ internal class ZZZGachaService : GachaLogService { - protected override GameBiz GameBiz { get; } = GameBiz.nap; + protected override GameBiz CurrentGameBiz { get; } = GameBiz.nap; protected override string GachaTableName { get; } = "ZZZGachaItem"; - protected override IReadOnlyCollection GachaTypes { get; } = new int[] { 1, 2, 3, 5 }.AsReadOnly(); - - public ZZZGachaService(ILogger logger, DatabaseService database, ZZZGachaClient client) : base(logger, database, client) @@ -31,11 +30,11 @@ public ZZZGachaService(ILogger logger, DatabaseService database } - protected override List GetGroupGachaLogItems(IEnumerable items, GachaType type) + protected override List GetGachaLogItemsByQueryType(IEnumerable items, IGachaType type) { return type switch { - _ => items.Where(x => x.GachaType == type).ToList(), + _ => items.Where(x => x.GachaType == type.Value).ToList(), }; } @@ -47,9 +46,9 @@ public override List GetGachaLogItemEx(long uid) var list = dapper.Query(""" SELECT item.* FROM ZZZGachaItem item WHERE Uid=@uid ORDER BY item.Id; """, new { uid }).ToList(); - foreach (var type in GachaTypes) + foreach (var type in QueryGachaTypes) { - var l = GetGroupGachaLogItems(list, (GachaType)type); + var l = GetGachaLogItemsByQueryType(list, type); int index = 0; int pity = 0; foreach (var item in l) @@ -87,7 +86,7 @@ public override async Task GetGachaLogAsync(string url, bool all, string? _logger.LogInformation($"Last gacha log id of uid {uid} is {endId}"); } - var internalProgress = new Progress<(GachaType GachaType, int Page)>((x) => progress?.Report(string.Format(Lang.GachaLogService_GetGachaProgressText, x.GachaType.ToZZZLocalization(), x.Page))); + var internalProgress = new Progress<(IGachaType GachaType, int Page)>((x) => progress?.Report(string.Format(Lang.GachaLogService_GetGachaProgressText, x.GachaType.ToLocalization(), x.Page))); var list = (await _client.GetGachaLogAsync(url, endId, lang, internalProgress, cancellationToken)).ToList(); if (cancellationToken.IsCancellationRequested) { @@ -111,17 +110,17 @@ public override (List GachaStats, List ItemStats var allItems = GetGachaLogItemEx(uid); if (allItems.Count > 0) { - foreach (int type in GachaTypes) + foreach (IGachaType type in QueryGachaTypes) { - var list = GetGroupGachaLogItems(allItems, (GachaType)type); + var list = GetGachaLogItemsByQueryType(allItems, type); if (list.Count == 0) { continue; } var stats = new GachaTypeStats { - GachaType = (GachaType)type, - GachaTypeText = ((GachaType)type).ToZZZLocalization(), + GachaType = type.Value, + GachaTypeText = type.ToLocalization(), Count = list.Count, Count_5 = list.Count(x => x.RankType == 4), Count_4 = list.Count(x => x.RankType == 3), @@ -154,11 +153,11 @@ public override (List GachaStats, List ItemStats } statsList.Add(stats); - if ((GachaType)type == GachaType.NoviceWish && stats.Count == 20) + if (CurrentGameBiz == GameBiz.hk4e && type.Value == GenshinGachaType.NoviceWish && stats.Count == 20) { continue; } - else if ((GachaType)type == GachaType.DepartureWarp && stats.Count == 50) + else if (CurrentGameBiz == GameBiz.hkrpg && type.Value == StarRailGachaType.DepartureWarp && stats.Count == 50) { continue; }