Alert shared connections (#29405)
* add admin alert for active shared connections * update wizden config * review
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
using System.Collections.Immutable;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text.Json.Nodes;
|
||||
using System.Threading.Tasks;
|
||||
using Content.Server.Chat.Managers;
|
||||
using Content.Server.Database;
|
||||
using Content.Server.GameTicking;
|
||||
using Content.Server.Preferences.Managers;
|
||||
@@ -10,7 +12,9 @@ using Content.Shared.GameTicking;
|
||||
using Content.Shared.Players.PlayTimeTracking;
|
||||
using Robust.Server.Player;
|
||||
using Robust.Shared.Configuration;
|
||||
using Robust.Shared.Enums;
|
||||
using Robust.Shared.Network;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
/*
|
||||
@@ -50,6 +54,7 @@ namespace Content.Server.Connection
|
||||
[Dependency] private readonly ServerDbEntryManager _serverDbEntry = default!;
|
||||
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
||||
[Dependency] private readonly ILogManager _logManager = default!;
|
||||
[Dependency] private readonly IChatManager _chatManager = default!;
|
||||
|
||||
private readonly Dictionary<NetUserId, TimeSpan> _temporaryBypasses = [];
|
||||
private ISawmill _sawmill = default!;
|
||||
@@ -60,6 +65,7 @@ namespace Content.Server.Connection
|
||||
|
||||
_netMgr.Connecting += NetMgrOnConnecting;
|
||||
_netMgr.AssignUserIdCallback = AssignUserIdCallback;
|
||||
_plyMgr.PlayerStatusChanged += PlayerStatusChanged;
|
||||
// Approval-based IP bans disabled because they don't play well with Happy Eyeballs.
|
||||
// _netMgr.HandleApprovalCallback = HandleApproval;
|
||||
}
|
||||
@@ -128,6 +134,42 @@ namespace Content.Server.Connection
|
||||
}
|
||||
}
|
||||
|
||||
private async void PlayerStatusChanged(object? sender, SessionStatusEventArgs args)
|
||||
{
|
||||
if (args.NewStatus == SessionStatus.Connected)
|
||||
{
|
||||
AdminAlertIfSharedConnection(args.Session);
|
||||
}
|
||||
}
|
||||
|
||||
private void AdminAlertIfSharedConnection(ICommonSession newSession)
|
||||
{
|
||||
var playerThreshold = _cfg.GetCVar(CCVars.AdminAlertMinPlayersSharingConnection);
|
||||
if (playerThreshold < 0)
|
||||
return;
|
||||
|
||||
var addr = newSession.Channel.RemoteEndPoint.Address;
|
||||
|
||||
var otherConnectionsFromAddress = _plyMgr.Sessions.Where(session =>
|
||||
session.Status is SessionStatus.Connected or SessionStatus.InGame
|
||||
&& session.Channel.RemoteEndPoint.Address.Equals(addr)
|
||||
&& session.UserId != newSession.UserId)
|
||||
.ToList();
|
||||
|
||||
var otherConnectionCount = otherConnectionsFromAddress.Count;
|
||||
if (otherConnectionCount + 1 < playerThreshold) // Add one for the total, not just others, using the address
|
||||
return;
|
||||
|
||||
var username = newSession.Name;
|
||||
var otherUsernames = string.Join(", ",
|
||||
otherConnectionsFromAddress.Select(session => session.Name));
|
||||
|
||||
_chatManager.SendAdminAlert(Loc.GetString("admin-alert-shared-connection",
|
||||
("player", username),
|
||||
("otherCount", otherConnectionCount),
|
||||
("otherList", otherUsernames)));
|
||||
}
|
||||
|
||||
/*
|
||||
* TODO: Jesus H Christ what is this utter mess of a function
|
||||
* TODO: Break this apart into is constituent steps.
|
||||
|
||||
Reference in New Issue
Block a user