diff --git a/src/Starward.Core/Gacha/ZZZ/ZZZGachaInfo.cs b/src/Starward.Core/Gacha/ZZZ/ZZZGachaInfo.cs index beaa6ed43..fd425e756 100644 --- a/src/Starward.Core/Gacha/ZZZ/ZZZGachaInfo.cs +++ b/src/Starward.Core/Gacha/ZZZ/ZZZGachaInfo.cs @@ -1,6 +1,23 @@ -namespace Starward.Core.Gacha.ZZZ; +using System.Text.Json.Serialization; + +namespace Starward.Core.Gacha.ZZZ; public class ZZZGachaInfo { + [JsonPropertyName("id")] + public int Id { get; set; } + + + [JsonPropertyName("name")] + public string Name { get; set; } + + + [JsonPropertyName("rarity")] + public string Rarity { get; set; } + + + [JsonPropertyName("icon")] + public string Icon { get; set; } + } \ No newline at end of file diff --git a/src/Starward.Core/Gacha/ZZZ/ZZZGachaWiki.cs b/src/Starward.Core/Gacha/ZZZ/ZZZGachaWiki.cs index 730a4ea22..0090406fa 100644 --- a/src/Starward.Core/Gacha/ZZZ/ZZZGachaWiki.cs +++ b/src/Starward.Core/Gacha/ZZZ/ZZZGachaWiki.cs @@ -1,9 +1,19 @@ -namespace Starward.Core.Gacha.ZZZ; +using System.Text.Json.Serialization; + +namespace Starward.Core.Gacha.ZZZ; public class ZZZGachaWiki { + [JsonPropertyName("avatar")] + public List Avatar { get; set; } + + + [JsonPropertyName("weapon")] + public List Weapon { get; set; } + [JsonPropertyName("buddy")] + public List Buddy { get; set; } } diff --git a/src/Starward.Core/GameRecord/GameRecordClient.cs b/src/Starward.Core/GameRecord/GameRecordClient.cs index aa764b3d4..9f87bdbf5 100644 --- a/src/Starward.Core/GameRecord/GameRecordClient.cs +++ b/src/Starward.Core/GameRecord/GameRecordClient.cs @@ -10,8 +10,8 @@ using System.Text; using Starward.Core.GameRecord.Genshin.ImaginariumTheater; using Starward.Core.GameRecord.ZZZ.InterKnotReport; - - +using Starward.Core.Gacha.ZZZ; +using Starward.Core.GameRecord.ZZZ.UpgradeGuide; #if !DEBUG using System.Net.Http.Json; #endif @@ -458,6 +458,63 @@ protected virtual async Task CommonSendAsync(HttpRequestMessage request, Cancell + /// + /// 通过养成指南获取抽卡物品信息,不可用,返回未登录错误 + /// + /// + /// + /// + public async Task GetZZZGachaWikiAsync(GameRecordRole role, CancellationToken cancellationToken = default) + { + var items = await GetZZZUpgradeGuideItemListAsync(role, cancellationToken: cancellationToken); + var icons = await GetZZZUpgradeGuideIconInfoAsync(role, cancellationToken); + var wiki = new ZZZGachaWiki + { + Avatar = items.AvatarList.Select(x => new ZZZGachaInfo { Id = x.Id, Name = x.Name, Rarity = x.Rarity }).ToList(), + Weapon = items.Weapon.Select(x => new ZZZGachaInfo { Id = x.Id, Name = x.Name, Rarity = x.Rarity, Icon = x.Icon }).ToList(), + Buddy = items.BuddyList.Select(x => new ZZZGachaInfo { Id = x.Id, Name = x.Name, Rarity = x.Rarity }).ToList() + }; + foreach (var item in wiki.Avatar) + { + if (icons.AvatarIcon.TryGetValue(item.Id, out UpgradeGuidIconInfoItem? info)) + { + item.Icon = info.SquareAvatar; + } + } + foreach (var item in wiki.Buddy) + { + if (icons.BuddyIcon.TryGetValue(item.Id, out UpgradeGuidIconInfoItem? value)) + { + item.Icon = value.SquareAvatar; + } + } + return wiki; + } + + + + /// + /// 养成指南,不可用,返回未登录错误 + /// + /// + /// + /// + /// + public abstract Task GetZZZUpgradeGuideItemListAsync(GameRecordRole role, int avatar_id = 1011, CancellationToken cancellationToken = default); + + + + /// + /// 养成指南,不可用,返回未登录错误 + /// + /// + /// + /// + public abstract Task GetZZZUpgradeGuideIconInfoAsync(GameRecordRole role, CancellationToken cancellationToken = default); + + + + #endregion diff --git a/src/Starward.Core/GameRecord/GameRecordJsonContext.cs b/src/Starward.Core/GameRecord/GameRecordJsonContext.cs index 864e95c3e..c48f4f060 100644 --- a/src/Starward.Core/GameRecord/GameRecordJsonContext.cs +++ b/src/Starward.Core/GameRecord/GameRecordJsonContext.cs @@ -7,6 +7,7 @@ using Starward.Core.GameRecord.StarRail.SimulatedUniverse; using Starward.Core.GameRecord.StarRail.TrailblazeCalendar; using Starward.Core.GameRecord.ZZZ.InterKnotReport; +using Starward.Core.GameRecord.ZZZ.UpgradeGuide; using Starward.Core.JsonConverter; using System.Text.Json.Serialization; @@ -29,6 +30,8 @@ namespace Starward.Core.GameRecord; [JsonSerializable(typeof(miHoYoApiWrapper))] [JsonSerializable(typeof(miHoYoApiWrapper))] [JsonSerializable(typeof(miHoYoApiWrapper))] +[JsonSerializable(typeof(miHoYoApiWrapper))] +[JsonSerializable(typeof(miHoYoApiWrapper))] [JsonSerializable(typeof(DateTimeObjectJsonConverter.DateTimeObject))] internal partial class GameRecordJsonContext : JsonSerializerContext { diff --git a/src/Starward.Core/GameRecord/HoyolabClient.cs b/src/Starward.Core/GameRecord/HoyolabClient.cs index b76e9b10e..3a79522d6 100644 --- a/src/Starward.Core/GameRecord/HoyolabClient.cs +++ b/src/Starward.Core/GameRecord/HoyolabClient.cs @@ -7,6 +7,7 @@ using Starward.Core.GameRecord.StarRail.SimulatedUniverse; using Starward.Core.GameRecord.StarRail.TrailblazeCalendar; using Starward.Core.GameRecord.ZZZ.InterKnotReport; +using Starward.Core.GameRecord.ZZZ.UpgradeGuide; namespace Starward.Core.GameRecord; @@ -659,6 +660,47 @@ public override async Task GetInterKnotReportDetailAsync( + /// + /// 养成指南,不可用,返回未登录错误 + /// + /// + /// + /// + /// + public override async Task GetZZZUpgradeGuideItemListAsync(GameRecordRole role, int avatar_id = 1011, CancellationToken cancellationToken = default) + { + var url = $"https://sg-public-api.hoyolab.com/event/nap_cultivate_tool/user/item_list?uid={role.Uid}®ion={role.Region}&avatar_id={avatar_id}"; + var request = new HttpRequestMessage(HttpMethod.Get, url); + request.Headers.Add(Cookie, role.Cookie); + request.Headers.Add(Referer, "https://act.mihoyo.com/"); + request.Headers.Add(x_rpc_app_version, AppVersion); + request.Headers.Add(x_rpc_device_id, DeviceId); + request.Headers.Add(x_rpc_device_fp, DeviceFp); + return await CommonSendAsync(request, cancellationToken); + } + + + + /// + /// 养成指南,不可用,返回未登录错误 + /// + /// + /// + /// + public override async Task GetZZZUpgradeGuideIconInfoAsync(GameRecordRole role, CancellationToken cancellationToken = default) + { + var url = $"https://sg-public-api.hoyolab.com/event/nap_cultivate_tool/user/icon_info?uid={role.Uid}®ion={role.Region}"; + var request = new HttpRequestMessage(HttpMethod.Get, url); + request.Headers.Add(Cookie, role.Cookie); + request.Headers.Add(Referer, "https://act.mihoyo.com/"); + request.Headers.Add(x_rpc_app_version, AppVersion); + request.Headers.Add(x_rpc_device_id, DeviceId); + request.Headers.Add(x_rpc_device_fp, DeviceFp); + return await CommonSendAsync(request, cancellationToken); + } + + + #endregion diff --git a/src/Starward.Core/GameRecord/HyperionClient.cs b/src/Starward.Core/GameRecord/HyperionClient.cs index fd14ab48e..7c11a2a5f 100644 --- a/src/Starward.Core/GameRecord/HyperionClient.cs +++ b/src/Starward.Core/GameRecord/HyperionClient.cs @@ -7,6 +7,7 @@ using Starward.Core.GameRecord.StarRail.SimulatedUniverse; using Starward.Core.GameRecord.StarRail.TrailblazeCalendar; using Starward.Core.GameRecord.ZZZ.InterKnotReport; +using Starward.Core.GameRecord.ZZZ.UpgradeGuide; namespace Starward.Core.GameRecord; @@ -728,6 +729,48 @@ public override async Task GetInterKnotReportDetailAsync( + /// + /// 养成指南,不可用,返回未登录错误 + /// + /// + /// + /// + /// + public override async Task GetZZZUpgradeGuideItemListAsync(GameRecordRole role, int avatar_id = 1011, CancellationToken cancellationToken = default) + { + var url = $"https://api-takumi.mihoyo.com/event/nap_cultivate_tool/user/item_list?uid={role.Uid}®ion={role.Region}&avatar_id={avatar_id}"; + var request = new HttpRequestMessage(HttpMethod.Get, url); + request.Headers.Add(Cookie, role.Cookie); + request.Headers.Add(Referer, "https://act.mihoyo.com/"); + request.Headers.Add(x_rpc_app_version, AppVersion); + request.Headers.Add(x_rpc_device_id, DeviceId); + request.Headers.Add(x_rpc_device_fp, DeviceFp); + return await CommonSendAsync(request, cancellationToken); + } + + + + /// + /// 养成指南,不可用,返回未登录错误 + /// + /// + /// + /// + public override async Task GetZZZUpgradeGuideIconInfoAsync(GameRecordRole role, CancellationToken cancellationToken = default) + { + var url = $"https://api-takumi.mihoyo.com/event/nap_cultivate_tool/user/icon_info?uid={role.Uid}®ion={role.Region}"; + var request = new HttpRequestMessage(HttpMethod.Get, url); + request.Headers.Add(Cookie, role.Cookie); + request.Headers.Add(Referer, "https://act.mihoyo.com/"); + request.Headers.Add(x_rpc_app_version, AppVersion); + request.Headers.Add(x_rpc_device_id, DeviceId); + request.Headers.Add(x_rpc_device_fp, DeviceFp); + return await CommonSendAsync(request, cancellationToken); + } + + + + #endregion diff --git a/src/Starward.Core/GameRecord/ZZZ/UpgradeGuide/UpgradeGuidIconInfo.cs b/src/Starward.Core/GameRecord/ZZZ/UpgradeGuide/UpgradeGuidIconInfo.cs new file mode 100644 index 000000000..482f2df9f --- /dev/null +++ b/src/Starward.Core/GameRecord/ZZZ/UpgradeGuide/UpgradeGuidIconInfo.cs @@ -0,0 +1,41 @@ +using System.Text.Json.Serialization; + +namespace Starward.Core.GameRecord.ZZZ.UpgradeGuide; + +public class UpgradeGuidIconInfo +{ + + [JsonPropertyName("avatar_icon")] + public Dictionary AvatarIcon { get; set; } + + + [JsonPropertyName("buddy_icon")] + public Dictionary BuddyIcon { get; set; } + +} + + + +public class UpgradeGuidIconInfoItem +{ + + [JsonPropertyName("square_avatar")] + public string SquareAvatar { get; set; } + + + [JsonPropertyName("rectangle_avatar")] + public string RectangleAvatar { get; set; } + + + [JsonPropertyName("vertical_painting")] + public string? VerticalPainting { get; set; } + + + [JsonPropertyName("vertical_painting_color")] + public string? VerticalPaintingColor { get; set; } + + + [JsonPropertyName("avatar_us_full_name")] + public string? AvatarUsFullName { get; set; } + +} \ No newline at end of file diff --git a/src/Starward.Core/GameRecord/ZZZ/UpgradeGuide/UpgradeGuideItemList.cs b/src/Starward.Core/GameRecord/ZZZ/UpgradeGuide/UpgradeGuideItemList.cs new file mode 100644 index 000000000..825f4d37a --- /dev/null +++ b/src/Starward.Core/GameRecord/ZZZ/UpgradeGuide/UpgradeGuideItemList.cs @@ -0,0 +1,154 @@ +using System.Text.Json.Serialization; + +namespace Starward.Core.GameRecord.ZZZ.UpgradeGuide; + +public class UpgradeGuideItemList +{ + + + [JsonPropertyName("equip_suit")] + public List EquipSuit { get; set; } + + + [JsonPropertyName("weapon")] + public List Weapon { get; set; } + + + [JsonPropertyName("avatar_list")] + public List AvatarList { get; set; } + + + [JsonPropertyName("buddy_list")] + public List BuddyList { get; set; } + + +} + + +/// +/// 音擎 +/// +public class UpgradeGuideWeapon +{ + + [JsonPropertyName("id")] + public int Id { get; set; } + + + [JsonPropertyName("name")] + public string Name { get; set; } + + + [JsonPropertyName("icon")] + public string Icon { get; set; } + + + [JsonPropertyName("rarity")] + public string Rarity { get; set; } + + + [JsonPropertyName("profession")] + public int Profession { get; set; } + +} + + +/// +/// 驱动盘套装 +/// +public class UpgradeGuideEquipSuit +{ + + [JsonPropertyName("suit_id")] + public int SuitId { get; set; } + + + [JsonPropertyName("name")] + public string Name { get; set; } + + + [JsonPropertyName("desc1")] + public string Desc1 { get; set; } + + + [JsonPropertyName("desc2")] + public string Desc2 { get; set; } + + + [JsonPropertyName("icon")] + public string Icon { get; set; } + + + [JsonPropertyName("rarity")] + public string Rarity { get; set; } + +} + + + +/// +/// 角色 +/// +public class UpgradeGuideAvatar +{ + + [JsonPropertyName("id")] + public int Id { get; set; } + + + [JsonPropertyName("level")] + public int Level { get; set; } + + + [JsonPropertyName("name_mi18n")] + public string Name { get; set; } + + + [JsonPropertyName("full_name_mi18n")] + public string FullName { get; set; } + + + [JsonPropertyName("element_type")] + public int ElementType { get; set; } + + + [JsonPropertyName("camp_name_mi18n")] + public string CampName { get; set; } + + + [JsonPropertyName("avatar_profession")] + public int AvatarProfession { get; set; } + + + [JsonPropertyName("rarity")] + public string Rarity { get; set; } + + + [JsonPropertyName("group_icon_path")] + public string GroupIconPath { get; set; } + + + [JsonPropertyName("hollow_icon_path")] + public string HollowIconPath { get; set; } + +} + + +/// +/// 邦布 +/// +public class UpgradeGuideBuddy +{ + + [JsonPropertyName("id")] + public int Id { get; set; } + + + [JsonPropertyName("name")] + public string Name { get; set; } + + + [JsonPropertyName("rarity")] + public string Rarity { get; set; } + +} diff --git a/src/Starward.Language/Lang.Designer.cs b/src/Starward.Language/Lang.Designer.cs index d6a649a66..20093a5d4 100644 --- a/src/Starward.Language/Lang.Designer.cs +++ b/src/Starward.Language/Lang.Designer.cs @@ -4791,5 +4791,14 @@ public static string UpdateWindow_DisplayUpdateContentAfterRestart { return ResourceManager.GetString("UpdateWindow_DisplayUpdateContentAfterRestart", resourceCulture); } } + + /// + /// 查找类似 Import {0} signal search record(s) successfully. 的本地化字符串。 + /// + public static string ZZZGachaService_ImportSignalSearchRecordsSuccessfully { + get { + return ResourceManager.GetString("ZZZGachaService_ImportSignalSearchRecordsSuccessfully", resourceCulture); + } + } } } diff --git a/src/Starward.Language/Lang.resx b/src/Starward.Language/Lang.resx index 4caa690b5..3aa75acd1 100644 --- a/src/Starward.Language/Lang.resx +++ b/src/Starward.Language/Lang.resx @@ -1722,4 +1722,7 @@ Do you accept the risk and continue to use it? Detected that the application is in a removable storage device, it is not recommended to keep the RPC service running in the background. + + Import {0} signal search record(s) successfully. + \ No newline at end of file diff --git a/src/Starward.Language/Lang.zh-CN.resx b/src/Starward.Language/Lang.zh-CN.resx index 71e3cb71f..2118b99b2 100644 --- a/src/Starward.Language/Lang.zh-CN.resx +++ b/src/Starward.Language/Lang.zh-CN.resx @@ -1720,4 +1720,7 @@ 检测到应用处于可移动存储设备中,不建议保持 RPC 服务后台运行。 + + 成功导入调频记录 {count} 条 + \ No newline at end of file diff --git a/src/Starward/Features/Gacha/GachaLogPage.xaml.cs b/src/Starward/Features/Gacha/GachaLogPage.xaml.cs index 879e9338d..f491c0cdd 100644 --- a/src/Starward/Features/Gacha/GachaLogPage.xaml.cs +++ b/src/Starward/Features/Gacha/GachaLogPage.xaml.cs @@ -71,9 +71,6 @@ protected override void OnNavigatedTo(NavigationEventArgs e) _gachaLogService = AppService.GetService(); Image_Emoji.Source = new BitmapImage(AppConfig.EmojiBangboo); MenuFlyoutItem_CloudGame.Visibility = Visibility.Collapsed; - Button_Export_Excel.IsEnabled = false; - Button_Export_JSON.IsEnabled = false; - Button_Import.IsEnabled = false; } if (CurrentGameBiz.IsGlobalServer()) { diff --git a/src/Starward/Features/Gacha/ZZZGachaService.cs b/src/Starward/Features/Gacha/ZZZGachaService.cs index 2ebf6d107..669863fc4 100644 --- a/src/Starward/Features/Gacha/ZZZGachaService.cs +++ b/src/Starward/Features/Gacha/ZZZGachaService.cs @@ -1,14 +1,20 @@ using Dapper; using Microsoft.Extensions.Logging; +using MiniExcelLibs; using Starward.Core; using Starward.Core.Gacha; using Starward.Core.Gacha.Genshin; using Starward.Core.Gacha.StarRail; using Starward.Core.Gacha.ZZZ; using Starward.Features.Database; +using Starward.Frameworks; +using Starward.Helpers; using System; using System.Collections.Generic; +using System.IO; using System.Linq; +using System.Text.Json; +using System.Text.Json.Serialization; using System.Threading; using System.Threading.Tasks; @@ -204,39 +210,107 @@ INSERT OR REPLACE INTO ZZZGachaItem (Uid, Id, Name, Time, ItemId, ItemType, Rank - public override Task ExportGachaLogAsync(long uid, string file, string format) + public override async Task ExportGachaLogAsync(long uid, string file, string format) { - throw new NotImplementedException(); + if (format is "excel") + { + await ExportAsExcelAsync(uid, file); + } + else + { + await ExportAsJsonAsync(uid, file); + } + } + + + + private async Task ExportAsJsonAsync(long uid, string output) + { + using var dapper = DatabaseService.CreateConnection(); + var list = dapper.Query($"SELECT * FROM {GachaTableName} WHERE Uid = @uid ORDER BY Id;", new { uid }).ToList(); + var obj = new UIGFObj(uid, list); + var str = JsonSerializer.Serialize(obj, AppConfig.JsonSerializerOptions); + await File.WriteAllTextAsync(output, str); + } + + + private async Task ExportAsExcelAsync(long uid, string output) + { + using var dapper = DatabaseService.CreateConnection(); + var list = GetGachaLogItemEx(uid); + var template = Path.Combine(AppContext.BaseDirectory, @"Assets\Template\GachaLog.xlsx"); + if (File.Exists(template)) + { + await MiniExcel.SaveAsByTemplateAsync(output, template, new { list }); + } } + public override long ImportGachaLog(string file) { - throw new NotImplementedException(); + var str = File.ReadAllText(file); + var obj = JsonSerializer.Deserialize(str); + if (obj != null) + { + var lang = obj.info.lang ?? ""; + long uid = obj.info.uid; + foreach (var item in obj.list) + { + if (item.Lang is null) + { + item.Lang = lang; + } + if (item.Uid == 0) + { + item.Uid = uid; + } + } + var count = InsertGachaLogItems(obj.list.ToList()); + // 成功导入调频记录 {count} 条 + InAppToast.MainWindow?.Success($"Uid {obj.info.uid}", string.Format(Lang.ZZZGachaService_ImportSignalSearchRecordsSuccessfully, count), 5000); + return obj.info.uid; + } + return 0; } - // todo + public override async Task UpdateGachaInfoAsync(GameBiz gameBiz, string lang, CancellationToken cancellationToken = default) { return lang; - // var data = await _client.GetZZZGachaInfoAsync(gameBiz, lang, cancellationToken); - // using var dapper = DatabaseService.CreateConnection(); - // using var t = dapper.BeginTransaction(); - // // todo - // const string insertSql = """ - // INSERT OR REPLACE INTO ZZZGachaInfo (Id, Name, Icon, Element, Level, CatId, WeaponCatId) - // VALUES (@Id, @Name, @Icon, @Element, @Level, @CatId, @WeaponCatId); - // """; - // dapper.Execute(insertSql, data.AllAvatar, t); - // dapper.Execute(insertSql, data.AllWeapon, t); - // t.Commit(); - // return data.Language; + // 很可惜,这个方法不能用,服务器返回错误未登录 + // 还没有定义数据表 ZZZGachaInfo + //GameRecordService service = AppService.GetService(); + //if (gameBiz.IsChinaServer() || gameBiz.IsBilibili()) + //{ + // service.IsHoyolab = false; + //} + //else + //{ + // service.IsHoyolab = true; + // service.Language = lang; + //} + //var role = service.GetLastSelectGameRecordRoleOrTheFirstOne(gameBiz); + //if (role is null) + //{ + // return ""; + //} + //var wiki = await service.GetZZZGachaWikiAsync(role, cancellationToken); + //var list = new List(); + //list.AddRange(wiki.Avatar); + //list.AddRange(wiki.Weapon); + //list.AddRange(wiki.Buddy); + //using var dapper = DatabaseService.CreateConnection(); + //using var t = dapper.BeginTransaction(); + //const string insertSql = "INSERT OR REPLACE INTO ZZZGachaInfo (Id, Name, Rarity, Icon) VALUES (Id, Name, Rarity, Icon);"; + //dapper.Execute(insertSql, list, t); + //t.Commit(); + //return lang; } - // todo public override async Task<(string Language, int Count)> ChangeGachaItemNameAsync(GameBiz gameBiz, string lang, CancellationToken cancellationToken = default) { return (lang, 0); @@ -252,4 +326,51 @@ public override async Task UpdateGachaInfoAsync(GameBiz gameBiz, string } + + + private class UIGFObj + { + public UIGFObj() { } + + public UIGFObj(long uid, List list) + { + this.info = new UIGFInfo(uid, list); + this.list = list; + } + + public UIGFInfo info { get; set; } + + public List list { get; set; } + } + + + private class UIGFInfo + { + [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)] + public long uid { get; set; } + + public string lang { get; set; } + + public int region_time_zone { get; set; } = 0; + + [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString)] + public long export_timestamp { get; set; } + + public string export_app { get; set; } = "Starward"; + + public string export_app_version { get; set; } = AppSetting.AppVersion ?? ""; + + public string uigf_version { get; set; } = "v1.0"; + + public UIGFInfo() { } + + public UIGFInfo(long uid, List list) + { + this.uid = uid; + lang = list.FirstOrDefault()?.Lang ?? ""; + export_timestamp = DateTimeOffset.Now.ToUnixTimeSeconds(); + } + } + + } diff --git a/src/Starward/Features/GameRecord/GameRecordService.cs b/src/Starward/Features/GameRecord/GameRecordService.cs index 4886887a8..17073e27a 100644 --- a/src/Starward/Features/GameRecord/GameRecordService.cs +++ b/src/Starward/Features/GameRecord/GameRecordService.cs @@ -1,6 +1,7 @@ using Dapper; using Microsoft.Extensions.Logging; using Starward.Core; +using Starward.Core.Gacha.ZZZ; using Starward.Core.GameRecord; using Starward.Core.GameRecord.Genshin.ImaginariumTheater; using Starward.Core.GameRecord.Genshin.SpiralAbyss; @@ -926,4 +927,22 @@ public List GetInterKnotReportDetailItems(long uid, s #endregion + + + #region ZZZ Gacha Wiki + + + + public async Task GetZZZGachaWikiAsync(GameRecordRole role, CancellationToken cancellationToken = default) + { + return await _gameRecordClient.GetZZZGachaWikiAsync(role, cancellationToken); + } + + + + #endregion + + + + }