108 lines
4.6 KiB
C#
108 lines
4.6 KiB
C#
// 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 = $"🎲 <b>Новые игры:</b> {System.Net.WebUtility.HtmlEncode(view.Title)}\n\n" +
|
||
$"<b>Расписание:</b>\n\n";
|
||
|
||
var buttons = new List<InlineKeyboardButton[]>();
|
||
|
||
foreach (var session in view.Sessions)
|
||
{
|
||
messageText += $"📅 <b>{session.ScheduledAt.FormatMoscow()}</b>\n";
|
||
|
||
var tags = new List<string>();
|
||
if (!string.IsNullOrWhiteSpace(session.System))
|
||
tags.Add($"<b>Система:</b> {System.Net.WebUtility.HtmlEncode(session.System)}");
|
||
if (!string.IsNullOrWhiteSpace(session.Format))
|
||
tags.Add($"<b>Формат:</b> {System.Net.WebUtility.HtmlEncode(session.Format)}");
|
||
tags.Add($"<b>Тип:</b> {(session.IsOneShot ? "One-shot" : "Кампания")}");
|
||
|
||
if (tags.Count > 0)
|
||
{
|
||
messageText += "🏷 " + string.Join(" · ", tags) + "\n";
|
||
}
|
||
|
||
if (session.DurationMinutes.HasValue)
|
||
{
|
||
messageText += $"⏱ <b>Длительность:</b> {FormatDuration(session.DurationMinutes.Value)}\n";
|
||
}
|
||
|
||
if (!string.IsNullOrWhiteSpace(session.Description))
|
||
{
|
||
messageText += $"📝 <b>Описание:</b>\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 += $"🔗 <b>Ссылка:</b> <a href=\"{encodedLink}\">{encodedLink}</a>\n";
|
||
}
|
||
|
||
if ((isOffline || isHybrid) && !string.IsNullOrWhiteSpace(session.LocationAddress))
|
||
{
|
||
messageText += $"📍 <b>Адрес:</b> {System.Net.WebUtility.HtmlEncode(session.LocationAddress)}\n";
|
||
}
|
||
|
||
messageText += session.MaxPlayers.HasValue
|
||
? $"👥 <b>Места:</b> {session.ActivePlayerCount}/{session.MaxPlayers.Value}\n"
|
||
: $"👥 <b>Игроки ({session.ActivePlayerCount}):</b>\n";
|
||
|
||
if (session.ActivePlayers.Count > 0)
|
||
{
|
||
messageText += string.Join("\n", session.ActivePlayers.Select(p =>
|
||
$" 👤 {(p.TelegramUsername != null ? "@" + p.TelegramUsername : p.DisplayName)}")) + "\n";
|
||
}
|
||
else
|
||
{
|
||
messageText += " <i>Пока никто не записался</i>\n";
|
||
}
|
||
|
||
if (session.WaitlistedPlayers.Count > 0)
|
||
{
|
||
messageText += $"⏳ <b>Лист ожидания ({session.WaitlistedPlayers.Count}):</b>\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 += "❌ <i>Сессия отменена</i>\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} мин";
|
||
}
|
||
}
|