using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using PCL.Core.UI;
using PCL.Core.UI.Theme;
using PCL.Core.App.Localization;
namespace PCL;
public partial class ServerCard
{
private readonly IconManager _manager;
public MinecraftServerInfo server;
public ServerCard()
{
InitializeComponent();
DataContext = new IconManager();
// 示例:可在代码中切换图标
_manager = DataContext as IconManager;
_manager.AddIconFromXaml("signal_1",
"");
_manager.AddIconFromXaml("signal_2",
"");
_manager.AddIconFromXaml("signal_3",
"");
_manager.AddIconFromXaml("signal_4",
"");
_manager.AddIconFromXaml("signal_5",
"");
_manager.AddIconFromXaml("signal_offline",
"");
_manager.AddIconFromXaml("loading",
"");
}
public event EventHandler? RemoveServer;
public event EventHandler? EditServer;
private void BtnSkin_Click(object sender, EventArgs eventArgs)
{
BtnSetting.ContextMenu.IsOpen = true;
}
///
/// 初始化服务器卡片
///
public void UpdateServerInfo(MinecraftServerInfo serverInfo)
{
server = serverInfo;
ModBase.RunInUi(() => UpdateServerUi());
}
///
/// 更新服务器UI
///
private async void UpdateServerUi()
{
if (server is null)
return;
// 更新服务器名称
ServerName.Text = server.Name;
await ImageLoaderHelper.SetServerLogoAsync(server.Icon, ServerIcon);
if (server.Status == ServerStatus.Online)
{
_manager.SetSelectedIconByName(GetSignalIcon(server.Ping));
Signal.ToolTip = $"{server.Ping}ms";
ToolTipService.SetInitialShowDelay(Signal, 0);
ToolTipService.SetBetweenShowDelay(Signal, 50);
ToolTipService.SetPlacement(Signal, PlacementMode.Top);
if (server.PlayerCount != default && server.MaxPlayers != default)
ServerPlayer.Text = $"{server.PlayerCount} / {server.MaxPlayers}";
else
ServerPlayer.Text = "???";
ServerMotD.Visibility = Visibility.Collapsed;
MotdRenderer.RenderMotd(server.Description, ThemeService.IsDarkMode, 2);
MotdRenderer.RenderCanvas();
}
else if (server.Status == ServerStatus.Pinging)
{
_manager.SetSelectedIconByName("loading");
MotdRenderer.ClearCanvas();
ServerPlayer.Text = Lang.Text("Instance.Server.Card.Connecting");
ServerMotD.Text = Lang.Text("Instance.Server.Card.ConnectingDots");
ServerMotD.Visibility = Visibility.Visible;
}
else if (server.Status == ServerStatus.Offline)
{
_manager.SetSelectedIconByName("signal_offline");
MotdRenderer.ClearCanvas();
ServerPlayer.Text = Lang.Text("Instance.Server.Card.Offline");
ServerMotD.Text = Lang.Text("Instance.Server.Card.ServerOffline");
ServerMotD.Visibility = Visibility.Visible;
}
}
private string GetSignalIcon(int ping)
{
switch (ping)
{
case var @case when 0 <= @case && @case <= 99:
{
return "signal_5"; // 5 条信号
}
case var case1 when 100 <= case1 && case1 <= 299:
{
return "signal_4"; // 4 条信号
}
case var case2 when 300 <= case2 && case2 <= 599:
{
return "signal_3"; // 3 条信号
}
case var case3 when 600 <= case3 && case3 <= 999:
{
return "signal_2"; // 2 条信号
}
default:
{
return "signal_1"; // 1 条信号
}
}
}
///
/// 刷新服务器状态
///
public async Task RefreshServerStatusAsync(bool withHint, CancellationToken token = default)
{
if (withHint) HintService.Hint(Lang.Text("Instance.Server.Card.RefreshingStatus", server.Name));
server.Status = ServerStatus.Pinging;
await Dispatcher.InvokeAsync(() => UpdateServerUi());
var serverInfo = await PageInstanceServer.PingServerAsync(server, token);
UpdateServerInfo(serverInfo);
}
///
/// 连接到服务器
///
private void BtnConnect_Click(object sender, EventArgs e)
{
try
{
var launchOptions = new ModLaunch.McLaunchOptions
{
ServerIp = server.Address,
instance = PageInstanceLeft.McInstance
};
ModLaunch.McLaunchStart(launchOptions);
ModMain.frmMain.PageChange(new FormMain.PageStackData { page = FormMain.PageType.Launch });
HintService.Hint(Lang.Text("Instance.Server.Card.ConnectingTo", server.Name));
}
catch (Exception ex)
{
ModBase.Log(
ex,
Lang.Text("Instance.Server.Card.LaunchFailed"),
ModBase.LogLevel.Feedback,
userSummary: Lang.Text("Instance.Server.Card.LaunchFailed"));
HintService.Hint(Lang.Text("Instance.Server.Card.LaunchFailedMsg", ex.Message), HintType.Error);
}
}
///
/// 复制服务器地址
///
private void BtnCopy_Click(object sender, RoutedEventArgs e)
{
try
{
Clipboard.SetText(server.Address);
HintService.Hint(Lang.Text("Instance.Server.Card.AddressCopied", server.Address), HintType.Success);
}
catch (Exception ex)
{
ModBase.Log(ex, Lang.Text("Instance.Server.Card.CopyAddressFailed"));
HintService.Hint(Lang.Text("Instance.Server.Card.CopyAddressFailed"), HintType.Error);
}
}
///
/// 刷新服务器状态
///
private async void BtnRefresh_Click(object sender, RoutedEventArgs e)
{
await Task.Run(async () => await RefreshServerStatusAsync(true));
}
///
/// 编辑服务器信息
///
private void BtnEdit_Click(object sender, RoutedEventArgs e)
{
try
{
// Get server information
var result = PageInstanceServer.GetServerInfo(server);
if (!result.Success) return;
EditServer?.Invoke(this, new ResultEventArgs(result.Name, result.Address));
}
// Update server object
// _server.Name = result.Name
// _server.Address = result.Address
catch (Exception ex)
{
HintService.Hint(Lang.Text("Instance.Server.Card.EditFailed", ex.Message), HintType.Error);
}
}
private void BtnRemove_Click(object sender, RoutedEventArgs e)
{
if (ModMain.MyMsgBox(
Lang.Text("Instance.Server.Card.RemoveConfirmMessage", server.Name, server.Address),
Lang.Text("Instance.Server.Card.RemoveConfirmTitle"), Lang.Text("Common.Action.Confirm"),
Lang.Text("Common.Action.Cancel")
) == 1) RemoveServer?.Invoke(this, EventArgs.Empty);
}
public class ResultEventArgs : EventArgs
{
public ResultEventArgs(string param1, string param2)
{
Param1 = param1;
Param2 = param2;
}
public string Param1 { get; set; }
public string Param2 { get; set; }
}
}