Fixed issues with TTS voice changes. Added proper handling for slave clients. Fixed several stores. Fixed database saving to safely save foreign keys.

This commit is contained in:
Tom
2025-03-06 16:11:36 +00:00
parent 3e717522c2
commit fd0bca5c7c
13 changed files with 139 additions and 96 deletions

View File

@ -45,16 +45,24 @@ namespace HermesSocketServer.Socket.Handlers
if (userId == null)
return;
IEnumerable<WebSocketUser?> recipients = Enumerable.Empty<WebSocketUser?>();
lock (_lock)
{
if (sender.Id != null)
return;
throw new Exception("User already logged in.");
sender.Id = userId;
sender.ApiKey = data.ApiKey;
sender.WebLogin = data.WebLogin;
if (string.IsNullOrWhiteSpace(sender.Id))
throw new Exception("Credentials do not match.");
recipients = _sockets.GetSockets(userId).ToList().Where(s => s.SessionId != sender.SessionId);
sender.Slave = data.WebLogin || recipients.Where(r => r?.WebLogin != true).Any();
}
sender.ApiKey = data.ApiKey;
sender.WebLogin = data.WebLogin;
var channel = _manager.Get(userId);
if (channel == null)
{
@ -73,11 +81,12 @@ namespace HermesSocketServer.Socket.Handlers
}
if (string.IsNullOrEmpty(channel.User.DefaultVoice))
_logger.Warning($"No default voice was set for an user [user id: {userId}][api key: {data.ApiKey}]");
sql = "select \"providerAccountId\" from \"Account\" where \"userId\" = @user and provider = @provider";
var result2 = await _database.ExecuteScalar(sql, new Dictionary<string, object>() { { "user", userId }, { "provider", "twitch" } });
var providerId = result2?.ToString();
if (providerId == null) {
if (providerId == null)
{
_logger.Warning($"Could not find the Provider Account Id [user id: {userId}][provider: twitch]");
return;
}
@ -86,7 +95,7 @@ namespace HermesSocketServer.Socket.Handlers
{
UserId = userId,
ProviderAccountId = providerId,
SessionId = sender.UID,
SessionId = sender.SessionId,
UserName = channel.User.Name,
OwnerId = _configuration.Tts.OwnerId,
Admin = sender.Admin,
@ -94,6 +103,7 @@ namespace HermesSocketServer.Socket.Handlers
WordFilters = channel.Filters.Get().Values,
DefaultTTSVoice = channel.User.DefaultVoice ?? _configuration.Tts.DefaultTtsVoice,
TTSVoicesAvailable = _voices.Get().ToDictionary(v => v.Key, v => v.Value.Name),
Slave = sender.Slave,
};
var userIdDict = new Dictionary<string, object>() { { "user", userId } };
@ -122,7 +132,7 @@ namespace HermesSocketServer.Socket.Handlers
await sender.Send(2, ack);
string version = data.MajorVersion == null ? "unknown" : $"{data.MajorVersion}.{data.MinorVersion}";
string version = $"{data.MajorVersion}.{data.MinorVersion}.{data.PatchVersion}";
_logger.Information($"Hermes client logged in {(sender.Admin ? "as administrator " : "")}[name: {sender.Name}][id: {userId}][ip: {sender.IPAddress}][version: {version}][web: {data.WebLogin}]");
ack = new LoginAckMessage()
@ -133,7 +143,6 @@ namespace HermesSocketServer.Socket.Handlers
WebLogin = data.WebLogin
};
var recipients = _sockets.GetSockets(userId).ToList().Where(s => s.UID != sender.UID);
var tasks = new List<Task>();
foreach (var socket in recipients)
{

View File

@ -38,7 +38,7 @@ namespace HermesSocketServer.Socket.Handlers
return Task.CompletedTask;
}
logging.Invoke(message.Exception, message.Message + $" [ip: {sender.IPAddress}][id: {sender.Id}][name: {sender.Name}][token: {sender.ApiKey}][uid: {sender.UID}]");
logging.Invoke(message.Exception, message.Message + $" [ip: {sender.IPAddress}][id: {sender.Id}][name: {sender.Name}][token: {sender.ApiKey}][uid: {sender.SessionId}]");
return Task.CompletedTask;
}
}

View File

@ -6,9 +6,10 @@ namespace HermesSocketServer.Socket
{
public class HermesSocketManager
{
private IList<WebSocketUser> _sockets;
private System.Timers.Timer _timer;
private ILogger _logger;
private readonly IList<WebSocketUser> _sockets;
private readonly System.Timers.Timer _timer;
private readonly ILogger _logger;
private readonly object _lock = new object();
public HermesSocketManager(ILogger logger)
@ -18,31 +19,40 @@ namespace HermesSocketServer.Socket
_timer.Elapsed += async (sender, e) => await HandleHeartbeats(e);
_timer.Enabled = true;
_logger = logger;
_lock = new object();
}
public void Add(WebSocketUser socket)
{
_sockets.Add(socket);
lock (_lock)
{
_sockets.Add(socket);
}
}
public IList<WebSocketUser> GetAllSockets()
{
return _sockets.AsReadOnly();
lock (_lock)
{
return _sockets.AsReadOnly();
}
}
public IEnumerable<WebSocketUser> GetSockets(string userId)
{
foreach (var socket in _sockets)
lock (_lock)
{
if (socket.Id == userId)
yield return socket;
return _sockets.Where(s => s.Id == userId);
}
}
public bool Remove(WebSocketUser socket)
{
return _sockets.Remove(socket);
lock (_lock)
{
return _sockets.Remove(socket);
}
}
private async Task HandleHeartbeats(ElapsedEventArgs e)

View File

@ -22,7 +22,8 @@ namespace HermesSocketServer.Socket
public WebSocketState State { get => _socket.State; }
public IPAddress? IPAddress { get => _ipAddress; }
public bool Connected { get => _connected; }
public string UID { get; }
public bool Slave { get; set; }
public string SessionId { get; }
public string? ApiKey { get; set; }
public string? Id { get; set; }
public string? Name { get; set; }
@ -43,7 +44,7 @@ namespace HermesSocketServer.Socket
Admin = false;
WebLogin = false;
_cts = new CancellationTokenSource();
UID = Guid.NewGuid().ToString("D");
SessionId = Guid.NewGuid().ToString("D");
LastHeartbeatReceived = DateTime.UtcNow;
}