diff --git a/ProjectLighthouse.Localization/ModPanel.resx b/ProjectLighthouse.Localization/ModPanel.resx
index d0987e59..813a9cdc 100644
--- a/ProjectLighthouse.Localization/ModPanel.resx
+++ b/ProjectLighthouse.Localization/ModPanel.resx
@@ -24,4 +24,10 @@
Welcome to the moderation panel, {0}!
+
+ Banned Users
+
+
+ Hidden Levels
+
\ No newline at end of file
diff --git a/ProjectLighthouse.Localization/StringLists/ModPanelStrings.cs b/ProjectLighthouse.Localization/StringLists/ModPanelStrings.cs
index 00febf91..32299f8c 100644
--- a/ProjectLighthouse.Localization/StringLists/ModPanelStrings.cs
+++ b/ProjectLighthouse.Localization/StringLists/ModPanelStrings.cs
@@ -4,6 +4,8 @@ public static class ModPanelStrings
{
public static readonly TranslatableString ModPanelTitle = create("mod_panel_title");
public static readonly TranslatableString Greeting = create("greeting");
+ public static readonly TranslatableString BannedUsers = create("banned_users");
+ public static readonly TranslatableString HiddenLevels = create("hidden_levels");
private static TranslatableString create(string key) => new(TranslationAreas.ModPanel, key);
}
\ No newline at end of file
diff --git a/ProjectLighthouse.Servers.Website/Pages/Moderation/BannedUsersPage.cshtml b/ProjectLighthouse.Servers.Website/Pages/Moderation/BannedUsersPage.cshtml
new file mode 100644
index 00000000..42f0c154
--- /dev/null
+++ b/ProjectLighthouse.Servers.Website/Pages/Moderation/BannedUsersPage.cshtml
@@ -0,0 +1,41 @@
+@page "/moderation/bannedUsers/{pageNumber:int}"
+@using LBPUnion.ProjectLighthouse.Extensions
+@using LBPUnion.ProjectLighthouse.Localization.StringLists
+@using LBPUnion.ProjectLighthouse.PlayerData.Profiles
+@model LBPUnion.ProjectLighthouse.Servers.Website.Pages.Moderation.BannedUsersPage
+
+@{
+ Layout = "Layouts/BaseLayout";
+ Model.Title = Model.Translate(ModPanelStrings.BannedUsers);
+ bool isMobile = Model.Request.IsMobile();
+}
+
+
There are @Model.UserCount banned users.
+
+@foreach (User user in Model.Users)
+{
+
+ @await Html.PartialAsync("Partials/UserCardPartial", user, new ViewDataDictionary(ViewData)
+ {
+ {
+ "ShowLink", true
+ },
+ {
+ "IsMobile", isMobile
+ },
+ {
+ "Language", Model.GetLanguage()
+ },
+ })
+
+}
+
+@if (Model.PageNumber != 0)
+{
+ Previous Page
+}
+@(Model.PageNumber + 1) / @(Model.PageAmount)
+@if (Model.PageNumber < Model.PageAmount - 1)
+{
+ Next Page
+}
diff --git a/ProjectLighthouse.Servers.Website/Pages/Moderation/BannedUsersPage.cshtml.cs b/ProjectLighthouse.Servers.Website/Pages/Moderation/BannedUsersPage.cshtml.cs
new file mode 100644
index 00000000..33c095b4
--- /dev/null
+++ b/ProjectLighthouse.Servers.Website/Pages/Moderation/BannedUsersPage.cshtml.cs
@@ -0,0 +1,41 @@
+using LBPUnion.ProjectLighthouse.Configuration;
+using LBPUnion.ProjectLighthouse.PlayerData;
+using LBPUnion.ProjectLighthouse.PlayerData.Profiles;
+using LBPUnion.ProjectLighthouse.Servers.Website.Pages.Layouts;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using Microsoft.EntityFrameworkCore;
+
+namespace LBPUnion.ProjectLighthouse.Servers.Website.Pages.Moderation;
+
+public class BannedUsersPage : BaseLayout
+{
+ public BannedUsersPage(Database database) : base(database)
+ {}
+
+ public List Users = new();
+
+ public int PageAmount;
+
+ public int PageNumber;
+
+ public int UserCount;
+
+ public async Task OnGet([FromRoute] int pageNumber, [FromQuery] string? name)
+ {
+ WebToken? token = this.Database.WebTokenFromRequest(this.Request);
+ if (token == null) return this.Redirect("/login");
+
+ this.Users = await this.Database.Users
+ .Where(u => u.PermissionLevel < 0)
+ .Skip(pageNumber * ServerStatics.PageSize)
+ .Take(ServerStatics.PageSize)
+ .ToListAsync();
+
+ this.UserCount = await this.Database.Users.CountAsync(u => u.PermissionLevel < 0);
+
+ this.PageAmount = Math.Max(1, (int)Math.Ceiling((double)this.UserCount / ServerStatics.PageSize));
+
+ return this.Page();
+ }
+}
\ No newline at end of file
diff --git a/ProjectLighthouse.Servers.Website/Pages/Moderation/HiddenLevelsPage.cshtml b/ProjectLighthouse.Servers.Website/Pages/Moderation/HiddenLevelsPage.cshtml
new file mode 100644
index 00000000..e8122bc1
--- /dev/null
+++ b/ProjectLighthouse.Servers.Website/Pages/Moderation/HiddenLevelsPage.cshtml
@@ -0,0 +1,44 @@
+@page "/moderation/hiddenLevels/{pageNumber:int}"
+@using LBPUnion.ProjectLighthouse.Extensions
+@using LBPUnion.ProjectLighthouse.Levels
+@using LBPUnion.ProjectLighthouse.Localization.StringLists
+@model LBPUnion.ProjectLighthouse.Servers.Website.Pages.Moderation.HiddenLevelsPage
+
+@{
+ Layout = "Layouts/BaseLayout";
+ Model.Title = Model.Translate(ModPanelStrings.HiddenLevels);
+ bool isMobile = Model.Request.IsMobile();
+}
+
+There are @Model.SlotCount hidden levels.
+
+@foreach (Slot slot in Model.Slots)
+{
+
+ @await Html.PartialAsync("Partials/SlotCardPartial", slot, new ViewDataDictionary(ViewData)
+ {
+ {
+ "User", Model.User
+ },
+ {
+ "CallbackUrl", $"~/moderation/hiddenLevels/{Model.PageNumber}"
+ },
+ {
+ "ShowLink", true
+ },
+ {
+ "IsMobile", isMobile
+ },
+ })
+
+}
+
+@if (Model.PageNumber != 0)
+{
+ Previous Page
+}
+@(Model.PageNumber + 1) / @(Model.PageAmount)
+@if (Model.PageNumber < Model.PageAmount - 1)
+{
+ Next Page
+}
\ No newline at end of file
diff --git a/ProjectLighthouse.Servers.Website/Pages/Moderation/HiddenLevelsPage.cshtml.cs b/ProjectLighthouse.Servers.Website/Pages/Moderation/HiddenLevelsPage.cshtml.cs
new file mode 100644
index 00000000..11d4a25f
--- /dev/null
+++ b/ProjectLighthouse.Servers.Website/Pages/Moderation/HiddenLevelsPage.cshtml.cs
@@ -0,0 +1,41 @@
+using LBPUnion.ProjectLighthouse.Configuration;
+using LBPUnion.ProjectLighthouse.Levels;
+using LBPUnion.ProjectLighthouse.PlayerData;
+using LBPUnion.ProjectLighthouse.Servers.Website.Pages.Layouts;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using Microsoft.EntityFrameworkCore;
+
+namespace LBPUnion.ProjectLighthouse.Servers.Website.Pages.Moderation;
+
+public class HiddenLevelsPage : BaseLayout
+{
+ public HiddenLevelsPage(Database database) : base(database)
+ {}
+
+ public int PageAmount;
+
+ public int PageNumber;
+
+ public int SlotCount;
+
+ public List Slots = new();
+
+ public async Task OnGet([FromRoute] int pageNumber, [FromQuery] string? name)
+ {
+ WebToken? token = this.Database.WebTokenFromRequest(this.Request);
+ if (token == null) return this.Redirect("/login");
+
+ this.Slots = await this.Database.Slots
+ .Where(s => s.Hidden)
+ .Skip(pageNumber * ServerStatics.PageSize)
+ .Take(ServerStatics.PageSize)
+ .ToListAsync();
+
+ this.SlotCount = await this.Database.Slots.CountAsync(s => s.Hidden);
+
+ this.PageAmount = Math.Max(1, (int)Math.Ceiling((double)this.SlotCount / ServerStatics.PageSize));
+
+ return this.Page();
+ }
+}
\ No newline at end of file
diff --git a/ProjectLighthouse.Servers.Website/Pages/Moderation/ModPanelPage.cshtml b/ProjectLighthouse.Servers.Website/Pages/Moderation/ModPanelPage.cshtml
index 0c62c02f..304d54ab 100644
--- a/ProjectLighthouse.Servers.Website/Pages/Moderation/ModPanelPage.cshtml
+++ b/ProjectLighthouse.Servers.Website/Pages/Moderation/ModPanelPage.cshtml
@@ -42,12 +42,12 @@ else
Actions
-
+
View banned users
-
+
View hidden levels
\ No newline at end of file
diff --git a/ProjectLighthouse.Servers.Website/Pages/UsersPage.cshtml b/ProjectLighthouse.Servers.Website/Pages/UsersPage.cshtml
index db8f7a46..e2f083e9 100644
--- a/ProjectLighthouse.Servers.Website/Pages/UsersPage.cshtml
+++ b/ProjectLighthouse.Servers.Website/Pages/UsersPage.cshtml
@@ -8,6 +8,7 @@
@{
Layout = "Layouts/BaseLayout";
Model.Title = Model.Translate(BaseLayoutStrings.HeaderUsers);
+ bool isMobile = Model.Request.IsMobile();
}
There are @Model.UserCount total users.
@@ -22,7 +23,6 @@
@foreach (User user in Model.Users)
{
- bool isMobile = Model.Request.IsMobile();
@await Html.PartialAsync("Partials/UserCardPartial", user, new ViewDataDictionary(ViewData)
{