Files
2026-10-16 23:33:13 -07:00

82 lines
2.2 KiB
C#

using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using RadicadeServer.DB;
using RadicadeServer.Extensions;
using RadicadeServer.RecNet.Enums.Players;
using RadicadeServer.RecNet.Notifications;
namespace RadicadeServer.API
{
[Route("api/announcement")]
public class AnnouncementAPI : Controller
{
RecDBContext db;
public AnnouncementAPI(RecDBContext context)
{
this.db = context;
}
[HttpGet("v1/get")]
public List<Announcement>? GetAnnouncement()
{
var config = db.ServerConfig.FirstOrDefault(x => x.Key == "Announcement");
if (config == null || string.IsNullOrWhiteSpace(config.Value) || config.Value == "[]")
return new List<Announcement>();
try
{
var announcements = config.Value.FromJson<List<Announcement>>() ?? new List<Announcement>();
var raw = System.Text.Json.JsonDocument.Parse(config.Value);
if (raw.RootElement.ValueKind == System.Text.Json.JsonValueKind.Array)
{
var now = DateTime.UtcNow;
var keep = new List<Announcement>();
int i = 0;
foreach (var element in raw.RootElement.EnumerateArray())
{
var ann = i < announcements.Count ? announcements[i] : null;
if (ann != null)
{
if (element.TryGetProperty("type", out var typeProp) && typeProp.ValueKind == System.Text.Json.JsonValueKind.String &&
string.Equals(typeProp.GetString(), "Game Update", StringComparison.OrdinalIgnoreCase))
{
i++;
continue;
}
string? expiresAt = null;
if (element.TryGetProperty("expires_at", out var exp) && exp.ValueKind == System.Text.Json.JsonValueKind.String)
expiresAt = exp.GetString();
if (string.IsNullOrEmpty(expiresAt) || !DateTime.TryParse(expiresAt, out var expiry) || expiry > now)
keep.Add(ann);
}
i++;
}
announcements = keep;
}
announcements = announcements.OrderByDescending(x => x.CreatedAt).ToList();
foreach (var ann in announcements)
{
ann.IsMostRecent = false;
ann.Platform = Platforms.All;
}
if (announcements.Count > 0)
announcements[0].IsMostRecent = true;
return announcements;
}
catch
{
return new List<Announcement>();
}
}
}
}