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) ? definition.Type : definition.Title; } public static string Render(DialogInstance instance) { StringBuilder builder = new(); builder.AppendLine(string.Format(Translations.dialog_render_header, instance.Revision, instance.Phase, instance.Definition.DisplayTitle())); builder.AppendLine(string.Format(Translations.dialog_render_type, instance.Definition.Type)); foreach (var body in instance.Definition.Body.Where(static body => !string.IsNullOrWhiteSpace(body.Text))) builder.AppendLine(string.Format(Translations.dialog_render_body, 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, 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))); } if (instance.Definition.CancelAction is not null || instance.Definition.CanCloseWithEscape) builder.AppendLine(Translations.dialog_render_cancel_hint); return builder.ToString(); } 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 }; } }