Files
MRCC/launcher/PCL-CE/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuth.xaml.cs
T
xyou f70b061d1a
CI / Go Backend (push) Canceled after 0s
feat: 项目初始化 + 3D方块世界原型 + AI助搭系统
初始化 monorepo: Go后端(7微服务) + Unity客户端(9模块) + 启动器

HTML5原型: Three.js 3D体素世界, Perlin噪声地形, 原版材质, 22种方块

Minecraft创造模式背包: 双栏布局, 拖拽移动物品, 方向性元件引脚

AI助搭策划文档 + 客户端/服务端骨架 + Docker Compose + CI
2026-08-08 14:07:56 +08:00

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;
}
}