From 36b379e8ed9ff8e22dbcb0c575b04c0a7e126514 Mon Sep 17 00:00:00 2001 From: _sega Date: Tue, 27 Jan 2026 11:33:32 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=BD=D0=BE=D0=B5=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20?= =?UTF-8?q?=D1=81=20=D1=84=D0=BE=D1=80=D0=BC=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Fonts/NEW/NexaRegular COOL.asset | 2 +- Assets/Scripts/Server/SettingsToHtml.cs | 133 ++++++++---- Assets/Scripts/Server/TestHTML.cs | 15 -- Assets/Scripts/Server/TestHTML.cs.meta | 11 - Assets/Scripts/Server/WebServer.cs | 266 ++++++++++++++++++++---- 5 files changed, 328 insertions(+), 99 deletions(-) delete mode 100644 Assets/Scripts/Server/TestHTML.cs delete mode 100644 Assets/Scripts/Server/TestHTML.cs.meta diff --git a/Assets/Fonts/NEW/NexaRegular COOL.asset b/Assets/Fonts/NEW/NexaRegular COOL.asset index 783fae4..41bf10d 100644 --- a/Assets/Fonts/NEW/NexaRegular COOL.asset +++ b/Assets/Fonts/NEW/NexaRegular COOL.asset @@ -11349,7 +11349,7 @@ Material: - _ClipRect: {r: -32767, g: -32767, b: 32767, a: 32767} - _EnvMatrixRotation: {r: 0, g: 0, b: 0, a: 0} - _FaceColor: {r: 1, g: 1, b: 1, a: 1} - - _GlowColor: {r: 0, g: 1, b: 0.991272, a: 1} + - _GlowColor: {r: 0, g: 0.12699413, b: 1, a: 1} - _MaskCoord: {r: 0, g: 0, b: 32767, a: 32767} - _OutlineColor: {r: 0.554717, g: 0.554717, b: 0.554717, a: 1} - _ReflectFaceColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Scripts/Server/SettingsToHtml.cs b/Assets/Scripts/Server/SettingsToHtml.cs index 4fd5bbf..3fcf19c 100644 --- a/Assets/Scripts/Server/SettingsToHtml.cs +++ b/Assets/Scripts/Server/SettingsToHtml.cs @@ -1,11 +1,21 @@ using System.Collections; using System.Collections.Generic; using System.Globalization; +using System.Security.Cryptography; using System.Text; using UnityEngine; public class SettingsToHtml : MonoBehaviour { + + const string FORM_GROUP_STYLE = "style=\"border: 2px solid black;border-radius: 5px;\""; + + + public static string GetSettingsPage(List settings) + { + return Decorate(GetSettingsString(settings)); + } + public static string GetSettingsString(List settings) { StringBuilder sb = new StringBuilder(); @@ -15,21 +25,25 @@ public class SettingsToHtml : MonoBehaviour sb.AppendLine("
"); foreach (Setting setting in settings) { + string view = string.Empty; if(setting.Type== SettingType.Bool) { - string boolView = GetBoolView(setting); - sb.AppendLine(boolView); + view = GetBoolView(setting); } else if(setting.Type == SettingType.Float) { - string view = GetFloatView(setting); - sb.AppendLine(view); + view = GetFloatView(setting); + } + else if(setting.Type == SettingType.String) + { + view = GetStringView(setting); } else { - sb.AppendLine($"

{setting.Alias}: {GetStringSettingValue(setting)}

"); + view = $"

{setting.Alias}: {setting.IntValue.ToString()}

"; } + sb.AppendLine(view); } sb.AppendLine(""); sb.AppendLine("
"); @@ -38,39 +52,18 @@ public class SettingsToHtml : MonoBehaviour } - private static string GetStringSettingValue(Setting setting) - { - if (setting.Type == SettingType.Bool) - { - return setting.BoolValue ? "true" : "false"; - } - else if (setting.Type == SettingType.String) - { - return setting.StringValue; - } - else if (setting.Type == SettingType.Int) - { - return setting.IntValue.ToString(); - } - else if (setting.Type == SettingType.Float) - { - return setting.FloatValue.ToString(); - } - else - { - return "Непонятый гений..."; - } - - } - private static string GetBoolView(Setting setting) { + string name = setting.Id; + string id = name + "ID"; + + string res = string.Empty; - res += "
"; - res += $""; + res += $"
"; + res += $""; string ischecked = setting.BoolValue ? "checked" : ""; - res += $""; + res += $""; res += "
"; return res; @@ -78,15 +71,81 @@ public class SettingsToHtml : MonoBehaviour private static string GetFloatView(Setting setting) { + string name = setting.Id; + string id = name + "ID"; string res = string.Empty; - res += "
"; - res += $""; - //res += $""; - res += $""; + + 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); + + res += $"
"; + res += $""; + res += $""; res += "
"; return res; } + private static string GetStringView(Setting setting) + { + string res = string.Empty; + + res += $"
"; + res += $"

{setting.Alias}

"; + + for (int i = 0; i < setting.AllowedValues.Count; i++) + { + string stringValue = setting.AllowedValues[i]; + + string name = setting.Id; + string id = name + "ID"; + + + bool isChecked = setting.StringValue == stringValue; + string Checked = isChecked ? "checked" : ""; + + + + res += "
"; + + res += $""; + res += $""; + + + res += "
"; + + + } + + + + res += "
"; + + + + + return res; + } + + private static string GetIntView(Setting setting) + { + + return string.Empty; + } + + private static string Decorate(string content) + { + string res = "\r\n\r\n\r\n \r\n Настройки Фишки\r\n\r\n"; + + res += content; + + res += "\r\n"; + + return res; + } + + } diff --git a/Assets/Scripts/Server/TestHTML.cs b/Assets/Scripts/Server/TestHTML.cs deleted file mode 100644 index e08d182..0000000 --- a/Assets/Scripts/Server/TestHTML.cs +++ /dev/null @@ -1,15 +0,0 @@ -public static class TestHTML -{ - - public const string HTMLTEST = - "" + - "" + - "

Привет.

" + - "Это сообщение из юнити.
" + - "Если вы это читаете то фишка что то отправила
" + - "Разраб морально устал.
" + - "Конец связи" + - "" + - ""; - -} diff --git a/Assets/Scripts/Server/TestHTML.cs.meta b/Assets/Scripts/Server/TestHTML.cs.meta deleted file mode 100644 index d8ed3ba..0000000 --- a/Assets/Scripts/Server/TestHTML.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ab705deb32565dc4b82350ec6b2e03c0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Server/WebServer.cs b/Assets/Scripts/Server/WebServer.cs index e86e049..8eba3d5 100644 --- a/Assets/Scripts/Server/WebServer.cs +++ b/Assets/Scripts/Server/WebServer.cs @@ -1,11 +1,12 @@ using System; +using System.Collections.Generic; using System.IO; using System.Net; using System.Text; using System.Threading.Tasks; using UnityEngine; -// Класс для сериализации в JSON +//Зависит от SettingsManager [System.Serializable] public class ServerResponse { @@ -20,7 +21,7 @@ public class WebServer : MonoBehaviour async void Start() { - SettingsManager.Initialize(); + SettingsManager.Initialize();//надо будет убирать await StartWebServerAsync(); } @@ -90,7 +91,8 @@ public class WebServer : MonoBehaviour var stopwatch = System.Diagnostics.Stopwatch.StartNew(); var htmlTask = Task.Run(() => - SettingsToHtml.GetSettingsString(SettingsManager.Container.Settings)); + SettingsToHtml.GetSettingsPage(SettingsManager.Container.Settings)); + //SettingsToHtml.GetSettingsString(SettingsManager.Container.Settings)); if (htmlTask.Wait(TimeSpan.FromSeconds(5))) { @@ -119,68 +121,262 @@ public class WebServer : MonoBehaviour }); } + /* + async Task HandlePostUpdateAsync(HttpListenerContext context) + { + try + { + // Читаем тело POST-запроса + string requestBody; + using (var reader = new StreamReader(context.Request.InputStream, context.Request.ContentEncoding)) + { + requestBody = await reader.ReadToEndAsync(); + } + + Debug.Log($"Получен POST запрос на /upd"); + Debug.Log($"Тело запроса: {requestBody}"); + + // Здесь вы можете обработать данные формы + // Обычно данные формы приходят в формате: key1=value1&key2=value2 + // Вы можете их разобрать: + var formData = System.Web.HttpUtility.ParseQueryString(requestBody); + + // Пример: если у вас есть поле "action" в форме + string action = formData["action"]; + string buttonValue = formData["submit"]; // для input type="submit" + + Debug.Log($"Action: {action}, Button value: {buttonValue}"); + + // Пример обработки разных кнопок: + // Если у вас несколько кнопок с разными именами/значениями + if (!string.IsNullOrEmpty(formData["save"])) + { + await HandleSaveAction(formData); + } + else if (!string.IsNullOrEmpty(formData["reset"])) + { + await HandleResetAction(formData); + } + + // Отправляем ответ обратно + string responseHtml = @" + + Обновлено + +

Данные успешно получены!

+

Сервер обработал ваш запрос.

+ Вернуться назад + + + "; + + SendHtmlResponse(context, responseHtml); + } + catch (Exception ex) + { + Debug.LogError($"Error handling POST /upd: {ex.Message}"); + SendHtmlResponse(context, $"

Error: {ex.Message}

", 500); + } + } + */ + async Task HandlePostUpdateAsync(HttpListenerContext context) { try { + // Определяем кодировку из Content-Type или используем UTF-8 по умолчанию + Encoding encoding = Encoding.UTF8; + string contentType = context.Request.ContentType?.ToLower() ?? ""; + + if (contentType.Contains("charset=")) + { + try + { + string charset = contentType.Split("charset=")[1].Trim().Split(';')[0]; + encoding = Encoding.GetEncoding(charset); + Debug.Log($"Определена кодировка из Content-Type: {charset}"); + } + catch + { + encoding = Encoding.UTF8; + Debug.Log($"Не удалось определить кодировку из Content-Type, используем UTF-8"); + } + } + // Читаем тело POST-запроса string requestBody; - using (var reader = new StreamReader(context.Request.InputStream, context.Request.ContentEncoding)) + using (var reader = new StreamReader(context.Request.InputStream, encoding)) { requestBody = await reader.ReadToEndAsync(); } Debug.Log($"Получен POST запрос на /upd"); - Debug.Log($"Тело запроса: {requestBody}"); + Debug.Log($"Content-Type: {contentType}"); + Debug.Log($"Используемая кодировка: {encoding.WebName}"); + Debug.Log($"Тело запроса (сырое): {requestBody}"); - // Здесь вы можете обработать данные формы - // Обычно данные формы приходят в формате: key1=value1&key2=value2 - // Вы можете их разобрать: - var formData = System.Web.HttpUtility.ParseQueryString(requestBody); + // Ручное декодирование данных формы + Debug.Log("\n=== Декодированные данные формы ==="); + var decodedValues = new Dictionary(); - // Пример: если у вас есть поле "action" в форме - string action = formData["action"]; - string buttonValue = formData["submit"]; // для input type="submit" + - Debug.Log($"Action: {action}, Button value: {buttonValue}"); - - // Пример обработки разных кнопок: - // Если у вас несколько кнопок с разными именами/значениями - if (!string.IsNullOrEmpty(formData["save"])) + // Также можно использовать ParseQueryString для сравнения + try { - await HandleSaveAction(formData); + var formData = System.Web.HttpUtility.ParseQueryString(requestBody, encoding); + Debug.Log("\n=== Данные через ParseQueryString ==="); + foreach (string key in formData.AllKeys) + { + if (key != null) + { + string value = formData[key] ?? ""; + Debug.Log($" {key} = {value}"); + + // Если ParseQueryString не декодировал ключ, делаем это вручную + if (key.Contains("%")) + { + string decodedKey = Uri.UnescapeDataString(key); + Debug.Log($" Декодированный ключ: {decodedKey}"); + } + } + } } - else if (!string.IsNullOrEmpty(formData["reset"])) + catch (Exception parseEx) { - await HandleResetAction(formData); + Debug.LogWarning($"ParseQueryString ошибка: {parseEx.Message}"); + } + + // Получаем action из декодированных данных + string action = decodedValues.ContainsKey("action") ? decodedValues["action"] : + (decodedValues.ContainsKey("action") ? decodedValues["action"] : null); + + Debug.Log($"\nAction: {action}"); + + // Обработка разных действий + if (!string.IsNullOrEmpty(action)) + { + if (action == "save") + { + await HandleSaveAction(decodedValues); + } + else if (action == "reset") + { + await HandleResetAction(decodedValues); + } + else + { + Debug.Log($"Неизвестное действие: {action}"); + } + } + else + { + Debug.Log("Action не указан, проверяем наличие отдельных кнопок..."); + + // Проверяем наличие других кнопок + if (decodedValues.ContainsKey("save") && !string.IsNullOrEmpty(decodedValues["save"])) + { + await HandleSaveAction(decodedValues); + } + else if (decodedValues.ContainsKey("reset") && !string.IsNullOrEmpty(decodedValues["reset"])) + { + await HandleResetAction(decodedValues); + } } // Отправляем ответ обратно string responseHtml = @" - - Обновлено - -

Данные успешно получены!

+ + + + Обновлено + + + +

✓ Данные успешно получены!

+

Сервер обработал ваш запрос.

- Вернуться назад - - - "; +

Полученные данные:

+
    "; + + // Добавляем список полученных данных в ответ + foreach (var kvp in decodedValues) + { + responseHtml += $"
  • {kvp.Key}: {kvp.Value}
  • "; + } + + responseHtml += @" +
+
+ + Вернуться к настройкам + + + + "; SendHtmlResponse(context, responseHtml); } catch (Exception ex) { - Debug.LogError($"Error handling POST /upd: {ex.Message}"); - SendHtmlResponse(context, $"

Error: {ex.Message}

", 500); + Debug.LogError($"Ошибка обработки POST /upd: {ex.Message}"); + Debug.LogError($"StackTrace: {ex.StackTrace}"); + SendHtmlResponse(context, + $"Ошибка" + + $"

Ошибка: {ex.Message}

" + + $"
{ex.StackTrace}
" + + $"Вернуться назад", + 500); } } + // Обновленный HandleSaveAction для работы с Dictionary + async Task HandleSaveAction(Dictionary formData) + { + Debug.Log("\n=== Обработка сохранения настроек ==="); + + foreach (var kvp in formData) + { + string key = kvp.Key; + string value = kvp.Value; + + Debug.Log($"Поле формы: '{key}' = '{value}'"); + + // Пропускаем служебные поля + if (key == "action" || key == "_charset_" || key == "submit") + continue; + + // TODO: Здесь логика обновления SettingsManager + // Например: + // var setting = SettingsManager.Container.Settings.FirstOrDefault(s => s.Id == key); + // if (setting != null) { ... } + } + + Debug.Log("Сохранение настроек завершено"); + await Task.CompletedTask; + } + + async Task HandleResetAction(Dictionary formData) + { + Debug.Log("\n=== Обработка сброса настроек ==="); + // TODO: Реализовать сброс настроек + await Task.CompletedTask; + } + async Task HandleSaveAction(System.Collections.Specialized.NameValueCollection formData) { // Здесь обрабатываем сохранение настроек