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.

View File

@@ -2,6 +2,7 @@ using System.Collections.Immutable;
using System.Net;
using System.Threading.Tasks;
using Content.Server._White.PandaSocket.Interfaces;
using Content.Server.Database;
using Content.Shared.Database;
using Content.Shared.Roles;
using Robust.Shared.Network;
@@ -28,6 +29,8 @@ public interface IBanManager
public HashSet<string>? GetRoleBans(NetUserId playerUserId);
public HashSet<string>? GetJobBans(NetUserId playerUserId);
public HashSet<ServerBanDef> GetServerBans(NetUserId userId); // Miracle edit
/// <summary>
/// Creates a job ban for the specified target, username or GUID
/// </summary>

View File

@@ -6,6 +6,7 @@ using System.Text.Json.Nodes;
using System.Text.Json.Serialization;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Content.Server._Miracle.GulagSystem;
using Content.Server.Administration.Managers;
using Content.Server.GameTicking;
using Content.Server._White.PandaSocket.Main;
@@ -35,6 +36,8 @@ namespace Content.Server.Administration.Systems
[Dependency] private readonly GameTicker _gameTicker = default!;
[Dependency] private readonly SharedMindSystem _minds = default!;
[Dependency] private readonly PandaWebManager _pandaWeb = default!; // WD
[Dependency] private readonly GulagSystem _gulagSystem = default!; // Miracle
private ISawmill _sawmill = default!;
private readonly HttpClient _httpClient = new();
@@ -389,6 +392,12 @@ namespace Content.Server.Administration.Systems
base.OnBwoinkTextMessage(message, eventArgs);
var senderSession = eventArgs.SenderSession;
//No bwoink for banned
if (_gulagSystem.IsUserGulaged(senderSession.UserId, out _))
{
return;
}
// TODO: Sanitize text?
// Confirm that this person is actually allowed to send a message here.
var personalChannel = senderSession.UserId == message.UserId;