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

53 lines
2.6 KiB
C#

using Microsoft.AspNetCore.Mvc;
using Campus_live_rewrite.api.dbs;
using Campus_live_rewrite.api.server;
namespace Campus_live_rewrite.Controllers
{
/// <summary>
/// CampusNet's stuck-load report (CampusNet Services/StuckLoad.cs): a player joined a Photon
/// room and after 90 s has neither streamed a transform nor asked the master client for the
/// room - they are on the loading screen for good (25%, "Waiting to receive buffered
/// message"). The instance is marked broken, so matchmaking stops putting anyone new in it
/// (HeartbeatDB.IsInstanceBroken), and the player is moved out of it (the same frame a room
/// kick sends, presence rewritten to their dorm) with a message saying why, instead of
/// loading forever. Local callers only, like /photon/placement.
/// </summary>
public class StuckLoadController : ControllerBase
{
[HttpPost("/photon/stuckload")]
public IActionResult Report()
{
var ip = HttpContext.Connection.RemoteIpAddress;
bool local = ip != null && System.Net.IPAddress.IsLoopback(ip)
&& string.IsNullOrEmpty(Request.Headers["X-Forwarded-For"].ToString());
if (!local) return NotFound();
string id = "", room = "", secs = "";
try
{
if (Request.HasFormContentType)
{
id = Request.Form["id"].ToString();
room = Request.Form["room"].ToString();
secs = Request.Form["seconds"].ToString();
}
}
catch { }
if (!ulong.TryParse(id, out var playerId)) return Content("ok", "text/plain");
var inst = HeartbeatDB.FindInstanceByPhotonName(room);
if (inst != null && !HeartbeatDB.IsInstanceBroken(inst))
{
HeartbeatDB.MarkInstanceBroken(inst.roomInstanceId);
Console.WriteLine($"[stuck-load] instance {inst.roomInstanceId} of room {inst.roomId} ('{room}') marked broken - no new players will be matchmade into it for {HeartbeatDB.BrokenInstanceWindow.TotalMinutes:0} min");
}
Console.WriteLine($"[stuck-load] {playerId} stuck loading '{room}' for {secs}s - moving them out");
RoomModeration.RemoveFromRoom(playerId, (ulong)(inst?.roomId ?? 0), inst?.roomInstanceId ?? 0,
"That room instance didn't finish loading, so you've been moved out of it. Join again to get a fresh instance.",
0, false, false);
return Content("ok", "text/plain");
}
}
}