Fixed emote duplicate issue. Improved chatter tracking. Used stores in Login Handler in cases where databases was used instead.

This commit is contained in:
Tom
2025-03-07 17:34:27 +00:00
parent fd0bca5c7c
commit 4d0743c4aa
4 changed files with 64 additions and 69 deletions

View File

@@ -2,7 +2,6 @@ using System.Net.WebSockets;
using System.Text;
using System.Text.Json;
using CommonSocketLibrary.Common;
using HermesSocketLibrary.Requests.Messages;
using HermesSocketLibrary.Socket.Data;
using HermesSocketServer.Socket;
using ILogger = Serilog.ILogger;
@@ -51,12 +50,12 @@ namespace HermesSocketLibrary
continue;
if (message.OpCode != 0)
_logger.Information($"rxm: {messageString} [ip: {socket.IPAddress}][id: {socket.Id}][name: {socket.Name}][token: {socket.ApiKey}][uid: {socket.SessionId}]");
_logger.Information($"receive: {messageString} [ip: {socket.IPAddress}][id: {socket.Id}][name: {socket.Name}][token: {socket.ApiKey}][uid: {socket.SessionId}]");
if (message.OpCode < 0 || message.OpCode > 8 || message.OpCode == 2 || message.OpCode == 4)
{
await socket.Send(5, new LoggingMessage("Received an invalid message: " + messageString, HermesLoggingLevel.Error));
return;
break;
}
bool loggedIn = !string.IsNullOrEmpty(socket.Id);
@@ -64,13 +63,13 @@ namespace HermesSocketLibrary
if (!loggedIn && !nonProtectedOps.Contains(message.OpCode))
{
_logger.Warning($"An attempt was made to use protected routes while not logged in [ip: {socket.IPAddress}][id: {socket.Id}][name: {socket.Name}][token: {socket.ApiKey}][uid: {socket.SessionId}]");
return;
break;
}
int[] protectedOps = { 0, 3, 5, 6, 7, 8 };
if (loggedIn && !protectedOps.Contains(message.OpCode))
{
_logger.Warning($"An attempt was made to use non-protected routes while logged in [ip: {socket.IPAddress}][id: {socket.Id}][name: {socket.Name}][token: {socket.ApiKey}][uid: {socket.SessionId}]");
return;
break;
}
if (message.Data == null)
@@ -80,27 +79,7 @@ namespace HermesSocketLibrary
}
string data = message.Data.ToString()!;
if (message.OpCode == 0)
message.Data = JsonSerializer.Deserialize<HeartbeatMessage>(data, _options);
else if (message.OpCode == 1)
message.Data = JsonSerializer.Deserialize<HermesLoginMessage>(data, _options);
else if (message.OpCode == 3)
message.Data = JsonSerializer.Deserialize<RequestMessage>(data, _options);
else if (message.OpCode == 5)
message.Data = JsonSerializer.Deserialize<LoggingMessage>(data, _options);
else if (message.OpCode == 6)
message.Data = JsonSerializer.Deserialize<ChatterMessage>(data, _options);
else if (message.OpCode == 7)
message.Data = JsonSerializer.Deserialize<EmoteDetailsMessage>(data, _options);
else if (message.OpCode == 8)
message.Data = JsonSerializer.Deserialize<EmoteUsageMessage>(data, _options);
//else if (message.OpCode == 9)
// message.Data = JsonSerializer.Deserialize<SlaveMessage>(data, _options);
else
{
await socket.Send(5, new LoggingMessage("Received a message with invalid data: " + messageString, HermesLoggingLevel.Error));
continue;
}
message.Data = DeserializeData(message.OpCode, data);
await _handlers.Execute(socket, message.OpCode, message.Data);
}
catch (WebSocketException wse)
@@ -120,7 +99,7 @@ namespace HermesSocketLibrary
}
catch (Exception e)
{
_logger.Information(e, $"Client failed to disconnect [ip: {socket.IPAddress}][id: {socket.Id}][name: {socket.Name}][token: {socket.ApiKey}][uid: {socket.SessionId}]");
_logger.Warning(e, $"Client failed to disconnect [ip: {socket.IPAddress}][id: {socket.Id}][name: {socket.Name}][token: {socket.ApiKey}][uid: {socket.SessionId}]");
}
finally
{
@@ -130,7 +109,6 @@ namespace HermesSocketLibrary
_logger.Information($"Client disconnected [ip: {socket.IPAddress}][id: {socket.Id}][name: {socket.Name}][token: {socket.ApiKey}][uid: {socket.SessionId}]");
// Update slave status of another client from the same user if available.
// TODO: Ensure one of the clients is always a non-slave.
if (socket.Id != null && !socket.Slave)
{
var client = _sockets.GetSockets(socket.Id).Where(s => !s.WebLogin).FirstOrDefault();
@@ -141,5 +119,24 @@ namespace HermesSocketLibrary
}
}
}
private object? DeserializeData(int opcode, string data)
{
if (opcode == 0)
return JsonSerializer.Deserialize<HeartbeatMessage>(data, _options);
else if (opcode == 1)
return JsonSerializer.Deserialize<HermesLoginMessage>(data, _options);
else if (opcode == 3)
return JsonSerializer.Deserialize<RequestMessage>(data, _options);
else if (opcode == 5)
return JsonSerializer.Deserialize<LoggingMessage>(data, _options);
else if (opcode == 6)
return JsonSerializer.Deserialize<ChatterMessage>(data, _options);
else if (opcode == 7)
return JsonSerializer.Deserialize<EmoteDetailsMessage>(data, _options);
else if (opcode == 8)
return JsonSerializer.Deserialize<EmoteUsageMessage>(data, _options);
return null;
}
}
}