121 lines
3.9 KiB
C#
121 lines
3.9 KiB
C#
using DysonNetwork.Shared.Models;
|
|
using DysonNetwork.Shared.Proto;
|
|
using DysonNetwork.Shared.Registry;
|
|
using DysonNetwork.Zone.Publication;
|
|
// Add this using statement
|
|
using Microsoft.AspNetCore.Mvc.RazorPages;
|
|
using NodaTime;
|
|
|
|
namespace DysonNetwork.Zone.Pages;
|
|
|
|
public class IndexModel(
|
|
PostService.PostServiceClient postClient,
|
|
RemotePublisherService rps,
|
|
RemoteAccountService ras,
|
|
MarkdownConverter markdownConverter // Inject MarkdownConverter
|
|
) : PageModel
|
|
{
|
|
private readonly MarkdownConverter _markdownConverter = markdownConverter; // Store the injected service
|
|
public SnPublicationSite? Site { get; set; }
|
|
public SnPublisher? Publisher { get; set; }
|
|
public Account? UserAccount { get; set; }
|
|
public List<SnPost> FeaturedPosts { get; set; } = [];
|
|
|
|
public string? UserPictureUrl =>
|
|
UserAccount?.Profile?.Picture?.Id != null
|
|
? $"/drive/files/{UserAccount.Profile.Picture.Id}"
|
|
: null;
|
|
|
|
public string? UserBackgroundUrl =>
|
|
UserAccount?.Profile?.Background?.Id != null
|
|
? $"/drive/files/{UserAccount.Profile.Background.Id}?original=true"
|
|
: null;
|
|
|
|
public async Task OnGetAsync()
|
|
{
|
|
Site = HttpContext.Items[PublicationSiteMiddleware.SiteContextKey] as SnPublicationSite;
|
|
|
|
if (Site != null)
|
|
{
|
|
// Fetch Publisher Information
|
|
Publisher = await rps.GetPublisher(id: Site!.PublisherId.ToString());
|
|
|
|
// Fetch User Account Information if available
|
|
UserAccount = await ras.GetAccount(Site.AccountId);
|
|
|
|
// Fetch Featured Posts (e.g., top 5 by views)
|
|
var request = new ListPostsRequest
|
|
{
|
|
OrderBy = "popularity",
|
|
OrderDesc = true,
|
|
PageSize = 5,
|
|
PublisherId = Site!.PublisherId.ToString(),
|
|
};
|
|
|
|
var response = await postClient.ListPostsAsync(request);
|
|
|
|
if (response?.Posts != null)
|
|
{
|
|
FeaturedPosts = response.Posts.Select(SnPost.FromProtoValue).ToList();
|
|
|
|
// Convert the markdown content to HTML
|
|
foreach (
|
|
var post in FeaturedPosts.Where(post => !string.IsNullOrEmpty(post.Content))
|
|
)
|
|
post.Content = _markdownConverter.ToHtml(post.Content!);
|
|
}
|
|
}
|
|
}
|
|
|
|
public int CalculateAge(Instant birthday)
|
|
{
|
|
var birthDate = birthday.ToDateTimeOffset();
|
|
var today = DateTimeOffset.Now;
|
|
var age = today.Year - birthDate.Year;
|
|
if (birthDate > today.AddYears(-age))
|
|
age--;
|
|
return age;
|
|
}
|
|
|
|
public string GetOffsetUtcString(string targetTimeZone)
|
|
{
|
|
try
|
|
{
|
|
var tz = TimeZoneInfo.FindSystemTimeZoneById(targetTimeZone);
|
|
var offset = tz.GetUtcOffset(DateTimeOffset.Now);
|
|
var sign = offset >= TimeSpan.Zero ? "+" : "-";
|
|
return $"{Math.Abs(offset.Hours):D2}:{Math.Abs(offset.Minutes):D2}";
|
|
}
|
|
catch
|
|
{
|
|
return "00:00";
|
|
}
|
|
}
|
|
|
|
public string GetCurrentTimeInTimeZone(string targetTimeZone)
|
|
{
|
|
try
|
|
{
|
|
var tz = TimeZoneInfo.FindSystemTimeZoneById(targetTimeZone);
|
|
var now = TimeZoneInfo.ConvertTime(DateTimeOffset.Now, tz);
|
|
return now.ToString("t", System.Globalization.CultureInfo.InvariantCulture);
|
|
}
|
|
catch
|
|
{
|
|
return DateTime.Now.ToString("t", System.Globalization.CultureInfo.InvariantCulture);
|
|
}
|
|
}
|
|
|
|
public (string Name, string Color) GetPerkInfo(string identifier)
|
|
{
|
|
return identifier switch
|
|
{
|
|
"solian.stellar.primary" => ("Stellar", "#2196f3"),
|
|
"solian.stellar.nova" => ("Nova", "#39c5bb"),
|
|
"solian.stellar.supernova" => ("Supernova", "#ffc109"),
|
|
_ => ("Unknown", "#2196f3"),
|
|
};
|
|
}
|
|
}
|
|
|