// NOTE: duplicated in GmRelay.Web/Services/TelegramSessionBatchRenderer.cs
using GmRelay.Shared.Domain;
using GmRelay.Shared.Rendering;
using Telegram.Bot.Types.ReplyMarkups;
namespace GmRelay.Bot.Infrastructure.Telegram;
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} ΠΌΠΈΠ½";
}
}