using GmRelay.Shared.Domain; using GmRelay.Shared.Rendering; using Telegram.Bot.Types.ReplyMarkups; namespace GmRelay.Web.Services; public static class TelegramSessionBatchRenderer { public static (string Text, InlineKeyboardMarkup Markup) Render(SessionBatchViewModel view) { var messageText = $"🎲 НовыС ΠΈΠ³Ρ€Ρ‹: {System.Net.WebUtility.HtmlEncode(view.Title)}\n\n" + $"РасписаниС:\n\n"; var buttons = new List(); foreach (var session in view.Sessions) { messageText += $"πŸ“… {session.ScheduledAt.FormatMoscow()}\n"; var tags = new List(); if (!string.IsNullOrWhiteSpace(session.System)) tags.Add($"БистСма: {System.Net.WebUtility.HtmlEncode(session.System)}"); if (!string.IsNullOrWhiteSpace(session.Format)) tags.Add($"Π€ΠΎΡ€ΠΌΠ°Ρ‚: {System.Net.WebUtility.HtmlEncode(session.Format)}"); tags.Add($"Π’ΠΈΠΏ: {(session.IsOneShot ? "One-shot" : "Кампания")}"); if (tags.Count > 0) { messageText += "🏷 " + string.Join(" Β· ", tags) + "\n"; } if (session.DurationMinutes.HasValue) { messageText += $"⏱ Π”Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ: {FormatDuration(session.DurationMinutes.Value)}\n"; } if (!string.IsNullOrWhiteSpace(session.Description)) { messageText += $"πŸ“ ОписаниС:\n{System.Net.WebUtility.HtmlEncode(session.Description)}\n\n"; } var format = session.Format ?? string.Empty; var isOnline = string.Equals(format, "Online", StringComparison.OrdinalIgnoreCase); var isOffline = string.Equals(format, "Offline", StringComparison.OrdinalIgnoreCase); var isHybrid = string.Equals(format, "Hybrid", StringComparison.OrdinalIgnoreCase); if ((isOnline || isHybrid) && !string.IsNullOrWhiteSpace(session.JoinLink)) { var encodedLink = System.Net.WebUtility.HtmlEncode(session.JoinLink); messageText += $"πŸ”— Бсылка: {encodedLink}\n"; } if ((isOffline || isHybrid) && !string.IsNullOrWhiteSpace(session.LocationAddress)) { messageText += $"πŸ“ АдрСс: {System.Net.WebUtility.HtmlEncode(session.LocationAddress)}\n"; } messageText += session.MaxPlayers.HasValue ? $"πŸ‘₯ ΠœΠ΅ΡΡ‚Π°: {session.ActivePlayerCount}/{session.MaxPlayers.Value}\n" : $"πŸ‘₯ Π˜Π³Ρ€ΠΎΠΊΠΈ ({session.ActivePlayerCount}):\n"; if (session.ActivePlayers.Count > 0) { messageText += string.Join("\n", session.ActivePlayers.Select(p => $" πŸ‘€ {(p.TelegramUsername != null ? "@" + p.TelegramUsername : p.DisplayName)}")) + "\n"; } else { messageText += " Пока Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ записался\n"; } if (session.WaitlistedPlayers.Count > 0) { messageText += $"⏳ Лист оТидания ({session.WaitlistedPlayers.Count}):\n"; messageText += string.Join("\n", session.WaitlistedPlayers.Select(p => $" ⏱ {(p.TelegramUsername != null ? "@" + p.TelegramUsername : p.DisplayName)}")) + "\n"; } if (GmRelay.Shared.Domain.SessionStatus.IsCancelled(session.Status)) { messageText += "❌ БСссия ΠΎΡ‚ΠΌΠ΅Π½Π΅Π½Π°\n\n"; } else { messageText += "\n"; var actionRow = session.AvailableActions .Select(a => InlineKeyboardButton.WithCallbackData(a.Label, $"{a.ActionKey}:{a.SessionId}")) .ToArray(); if (actionRow.Length > 0) buttons.Add(actionRow); } } return (messageText, new InlineKeyboardMarkup(buttons)); } private static string FormatDuration(int minutes) { if (minutes <= 0) return "0 ΠΌΠΈΠ½"; var hours = minutes / 60; var mins = minutes % 60; if (hours > 0 && mins > 0) return $"{hours} Ρ‡ {mins} ΠΌΠΈΠ½"; if (hours > 0) return $"{hours} Ρ‡"; return $"{mins} ΠΌΠΈΠ½"; } }