Kicking AFK players (#12812)
* Kicking AFK players * Set correct CCvar values
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
using System.Linq;
|
||||
using Content.Server.Afk.Events;
|
||||
using Content.Server.Chat.Managers;
|
||||
using Content.Server.GameTicking;
|
||||
using Content.Shared.CCVar;
|
||||
using Robust.Server.Player;
|
||||
@@ -20,17 +21,20 @@ public sealed class AFKSystem : EntitySystem
|
||||
[Dependency] private readonly IPlayerManager _playerManager = default!;
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
[Dependency] private readonly GameTicker _ticker = default!;
|
||||
[Dependency] private readonly IChatManager _chatManager = default!;
|
||||
|
||||
private float _checkDelay;
|
||||
private float _kickDelay;
|
||||
private TimeSpan _checkTime;
|
||||
|
||||
private readonly HashSet<IPlayerSession> _afkPlayers = new();
|
||||
private readonly Dictionary<IPlayerSession, TimeSpan> _afkPlayers = new();
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
_playerManager.PlayerStatusChanged += OnPlayerChange;
|
||||
_configManager.OnValueChanged(CCVars.AfkTime, SetAfkDelay, true);
|
||||
_configManager.OnValueChanged(CCVars.AfkKickTime, SetAfkKickDelay, true);
|
||||
}
|
||||
|
||||
private void SetAfkDelay(float obj)
|
||||
@@ -38,6 +42,11 @@ public sealed class AFKSystem : EntitySystem
|
||||
_checkDelay = obj;
|
||||
}
|
||||
|
||||
private void SetAfkKickDelay(float obj)
|
||||
{
|
||||
_kickDelay = obj;
|
||||
}
|
||||
|
||||
private void OnPlayerChange(object? sender, SessionStatusEventArgs e)
|
||||
{
|
||||
switch (e.NewStatus)
|
||||
@@ -54,6 +63,7 @@ public sealed class AFKSystem : EntitySystem
|
||||
_afkPlayers.Clear();
|
||||
_playerManager.PlayerStatusChanged -= OnPlayerChange;
|
||||
_configManager.UnsubValueChanged(CCVars.AfkTime, SetAfkDelay);
|
||||
_configManager.UnsubValueChanged(CCVars.AfkKickTime, SetAfkKickDelay);
|
||||
}
|
||||
|
||||
public override void Update(float frameTime)
|
||||
@@ -78,18 +88,25 @@ public sealed class AFKSystem : EntitySystem
|
||||
var pSession = (IPlayerSession) session;
|
||||
var isAfk = _afkManager.IsAfk(pSession);
|
||||
|
||||
if (isAfk && _afkPlayers.Add(pSession))
|
||||
if (isAfk && _afkPlayers.TryAdd(pSession, _timing.CurTime))
|
||||
{
|
||||
var ev = new AFKEvent(pSession);
|
||||
RaiseLocalEvent(ref ev);
|
||||
continue;
|
||||
|
||||
_chatManager.DispatchServerMessage(pSession, Loc.GetString("afk-system-kick-warning"));
|
||||
}
|
||||
|
||||
if (!isAfk && _afkPlayers.Remove(pSession))
|
||||
{
|
||||
var ev = new UnAFKEvent(pSession);
|
||||
RaiseLocalEvent(ref ev);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isAfk &&
|
||||
_afkPlayers.TryGetValue(pSession, out var startAfkTime) &&
|
||||
_timing.CurTime - startAfkTime >= TimeSpan.FromSeconds(_kickDelay))
|
||||
{
|
||||
pSession.ConnectedClient.Disconnect( Loc.GetString("afk-system-kick-reason"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user