mirror of
https://jihulab.com/DGP-Studio/Snap.Hutao.git
synced 2025-11-19 21:02:53 +08:00
Compare commits
1 Commits
fix/launch
...
ci/cake_up
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4ded6dc9bf |
16
.github/workflows/alpha.yml
vendored
16
.github/workflows/alpha.yml
vendored
@@ -13,15 +13,6 @@ on:
|
|||||||
- '**.md'
|
- '**.md'
|
||||||
- 'LICENSE'
|
- 'LICENSE'
|
||||||
- '**.yml'
|
- '**.yml'
|
||||||
pull_request:
|
|
||||||
paths-ignore:
|
|
||||||
- '.gitattributes'
|
|
||||||
- '.github/**'
|
|
||||||
- '.gitignore'
|
|
||||||
- '.gitmodules'
|
|
||||||
- '**.md'
|
|
||||||
- 'LICENSE'
|
|
||||||
- '**.yml'
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
@@ -43,21 +34,20 @@ jobs:
|
|||||||
VERSION_API_TOKEN: ${{ secrets.VERSION_API_TOKEN }}
|
VERSION_API_TOKEN: ${{ secrets.VERSION_API_TOKEN }}
|
||||||
|
|
||||||
- name: Sign Msix
|
- name: Sign Msix
|
||||||
if: success() && github.event_name != 'pull_request'
|
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
[System.Convert]::FromBase64String("${{ secrets.CERTIFICATE }}") | Set-Content -AsByteStream temp.pfx
|
[System.Convert]::FromBase64String("${{ secrets.CERTIFICATE }}") | Set-Content -AsByteStream temp.pfx
|
||||||
signtool.exe sign /debug /v /a /fd SHA256 /f temp.pfx /p ${{ secrets.PW }} ${{ github.workspace }}\src\output\Snap.Hutao.Alpha-${{ steps.cake.outputs.version }}.msix
|
signtool.exe sign /debug /v /a /fd SHA256 /f temp.pfx /p ${{ secrets.PW }} ${{ github.workspace }}\src\output\Snap.Hutao.Alpha-${{ steps.cake.outputs.version }}.msix
|
||||||
|
|
||||||
- name: Upload signed msix
|
- name: Upload signed msix
|
||||||
if: success() && github.event_name != 'pull_request'
|
if: success()
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: Snap.Hutao.Alpha-${{ steps.cake.outputs.version }}
|
name: Snap.Hutao.Alpha-${{ steps.cake.outputs.version }}
|
||||||
path: ${{ github.workspace }}/src/output/Snap.Hutao.Alpha-${{ steps.cake.outputs.version }}.msix
|
path: ${{ github.workspace }}/src/output/Snap.Hutao.Alpha-${{ steps.cake.outputs.version }}.msix
|
||||||
|
|
||||||
- name: Add summary
|
- name: Add summary
|
||||||
if: success() && github.event_name != 'pull_request'
|
if: success()
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
$summary = "
|
$summary = "
|
||||||
|
|||||||
32
build.cake
32
build.cake
@@ -33,28 +33,18 @@ if (GitHubActions.IsRunningOnGitHubActions)
|
|||||||
repoDir = GitHubActions.Environment.Workflow.Workspace.FullPath;
|
repoDir = GitHubActions.Environment.Workflow.Workspace.FullPath;
|
||||||
outputPath = System.IO.Path.Combine(repoDir, "src", "output");
|
outputPath = System.IO.Path.Combine(repoDir, "src", "output");
|
||||||
|
|
||||||
if (GitHubActions.Environment.PullRequest.IsPullRequest)
|
var versionAuth = HasEnvironmentVariable("VERSION_API_TOKEN") ? EnvironmentVariable("VERSION_API_TOKEN") : throw new Exception("Cannot find VERSION_API_TOKEN");
|
||||||
{
|
version = HttpGet(
|
||||||
version = System.DateTime.Now.ToString("yyyy.M.d.0");
|
"https://internal.snapgenshin.cn/BuildIntergration/RequestNewVersion",
|
||||||
|
new HttpSettings
|
||||||
Information("Is Pull Request. Skip version.");
|
{
|
||||||
}
|
Headers = new Dictionary<string, string>
|
||||||
else
|
{
|
||||||
{
|
|
||||||
var versionAuth = HasEnvironmentVariable("VERSION_API_TOKEN") ? EnvironmentVariable("VERSION_API_TOKEN") : throw new Exception("Cannot find VERSION_API_TOKEN");
|
|
||||||
version = HttpGet(
|
|
||||||
"https://internal.snapgenshin.cn/BuildIntergration/RequestNewVersion",
|
|
||||||
new HttpSettings
|
|
||||||
{
|
|
||||||
Headers = new Dictionary<string, string>
|
|
||||||
{
|
|
||||||
{ "Authorization", versionAuth }
|
{ "Authorization", versionAuth }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
Information($"Version: {version}");
|
||||||
Information($"Version: {version}");
|
|
||||||
}
|
|
||||||
|
|
||||||
GitHubActions.Commands.SetOutputParameter("version", version);
|
GitHubActions.Commands.SetOutputParameter("version", version);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ internal sealed partial class SettingEntry
|
|||||||
public const string Culture = "Culture";
|
public const string Culture = "Culture";
|
||||||
|
|
||||||
public const string SystemBackdropType = "SystemBackdropType";
|
public const string SystemBackdropType = "SystemBackdropType";
|
||||||
public const string BackgroundImageType = "BackgroundImageType";
|
|
||||||
|
|
||||||
public const string AnnouncementRegion = "AnnouncementRegion";
|
public const string AnnouncementRegion = "AnnouncementRegion";
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ using Snap.Hutao.Core.Windowing;
|
|||||||
using Snap.Hutao.Model;
|
using Snap.Hutao.Model;
|
||||||
using Snap.Hutao.Model.Entity;
|
using Snap.Hutao.Model.Entity;
|
||||||
using Snap.Hutao.Service.Abstraction;
|
using Snap.Hutao.Service.Abstraction;
|
||||||
using Snap.Hutao.Service.BackgroundImage;
|
|
||||||
using Snap.Hutao.Web.Hoyolab;
|
using Snap.Hutao.Web.Hoyolab;
|
||||||
|
|
||||||
namespace Snap.Hutao.Service;
|
namespace Snap.Hutao.Service;
|
||||||
@@ -16,7 +15,6 @@ internal sealed partial class AppOptions : DbStoreOptions
|
|||||||
{
|
{
|
||||||
private bool? isEmptyHistoryWishVisible;
|
private bool? isEmptyHistoryWishVisible;
|
||||||
private BackdropType? backdropType;
|
private BackdropType? backdropType;
|
||||||
private BackgroundImageType? backgroundImageType;
|
|
||||||
private Region? region;
|
private Region? region;
|
||||||
private string? geetestCustomCompositeUrl;
|
private string? geetestCustomCompositeUrl;
|
||||||
|
|
||||||
@@ -30,14 +28,8 @@ internal sealed partial class AppOptions : DbStoreOptions
|
|||||||
|
|
||||||
public BackdropType BackdropType
|
public BackdropType BackdropType
|
||||||
{
|
{
|
||||||
get => GetOption(ref backdropType, SettingEntry.SystemBackdropType, EnumParse<BackdropType>, BackdropType.Mica).Value;
|
get => GetOption(ref backdropType, SettingEntry.SystemBackdropType, v => Enum.Parse<BackdropType>(v), BackdropType.Mica).Value;
|
||||||
set => SetOption(ref backdropType, SettingEntry.SystemBackdropType, value, EnumToStringOrEmpty);
|
set => SetOption(ref backdropType, SettingEntry.SystemBackdropType, value, value => value.ToStringOrEmpty());
|
||||||
}
|
|
||||||
|
|
||||||
public BackgroundImageType BackgroundImageType
|
|
||||||
{
|
|
||||||
get => GetOption(ref backgroundImageType, SettingEntry.BackgroundImageType, EnumParse<BackgroundImageType>, BackgroundImageType.HutaoOfficialLauncher).Value;
|
|
||||||
set => SetOption(ref backgroundImageType, SettingEntry.BackgroundImageType, value, EnumToStringOrEmpty);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Lazy<List<NameValue<Region>>> LazyRegions { get; } = new(KnownRegions.Get);
|
public Lazy<List<NameValue<Region>>> LazyRegions { get; } = new(KnownRegions.Get);
|
||||||
@@ -53,16 +45,4 @@ internal sealed partial class AppOptions : DbStoreOptions
|
|||||||
get => GetOption(ref geetestCustomCompositeUrl, SettingEntry.GeetestCustomCompositeUrl);
|
get => GetOption(ref geetestCustomCompositeUrl, SettingEntry.GeetestCustomCompositeUrl);
|
||||||
set => SetOption(ref geetestCustomCompositeUrl, SettingEntry.GeetestCustomCompositeUrl, value);
|
set => SetOption(ref geetestCustomCompositeUrl, SettingEntry.GeetestCustomCompositeUrl, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static T? EnumParse<T>(string input)
|
|
||||||
where T : struct, Enum
|
|
||||||
{
|
|
||||||
return Enum.Parse<T>(input);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string EnumToStringOrEmpty<T>(T? input)
|
|
||||||
where T : struct, Enum
|
|
||||||
{
|
|
||||||
return input.ToStringOrEmpty();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -13,8 +13,6 @@ namespace Snap.Hutao.Service.BackgroundImage;
|
|||||||
|
|
||||||
internal sealed class BackgroundImage
|
internal sealed class BackgroundImage
|
||||||
{
|
{
|
||||||
public string Path { get; set; } = default!;
|
|
||||||
|
|
||||||
public BitmapImage ImageSource { get; set; } = default!;
|
public BitmapImage ImageSource { get; set; } = default!;
|
||||||
|
|
||||||
public Color AccentColor { get; set; }
|
public Color AccentColor { get; set; }
|
||||||
|
|||||||
@@ -38,7 +38,8 @@ internal sealed partial class BackgroundImageService : IBackgroundImageService
|
|||||||
string path = System.Random.Shared.GetItems(backgroundSet.ToArray(), 1)[0];
|
string path = System.Random.Shared.GetItems(backgroundSet.ToArray(), 1)[0];
|
||||||
backgroundSet.Remove(path);
|
backgroundSet.Remove(path);
|
||||||
|
|
||||||
if (string.Equals(path, previous?.Path, StringComparison.OrdinalIgnoreCase))
|
await taskContext.SwitchToMainThreadAsync();
|
||||||
|
if (string.Equals(path, previous?.ImageSource.UriSource.ToString(), StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
return new(false, default!);
|
return new(false, default!);
|
||||||
}
|
}
|
||||||
@@ -53,7 +54,6 @@ internal sealed partial class BackgroundImageService : IBackgroundImageService
|
|||||||
|
|
||||||
BackgroundImage background = new()
|
BackgroundImage background = new()
|
||||||
{
|
{
|
||||||
Path = path,
|
|
||||||
ImageSource = new(path.ToUri()),
|
ImageSource = new(path.ToUri()),
|
||||||
AccentColor = accentColor,
|
AccentColor = accentColor,
|
||||||
Luminance = accentColor.Luminance,
|
Luminance = accentColor.Luminance,
|
||||||
@@ -65,7 +65,7 @@ internal sealed partial class BackgroundImageService : IBackgroundImageService
|
|||||||
|
|
||||||
private async ValueTask<HashSet<string>> SkipOrInitBackgroundAsync()
|
private async ValueTask<HashSet<string>> SkipOrInitBackgroundAsync()
|
||||||
{
|
{
|
||||||
if (backgroundPathSet is not { Count: > 0 })
|
if (backgroundPathSet is null || backgroundPathSet.Count <= 0)
|
||||||
{
|
{
|
||||||
string backgroundFolder = runtimeOptions.GetDataFolderBackgroundFolder();
|
string backgroundFolder = runtimeOptions.GetDataFolderBackgroundFolder();
|
||||||
Directory.CreateDirectory(backgroundFolder);
|
Directory.CreateDirectory(backgroundFolder);
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
// Copyright (c) DGP Studio. All rights reserved.
|
|
||||||
// Licensed under the MIT license.
|
|
||||||
|
|
||||||
namespace Snap.Hutao.Service.BackgroundImage;
|
|
||||||
|
|
||||||
internal enum BackgroundImageType
|
|
||||||
{
|
|
||||||
None,
|
|
||||||
LocalFolder,
|
|
||||||
HutaoBing,
|
|
||||||
HutaoDaily,
|
|
||||||
HutaoOfficialLauncher,
|
|
||||||
}
|
|
||||||
@@ -7,7 +7,7 @@ using Snap.Hutao.Model.Entity;
|
|||||||
using Snap.Hutao.Model.Entity.Database;
|
using Snap.Hutao.Model.Entity.Database;
|
||||||
using Snap.Hutao.Model.Entity.Primitive;
|
using Snap.Hutao.Model.Entity.Primitive;
|
||||||
using Snap.Hutao.Model.Metadata.Item;
|
using Snap.Hutao.Model.Metadata.Item;
|
||||||
using Snap.Hutao.Service.Inventory;
|
using Snap.Hutao.Service.Inventroy;
|
||||||
using Snap.Hutao.Service.Metadata.ContextAbstraction;
|
using Snap.Hutao.Service.Metadata.ContextAbstraction;
|
||||||
using Snap.Hutao.ViewModel.Cultivation;
|
using Snap.Hutao.ViewModel.Cultivation;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
|
|||||||
@@ -23,9 +23,6 @@ internal sealed class LaunchExecutionBetterGenshinImpactAutomationHandlder : ILa
|
|||||||
Uri betterGenshinImpactUri = "bettergi://start".ToUri();
|
Uri betterGenshinImpactUri = "bettergi://start".ToUri();
|
||||||
if (await Launcher.QueryUriSupportAsync(betterGenshinImpactUri, LaunchQuerySupportType.Uri) is LaunchQuerySupportStatus.Available)
|
if (await Launcher.QueryUriSupportAsync(betterGenshinImpactUri, LaunchQuerySupportType.Uri) is LaunchQuerySupportStatus.Available)
|
||||||
{
|
{
|
||||||
context.Logger.LogInformation("Waiting game window to be ready");
|
|
||||||
context.Process.WaitForInputIdle();
|
|
||||||
|
|
||||||
context.Logger.LogInformation("Launching BetterGI");
|
context.Logger.LogInformation("Launching BetterGI");
|
||||||
await Launcher.LaunchUriAsync(betterGenshinImpactUri);
|
await Launcher.LaunchUriAsync(betterGenshinImpactUri);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,9 +24,9 @@ internal sealed class LaunchExecutionInvoker
|
|||||||
handlers.Enqueue(new LaunchExecutionGameProcessInitializationHandler());
|
handlers.Enqueue(new LaunchExecutionGameProcessInitializationHandler());
|
||||||
handlers.Enqueue(new LaunchExecutionSetDiscordActivityHandler());
|
handlers.Enqueue(new LaunchExecutionSetDiscordActivityHandler());
|
||||||
handlers.Enqueue(new LaunchExecutionGameProcessStartHandler());
|
handlers.Enqueue(new LaunchExecutionGameProcessStartHandler());
|
||||||
|
handlers.Enqueue(new LaunchExecutionUnlockFpsHandler());
|
||||||
handlers.Enqueue(new LaunchExecutionStarwardPlayTimeStatisticsHandler());
|
handlers.Enqueue(new LaunchExecutionStarwardPlayTimeStatisticsHandler());
|
||||||
handlers.Enqueue(new LaunchExecutionBetterGenshinImpactAutomationHandlder());
|
handlers.Enqueue(new LaunchExecutionBetterGenshinImpactAutomationHandlder());
|
||||||
handlers.Enqueue(new LaunchExecutionUnlockFpsHandler());
|
|
||||||
handlers.Enqueue(new LaunchExecutionGameProcessExitHandler());
|
handlers.Enqueue(new LaunchExecutionGameProcessExitHandler());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
using Snap.Hutao.Model.Entity;
|
using Snap.Hutao.Model.Entity;
|
||||||
|
|
||||||
namespace Snap.Hutao.Service.Inventory;
|
namespace Snap.Hutao.Service.Inventroy;
|
||||||
|
|
||||||
internal interface IInventoryDbService
|
internal interface IInventoryDbService
|
||||||
{
|
{
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
// Copyright (c) DGP Studio. All rights reserved.
|
// Copyright (c) DGP Studio. All rights reserved.
|
||||||
// Licensed under the MIT license.
|
// Licensed under the MIT license.
|
||||||
|
|
||||||
namespace Snap.Hutao.Service.Inventory;
|
namespace Snap.Hutao.Service.Inventroy;
|
||||||
|
|
||||||
internal interface IInventoryService
|
internal interface IInventoryService
|
||||||
{
|
{
|
||||||
@@ -6,7 +6,7 @@ using Snap.Hutao.Core.Database;
|
|||||||
using Snap.Hutao.Model.Entity;
|
using Snap.Hutao.Model.Entity;
|
||||||
using Snap.Hutao.Model.Entity.Database;
|
using Snap.Hutao.Model.Entity.Database;
|
||||||
|
|
||||||
namespace Snap.Hutao.Service.Inventory;
|
namespace Snap.Hutao.Service.Inventroy;
|
||||||
|
|
||||||
[ConstructorGenerated]
|
[ConstructorGenerated]
|
||||||
[Injection(InjectAs.Singleton, typeof(IInventoryDbService))]
|
[Injection(InjectAs.Singleton, typeof(IInventoryDbService))]
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
// Copyright (c) DGP Studio. All rights reserved.
|
// Copyright (c) DGP Studio. All rights reserved.
|
||||||
// Licensed under the MIT license.
|
// Licensed under the MIT license.
|
||||||
|
|
||||||
namespace Snap.Hutao.Service.Inventory;
|
namespace Snap.Hutao.Service.Inventroy;
|
||||||
|
|
||||||
[Injection(InjectAs.Transient)]
|
[Injection(InjectAs.Transient)]
|
||||||
internal sealed class InventoryService : IInventoryService
|
internal sealed class InventoryService : IInventoryService
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
// Copyright (c) DGP Studio. All rights reserved.
|
|
||||||
// Licensed under the MIT license.
|
|
||||||
|
|
||||||
using Snap.Hutao.Core.DependencyInjection.Annotation.HttpClient;
|
|
||||||
using Snap.Hutao.Web.Request.Builder;
|
|
||||||
using Snap.Hutao.Web.Request.Builder.Abstraction;
|
|
||||||
using Snap.Hutao.Web.Response;
|
|
||||||
using System.Net.Http;
|
|
||||||
|
|
||||||
namespace Snap.Hutao.Web.Hutao.Wallpaper;
|
|
||||||
|
|
||||||
[HttpClient(HttpClientConfiguration.Default)]
|
|
||||||
[ConstructorGenerated(ResolveHttpClient = true)]
|
|
||||||
internal sealed partial class HutaoWallpaperClient
|
|
||||||
{
|
|
||||||
private readonly IHttpRequestMessageBuilderFactory httpRequestMessageBuilderFactory;
|
|
||||||
private readonly ILogger<HutaoWallpaperClient> logger;
|
|
||||||
private readonly HttpClient httpClient;
|
|
||||||
|
|
||||||
public ValueTask<Response<Wallpaper>> GetBingWallpaperAsync(CancellationToken token = default)
|
|
||||||
{
|
|
||||||
return GetWallpaperAsync(HutaoEndpoints.WallpaperBing, token);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ValueTask<Response<Wallpaper>> GetLauncherWallpaperAsync(CancellationToken token = default)
|
|
||||||
{
|
|
||||||
return GetWallpaperAsync(HutaoEndpoints.WallpaperGenshinLauncher, token);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ValueTask<Response<Wallpaper>> GetTodayWallpaperAsync(CancellationToken token = default)
|
|
||||||
{
|
|
||||||
return GetWallpaperAsync(HutaoEndpoints.WallpaperToday, token);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async ValueTask<Response<Wallpaper>> GetWallpaperAsync(string url, CancellationToken token = default)
|
|
||||||
{
|
|
||||||
HttpRequestMessageBuilder builder = httpRequestMessageBuilderFactory.Create()
|
|
||||||
.SetRequestUri(url)
|
|
||||||
.Get();
|
|
||||||
|
|
||||||
Response<Wallpaper>? resp = await builder.TryCatchSendAsync<Response<Wallpaper>>(httpClient, logger, token).ConfigureAwait(false);
|
|
||||||
return Web.Response.Response.DefaultIfNull(resp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
// Copyright (c) DGP Studio. All rights reserved.
|
|
||||||
// Licensed under the MIT license.
|
|
||||||
|
|
||||||
namespace Snap.Hutao.Web.Hutao.Wallpaper;
|
|
||||||
|
|
||||||
internal sealed class Wallpaper
|
|
||||||
{
|
|
||||||
[JsonPropertyName("url")]
|
|
||||||
public string Url { get; set; } = default!;
|
|
||||||
|
|
||||||
[JsonPropertyName("source_url")]
|
|
||||||
public string SourceUrl { get; set; } = default!;
|
|
||||||
|
|
||||||
[JsonPropertyName("author")]
|
|
||||||
public string Author { get; set; } = default!;
|
|
||||||
|
|
||||||
[JsonPropertyName("uploader")]
|
|
||||||
public string Uploader { get; set; } = default!;
|
|
||||||
}
|
|
||||||
@@ -10,9 +10,8 @@ namespace Snap.Hutao.Web;
|
|||||||
/// 胡桃 API 端点
|
/// 胡桃 API 端点
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[HighQuality]
|
[HighQuality]
|
||||||
[SuppressMessage("", "SA1124")]
|
|
||||||
[SuppressMessage("", "SA1201")]
|
[SuppressMessage("", "SA1201")]
|
||||||
[SuppressMessage("", "SA1203")]
|
[SuppressMessage("", "SA1124")]
|
||||||
internal static class HutaoEndpoints
|
internal static class HutaoEndpoints
|
||||||
{
|
{
|
||||||
#region HomaAPI
|
#region HomaAPI
|
||||||
@@ -272,15 +271,6 @@ internal static class HutaoEndpoints
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Wallpaper
|
|
||||||
|
|
||||||
public const string WallpaperBing = $"{ApiSnapGenshin}/wallpaper/bing";
|
|
||||||
|
|
||||||
public const string WallpaperGenshinLauncher = $"{ApiSnapGenshin}/wallpaper/genshin-launcher";
|
|
||||||
|
|
||||||
public const string WallpaperToday = $"{ApiSnapGenshin}/wallpaper/today";
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private const string ApiSnapGenshin = "https://api.snapgenshin.com";
|
private const string ApiSnapGenshin = "https://api.snapgenshin.com";
|
||||||
|
|||||||
Reference in New Issue
Block a user