приколы

This commit is contained in:
Vigers Ray 2025-07-19 12:44:38 +03:00
parent 6fc7a1d2d0
commit ec12721bac
8 changed files with 159 additions and 1 deletions

View file

@ -1,4 +1,5 @@
using System.Text;
using Content.Server.Administration.Managers;
using Content.Server.Database;
using Content.Shared.Administration;
using Robust.Shared.Console;
@ -16,6 +17,7 @@ namespace Content.Server.Administration.Commands
{
var player = shell.Player;
var dbMan = IoCManager.Resolve<IServerDbManager>();
var banMan = IoCManager.Resolve<IBanManager>();
if (args.Length != 1)
{
@ -52,7 +54,7 @@ namespace Content.Server.Administration.Commands
return;
}
await dbMan.AddServerUnbanAsync(new ServerUnbanDef(banId, player?.UserId, DateTimeOffset.UtcNow));
await banMan.PardonBan(shell.Player, banId, ban); // Sunrise-Edit
shell.WriteLine($"Pardoned ban with id {banId}");
}

View file

@ -0,0 +1,18 @@
using Robust.Shared.Network;
namespace Content.Server.Administration.Managers;
public sealed class BanIssuedEventArgs : EventArgs
{
public NetUserId? Target { get; init; }
public NetUserId? BanningAdmin { get; init; }
public string? Reason { get; init; }
public DateTimeOffset Time { get; init; }
}
public sealed class BanPardonedEventArgs : EventArgs
{
public NetUserId? Target { get; init; }
public NetUserId? PardoningAdmin { get; init; }
public DateTimeOffset Time { get; init; }
}

View file

@ -66,6 +66,8 @@ public sealed partial class BanManager : IBanManager, IPostInjectInit
private string _webhookName = "Sunrise Ban";
private string _webhookAvatarUrl = "https://i.ibb.co/WfGqKtG/avatar.png";
private List<IPAddress?> _ipWhitelist = [];
public event EventHandler<BanIssuedEventArgs>? BanIssued;
public event EventHandler<BanPardonedEventArgs>? BanPardoned;
// Sunrise-end
private readonly Dictionary<ICommonSession, List<ServerRoleBanDef>> _cachedRoleBans = new();
@ -122,6 +124,20 @@ public sealed partial class BanManager : IBanManager, IPostInjectInit
_ipWhitelist = ips;
}
public async Task PardonBan(ICommonSession? admin, int banId, ServerBanDef ban)
{
await _db.AddServerUnbanAsync(new ServerUnbanDef(banId, admin?.UserId, DateTimeOffset.UtcNow));
if (admin != null)
{
BanPardoned?.Invoke(this, new BanPardonedEventArgs
{
Target = ban.UserId,
PardoningAdmin = admin.UserId,
Time = DateTimeOffset.UtcNow
});
}
}
// Sunrise-End
private async Task CachePlayerData(ICommonSession player, CancellationToken cancel)
@ -248,6 +264,16 @@ public sealed partial class BanManager : IBanManager, IPostInjectInit
var hwidString = hwid?.ToString() ?? "null";
var expiresString = expires == null ? Loc.GetString("server-ban-string-never") : $"{expires}";
// Sunrise-Start
BanIssued?.Invoke(this, new BanIssuedEventArgs
{
Target = target,
BanningAdmin = banningAdmin,
Reason = reason,
Time = DateTimeOffset.UtcNow
});
// Sunrise-End
var key = _cfg.GetCVar(CCVars.AdminShowPIIOnBan) ? "server-ban-string" : "server-ban-string-no-pii";
var logMessage = Loc.GetString(
@ -368,6 +394,16 @@ public sealed partial class BanManager : IBanManager, IPostInjectInit
return;
}
// Sunrise-Start
BanIssued?.Invoke(this, new BanIssuedEventArgs
{
Target = target,
BanningAdmin = banningAdmin,
Reason = reason,
Time = timeOfBan
});
// Sunrise-End
var length = expires == null ? Loc.GetString("cmd-roleban-inf") : Loc.GetString("cmd-roleban-until", ("expires", expires));
_chat.SendAdminAlert(Loc.GetString("cmd-roleban-success", ("target", targetUsername ?? "null"), ("role", role), ("reason", reason), ("length", length)));
@ -433,6 +469,15 @@ public sealed partial class BanManager : IBanManager, IPostInjectInit
await _db.AddServerRoleUnbanAsync(new ServerRoleUnbanDef(banId, unbanningAdmin, DateTimeOffset.UtcNow));
// Sunrise-Start
BanPardoned?.Invoke(this, new BanPardonedEventArgs
{
Target = ban.UserId,
PardoningAdmin = unbanningAdmin,
Time = DateTimeOffset.UtcNow
});
// Sunrise-End
if (ban.UserId is { } player
&& _playerManager.TryGetSessionById(player, out var session)
&& _cachedRoleBans.TryGetValue(session, out var roleBans))

View file

