diff --git a/Application/IW4MServer.cs b/Application/IW4MServer.cs index e60d79c05..4edfae335 100644 --- a/Application/IW4MServer.cs +++ b/Application/IW4MServer.cs @@ -97,20 +97,27 @@ namespace IW4MAdmin override public async Task OnClientDisconnected(EFClient client) { - Logger.WriteInfo($"Client {client} [{client.State.ToString().ToLower()}] disconnecting..."); - await client.OnDisconnect(); - Clients[client.ClientNumber] = null; #if DEBUG == true - Logger.WriteDebug($"End PreDisconnect for {client}"); -#endif - var e = new GameEvent() + if (client.ClientNumber >= 0) { - Origin = client, - Owner = this, - Type = GameEvent.EventType.Disconnect - }; +#endif + Logger.WriteInfo($"Client {client} [{client.State.ToString().ToLower()}] disconnecting..."); + await client.OnDisconnect(); + Clients[client.ClientNumber] = null; +#if DEBUG == true + Logger.WriteDebug($"End PreDisconnect for {client}"); +#endif + var e = new GameEvent() + { + Origin = client, + Owner = this, + Type = GameEvent.EventType.Disconnect + }; - Manager.GetEventHandler().AddEvent(e); + Manager.GetEventHandler().AddEvent(e); +#if DEBUG == true + } +#endif } public override async Task ExecuteEvent(GameEvent E) @@ -751,7 +758,7 @@ namespace IW4MAdmin } CustomCallback = await ScriptLoaded(); - + // they've manually specified the log path if (!string.IsNullOrEmpty(ServerConfig.ManualLogPath)) { diff --git a/SharedLibraryCore/Dtos/PenaltyInfo.cs b/SharedLibraryCore/Dtos/PenaltyInfo.cs index 9a959be10..458653865 100644 --- a/SharedLibraryCore/Dtos/PenaltyInfo.cs +++ b/SharedLibraryCore/Dtos/PenaltyInfo.cs @@ -19,5 +19,6 @@ namespace SharedLibraryCore.Dtos public string Type { get; set; } public string TimePunished { get; set; } public string TimeRemaining { get; set; } + public bool Expired { get; set; } } } diff --git a/SharedLibraryCore/Services/ChangeHistoryService.cs b/SharedLibraryCore/Services/ChangeHistoryService.cs index c9d737304..ac1089886 100644 --- a/SharedLibraryCore/Services/ChangeHistoryService.cs +++ b/SharedLibraryCore/Services/ChangeHistoryService.cs @@ -5,7 +5,6 @@ using SharedLibraryCore.Interfaces; using System; using System.Collections.Generic; using System.Linq; -using System.Text; using System.Threading.Tasks; namespace SharedLibraryCore.Services @@ -33,6 +32,7 @@ namespace SharedLibraryCore.Services }; break; case GameEvent.EventType.Command: + // this prevents passwords/tokens being logged into the database in plain text if (e.Extra is Command cmd) { if (cmd.Name == "login" || cmd.Name == "setpassword") diff --git a/SharedLibraryCore/Services/PenaltyService.cs b/SharedLibraryCore/Services/PenaltyService.cs index 556d046d1..31f59eba7 100644 --- a/SharedLibraryCore/Services/PenaltyService.cs +++ b/SharedLibraryCore/Services/PenaltyService.cs @@ -197,7 +197,8 @@ namespace SharedLibraryCore.Services Offense = penalty.Offense, Type = penalty.Type.ToString(), TimeRemaining = penalty.Expires.HasValue ? (now > penalty.Expires ? "" : penalty.Expires.ToString()) : DateTime.MaxValue.ToString(), - AutomatedOffense = penalty.AutomatedOffense + AutomatedOffense = penalty.AutomatedOffense, + Expired = penalty.Expires.HasValue && penalty.Expires <= DateTime.UtcNow }, When = penalty.When, Sensitive = penalty.Type == Penalty.PenaltyType.Flag @@ -216,6 +217,11 @@ namespace SharedLibraryCore.Services if (pi.TimeRemaining?.Length > 0) { pi.TimeRemaining = (DateTime.Parse(((PenaltyInfo)p.Value).TimeRemaining) - now).TimeSpanText(); + + if (!pi.Expired) + { + pi.TimeRemaining = $"{pi.TimeRemaining} {Utilities.CurrentLocalization.LocalizationIndex["WEBFRONT_PENALTY_TEMPLATE_REMAINING"]}"; + } } }); return list; diff --git a/WebfrontCore/Controllers/ClientController.cs b/WebfrontCore/Controllers/ClientController.cs index 4e9daa81c..e7ab06ace 100644 --- a/WebfrontCore/Controllers/ClientController.cs +++ b/WebfrontCore/Controllers/ClientController.cs @@ -95,6 +95,18 @@ namespace WebfrontCore.Controllers administeredPenaltiesMeta.ForEach(p => p.Value.Offense = p.Value.AutomatedOffense ?? p.Value.Offense); } + var currentPenalty = activePenalties.FirstOrDefault(); + + if (currentPenalty != null && currentPenalty.Type == SharedLibraryCore.Objects.Penalty.PenaltyType.TempBan) + { + clientDto.Meta.Add(new ProfileMeta() + { + Key = Localization["WEBFRONT_CLIENT_META_REMAINING_BAN"], + Value = ((currentPenalty.Expires - DateTime.UtcNow) ?? new TimeSpan()).TimeSpanText(), + When = currentPenalty.When + }); + } + clientDto.Meta.AddRange(Authorized ? meta : meta.Where(m => !m.Sensitive)); clientDto.Meta.AddRange(Authorized ? penaltyMeta : penaltyMeta.Where(m => !m.Sensitive)); clientDto.Meta.AddRange(Authorized ? administeredPenaltiesMeta : administeredPenaltiesMeta.Where(m => !m.Sensitive)); diff --git a/WebfrontCore/wwwroot/js/profile.js b/WebfrontCore/wwwroot/js/profile.js index 0e6fca51d..53b32e620 100644 --- a/WebfrontCore/wwwroot/js/profile.js +++ b/WebfrontCore/wwwroot/js/profile.js @@ -209,7 +209,7 @@ function loadMeta(meta) { if (meta.class.includes("Penalty")) { if (meta.value.punisherId !== clientInfo.clientId) { const timeRemaining = meta.value.type === 'TempBan' && meta.value.timeRemaining.length > 0 ? - `(${meta.value.timeRemaining} remaining)` : + `(${meta.value.timeRemaining})` : ''; eventString = `
${penaltyToName(meta.value.type)} by ${meta.value.punisherName} for ${meta.value.offense} ${timeRemaining}
`; }