Files
2026-10-14 06:59:51 +02:00

57 lines
2.2 KiB
C#

using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Campus_live_rewrite.api.server;
using Campus_live_rewrite.api.server.Classes.db_class;
namespace Campus_live_rewrite.Controllers
{
/// <summary>Website Settings > Do not disturb (see DoNotDisturb). Website session only (campus_site cookie).</summary>
[Route("api/site/dnd")]
public class SiteDndController : ControllerBase
{
private player_info? CurrentUser()
{
string token = Request.Cookies["campus_site"] ?? "";
if (string.IsNullOrEmpty(token)) return null;
string data = ClientSecurity.DecodeToken(token, requireSurface: "website");
if (string.IsNullOrEmpty(data) || data.StartsWith("error_")) return null;
try { return JsonConvert.DeserializeObject<player_info>(data); } catch { return null; }
}
public class DndBody { public int minutes { get; set; } }
private static object State(ulong id)
{
var until = DoNotDisturb.Until(id);
return new
{
ok = true,
active = until != null,
until,
minutesLeft = until == null ? 0 : (int)Math.Ceiling((until.Value - DateTime.UtcNow).TotalMinutes),
maxMinutes = DoNotDisturb.MaxMinutes
};
}
[HttpGet("")]
public IActionResult Get()
{
var me = CurrentUser();
if (me == null) return Unauthorized(new { ok = false, error = "not signed in" });
return Ok(State(me.Id));
}
// POST /api/site/dnd {minutes} - minutes > 0 turns it on for that long (capped at 24 h), 0 turns it off
[HttpPost("")]
public IActionResult Set([FromBody] DndBody? body)
{
var me = CurrentUser();
if (me == null) return Unauthorized(new { ok = false, error = "not signed in" });
if (body == null || body.minutes < 0) return BadRequest(new { ok = false, error = "invalid time" });
var until = DoNotDisturb.Set(me.Id, body.minutes);
Console.WriteLine($"[dnd] {me.Id} {(until == null ? "turned Do Not Disturb off" : $"on until {until:HH:mm}Z")}");
return Ok(State(me.Id));
}
}
}