diff --git a/ProjectLighthouse.Servers.Website/Controllers/Admin/AdminUserController.cs b/ProjectLighthouse.Servers.Website/Controllers/Admin/AdminUserController.cs index 3b888391..a0b0ee4c 100644 --- a/ProjectLighthouse.Servers.Website/Controllers/Admin/AdminUserController.cs +++ b/ProjectLighthouse.Servers.Website/Controllers/Admin/AdminUserController.cs @@ -1,8 +1,10 @@ #nullable enable +using LBPUnion.ProjectLighthouse.Files; +using LBPUnion.ProjectLighthouse.Logging; using LBPUnion.ProjectLighthouse.PlayerData.Profiles; -using LBPUnion.ProjectLighthouse.Types; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; +using IOFile = System.IO.File; namespace LBPUnion.ProjectLighthouse.Servers.Website.Controllers.Admin; @@ -24,7 +26,6 @@ public class AdminUserController : ControllerBase if (user == null || !user.IsAdmin) return this.NotFound(); User? targetedUser = await this.database.Users.FirstOrDefaultAsync(u => u.UserId == id); - if (targetedUser == null) return this.NotFound(); targetedUser.Banned = false; @@ -33,4 +34,70 @@ public class AdminUserController : ControllerBase await this.database.SaveChangesAsync(); return this.Redirect($"/user/{targetedUser.UserId}"); } + + /// + /// Resets the user's earth decorations to a blank state. Useful for users who abuse audio for example. + /// + [HttpGet("wipePlanets")] + public async Task WipePlanets([FromRoute] int id) { + User? user = this.database.UserFromWebRequest(this.Request); + if (user == null || !user.IsAdmin) return this.NotFound(); + + User? targetedUser = await this.database.Users.FirstOrDefaultAsync(u => u.UserId == id); + if (targetedUser == null) return this.NotFound(); + + string[] hashes = { + targetedUser.PlanetHashLBP2, + targetedUser.PlanetHashLBP3, + targetedUser.PlanetHashLBPVita, + }; + + // This will also wipe users' earth with the same hashes. + foreach (string hash in hashes) + { + // Don't try to remove empty hashes. That's a horrible idea. + if (string.IsNullOrWhiteSpace(hash)) continue; + + // Find users with a matching hash + List users = await this.database.Users + .Where(u => u.PlanetHashLBP2 == hash || + u.PlanetHashLBP3 == hash || + u.PlanetHashLBPVita == hash) + .ToListAsync(); + + // We should match at least the targeted user... + System.Diagnostics.Debug.Assert(users.Count != 0); + + // Reset each users' hash. + foreach (User userWithPlanet in users) + { + userWithPlanet.PlanetHashLBP2 = ""; + userWithPlanet.PlanetHashLBP3 = ""; + userWithPlanet.PlanetHashLBPVita = ""; + Logger.Success($"Deleted planets for {userWithPlanet.Username} (id:{userWithPlanet.UserId})", LogArea.Admin); + } + + // And finally, attempt to remove the resource from the filesystem. We don't want that taking up space. + try + { + IOFile.Delete(FileHelper.GetResourcePath(hash)); + Logger.Success($"Deleted planet resource {hash}", + LogArea.Admin); + } + catch(DirectoryNotFoundException) + { + // This is certainly a strange case, but it's not worth doing anything about since we were about + // to delete the file anyways. Carry on~ + } + catch(Exception e) + { + // Welp, guess I'll die then. We tried~ + Logger.Error($"Failed to delete planet resource {hash}\n{e}", LogArea.Admin); + } + } + + await this.database.SaveChangesAsync(); + + return this.Redirect($"/user/{targetedUser.UserId}"); + } } \ No newline at end of file diff --git a/ProjectLighthouse.Servers.Website/Pages/UserPage.cshtml b/ProjectLighthouse.Servers.Website/Pages/UserPage.cshtml index b766e011..e3761284 100644 --- a/ProjectLighthouse.Servers.Website/Pages/UserPage.cshtml +++ b/ProjectLighthouse.Servers.Website/Pages/UserPage.cshtml @@ -130,6 +130,15 @@ } + +
+ + + Wipe user's earth decorations + +
+ + @await Html.PartialAsync("Partials/AdminSetGrantedSlotsFormPartial", Model.ProfileUser) } \ No newline at end of file diff --git a/ProjectLighthouse/Logging/LogArea.cs b/ProjectLighthouse/Logging/LogArea.cs index dde0f5f4..f83c0d76 100644 --- a/ProjectLighthouse/Logging/LogArea.cs +++ b/ProjectLighthouse/Logging/LogArea.cs @@ -20,4 +20,5 @@ public enum LogArea Logger, Redis, Command, + Admin, } \ No newline at end of file