From b6a4dd560961ddd670bedf18554184eeb839a95b Mon Sep 17 00:00:00 2001 From: HitPanda <104197232+EnefFlow@users.noreply.github.com> Date: Wed, 17 May 2023 18:04:10 +0300 Subject: [PATCH] [Fix] Socket packet loss fix (#75) --- .../UtkaIntegration/TCP/UtkaTCPSession.cs | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/Content.Server/UtkaIntegration/TCP/UtkaTCPSession.cs b/Content.Server/UtkaIntegration/TCP/UtkaTCPSession.cs index b5d8cb1648..681e1f1eca 100644 --- a/Content.Server/UtkaIntegration/TCP/UtkaTCPSession.cs +++ b/Content.Server/UtkaIntegration/TCP/UtkaTCPSession.cs @@ -4,12 +4,14 @@ using System.Text; using System.Text.Json; using NetCoreServer; using Newtonsoft.Json.Linq; +using System.Text.RegularExpressions; namespace Content.Server.UtkaIntegration.TCP; public sealed class UtkaTCPSession : TcpSession { public event EventHandler? OnMessageReceived; + private string BufferCahce = string.Empty; public bool Authenticated { get; set; } @@ -19,13 +21,9 @@ public sealed class UtkaTCPSession : TcpSession protected override void OnReceived(byte[] buffer, long offset, long size) { - if (!ValidateMessage(buffer, offset, size, out var message)) - { - this.SendAsync("Validation fail"); - return; - } + BufferCahce += Encoding.UTF8.GetString(buffer, (int) offset, (int) size); - OnMessageReceived?.Invoke(this, message!); + HandleCache(); } protected override void OnError(SocketError error) @@ -36,13 +34,12 @@ public sealed class UtkaTCPSession : TcpSession protected override void OnConnected() { - SendAsync("HandShake??? Hello."); + SendAsync("Utka sosal handshake"); base.OnConnected(); } - private bool ValidateMessage(byte[] buffer, long offset, long size, out UtkaBaseMessage? fromDiscordMessage) + private bool ValidateMessage(string message, out UtkaBaseMessage? fromDiscordMessage) { - var message = Encoding.UTF8.GetString(buffer, (int) offset, (int) size); fromDiscordMessage = null; if (string.IsNullOrEmpty(message)) @@ -77,5 +74,26 @@ public sealed class UtkaTCPSession : TcpSession { base.OnDisconnecting(); Dispose(); + BufferCahce = string.Empty; + } + + private void HandleCache() + { + var regex = new Regex("{.+?}"); + var matches = regex.Matches(BufferCahce); + + foreach (Match match in matches) + { + var pos = BufferCahce.IndexOf(match.Value); + BufferCahce = BufferCahce.Substring(0, pos) + BufferCahce.Substring(pos + match.Value.Length); + + if (!ValidateMessage(match.Value, out var message)) + { + this.SendAsync("Validation fail"); + return; + } + + OnMessageReceived?.Invoke(this, message!); + } } }