Minecraft-Console-Client/MinecraftClient/Dialogs/DialogFormatter.cs

108 lines
4.6 KiB
C#

using System;
using System.Linq;
using System.Text;
namespace MinecraftClient.Dialogs;
public static class DialogFormatter
{
public static string DisplayTitle(this DialogDefinition definition)
{
if (!string.IsNullOrWhiteSpace(definition.ExternalTitle))
return definition.ExternalTitle!;
return string.IsNullOrWhiteSpace(definition.Title) ? DisplayType(definition.Type) : definition.Title;
}
private const int BoxWidth = 50;
public static string Render(DialogInstance instance)
{
StringBuilder builder = new();
string border = new('-', BoxWidth);
builder.AppendLine(border);
builder.AppendLine(" " + string.Format(Translations.dialog_render_header, instance.Revision, instance.Phase, instance.Definition.DisplayTitle()));
builder.AppendLine(border);
foreach (var body in instance.Definition.Body.Where(static body => !string.IsNullOrWhiteSpace(body.Text)))
builder.AppendLine(body.Text);
if (instance.Definition.Inputs.Count > 0)
{
builder.AppendLine(Translations.dialog_render_inputs);
foreach (var input in instance.Definition.Inputs)
{
instance.Values.TryGetValue(input.Key, out var value);
value ??= input.InitialValue;
builder.AppendLine(string.Format(Translations.dialog_render_input, input.Key, DescribeKind(input.Kind), input.Label, value, DescribeInput(input)));
}
}
if (instance.Definition.Actions.Count > 0)
{
builder.AppendLine(Translations.dialog_render_actions);
foreach (var action in instance.Definition.Actions)
builder.AppendLine(string.Format(Translations.dialog_render_action, action.Index, action.Label, DescribeAction(action.Action)));
}
builder.AppendLine();
builder.AppendLine("§o" + Translations.dialog_render_help_hint + "§r");
builder.Append(border);
return builder.ToString();
}
public static string DisplayType(string rawType)
{
return rawType switch
{
"minecraft:notice" => Translations.dialog_type_notice,
"minecraft:confirmation" => Translations.dialog_type_confirmation,
"minecraft:multi_action" => Translations.dialog_type_multi_action,
"minecraft:dialog_list" => Translations.dialog_type_dialog_list,
"minecraft:server_links" => Translations.dialog_type_server_links,
_ => string.IsNullOrEmpty(rawType) ? Translations.dialog_type_unknown : rawType
};
}
private static string DescribeKind(DialogInputKind kind)
{
return kind switch
{
DialogInputKind.Text => Translations.dialog_input_kind_text,
DialogInputKind.Boolean => Translations.dialog_input_kind_boolean,
DialogInputKind.SingleOption => Translations.dialog_input_kind_options,
DialogInputKind.NumberRange => Translations.dialog_input_kind_number,
_ => Translations.dialog_input_kind_unknown
};
}
private static string DescribeInput(DialogInput input)
{
return input.Kind switch
{
DialogInputKind.Text => string.Format(Translations.dialog_input_desc_text, input.MaxLength),
DialogInputKind.Boolean => string.Format(Translations.dialog_input_desc_boolean, input.OnTrue, input.OnFalse),
DialogInputKind.SingleOption => string.Format(Translations.dialog_input_desc_options,
string.Join(", ", input.Options?.Select(static option => option.Id) ?? [])),
DialogInputKind.NumberRange => string.Format(Translations.dialog_input_desc_number, input.Start, input.End),
_ => input.Type ?? Translations.dialog_input_desc_unknown
};
}
private static string DescribeAction(DialogActionDefinition? action)
{
if (action is null)
return Translations.dialog_action_desc_close;
return action.Kind switch
{
DialogActionKind.RunCommand => Translations.dialog_action_desc_command,
DialogActionKind.CustomClick => Translations.dialog_action_desc_custom,
DialogActionKind.ShowDialog => Translations.dialog_action_desc_show_dialog,
DialogActionKind.OpenUrl => Translations.dialog_action_desc_open_url,
DialogActionKind.SuggestCommand => Translations.dialog_action_desc_suggest,
DialogActionKind.CopyToClipboard => Translations.dialog_action_desc_copy,
_ => action.Type ?? Translations.dialog_action_desc_unknown
};
}
}