using System.Net.Http.Json; using System.Text; using System.Text.Json; using KronaStaffTerminal.Models; namespace KronaStaffTerminal.Services; public sealed class NotificationService { private readonly HttpClient _httpClient = new() { Timeout = TimeSpan.FromSeconds(15) }; public async Task<(bool Delivered, string? Error)> SendArrivalAsync(TerminalSettings settings, string employeeName, DateTimeOffset localTime) { return await SendAsync(settings, $"{employeeName} пришёл(а) в {localTime:HH:mm}"); } public async Task<(bool Delivered, string? Error)> SendTestAsync(TerminalSettings settings) { return await SendAsync(settings, "Krona Staff: тестовое сообщение доставлено."); } private async Task<(bool Delivered, string? Error)> SendAsync(TerminalSettings settings, string text) { var errors = new List(); var sent = false; if (settings.TelegramEnabled) { try { var url = $"https://api.telegram.org/bot{settings.TelegramBotToken}/sendMessage"; using var response = await _httpClient.PostAsJsonAsync(url, new { chat_id = settings.TelegramChatId, text }); if (!response.IsSuccessStatusCode) { errors.Add($"Telegram: HTTP {(int)response.StatusCode}"); } else { sent = true; } } catch (Exception exception) { errors.Add($"Telegram: {exception.Message}"); } } if (settings.MaxEnabled) { try { var url = $"https://platform-api.max.ru/messages?chat_id={Uri.EscapeDataString(settings.MaxChatId)}"; using var request = new HttpRequestMessage(HttpMethod.Post, url); request.Headers.TryAddWithoutValidation("Authorization", settings.MaxBotToken); request.Content = new StringContent(JsonSerializer.Serialize(new { text }), Encoding.UTF8, "application/json"); using var response = await _httpClient.SendAsync(request); if (!response.IsSuccessStatusCode) { errors.Add($"MAX: HTTP {(int)response.StatusCode}"); } else { sent = true; } } catch (Exception exception) { errors.Add($"MAX: {exception.Message}"); } } if (!settings.TelegramEnabled && !settings.MaxEnabled) { return (false, null); } return (sent && errors.Count == 0, errors.Count == 0 ? null : string.Join("; ", errors)); } }