@ -1,6 +1,7 @@
using System.Collections.Immutable;
using System.Net;
using System.Threading.Tasks;
using Content.Server.Database;
using Content.Shared.Database;
using Content.Shared.Roles;
using Robust.Shared.Network;
@ -100,4 +101,9 @@ public interface IBanManager
/// </summary>
/// <param name="pSession">Player's session</param>
public void SendRoleBans(ICommonSession pSession);
// Sunrise-Start
public Task PardonBan(ICommonSession? admin, int banId, ServerBanDef ban);
public event EventHandler<BanPardonedEventArgs>? BanPardoned;
public event EventHandler<BanIssuedEventArgs>? BanIssued;
// Sunrise-End
}

View file

@ -512,6 +512,11 @@ namespace Content.Server.Database
return flags ?? ServerBanExemptFlags.None;
}
// Sunrise-Start
public abstract Task<List<ServerBanDef>> GetServerBansByAdminAsync(NetUserId adminId, DateTimeOffset since);
public abstract Task DeleteServerBanAsync(int banId);
// Sunrise-End
#endregion
#region Role Bans

View file

@ -126,6 +126,10 @@ namespace Content.Server.Database
/// <returns><see cref="ServerBanExemptFlags.None"/> if the user is not exempt from any bans.</returns>
Task<ServerBanExemptFlags> GetBanExemption(NetUserId userId, CancellationToken cancel = default);
// Sunrise-Start
Task<List<ServerBanDef>> GetServerBansByAdminAsync(NetUserId adminId, DateTimeOffset since);
Task DeleteServerBanAsync(int banId);
// Sunrise-End
#endregion
#region Role Bans
@ -584,6 +588,20 @@ namespace Content.Server.Database
return RunDbCommand(() => _db.GetBanExemption(userId, cancel));
}
// Sunrise-Start
public Task<List<ServerBanDef>> GetServerBansByAdminAsync(NetUserId adminId, DateTimeOffset since)
{
DbReadOpsMetric.Inc();
return RunDbCommand(() => _db.GetServerBansByAdminAsync(adminId, since));
}
public Task DeleteServerBanAsync(int banId)
{
DbWriteOpsMetric.Inc();
return RunDbCommand(() => _db.DeleteServerBanAsync(banId));
}
// Sunrise-End
#region Role Ban
public Task<ServerRoleBanDef?> GetServerRoleBanAsync(int id)
{

View file

@ -127,6 +127,38 @@ namespace Content.Server.Database
return bans;
}
// Sunrise-Start
public override async Task<List<ServerBanDef>> GetServerBansByAdminAsync(NetUserId adminId, DateTimeOffset since)
{
await using var db = await GetDbImpl();
var bans = await db.PgDbContext.Ban
.Include(b => b.Unban)
.Where(b => b.BanningAdmin == adminId.UserId && b.BanTime >= since.UtcDateTime)
.ToListAsync();
var result = new List<ServerBanDef>();
foreach (var ban in bans)
{
var banDef = ConvertBan(ban);
if (banDef != null)
result.Add(banDef);
}
return result;
}
public override async Task DeleteServerBanAsync(int banId)
{
await using var db = await GetDbImpl();
var unbans = db.PgDbContext.Unban.Where(u => u.BanId == banId);
db.PgDbContext.Unban.RemoveRange(unbans);
var ban = await db.PgDbContext.Ban.SingleOrDefaultAsync(b => b.Id == banId);
if (ban != null)
{
db.PgDbContext.Ban.Remove(ban);
await db.PgDbContext.SaveChangesAsync();
}
}
// Sunrise-End
private static IQueryable<ServerBan> MakeBanLookupQuery(
IPAddress? address,
NetUserId? userId,

View file

@ -101,6 +101,38 @@ namespace Content.Server.Database
return (await GetServerBanQueryAsync(db, address, userId, hwId, modernHWIds, includeUnbanned)).ToList();
}
// Sunrise-Start
public override async Task<List<ServerBanDef>> GetServerBansByAdminAsync(NetUserId adminId, DateTimeOffset since)
{
await using var db = await GetDbImpl();
var bans = await db.SqliteDbContext.Ban
.Include(b => b.Unban)
.Where(b => b.BanningAdmin == adminId.UserId && b.BanTime >= since.UtcDateTime)
.ToListAsync();
var result = new List<ServerBanDef>();
foreach (var ban in bans)
{
var banDef = ConvertBan(ban);
if (banDef != null)
result.Add(banDef);
}
return result;
}
public override async Task DeleteServerBanAsync(int banId)
{
await using var db = await GetDbImpl();
var unbans = db.SqliteDbContext.Unban.Where(u => u.BanId == banId);
db.SqliteDbContext.Unban.RemoveRange(unbans);
var ban = await db.SqliteDbContext.Ban.SingleOrDefaultAsync(b => b.Id == banId);
if (ban != null)
{
db.SqliteDbContext.Ban.Remove(ban);
await db.SqliteDbContext.SaveChangesAsync();
}
}
// Sunrise-End
private async Task<IEnumerable<ServerBanDef>> GetServerBanQueryAsync(
DbGuardImpl db,
IPAddress? address,