AdminCommandPermissions.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using System.IO;
  2. using System.Linq;
  3. using Robust.Shared.Utility;
  4. using YamlDotNet.RepresentationModel;
  5. namespace Content.Shared.Administration;
  6. public sealed class AdminCommandPermissions
  7. {
  8. // Commands executable by anybody.
  9. public readonly HashSet<string> AnyCommands = new();
  10. // Commands only executable by admins with one of the given flag masks.
  11. public readonly Dictionary<string, AdminFlags[]> AdminCommands = new();
  12. public void LoadPermissionsFromStream(Stream fs)
  13. {
  14. using var reader = new StreamReader(fs, EncodingHelpers.UTF8);
  15. var yStream = new YamlStream();
  16. yStream.Load(reader);
  17. var root = (YamlSequenceNode) yStream.Documents[0].RootNode;
  18. foreach (var child in root)
  19. {
  20. var map = (YamlMappingNode) child;
  21. var commands = map.GetNode<YamlSequenceNode>("Commands").Select(p => p.AsString());
  22. if (map.TryGetNode("Flags", out var flagsNode))
  23. {
  24. var flagNames = flagsNode.AsString().Split(",", StringSplitOptions.RemoveEmptyEntries);
  25. var flags = AdminFlagsHelper.NamesToFlags(flagNames);
  26. foreach (var cmd in commands)
  27. {
  28. if (!AdminCommands.TryGetValue(cmd, out var exFlags))
  29. {
  30. AdminCommands.Add(cmd, new[] {flags});
  31. }
  32. else
  33. {
  34. var newArr = new AdminFlags[exFlags.Length + 1];
  35. exFlags.CopyTo(newArr, 0);
  36. newArr[^1] = flags;
  37. AdminCommands[cmd] = newArr;
  38. }
  39. }
  40. }
  41. else
  42. {
  43. AnyCommands.UnionWith(commands);
  44. }
  45. }
  46. }
  47. public bool CanCommand(string cmdName, AdminData? admin)
  48. {
  49. if (AnyCommands.Contains(cmdName))
  50. {
  51. // Anybody can use this command.
  52. return true;
  53. }
  54. if (!AdminCommands.TryGetValue(cmdName, out var flagsReq))
  55. {
  56. // Server-console only.
  57. return false;
  58. }
  59. if (admin == null)
  60. {
  61. // Player isn't an admin.
  62. return false;
  63. }
  64. foreach (var flagReq in flagsReq)
  65. {
  66. if (admin.HasFlag(flagReq))
  67. {
  68. return true;
  69. }
  70. }
  71. return false;
  72. }
  73. }