From d0f0afd763721b0c91e68ac5279e4c366299865c Mon Sep 17 00:00:00 2001 From: RedFlames Date: Sun, 19 Feb 2023 06:05:37 +0100 Subject: [PATCH] Make WSCMD update cooldowns per-path instead of one for all. --- CelesteNet.Server.FrontendModule/Frontend.cs | 33 ++++++++++---------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/CelesteNet.Server.FrontendModule/Frontend.cs b/CelesteNet.Server.FrontendModule/Frontend.cs index 53c7161a..14880026 100644 --- a/CelesteNet.Server.FrontendModule/Frontend.cs +++ b/CelesteNet.Server.FrontendModule/Frontend.cs @@ -33,7 +33,8 @@ public class Frontend : CelesteNetServerModule { private WebSocketServiceHost? WSHost; private Timer? StatsTimer; - private Timer? WSUpdateCooldown; + private Dictionary WSUpdateCooldowns; + public static readonly long WSUpdateCooldownTime = 1000; #if NETCORE private readonly FileExtensionContentTypeProvider ContentTypeProvider = new(); @@ -96,9 +97,7 @@ public override void Start() { StatsTimer.Elapsed += (_, _) => RCEndpoints.UpdateStats(Server); StatsTimer.Enabled = true; - WSUpdateCooldown = new(500); - WSUpdateCooldown.AutoReset = false; - WSUpdateCooldown.Elapsed += (_, _) => WSUpdateCooldown.Stop(); + WSUpdateCooldowns = new(); } public override void Dispose() { @@ -133,29 +132,29 @@ public override void Dispose() { } private void OnConnect(CelesteNetServer server, CelesteNetConnection con) { - TryBroadcastCMD(false, "update", Settings.APIPrefix + "/status"); + TryBroadcastUpdate(Settings.APIPrefix + "/status"); } private void OnSessionStart(CelesteNetPlayerSession session) { BroadcastCMD(false, "sess_join", PlayerSessionToFrontend(session, shorten: true)); - TryBroadcastCMD(false, "update", Settings.APIPrefix + "/status"); - TryBroadcastCMD(false, "update", Settings.APIPrefix + "/players"); + TryBroadcastUpdate(Settings.APIPrefix + "/status"); + TryBroadcastUpdate(Settings.APIPrefix + "/players"); session.OnEnd += OnSessionEnd; } private void OnSessionEnd(CelesteNetPlayerSession session, DataPlayerInfo? lastPlayerInfo) { BroadcastCMD(false, "sess_leave", PlayerSessionToFrontend(session, shorten: true)); - TryBroadcastCMD(false, "update", Settings.APIPrefix + "/status"); - TryBroadcastCMD(false, "update", Settings.APIPrefix + "/players"); + TryBroadcastUpdate(Settings.APIPrefix + "/status"); + TryBroadcastUpdate(Settings.APIPrefix + "/players"); } private void OnDisconnect(CelesteNetServer server, CelesteNetConnection con, CelesteNetPlayerSession? session) { if (session == null) - TryBroadcastCMD(false, "update", Settings.APIPrefix + "/status"); + TryBroadcastUpdate(Settings.APIPrefix + "/status"); } private void OnBroadcastChannels(Channels obj) { - TryBroadcastCMD(false, "update", Settings.APIPrefix + "/channels"); + TryBroadcastUpdate(Settings.APIPrefix + "/channels"); } private void OnChannelMove(CelesteNetPlayerSession session, Channel? from, Channel to) { @@ -411,13 +410,15 @@ public void BroadcastRawObject(bool authOnly, object obj) { BroadcastRawString(authOnly, sr.ReadToEnd()); } - public void TryBroadcastCMD(bool authOnly, string id, object obj) { - if (WSUpdateCooldown?.Enabled ?? false) { - Logger.Log(LogLevel.VVV, "frontend", $"Not sending {id} wscmd because of WSUpdateCooldown"); + public void TryBroadcastUpdate(string path, bool authOnly = false) { + WSUpdateCooldowns.TryGetValue(path, out long cd); + if (cd > DateTime.UtcNow.Ticks / TimeSpan.TicksPerMillisecond) { + Logger.Log(LogLevel.VVV, "frontend", $"Not sending 'cmd update {path}' wscmd because of WSUpdateCooldown"); return; } - WSUpdateCooldown?.Start(); - BroadcastCMD(authOnly, id, obj); + WSUpdateCooldowns[path] = DateTime.UtcNow.Ticks / TimeSpan.TicksPerMillisecond + WSUpdateCooldownTime; + + BroadcastCMD(authOnly, "update", path); } public void BroadcastCMD(bool authOnly, string id, object obj) {