mirror of
https://github.com/MCCTeam/Minecraft-Console-Client
synced 2026-08-15 13:04:36 +00:00
Add server status display and protocol version upgrade handling
- Introduced a new `ServerStatusInfo` class to encapsulate server status data including MOTD, player counts, and version information. - Implemented `ServerStatusDisplay` to format and display server status information in both classic and TUI modes. - Added protocol version upgrade logic in `ProtocolHandler` to determine the highest supported protocol version for multi-version servers. - Updated translations to support new server status labels and messages. - Created `ServerStatusPanelBuilder` for TUI to visually represent server status with player information and connection details.
This commit is contained in:
parent
2f03f66f5c
commit
871305bd72
10 changed files with 954 additions and 269 deletions
118
MinecraftClient/Protocol/ServerStatusDisplay.cs
Normal file
118
MinecraftClient/Protocol/ServerStatusDisplay.cs
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
using System;
|
||||
using System.Text;
|
||||
using MinecraftClient.Protocol.Message;
|
||||
|
||||
namespace MinecraftClient.Protocol
|
||||
{
|
||||
internal static class ServerStatusDisplay
|
||||
{
|
||||
private const int MaxSamplePlayers = 10;
|
||||
|
||||
internal static void Show(ServerStatusInfo info)
|
||||
{
|
||||
if (ConsoleIO.Backend is Tui.TuiConsoleBackend tuiBackend)
|
||||
ShowTui(info, tuiBackend);
|
||||
else
|
||||
ShowClassic(info);
|
||||
}
|
||||
|
||||
private static void ShowClassic(ServerStatusInfo info)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
|
||||
sb.AppendLine();
|
||||
sb.Append("§8§m");
|
||||
sb.Append(new string('-', 50));
|
||||
sb.AppendLine("§r");
|
||||
|
||||
if (!string.IsNullOrEmpty(info.MotdRaw))
|
||||
{
|
||||
try
|
||||
{
|
||||
sb.AppendLine(ChatParser.ParseText(info.MotdRaw));
|
||||
}
|
||||
catch
|
||||
{
|
||||
sb.AppendLine(info.MotdRaw);
|
||||
}
|
||||
}
|
||||
|
||||
sb.Append("§f");
|
||||
sb.Append(Translations.mcc_server_info_label_server);
|
||||
sb.Append(" §b");
|
||||
sb.Append(info.Host);
|
||||
sb.Append("§7:§b");
|
||||
sb.AppendLine(info.Port.ToString());
|
||||
|
||||
sb.Append("§f");
|
||||
sb.Append(Translations.mcc_server_info_label_version);
|
||||
sb.Append(" §b");
|
||||
sb.Append(info.VersionName);
|
||||
sb.Append(" §7(");
|
||||
sb.Append(string.Format(Translations.mcc_server_info_label_protocol, "§e" + info.ProtocolVersion + "§7"));
|
||||
sb.AppendLine(")");
|
||||
|
||||
if (info.ResolvedProtocol != 0 && info.ResolvedProtocol != info.ProtocolVersion)
|
||||
{
|
||||
string resolvedMcVer = ProtocolHandler.ProtocolVersion2MCVer(info.ResolvedProtocol);
|
||||
sb.Append("§f");
|
||||
sb.Append(Translations.mcc_server_info_label_connecting_as);
|
||||
sb.Append(" §a");
|
||||
sb.Append(resolvedMcVer);
|
||||
sb.Append(" §7(");
|
||||
sb.Append(string.Format(Translations.mcc_server_info_label_protocol, "§a" + info.ResolvedProtocol + "§7"));
|
||||
sb.AppendLine(")");
|
||||
}
|
||||
|
||||
if (info.PingMs >= 0)
|
||||
{
|
||||
sb.Append("§f");
|
||||
sb.Append(Translations.mcc_server_info_label_ping);
|
||||
sb.Append(" §a");
|
||||
sb.AppendLine(string.Format(Translations.mcc_server_info_label_ping_ms, info.PingMs));
|
||||
}
|
||||
|
||||
sb.Append("§f");
|
||||
sb.Append(Translations.mcc_server_info_label_players);
|
||||
sb.Append(" §a");
|
||||
sb.Append(info.OnlinePlayers);
|
||||
sb.Append("§7/§c");
|
||||
sb.AppendLine(info.MaxPlayers.ToString());
|
||||
|
||||
if (info.SamplePlayers.Count > 0)
|
||||
{
|
||||
sb.Append("§f");
|
||||
sb.AppendLine(Translations.mcc_server_info_label_online);
|
||||
|
||||
int shown = Math.Min(info.SamplePlayers.Count, MaxSamplePlayers);
|
||||
for (int i = 0; i < shown; i++)
|
||||
sb.AppendLine($" §a{info.SamplePlayers[i].Name}");
|
||||
|
||||
if (info.SamplePlayers.Count > shown)
|
||||
sb.AppendLine($" §7{string.Format(Translations.mcc_server_info_sample_more, info.SamplePlayers.Count - shown)}");
|
||||
}
|
||||
|
||||
sb.Append("§8§m");
|
||||
sb.Append(new string('-', 50));
|
||||
sb.Append("§r");
|
||||
|
||||
ConsoleIO.WriteLineFormatted(sb.ToString(), acceptnewlines: true);
|
||||
}
|
||||
|
||||
private static void ShowTui(ServerStatusInfo info, Tui.TuiConsoleBackend backend)
|
||||
{
|
||||
var view = backend.GetView();
|
||||
if (view is null)
|
||||
{
|
||||
ShowClassic(info);
|
||||
return;
|
||||
}
|
||||
|
||||
Avalonia.Threading.Dispatcher.UIThread.Post(() =>
|
||||
{
|
||||
var panel = Tui.ServerStatusPanelBuilder.Build(info);
|
||||
view.AppendControlToLog(panel);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue