1
0

ServerBanDef.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using System.Net;
  2. using Content.Shared.CCVar;
  3. using Content.Shared.Database;
  4. using Robust.Shared.Configuration;
  5. using Robust.Shared.Network;
  6. namespace Content.Server.Database
  7. {
  8. public sealed class ServerBanDef
  9. {
  10. public int? Id { get; }
  11. public NetUserId? UserId { get; }
  12. public (IPAddress address, int cidrMask)? Address { get; }
  13. public ImmutableTypedHwid? HWId { get; }
  14. public DateTimeOffset BanTime { get; }
  15. public DateTimeOffset? ExpirationTime { get; }
  16. public int? RoundId { get; }
  17. public TimeSpan PlaytimeAtNote { get; }
  18. public string Reason { get; }
  19. public NoteSeverity Severity { get; set; }
  20. public NetUserId? BanningAdmin { get; }
  21. public ServerUnbanDef? Unban { get; }
  22. public ServerBanExemptFlags ExemptFlags { get; }
  23. public ServerBanDef(int? id,
  24. NetUserId? userId,
  25. (IPAddress, int)? address,
  26. TypedHwid? hwId,
  27. DateTimeOffset banTime,
  28. DateTimeOffset? expirationTime,
  29. int? roundId,
  30. TimeSpan playtimeAtNote,
  31. string reason,
  32. NoteSeverity severity,
  33. NetUserId? banningAdmin,
  34. ServerUnbanDef? unban,
  35. ServerBanExemptFlags exemptFlags = default)
  36. {
  37. if (userId == null && address == null && hwId == null)
  38. {
  39. throw new ArgumentException("Must have at least one of banned user, banned address or hardware ID");
  40. }
  41. if (address is {} addr && addr.Item1.IsIPv4MappedToIPv6)
  42. {
  43. // Fix IPv6-mapped IPv4 addresses
  44. // So that IPv4 addresses are consistent between separate-socket and dual-stack socket modes.
  45. address = (addr.Item1.MapToIPv4(), addr.Item2 - 96);
  46. }
  47. Id = id;
  48. UserId = userId;
  49. Address = address;
  50. HWId = hwId;
  51. BanTime = banTime;
  52. ExpirationTime = expirationTime;
  53. RoundId = roundId;
  54. PlaytimeAtNote = playtimeAtNote;
  55. Reason = reason;
  56. Severity = severity;
  57. BanningAdmin = banningAdmin;
  58. Unban = unban;
  59. ExemptFlags = exemptFlags;
  60. }
  61. public string FormatBanMessage(IConfigurationManager cfg, ILocalizationManager loc)
  62. {
  63. string expires;
  64. if (ExpirationTime is { } expireTime)
  65. {
  66. var duration = expireTime - BanTime;
  67. var utc = expireTime.ToUniversalTime();
  68. expires = loc.GetString("ban-expires", ("duration", duration.TotalMinutes.ToString("N0")), ("time", utc.ToString("f")));
  69. }
  70. else
  71. {
  72. var appeal = cfg.GetCVar(CCVars.InfoLinksAppeal);
  73. expires = !string.IsNullOrWhiteSpace(appeal)
  74. ? loc.GetString("ban-banned-permanent-appeal", ("link", appeal))
  75. : loc.GetString("ban-banned-permanent");
  76. }
  77. return $"""
  78. {loc.GetString("ban-banned-1")}
  79. {loc.GetString("ban-banned-2", ("reason", Reason))}
  80. {expires}
  81. {loc.GetString("ban-banned-3")}
  82. """;
  83. }
  84. }
  85. }