430 lines
14 KiB
C#
430 lines
14 KiB
C#
using System.Text.Json;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
namespace asdfasdf.APIs;
|
|
|
|
public static class Matchmaking
|
|
{
|
|
public static RoomInstance currentInstance = null;
|
|
|
|
private static string region = "us";
|
|
private static int currentStatusVisibility = 0;
|
|
private static DateTime lastOnline = DateTime.UtcNow;
|
|
|
|
public static void Init(WebApplication app)
|
|
{
|
|
if (File.Exists("ServerData/LastHeartbeat.json"))
|
|
{
|
|
currentInstance = JsonSerializer.Deserialize<Heartbeat>(File.ReadAllText("ServerData/LastHeartbeat.json")).roomInstance;
|
|
}
|
|
|
|
if (File.Exists("ServerData/LastPhotonRegion"))
|
|
{
|
|
region = File.ReadAllText("ServerData/LastPhotonRegion");
|
|
}
|
|
|
|
app.MapPost("/player/login", () =>
|
|
{
|
|
return Results.Ok();
|
|
});
|
|
|
|
app.MapPost("/player/logout", (HttpRequest request) =>
|
|
{
|
|
for (int i = 0; i < Auth.currentUsers.Count; i++)
|
|
{
|
|
if (Auth.currentUsers[i].token == request.Headers.Authorization[0])
|
|
{
|
|
Auth.currentUsers.RemoveAt(i);
|
|
break;
|
|
}
|
|
}
|
|
|
|
return Results.Ok();
|
|
});
|
|
|
|
app.MapGet("/player/qos", () =>
|
|
{
|
|
app.Logger.LogWarning("(Matchmaking) /player/qos STUB");
|
|
|
|
List<QosEndpoint> qosEndpoints = new();
|
|
|
|
QosEndpoint qos = new()
|
|
{
|
|
Id = "stub",
|
|
Address = "127.0.0.1"
|
|
};
|
|
|
|
qosEndpoints.Add(qos);
|
|
|
|
return qosEndpoints;
|
|
});
|
|
|
|
app.MapPost("/player/heartbeat", (HttpRequest request) =>
|
|
{
|
|
foreach (var user in Auth.currentUsers)
|
|
{
|
|
if (user.token == request.Headers.Authorization[0])
|
|
{
|
|
return user.heartbeat;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
});
|
|
|
|
app.MapPut("/player/statusvisibility", ([FromForm] string statusVisibility, HttpRequest request) =>
|
|
{
|
|
foreach (var user in Auth.currentUsers)
|
|
{
|
|
if (user.token == request.Headers.Authorization[0])
|
|
{
|
|
user.currentStatusVisibility = int.Parse(statusVisibility);
|
|
}
|
|
}
|
|
|
|
return Results.Ok();
|
|
}).DisableAntiforgery();
|
|
|
|
app.MapGet("/player", (string id) =>
|
|
{
|
|
List<Heartbeat> players = new();
|
|
|
|
foreach (var user in Auth.currentUsers)
|
|
{
|
|
if (user.id == int.Parse(id))
|
|
{
|
|
players.Add(user.heartbeat);
|
|
}
|
|
}
|
|
|
|
return players;
|
|
});
|
|
|
|
app.MapPost("/player/exclusivelogin", () =>
|
|
{
|
|
var response = new
|
|
{
|
|
errorCode = 0
|
|
};
|
|
|
|
return response;
|
|
});
|
|
|
|
// Can't get the in (India?) param because of c# being c#
|
|
app.MapPut("/player/photonregionpings", ([FromForm] int ussc, [FromForm] int us, [FromForm] int cae, [FromForm] int usw, [FromForm] int eu, [FromForm] int sa, [FromForm] int ru, [FromForm] int tr, [FromForm] int jp, [FromForm] int rue, [FromForm] int au, [FromForm] int hk, [FromForm] int asia, [FromForm] int za, [FromForm] int kr, [FromForm] int uae) =>
|
|
{
|
|
List<RegionPing> regionPings = new();
|
|
|
|
regionPings.Add(new("ussc", ussc));
|
|
regionPings.Add(new("us", us));
|
|
regionPings.Add(new("cae", cae));
|
|
regionPings.Add(new("usw", usw));
|
|
regionPings.Add(new("eu", eu));
|
|
regionPings.Add(new("sa", sa));
|
|
regionPings.Add(new("ru", ru));
|
|
regionPings.Add(new("tr", tr));
|
|
regionPings.Add(new("jp", jp));
|
|
regionPings.Add(new("rue", rue));
|
|
regionPings.Add(new("au", au));
|
|
regionPings.Add(new("hk", hk));
|
|
regionPings.Add(new("asia", asia));
|
|
regionPings.Add(new("za", za));
|
|
regionPings.Add(new("kr", kr));
|
|
regionPings.Add(new("uae", uae));
|
|
|
|
RegionPing[] regionLowestPing = regionPings.Where((x) => x.Ping == regionPings.Min(y => y.Ping)).ToArray();
|
|
|
|
region = regionLowestPing[0].Name;
|
|
|
|
return Results.Ok();
|
|
}).DisableAntiforgery();
|
|
|
|
app.MapPost("/matchmake/none", () =>
|
|
{
|
|
return Results.NotFound();
|
|
});
|
|
|
|
app.MapPost("/matchmake/dorm", (HttpRequest request) =>
|
|
{
|
|
long instanceId = Random.Shared.Next(1000, 999999999);
|
|
|
|
foreach (var user in Auth.currentUsers)
|
|
{
|
|
if (user.token == request.Headers.Authorization[0])
|
|
{
|
|
currentInstance = new()
|
|
{
|
|
isPrivate = true,
|
|
location = "76d98498-60a1-430c-ab76-b54a29b7a163",
|
|
maxCapacity = 4,
|
|
name = "@" + user.account.username + "'s" + " DormRoom",
|
|
photonRegion = region,
|
|
photonRegionId = region,
|
|
photonRoomId = "Dorm-" + instanceId + "-room",
|
|
roomId = -1,
|
|
roomInstanceId = instanceId,
|
|
subRoomId = -1
|
|
};
|
|
|
|
user.currentInstance = currentInstance;
|
|
|
|
user.UpdateHeartbeat();
|
|
|
|
return Results.Ok(user.heartbeat);
|
|
}
|
|
}
|
|
|
|
return Results.NotFound();
|
|
});
|
|
|
|
app.MapPost("/matchmake/room/{id}", (HttpRequest request, long id, [FromQuery] long? subRoomId = null) =>
|
|
{
|
|
long instanceId;
|
|
string region;
|
|
if (!string.IsNullOrEmpty(ServerConfig.config.PhotonInstanceId))
|
|
{
|
|
instanceId = long.Parse(ServerConfig.config.PhotonInstanceId);
|
|
}
|
|
else
|
|
{
|
|
instanceId = Random.Shared.Next(1000, 999999999);
|
|
}
|
|
if (!string.IsNullOrEmpty(ServerConfig.config.PhotonRegion))
|
|
{
|
|
region = ServerConfig.config.PhotonRegion;
|
|
}
|
|
else
|
|
{
|
|
region = Matchmaking.region;
|
|
}
|
|
|
|
foreach (var user in Auth.currentUsers)
|
|
{
|
|
if (user.currentInstance != null)
|
|
{
|
|
if (user.currentInstance.roomId == id)
|
|
{
|
|
instanceId = user.currentInstance.roomInstanceId;
|
|
region = user.currentInstance.photonRegion;
|
|
}
|
|
}
|
|
}
|
|
|
|
string path = "ServerData/Rooms/" + id + "/info.json";
|
|
|
|
Room room = null;
|
|
|
|
for (int i = 0; i < Rooms.roomNamesToIds.names.Count; i++)
|
|
{
|
|
if (Rooms.roomNamesToIds.names[i].id == id)
|
|
{
|
|
room = JsonSerializer.Deserialize<Room>(File.ReadAllText("ServerData/Rooms/" + Rooms.roomNamesToIds.names[i].name + "/info.json"));
|
|
}
|
|
}
|
|
|
|
if (room == null)
|
|
{
|
|
return Results.NotFound();
|
|
}
|
|
|
|
SubRooms subRoom;
|
|
|
|
if (subRoomId != null)
|
|
{
|
|
subRoom = room.SubRooms.FirstOrDefault(s => s.SubRoomId == subRoomId.Value);
|
|
}
|
|
else
|
|
{
|
|
subRoom = room.SubRooms?.FirstOrDefault();
|
|
}
|
|
|
|
foreach (var user in Auth.currentUsers)
|
|
{
|
|
if (user.token == request.Headers.Authorization[0])
|
|
{
|
|
currentInstance = new()
|
|
{
|
|
name = "^" + room.Name,
|
|
isPrivate = false,
|
|
location = subRoom.UnitySceneId,
|
|
maxCapacity = subRoom.MaxPlayers,
|
|
photonRegion = region,
|
|
photonRegionId = region,
|
|
photonRoomId = "Room-" + room.Name + "-room",
|
|
roomId = room.RoomId,
|
|
roomInstanceId = instanceId,
|
|
subRoomId = subRoom.SubRoomId
|
|
};
|
|
|
|
user.currentInstance = currentInstance;
|
|
|
|
user.UpdateHeartbeat();
|
|
|
|
return Results.Ok(user.heartbeat);
|
|
}
|
|
}
|
|
|
|
return Results.NotFound();
|
|
});
|
|
|
|
app.MapPost("/matchmake/room/{roomId}/{subRoomId}", (long roomId, long subRoomId, HttpRequest request) =>
|
|
{
|
|
long instanceId;
|
|
string region;
|
|
if (!string.IsNullOrEmpty(ServerConfig.config.PhotonInstanceId))
|
|
{
|
|
instanceId = long.Parse(ServerConfig.config.PhotonInstanceId);
|
|
}
|
|
else
|
|
{
|
|
instanceId = Random.Shared.Next(1000, 999999999);
|
|
}
|
|
if (!string.IsNullOrEmpty(ServerConfig.config.PhotonRegion))
|
|
{
|
|
region = ServerConfig.config.PhotonRegion;
|
|
}
|
|
else
|
|
{
|
|
region = Matchmaking.region;
|
|
}
|
|
|
|
foreach (var user in Auth.currentUsers)
|
|
{
|
|
if (user.currentInstance != null)
|
|
{
|
|
if (user.currentInstance.roomId == roomId)
|
|
{
|
|
instanceId = user.currentInstance.roomInstanceId;
|
|
region = user.currentInstance.photonRegion;
|
|
}
|
|
}
|
|
}
|
|
|
|
string path = "ServerData/Rooms/" + roomId + "/info.json";
|
|
|
|
Room room = null;
|
|
|
|
for (int i = 0; i < Rooms.roomNamesToIds.names.Count; i++)
|
|
{
|
|
if (Rooms.roomNamesToIds.names[i].id == roomId)
|
|
{
|
|
room = JsonSerializer.Deserialize<Room>(File.ReadAllText("ServerData/Rooms/" + Rooms.roomNamesToIds.names[i].name + "/info.json"));
|
|
}
|
|
}
|
|
|
|
if (room == null)
|
|
{
|
|
return Results.NotFound();
|
|
}
|
|
|
|
SubRooms subRoom;
|
|
|
|
if (subRoomId != null)
|
|
{
|
|
subRoom = room.SubRooms.FirstOrDefault(s => s.SubRoomId == subRoomId);
|
|
}
|
|
else
|
|
{
|
|
subRoom = room.SubRooms?.FirstOrDefault();
|
|
}
|
|
|
|
foreach (var user in Auth.currentUsers)
|
|
{
|
|
if (user.token == request.Headers.Authorization[0])
|
|
{
|
|
currentInstance = new()
|
|
{
|
|
name = "^" + room.Name,
|
|
isPrivate = false,
|
|
location = subRoom.UnitySceneId,
|
|
maxCapacity = subRoom.MaxPlayers,
|
|
photonRegion = region,
|
|
photonRegionId = region,
|
|
photonRoomId = "Room-" + room.Name + "-room",
|
|
roomId = room.RoomId,
|
|
roomInstanceId = instanceId,
|
|
subRoomId = subRoom.SubRoomId
|
|
};
|
|
|
|
user.currentInstance = currentInstance;
|
|
|
|
user.UpdateHeartbeat();
|
|
|
|
return Results.Ok(user.heartbeat);
|
|
}
|
|
}
|
|
|
|
return Results.NotFound();
|
|
});
|
|
|
|
// 2020 cv2 update
|
|
app.MapPost("/goto/room/{roomName}", (string roomName, HttpRequest request) =>
|
|
{
|
|
long instanceId = Random.Shared.Next(1000, 999999999);
|
|
|
|
foreach (var user in Auth.currentUsers)
|
|
{
|
|
if (user.token == request.Headers.Authorization[0])
|
|
{
|
|
currentInstance = new()
|
|
{
|
|
isPrivate = true,
|
|
location = "76d98498-60a1-430c-ab76-b54a29b7a163",
|
|
maxCapacity = 4,
|
|
name = "@" + user.account.username + "'s" + " DormRoom",
|
|
photonRegion = region,
|
|
photonRegionId = region,
|
|
photonRoomId = "Dorm-" + instanceId + "-room",
|
|
roomId = -1,
|
|
roomInstanceId = instanceId,
|
|
subRoomId = -1
|
|
};
|
|
|
|
user.currentInstance = currentInstance;
|
|
|
|
user.UpdateHeartbeat();
|
|
|
|
return Results.Ok(user.heartbeat);
|
|
}
|
|
}
|
|
|
|
return Results.NotFound();
|
|
});
|
|
|
|
app.MapGet("/player/avoidjuniors", () =>
|
|
{
|
|
return bool.Parse(File.ReadAllText("ServerData/Accounts/2/avoidjuniors"));
|
|
});
|
|
|
|
app.MapPut("/player/avoidjuniors", ([FromForm] bool avoidJuniors, HttpRequest request) =>
|
|
{
|
|
foreach (var user in Auth.currentUsers)
|
|
{
|
|
if (user.token == request.Headers.Authorization[0])
|
|
{
|
|
File.WriteAllText("ServerData/Accounts/" + user.id + "/avoidjuniors", avoidJuniors.ToString());
|
|
|
|
return Results.Ok();
|
|
}
|
|
}
|
|
|
|
return Results.NotFound();
|
|
|
|
}).DisableAntiforgery();
|
|
|
|
app.MapGet("/rooms/requiring/rrplus", () =>
|
|
{
|
|
return "[]";
|
|
});
|
|
|
|
app.MapGet("/rooms/requiring/developer", () =>
|
|
{
|
|
return "[]";
|
|
});
|
|
|
|
app.MapPost("/roominstance/{instance}/reportjoinresult", () =>
|
|
{
|
|
return Results.Ok();
|
|
});
|
|
}
|
|
} |