Gulag v2 (#21)

* Components или чет типо того

* Gulag System

* Shared shit

* Cvars

* Ban manager update

* Ghost roles shit

* No ooc for gulaged

* Connection manager update

* Gulag proto shit

* Merge conflict issue

* Fixing shit

* Фикс говняхи плюс QOL

* Pendos loc

* better loc

* More qol

* ctrl+s issue

* No bwoink for banned

* Ore shit

* MAP!!!!!!

---------

Co-authored-by: Mona Hmiza <you@example.com>
This commit is contained in:
rhailrake
2024-02-03 11:39:40 +00:00
committed by GitHub
parent 8edae953d7
commit 1594dff648
18 changed files with 5828 additions and 4 deletions

View File

@@ -4,6 +4,7 @@ using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using Content.Server._Miracle.GulagSystem;
using Content.Server.Chat.Managers;
using Content.Server.Database;
using Content.Server.GameTicking;
@@ -47,6 +48,7 @@ public sealed class BanManager : IBanManager, IPostInjectInit
public const string UnknownServer = "unknown";
private readonly Dictionary<NetUserId, HashSet<ServerRoleBanDef>> _cachedRoleBans = new();
private readonly Dictionary<NetUserId, HashSet<ServerBanDef>> _cachedServerBans = new(); // Miracle edit
public void Initialize()
{
@@ -63,6 +65,7 @@ public sealed class BanManager : IBanManager, IPostInjectInit
var netChannel = e.Session.Channel;
ImmutableArray<byte>? hwId = netChannel.UserData.HWId.Length == 0 ? null : netChannel.UserData.HWId;
await CacheDbRoleBans(e.Session.UserId, netChannel.RemoteEndPoint.Address, hwId);
await CacheDbServerBans(e.Session.UserId, netChannel.RemoteEndPoint.Address, hwId); //Miracle edit
SendRoleBans(e.Session);
}
@@ -97,6 +100,17 @@ public sealed class BanManager : IBanManager, IPostInjectInit
_cachedRoleBans[userId] = userRoleBans;
}
//Miracle edit start
private async Task CacheDbServerBans(NetUserId userId, IPAddress? address = null, ImmutableArray<byte>? hwId = null)
{
var serverBans = await _db.GetServerBansAsync(address, userId, hwId, false);
var userServerBans = new HashSet<ServerBanDef>(serverBans);
_cachedServerBans[userId] = userServerBans;
}
//Miracle edit end
public void Restart()
{
// Clear out players that have disconnected.
@@ -110,6 +124,7 @@ public sealed class BanManager : IBanManager, IPostInjectInit
foreach (var player in toRemove)
{
_cachedRoleBans.Remove(player);
_cachedServerBans.Remove(player); //Miracle edit
}
// Check for expired bans
@@ -117,6 +132,13 @@ public sealed class BanManager : IBanManager, IPostInjectInit
{
roleBans.RemoveWhere(ban => DateTimeOffset.Now > ban.ExpirationTime);
}
//Miracle edit start
foreach (var serverBan in _cachedServerBans.Values)
{
serverBan.RemoveWhere(ban => DateTimeOffset.Now > ban.ExpirationTime);
}
//Miracle edit end
}
#region Server Bans
@@ -182,6 +204,12 @@ public sealed class BanManager : IBanManager, IPostInjectInit
_sawmill.Info(logMessage);
_chat.SendAdminAlert(logMessage);
if (banDef.UserId.HasValue)
{
_cachedServerBans.GetOrNew(banDef.UserId.Value).Add(banDef);
}
// If we're not banning a player we don't care about disconnecting people
if (target == null)
return;
@@ -189,12 +217,32 @@ public sealed class BanManager : IBanManager, IPostInjectInit
// Is the player connected?
if (!_playerManager.TryGetSessionById(target.Value, out var targetPlayer))
return;
// If they are, kick them
var message = banDef.FormatBanMessage(_cfg, _localizationManager);
targetPlayer.Channel.Disconnect(message);
// Kick when perma
if (banDef.ExpirationTime == null)
{
var message = banDef.FormatBanMessage(_cfg, _localizationManager);
targetPlayer.Channel.Disconnect(message);
}
else // Teleport to gulag
{
var gulag = _systems.GetEntitySystem<GulagSystem>();
gulag.SendToGulag(targetPlayer);
}
}
#endregion
//Miracle edit start
public HashSet<ServerBanDef> GetServerBans(NetUserId userId)
{
if (_cachedServerBans.TryGetValue(userId, out var bans))
{
return bans;
}
return new HashSet<ServerBanDef>();
}
//Miracle edit end
#region Job Bans
// If you are trying to remove timeOfBan, please don't. It's there because the note system groups role bans by time, reason and banning admin.
// Removing it will clutter the note list. Please also make sure that department bans are applied to roles with the same DateTimeOffset.