CI / Go Backend (push) Canceled after 0s
初始化 monorepo: Go后端(7微服务) + Unity客户端(9模块) + 启动器 HTML5原型: Three.js 3D体素世界, Perlin噪声地形, 原版材质, 22种方块 Minecraft创造模式背包: 双栏布局, 拖拽移动物品, 方向性元件引脚 AI助搭策划文档 + 客户端/服务端骨架 + Docker Compose + CI
210 lines
7.4 KiB
C#
210 lines
7.4 KiB
C#
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using PCL.Core.App;
|
|
using PCL.Core.App.Localization;
|
|
using PCL.Core.IO.Net.Http;
|
|
using PCL.Core.Minecraft.Yggdrasil;
|
|
using PCL.Core.Utils;
|
|
using PCL.Core.Utils.Exts;
|
|
using PCL.Core.Utils.Validate;
|
|
|
|
namespace PCL;
|
|
|
|
public partial class PageLoginAuth
|
|
{
|
|
public static string draggedAuthServer;
|
|
|
|
// 预设服务器
|
|
private static readonly Dictionary<string, string> predefinedAuthServers = new()
|
|
{
|
|
{ Lang.Text("Launch.Account.Auth.Preset.LittleSkin"), "https://littleskin.cn/api/yggdrasil" },
|
|
{ Lang.Text("Common.Option.Customize"), "" }
|
|
};
|
|
|
|
private bool _isRegisterMode = true;
|
|
|
|
public PageLoginAuth()
|
|
{
|
|
InitializeComponent();
|
|
Loaded += (_, _) => Reload();
|
|
Loaded += (_, _) => ReloadRegisterButton();
|
|
// Handles
|
|
BtnBack.Click += BtnBack_Click;
|
|
BtnLogin.Click += BtnLogin_Click;
|
|
TextServer.TextChanged += TextServer_TextChanged;
|
|
BtnLink.Click += Btn_Click;
|
|
}
|
|
|
|
private void Reload()
|
|
{
|
|
var serverItems = TextServer.Items;
|
|
serverItems.Clear();
|
|
foreach (var serverName in predefinedAuthServers.Keys)
|
|
serverItems.Add(new MyComboBoxItem { Content = serverName });
|
|
TextServer.Text = draggedAuthServer;
|
|
draggedAuthServer = null;
|
|
}
|
|
|
|
private void BtnBack_Click(object sender, EventArgs e)
|
|
{
|
|
TextServer.Text = null;
|
|
TextName.Text = null;
|
|
TextPass.Password = null;
|
|
ModMain.frmLaunchLeft.RefreshPage(true);
|
|
}
|
|
|
|
private void BtnLogin_Click(object sender, EventArgs e)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(TextServer.Text) || string.IsNullOrWhiteSpace(TextName.Text) ||
|
|
string.IsNullOrWhiteSpace(TextPass.Password))
|
|
{
|
|
HintService.Hint(Lang.Text("Launch.Account.Auth.EmptyFields"), HintType.Error);
|
|
return;
|
|
}
|
|
|
|
if (!TextServer.Text.IsMatch(RegexPatterns.HttpUri))
|
|
{
|
|
HintService.Hint(Lang.Text("Launch.Account.Auth.InvalidServer"), HintType.Error);
|
|
return;
|
|
}
|
|
|
|
BtnLogin.IsEnabled = false;
|
|
BtnBack.IsEnabled = false;
|
|
var loginData = new ModLaunch.McLoginServer(ModLaunch.McLoginType.Auth)
|
|
{
|
|
BaseUrl = TextServer.Text.EndsWithF("/") ? $"{TextServer.Text}authserver" : $"{TextServer.Text}/authserver",
|
|
UserName = TextName.Text, Password = TextPass.Password, Description = "Authlib-Injector",
|
|
LoginType = ModLaunch.McLoginType.Auth
|
|
};
|
|
Dispatcher.BeginInvoke(new Func<Task>(async () =>
|
|
{
|
|
try
|
|
{
|
|
ModProfile.isCreatingProfile = true;
|
|
ModLaunch.mcLoginAuthLoader.Start(loginData, true);
|
|
while (ModLaunch.mcLoginAuthLoader.State == ModBase.LoadState.Loading)
|
|
{
|
|
BtnLogin.Text = Lang.Number(ModLaunch.mcLoginAuthLoader.Progress, "P0");
|
|
await Task.Delay(50);
|
|
}
|
|
|
|
switch (ModLaunch.mcLoginAuthLoader.State)
|
|
{
|
|
case ModBase.LoadState.Finished:
|
|
ModMain.frmLaunchLeft.RefreshPage(true);
|
|
break;
|
|
case ModBase.LoadState.Aborted:
|
|
HintService.Hint(Lang.Text("Launch.Account.Auth.Cancelled"));
|
|
break;
|
|
case ModBase.LoadState.Waiting:
|
|
case ModBase.LoadState.Loading:
|
|
case ModBase.LoadState.Failed:
|
|
default:
|
|
{
|
|
if (ModLaunch.mcLoginAuthLoader.Error is null)
|
|
throw new Exception(Lang.Text("Launch.Account.Microsoft.Error.Unknown"));
|
|
throw new Exception(ModLaunch.mcLoginAuthLoader.Error.Message,
|
|
ModLaunch.mcLoginAuthLoader.Error);
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
if (ex.Message == "$$")
|
|
{
|
|
}
|
|
else if (ex.Message.StartsWith("$"))
|
|
{
|
|
HintService.Hint(
|
|
Lang.Text("Launch.Account.Auth.LoginFailed.WithDetail",ex.Message.TrimStart('$')),
|
|
HintType.Error);
|
|
}
|
|
else
|
|
{
|
|
ModBase.Log(
|
|
ex,
|
|
Lang.Text("Launch.Account.Auth.LoginFailed"),
|
|
ModBase.LogLevel.Msgbox,
|
|
userSummary: Lang.Text("Launch.Account.Auth.LoginFailed"));
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
ModProfile.isCreatingProfile = false;
|
|
BtnLogin.IsEnabled = true;
|
|
BtnBack.IsEnabled = true;
|
|
BtnLogin.Text = Lang.Text("Launch.Account.Auth.Login");
|
|
}
|
|
}));
|
|
}
|
|
|
|
// 获取验证服务器名称
|
|
private void GetServerName()
|
|
{
|
|
var serverUriInput = TextServer.Text;
|
|
if (string.IsNullOrWhiteSpace(serverUriInput))
|
|
{
|
|
TextServerName.Visibility = Visibility.Hidden;
|
|
return;
|
|
}
|
|
|
|
Dispatcher.BeginInvoke(async () =>
|
|
{
|
|
string serverUri = null;
|
|
string serverName = null;
|
|
try
|
|
{
|
|
serverUri = await ApiLocation.TryRequestAsync(serverUriInput);
|
|
using var resp = await HttpRequest.Create(serverUri).SendAsync();
|
|
var responseText = await resp.AsStringAsync();
|
|
serverName = await Task.Run(() => ModBase.GetJson(responseText)["meta"]?["serverName"]?.ToString());
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ModBase.Log(ex, "从服务器获取名称失败");
|
|
}
|
|
|
|
if (serverUri is not null) TextServer.Text = serverUri;
|
|
if (serverName is null)
|
|
{
|
|
TextServerName.Visibility = Visibility.Hidden;
|
|
}
|
|
else
|
|
{
|
|
TextServerName.Text = Lang.Text("Launch.Account.Auth.ServerLabel", serverName);
|
|
TextServerName.Visibility = Visibility.Visible;
|
|
}
|
|
});
|
|
}
|
|
|
|
// 链接处理
|
|
private void ComboName_TextChanged(object sender, TextChangedEventArgs e)
|
|
{
|
|
_isRegisterMode = string.IsNullOrEmpty(TextName.Text);
|
|
BtnLink.Content = _isRegisterMode
|
|
? Lang.Text("Launch.Account.Auth.Register")
|
|
: Lang.Text("Launch.Account.Auth.ForgotPassword");
|
|
}
|
|
|
|
private void Btn_Click(object sender, EventArgs e)
|
|
{
|
|
ModBase.OpenWebsite(_isRegisterMode
|
|
? Config.InstanceAuth.AuthRegisterAddress.ToString()
|
|
: Config.InstanceAuth.AuthRegisterAddress.ToString().Replace("/auth/register", "/auth/forgot"));
|
|
}
|
|
|
|
// 切换注册按钮可见性
|
|
private void ReloadRegisterButton()
|
|
{
|
|
var address = Config.InstanceAuth.AuthRegisterAddress.ToString();
|
|
BtnLink.Visibility = new HttpValidator().Validate(address).IsValid
|
|
? Visibility.Visible
|
|
: Visibility.Collapsed;
|
|
}
|
|
|
|
private void TextServer_TextChanged(object sender, TextChangedEventArgs e)
|
|
{
|
|
predefinedAuthServers.TryGetValue(TextServer.Text, out var server);
|
|
if (server is not null) TextServer.Text = server;
|
|
}
|
|
} |