feat: implement Blazor web interface for GM session management
Deploy Telegram Bot / deploy (push) Has been cancelled

- Created GmRelay.Web project (Blazor Server)
- Created GmRelay.Shared library for domain models and rendering
- Refactored GmRelay.Bot to use the Shared library
- Integrated Telegram Login widget with server-side HMAC verification
- Added Dashboard, Group Details, and Edit Session pages
- Enabled bot notifications and in-place message updates from web actions
- Updated .NET Aspire orchestration and Docker Compose configuration
This commit is contained in:
2026-04-17 11:06:59 +03:00
parent c27456e726
commit 988133e389
93 changed files with 61016 additions and 34 deletions
+34
View File
@@ -0,0 +1,34 @@
namespace GmRelay.Shared.Domain;
public static class MoscowTime
{
private static readonly TimeSpan MoscowOffset = TimeSpan.FromHours(3);
public static DateTimeOffset Now => DateTimeOffset.UtcNow.ToOffset(MoscowOffset);
public static DateTimeOffset ToMoscow(this DateTimeOffset utc) => utc.ToOffset(MoscowOffset);
public static string FormatMoscow(this DateTimeOffset utc)
=> utc.ToOffset(MoscowOffset).ToString("d MMMM yyyy, HH:mm", System.Globalization.CultureInfo.GetCultureInfo("ru-RU"));
public static DateTime ToMoscow(this DateTime utcDt) => utcDt.Add(MoscowOffset);
public static string FormatMoscow(this DateTime utcDt)
=> utcDt.Add(MoscowOffset).ToString("d MMMM yyyy, HH:mm", System.Globalization.CultureInfo.GetCultureInfo("ru-RU"));
public static string FormatMoscowShort(this DateTime utcDt)
=> utcDt.Add(MoscowOffset).ToString("dd.MM");
public static bool TryParseMoscow(string text, out DateTimeOffset utcTime)
{
if (DateTime.TryParseExact(text, new[] { "dd.MM.yyyy HH:mm", "dd.MM.yyyy H:mm", "d.MM.yyyy HH:mm" },
System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out var localDt))
{
utcTime = new DateTimeOffset(localDt, MoscowOffset).ToUniversalTime();
return true;
}
utcTime = default;
return false;
}
}