Files
2025-03-12 12:56:27 +00:00

107 lines
4.0 KiB
C#

using System;
using System.Collections.Generic;
using Barotrauma.IO;
using System.Linq;
using System.Xml.Linq;
namespace Barotrauma.Networking
{
[Flags]
public enum ClientPermissions
{
None = 0x0,
ManageRound = 0x1,
Kick = 0x2,
Ban = 0x4,
Unban = 0x8,
SelectSub = 0x10,
SelectMode = 0x20,
ManageCampaign = 0x40,
ConsoleCommands = 0x80,
ServerLog = 0x100,
ManageSettings = 0x200,
ManagePermissions = 0x400,
KarmaImmunity = 0x800,
ManageMoney = 0x1000,
SellInventoryItems = 0x2000,
SellSubItems = 0x4000,
ManageMap = 0x8000,
ManageHires = 0x10000,
ManageBotTalents = 0x20000,
SpamImmunity = 0x40000,
All = 0x7FFFF
}
class PermissionPreset
{
public static readonly List<PermissionPreset> List = new List<PermissionPreset>();
public readonly Identifier Identifier;
public readonly LocalizedString DisplayName;
public readonly LocalizedString Description;
public readonly ClientPermissions Permissions;
public readonly HashSet<DebugConsole.Command> PermittedCommands;
public PermissionPreset(XElement element)
{
Identifier = element.GetAttributeIdentifier("name", Identifier.Empty);
DisplayName = TextManager.Get("permissionpresetname." + Identifier).Fallback(Identifier.ToString());
Description = TextManager.Get("permissionpresetdescription." + Identifier) .Fallback(element.GetAttributeString("description", ""));
string permissionsStr = element.GetAttributeString("permissions", "");
if (!Enum.TryParse(permissionsStr, out Permissions))
{
DebugConsole.ThrowErrorLocalized("Error in permission preset \"" + DisplayName + "\" - " + permissionsStr + " is not a valid permission!");
}
PermittedCommands = new HashSet<DebugConsole.Command>();
if (Permissions.HasFlag(ClientPermissions.ConsoleCommands))
{
foreach (var subElement in element.Elements())
{
if (!subElement.Name.ToString().Equals("command", StringComparison.OrdinalIgnoreCase)) { continue; }
string commandName = subElement.GetAttributeString("name", "");
DebugConsole.Command command = DebugConsole.FindCommand(commandName);
if (command == null)
{
#if SERVER
DebugConsole.ThrowErrorLocalized("Error in permission preset \"" + DisplayName + "\" - " + commandName + "\" is not a valid console command.");
#endif
continue;
}
PermittedCommands.Add(command);
}
}
}
public static void LoadAll(string file)
{
if (!File.Exists(file)) { return; }
XDocument doc = XMLExtensions.TryLoadXml(file);
if (doc == null) { return; }
foreach (XElement element in doc.Root.Elements())
{
var newPermissionPreset = new PermissionPreset(element);
var existingPreset = List.FirstOrDefault(p => p.Identifier == newPermissionPreset.Identifier);
if (existingPreset != null)
{
List.Remove(existingPreset);
DebugConsole.AddWarning($"The permission preset file {file} contains a permission preset that conflicts with another preset. Overriding the previous preset...");
}
List.Add(newPermissionPreset);
}
}
public bool MatchesPermissions(ClientPermissions permissions, ISet<DebugConsole.Command> permittedConsoleCommands)
{
return permissions == Permissions
&& PermittedCommands.All(permittedConsoleCommands.Contains)
&& permittedConsoleCommands.All(PermittedCommands.Contains);
}
}
}