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 @@
}
+
+
+
+
@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