Files
Raidenxd2 255b572a6f first
2026-08-07 04:45:59 -04:00

618 lines
20 KiB
C#

using System.Text.Json;
using Microsoft.AspNetCore.Mvc;
namespace asdfasdf.APIs;
public static class Rooms
{
public static NameToIds roomNamesToIds;
private static void UpdateRoomNamesToIds()
{
NameToIds newRoomNamesToIds = new();
newRoomNamesToIds.names = new();
string[] dirs = Directory.GetDirectories("ServerData/Rooms");
newRoomNamesToIds.count = dirs.Length;
foreach (var room in dirs)
{
Room roomJson = JsonSerializer.Deserialize<Room>(File.ReadAllText(room + "/info.json"));
newRoomNamesToIds.names.Add(new()
{
id = roomJson.RoomId,
name = roomJson.Name
});
}
File.WriteAllText("ServerData/RoomNamesToIds.json", JsonSerializer.Serialize(newRoomNamesToIds));
}
public static void Init(WebApplication app)
{
if (!File.Exists("ServerData/RoomNamesToIds.json"))
{
UpdateRoomNamesToIds();
}
roomNamesToIds = JsonSerializer.Deserialize<NameToIds>(File.ReadAllText("ServerData/RoomNamesToIds.json"));
if (roomNamesToIds.count != Directory.GetDirectories("ServerData/Rooms").Length)
{
UpdateRoomNamesToIds();
}
app.MapGet("/rooms/ownedby/me", () =>
{
List<RoomDTO> ownedRooms = new();
DirectoryInfo roomsDir = new("ServerData/Rooms");
foreach (DirectoryInfo roomDir in roomsDir.EnumerateDirectories())
{
RoomDTO room = JsonSerializer.Deserialize<RoomDTO>(File.ReadAllText(roomDir.FullName + "/info.json"));
ownedRooms.Add(room);
}
return ownedRooms;
});
app.MapGet("/rooms/createdby/me", () =>
{
List<RoomDTO> ownedRooms = new();
DirectoryInfo roomsDir = new("ServerData/Rooms");
foreach (DirectoryInfo roomDir in roomsDir.EnumerateDirectories())
{
RoomDTO room = JsonSerializer.Deserialize<RoomDTO>(File.ReadAllText(roomDir.FullName + "/info.json"));
ownedRooms.Add(room);
}
return ownedRooms;
});
app.MapGet("/rooms/visitedby/me", (int skip, int take) =>
{
List<RoomDTO> ownedRooms = new();
DirectoryInfo roomsDir = new("ServerData/Rooms");
foreach (DirectoryInfo roomDir in roomsDir.EnumerateDirectories())
{
RoomDTO room = JsonSerializer.Deserialize<RoomDTO>(File.ReadAllText(roomDir.FullName + "/info.json"));
ownedRooms.Add(room);
}
return ownedRooms;
});
app.MapPost("/rooms/create", async (HttpRequest request) =>
{
var a = await request.ReadFormAsync();
var name = a.ElementAt(0);
var ugcVersion = a.ElementAt(1);
app.Logger.LogWarning($"(Rooms) /rooms/create STUB\n{name}\n{ugcVersion}");
RoomDTO room = new()
{
Name = name.Value,
UgcVersion = byte.Parse(ugcVersion.Value),
CreatedAt = DateTime.Now
};
CreateFolder("ServerData/Rooms/" + name.Value);
File.WriteAllText("ServerData/Rooms/" + name.Value + "/info.json", JsonSerializer.Serialize(room));
return Results.Created("/rooms/create", room);
});
app.MapPost("/rooms/{id}/clone", (int id, [FromForm] string name, HttpRequest request) =>
{
LoggedInUser user = null;
foreach (var user2 in Auth.currentUsers)
{
if (user2.token == request.Headers.Authorization[0])
{
user = user2;
}
}
if (user == null)
{
return Results.NotFound();
}
Room room = null;
for (int i = 0; i < roomNamesToIds.names.Count; i++)
{
if (roomNamesToIds.names[i].id == id)
{
room = JsonSerializer.Deserialize<Room>(File.ReadAllText("ServerData/Rooms/" + roomNamesToIds.names[i].name + "/info.json"));
}
}
for (int i = 0; i < roomNamesToIds.names.Count; i++)
{
if (roomNamesToIds.names[i].name == name)
{
ApiResponse alreadyExistsResponse = new()
{
success = false,
error = "The room " + roomNamesToIds.names[i].name + " already exists."
};
return Results.Ok(alreadyExistsResponse);
}
}
if (room == null)
{
return Results.NotFound();
}
List<Tags> tags = new();
tags.Add(new("beta", 1));
tags.Add(new("community", 2));
tags.Add(new("screen", 2));
tags.Add(new("walkvr", 2));
tags.Add(new("teleportvr", 2));
tags.Add(new("junior", 2));
tags.Add(new("pickout", 2));
room.Name = name;
room.RoomId = roomNamesToIds.count + 5;
room.SubRooms[0].RoomId = room.RoomId;
room.SubRooms[0].SubRoomId = 0;
room.SubRooms[0].CreatorAccountId = user.id;
room.Tags = tags;
room.ImageName = "lemres.png";
room.CreatorAccountId = user.id;
room.Roles[1].AccountId = user.id;
Directory.CreateDirectory("ServerData/Rooms/" + name);
File.WriteAllText("ServerData/Rooms/" + name + "/info.json", JsonSerializer.Serialize(room));
UpdateRoomNamesToIds();
roomNamesToIds = JsonSerializer.Deserialize<NameToIds>(File.ReadAllText("ServerData/RoomNamesToIds.json"));
ApiResponse response = new()
{
success = true,
error = string.Empty,
value = room
};
return Results.Ok(response);
}).DisableAntiforgery();
app.MapGet("/rooms", (string name, int include) =>
{
if (!Directory.Exists("ServerData/Rooms/" + name))
{
// return Results.NotFound();
}
return File.ReadAllText("ServerData/Rooms/" + name + "/info.json");
});
app.MapGet("/rooms/bulk", (string name, bool? excludePrivateRooms) =>
{
if (!Directory.Exists("ServerData/Rooms/" + name))
{
return Results.NotFound();
}
List<Room> rooms = new();
rooms.Add(JsonSerializer.Deserialize<Room>(File.ReadAllText("ServerData/Rooms/" + name + "/info.json")));
return Results.Ok(rooms);
});
app.MapGet("/rooms/{id}", (int id, int include) =>
{
if (Directory.Exists("ServerData/Rooms/" + id))
{
return Results.Ok(JsonSerializer.Deserialize<Room>(File.ReadAllText("ServerData/Rooms/" + id + "/info.json")));
}
for (int i = 0; i < roomNamesToIds.names.Count; i++)
{
if (roomNamesToIds.names[i].id == id)
{
return Results.Ok(JsonSerializer.Deserialize<Room>(File.ReadAllText("ServerData/Rooms/" + roomNamesToIds.names[i].name + "/info.json")));
}
}
return Results.NotFound();
});
app.MapGet("/rooms/hot", (int skip, int take) =>
{
app.Logger.LogWarning("(Rooms) /rooms/hot STUB");
List<Room> rooms = new();
rooms.Add(JsonSerializer.Deserialize<Room>(File.ReadAllText("ServerData/Rooms/RecCenter/info.json")));
var pagedRooms = new
{
Results = rooms,
TotalResults = 1
};
return pagedRooms;
});
app.MapGet("/rooms/{id}/interactionby/me", () =>
{
app.Logger.LogWarning("(Rooms) /rooms/{{id}}/interactionby/me STUB");
var result = new
{
Cheered = true,
Favorited = true,
LastVisitedAt = DateTime.UtcNow
};
return result;
});
app.MapPut("/rooms/{id}/interactionby/me/favorite", () =>
{
app.Logger.LogWarning("(Rooms) /rooms/{{id}}/interactionby/me/favorite STUB");
return new { Favorited = true };
});
app.MapDelete("/rooms/{id}/interactionby/me/favorite", () =>
{
app.Logger.LogWarning("(Rooms) /rooms/{{id}}/interactionby/me/favorite STUB");
return new { Favorited = false };
});
app.MapPut("/rooms/{id}/interactionby/me/cheer", () =>
{
app.Logger.LogWarning("(Rooms) /rooms/{{id}}/interactionby/me/cheer STUB");
return new { Cheered = true };
});
app.MapDelete("/rooms/{id}/interactionby/me/cheer", () =>
{
app.Logger.LogWarning("(Rooms) /rooms/{{id}}/interactionby/me/cheer STUB");
return new { Cheered = false };
});
app.MapGet("/photon_access_token", () =>
{
app.Logger.LogWarning("(Rooms) /photon_access_token STUB");
List<PhotonPermission> permissions = new();
permissions.Add(new()
{
Permission = "CAN_USE_ROOM_RESET_BUTTON",
Role = 0,
Override = true
});
permissions.Add(new()
{
Permission = "CAN_USE_DELETE_ALL_BUTTON",
Role = 0,
Override = true
});
permissions.Add(new()
{
Permission = "CAN_SAVE_INVENTIONS",
Role = 0,
Override = true
});
permissions.Add(new()
{
Permission = "CAN_SPAWN_INVENTIONS",
Role = 0,
Override = true
});
permissions.Add(new()
{
Permission = "CAN_USE_PLAY_GIZMOS_TOGGLE",
Role = 0,
Override = true
});
permissions.Add(new()
{
Permission = "CAN_USE_MAKER_PEN",
Role = 0,
Override = true
});
permissions.Add(new()
{
Permission = "CAN_USE_ROOM_RESET_BUTTON",
Role = 0,
Override = true
});
permissions.Add(new()
{
Permission = "CAN_USE_DELETE_ALL_BUTTON",
Role = 0,
Override = true
});
permissions.Add(new()
{
Permission = "CAN_SAVE_INVENTIONS",
Role = 0,
Override = true
});
permissions.Add(new()
{
Permission = "CAN_SPAWN_INVENTIONS",
Role = 0,
Override = true
});
permissions.Add(new()
{
Permission = "CAN_USE_PLAY_GIZMOS_TOGGLE",
Role = 0,
Override = true
});
PhotonAccessTokenObject accessToken = new()
{
Permissions = permissions.ToArray(),
PhotonAccessToken = "",
RoomInstanceId = Matchmaking.currentInstance.roomInstanceId
};
return accessToken;
});
app.MapGet("/publishState/configs", () =>
{
app.Logger.LogWarning("(Rooms) /publishState/configs STUB");
RoomPublishStateConfig config = new()
{
UpdateMaxCount = 5,
UpdateRollingWindowInDays = 10,
UpdateExpirationInDays = 9,
UpdateCooldownInDays = 1
};
ApiResponse response = new()
{
success = true,
value = config
};
return response;
});
app.MapGet("/rooms/{roomId}/subrooms/{subroomId}/saves", (int roomId, int subroomId) =>
{
app.Logger.LogWarning("(Rooms) /rooms/id/subrooms/id/saves STUB");
Room room = null;
for (int i = 0; i < roomNamesToIds.names.Count; i++)
{
if (roomNamesToIds.names[i].id == roomId)
{
room = JsonSerializer.Deserialize<Room>(File.ReadAllText("ServerData/Rooms/" + roomNamesToIds.names[i].name + "/info.json"));
}
}
if (room == null)
{
return Results.NotFound();
}
SubRooms subRoom = room.SubRooms[0];
List<CurrentSave> saves = new();
if (subRoom.CurrentSave == null)
{
saves.Add(new()
{
SubRoomId = (int)room.SubRooms[0].SubRoomId,
SubRoomDataSaveId = 1001,
ReferencedUnityAssetIds = Array.Empty<object>(),
PersistenceVersion = 50,
OMVersion = 0,
CreatedAt = DateTime.Now,
UgcSubVersion = 0,
});
}
else
{
saves.Add(subRoom.CurrentSave);
}
return Results.Ok(saves[0]);
});
app.MapPost("/rooms/{roomId}/subrooms/{subroomId}/data", async (int roomId, int subroomId, HttpRequest request) =>
{
Room room = null;
for (int i = 0; i < roomNamesToIds.names.Count; i++)
{
if (roomNamesToIds.names[i].id == roomId)
{
room = JsonSerializer.Deserialize<Room>(File.ReadAllText("ServerData/Rooms/" + roomNamesToIds.names[i].name + "/info.json"));
}
}
if (room == null)
{
return Results.NotFound();
}
var body = new StreamReader(request.Body);
var requestBody = await body.ReadToEndAsync();
SaveRequest saveRequest = JsonSerializer.Deserialize<SaveRequest>(requestBody);
if (room.SubRooms[0].CurrentSave == null)
{
room.SubRooms[0].CurrentSave = new()
{
SubRoomId = (int)room.SubRooms[0].SubRoomId,
SubRoomDataSaveId = 1001,
ReferencedUnityAssetIds = Array.Empty<object>(),
PersistenceVersion = 50,
OMVersion = 0,
CreatedAt = DateTime.Now,
UgcSubVersion = 0,
};
}
room.SubRooms[0].CurrentSave.DataBlob = saveRequest.SubRoomData.Filename;
room.SubRooms[0].CurrentSave.PersistenceVersion = saveRequest.PersistenceVersion;
ApiResponse response = new()
{
error = string.Empty,
success = true,
value = new SubroomSaveResponse
{
room = room,
subRoomDataSave = room.SubRooms[0].CurrentSave
}
};
if (File.Exists("ServerData/Rooms/" + room.Name + "/info.json.bak"))
{
File.Delete("ServerData/Rooms/" + room.Name + "/info.json.bak");
}
File.Move("ServerData/Rooms/" + room.Name + "/info.json", "ServerData/Rooms/" + room.Name + "/info.json.bak");
await File.WriteAllTextAsync("ServerData/Rooms/" + room.Name + "/info.json", JsonSerializer.Serialize(room));
return Results.Ok(response);
}).DisableAntiforgery();
app.MapGet("/rooms/{roomId}/subrooms/{subroomId}/data", (int roomId, int subroomId) =>
{
Room room = null;
for (int i = 0; i < roomNamesToIds.names.Count; i++)
{
if (roomNamesToIds.names[i].id == roomId)
{
room = JsonSerializer.Deserialize<Room>(File.ReadAllText("ServerData/Rooms/" + roomNamesToIds.names[i].name + "/info.json"));
}
}
if (room == null)
{
return Results.NotFound();
}
return Results.Ok(room.SubRooms[0]);
}).DisableAntiforgery();
app.MapPost("/rooms/regennamestoids", () =>
{
UpdateRoomNamesToIds();
roomNamesToIds = JsonSerializer.Deserialize<NameToIds>(File.ReadAllText("ServerData/RoomNamesToIds.json"));
});
app.MapGet("/rooms/{roomId}/playerdata/me", () =>
{
app.Logger.LogWarning("(Rooms) /rooms/{{roomId}}/playerdata/me STUB");
RoomPlayerData playerData = new()
{
Data = string.Empty
};
return playerData;
});
app.MapGet("/room/{name}", async (string name, HttpContext context) =>
{
return Results.File(await File.ReadAllBytesAsync("wwwroot/room/" + name));
});
app.MapGet("/rooms/{roomId}/similar", (int roomId) =>
{
app.Logger.LogWarning("(Rooms) /rooms/{{roomId}}/similar STUB");
List<Room> rooms = new();
rooms.Add(JsonSerializer.Deserialize<Room>(File.ReadAllText("ServerData/Rooms/RecCenter/info.json")));
var pagedRooms = new
{
Results = rooms,
TotalResults = 1
};
return pagedRooms;
});
app.MapGet("/rooms/base", () =>
{
app.Logger.LogWarning("(Rooms) /rooms/base STUB");
List<Room> rooms = new();
rooms.Add(JsonSerializer.Deserialize<Room>(File.ReadAllText("ServerData/Rooms/MakerRoom/info.json")));
return rooms;
});
app.MapGet("/room/{roomId}/instances", (int roomId) =>
{
List<RoomInstance> instances = new();
foreach (var user in Auth.currentUsers)
{
if (user.currentInstance != null)
{
if (user.currentInstance.roomId == roomId)
{
instances.Add(user.currentInstance);
}
}
}
return instances;
});
// 2020
app.MapGet("/api/rooms/v4/details/{roomId}", (int roomId) =>
{
if (Directory.Exists("ServerData/Rooms/" + roomId))
{
return Results.Ok(JsonSerializer.Deserialize<Room>(File.ReadAllText("ServerData/Rooms/" + roomId + "/info.json")));
}
for (int i = 0; i < roomNamesToIds.names.Count; i++)
{
if (roomNamesToIds.names[i].id == roomId)
{
return Results.Ok(JsonSerializer.Deserialize<Room>(File.ReadAllText("ServerData/Rooms/" + roomNamesToIds.names[i].name + "/info.json")));
}
}
return Results.NotFound();
});
}
private static void CreateFolder(string dir)
{
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
}
}