ModernUO/Projects/UOContent/Commands/StaffAccess.cs
Kamron Batman fffda53263
fix: Adds command help, webpage, and fixes issues with other commands (#1669)
### Summary

- Fixes `[AdvancedSearch` being accessible by players 😱 
- Adds `[GenCommands` to generate the same commands html page on https://muo.gg/commands.
- Fixes `[helpinfo` so all commands properly show up!

> [!WARNING]  
> ### Developer Warning:
> Commands must now be registered in the `Configure` bootup phase.
> If a command is not registered early enough, it may not be available to systems like [helpinfo
> that cache their information.

> [!NOTE]  
> ### Developer Note:
> Various commands related to generating content have been changed to _Developer_ and above access level.

### Screenshots
<img width="673" alt="image" src="https://github.com/modernuo/ModernUO/assets/3953314/b105b5c9-5eb4-4ace-93ff-1bfb31e7132f">

<img width="547" alt="image" src="https://github.com/modernuo/ModernUO/assets/3953314/e97487e8-47a5-4aa7-89cc-9fe3deda584d">
2024-02-10 00:19:19 -08:00

101 lines
3.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using Server.Accounting;
using Server.Mobiles;
namespace Server.Commands;
public static class StaffAccess
{
private static readonly Dictionary<string, AccessLevel> _accessLevelByString = new();
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static string AccountTag(Serial serial) => $"OriginalStaffAccess:{serial}";
public static void Configure()
{
CommandSystem.Register("StaffAccess", AccessLevel.Player, StaffAccess_OnCommand);
foreach (var accessLevel in Enum.GetValues<AccessLevel>())
{
_accessLevelByString[accessLevel.ToString().ToLower()] = accessLevel;
}
_accessLevelByString["gm"] = AccessLevel.GameMaster;
_accessLevelByString["dev"] = AccessLevel.Developer;
_accessLevelByString["admin"] = AccessLevel.Administrator;
}
public static void ResetStaffAccess(this PlayerMobile m)
{
if (m.Account is not Account account)
{
return;
}
var accountTag = AccountTag(m.Serial);
var originalAccessLevelString = account.GetTag(accountTag);
if (originalAccessLevelString == null)
{
return;
}
var accessLevel = _accessLevelByString[originalAccessLevelString];
account.RemoveTag(accountTag);
m.AccessLevel = accessLevel;
}
[Usage("StaffAccess <access level>")]
[Description("Changes your access level. Only access levels at or below your current access level can be set. Use the same access level to reset.")]
public static void StaffAccess_OnCommand(CommandEventArgs e)
{
var m = e.Mobile;
if (m.Account is not Account account)
{
return;
}
var accountTag = AccountTag(m.Serial);
var originalAccessLevelString = account.GetTag(accountTag);
AccessLevel? originalAccessLevel = originalAccessLevelString != null ? _accessLevelByString[originalAccessLevelString] : null;
if (originalAccessLevel == null && m.AccessLevel == AccessLevel.Player)
{
return;
}
var accessLevelArgument = e.GetString(0)?.Trim().ToLower();
AccessLevel newAccessLevel = AccessLevel.Player;
var validAccessLevel = !string.IsNullOrEmpty(accessLevelArgument) &&
_accessLevelByString.TryGetValue(accessLevelArgument, out newAccessLevel);
if (!validAccessLevel && originalAccessLevel == null)
{
m.SendMessage("Invalid access level specified.");
m.SendMessage("Usage: [staffaccess <access level>.");
return;
}
if (originalAccessLevel != null && (!validAccessLevel || newAccessLevel == originalAccessLevel))
{
account.RemoveTag(accountTag);
newAccessLevel = originalAccessLevel.Value;
m.SendMessage("Restoring original staff access...");
}
if ((originalAccessLevel ?? m.AccessLevel) < newAccessLevel)
{
m.SendMessage($"You cannot set your staff access to {newAccessLevel.ToString()}.");
return;
}
if (originalAccessLevel == null)
{
// Save the original access level
account.AddTag(accountTag, m.AccessLevel.ToString().ToLower());
}
m.AccessLevel = newAccessLevel;
m.SendMessage($"Staff access set to {newAccessLevel.ToString()}.");
}
}