using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; public class HtmlBuilder { // старый метод оставим, чтобы ничего не поломать public static string GetSettingsPage(List settings) => GetSettingsPage(settings, actions: null); // новый метод public static string GetSettingsPage(List settings, List actions) { return Decorate(GetSettingsString(settings, actions), title: "Настройки Фишки"); } public static string GetLoginPage() { string content = @" "; return Decorate(content, title: "Вход"); } // старый метод оставим public static string GetSettingsString(List settings) => GetSettingsString(settings, actions: null); // новый метод: настройки + действия (раздельные блоки) public static string GetSettingsString(List settings, List actions) { var sb = new StringBuilder(); sb.AppendLine("

Настройки фишки

"); // === БЛОК: АКТИВНЫЕ ПАРАМЕТРЫ (CountersCollector.Counters) === sb.AppendLine(GetActiveCountersBlock()); // === БЛОК: НАСТРОЙКИ === sb.AppendLine(@"
Настройки
"); // монеты внутри настроек sb.AppendLine(@"

Монеты

"); sb.AppendLine("
"); sb.AppendLine("

Параметры

"); foreach (Setting setting in settings) { string view = setting.Type switch { SettingType.Bool => GetBoolView(setting), SettingType.Float => GetFloatView(setting), SettingType.String => GetStringView(setting), SettingType.Int => GetIntView(setting), _ => $"

{Escape(setting.Alias)}: (unknown)

" }; sb.AppendLine(view); } sb.AppendLine("
"); // panel sb.AppendLine(@"
"); // === БЛОК: ДЕЙСТВИЯ === sb.AppendLine(@"
Действия
"); sb.AppendLine(GetActionsView(actions)); sb.AppendLine(@"
"); // JS: realtime settings + coins + actions sb.AppendLine(@"
"); return sb.ToString(); } private static string GetActionsView(List actions) { var sb = new StringBuilder(); if (actions == null || actions.Count == 0) { sb.AppendLine("

Нет доступных действий

"); return sb.ToString(); } // группировка по Group (если пусто — в "Другое") var groups = actions .Where(a => a != null && !string.IsNullOrWhiteSpace(a.Name)) .GroupBy(a => string.IsNullOrWhiteSpace(a.Group) ? "Другое" : a.Group); foreach (var g in groups) { sb.AppendLine($"
"); sb.AppendLine($"

{Escape(g.Key)}

"); sb.AppendLine("
"); foreach (var a in g) { sb.AppendLine( $" " ); } sb.AppendLine("
"); sb.AppendLine("
"); } return sb.ToString(); } private static string GetBoolView(Setting setting) { string name = setting.Id; string id = name + "ID"; string isChecked = setting.BoolValue ? "checked" : ""; return $@"
"; } private static string GetFloatView(Setting setting) { string name = setting.Id; string id = name + "ID"; string spanId = id + "_VAL"; string min = setting.FloatMin.ToString(CultureInfo.InvariantCulture); string max = setting.FloatMax.ToString(CultureInfo.InvariantCulture); string value = setting.FloatValue.ToString(CultureInfo.InvariantCulture); string step = setting.FloatStep.ToString(CultureInfo.InvariantCulture); return $@"
"; } private static string GetStringView(Setting setting) { var sb = new StringBuilder(); sb.AppendLine("
"); sb.AppendLine($"

{Escape(setting.Alias)}

"); for (int i = 0; i < setting.AllowedValues.Count; i++) { string stringValue = setting.AllowedValues[i]; string name = setting.Id; string id = name + "ID" + i; bool isChecked = setting.StringValue == stringValue; string Checked = isChecked ? "checked" : ""; sb.AppendLine("
"); sb.AppendLine($""); sb.AppendLine( $"" ); sb.AppendLine("
"); } sb.AppendLine("
"); return sb.ToString(); } private static string GetIntView(Setting setting) { string name = setting.Id; string id = name + "ID"; return $@"
"; } private static string Decorate(string content, string title) { string res = "" + "" + "" + "" + "" + "" + $"{Escape(title)}" + "" + ""; res += content; res += ""; return res; } private static string GetActiveCountersBlock() { var sb = new StringBuilder(); sb.AppendLine(@"
Активные параметры

Активные параметры

"); // CountersCollector.Counters : ConcurrentDictionary var dict = CountersCollector.Counters; if (dict == null || dict.IsEmpty) { sb.AppendLine("
Нет данных
"); } else { // Стабильный вывод: снимок + сортировка по ключу var items = dict.ToArray() .OrderBy(kv => kv.Key ?? "", StringComparer.Ordinal); foreach (var kv in items) { string key = kv.Key ?? ""; string val = kv.Value ?? ""; sb.AppendLine(@"
"); sb.AppendLine($" "); sb.AppendLine($"
{Escape(val)}
"); sb.AppendLine("
"); } } sb.AppendLine(@"
"); return sb.ToString(); } private static string Escape(string s) { if (string.IsNullOrEmpty(s)) return ""; return s.Replace("&", "&").Replace("<", "<").Replace(">", ">").Replace("\"", """); } private static string EscapeAttr(string s) => Escape(s).Replace("'", "'"); }