Changed command dictionary to a command tree. Fixed various requests. OBS reconnection added if identified previously.
This commit is contained in:
@@ -2,19 +2,18 @@ using CommonSocketLibrary.Abstract;
|
||||
using CommonSocketLibrary.Common;
|
||||
using Serilog;
|
||||
using TwitchChatTTS.OBS.Socket.Data;
|
||||
using TwitchChatTTS.OBS.Socket.Manager;
|
||||
|
||||
namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
{
|
||||
public class EventMessageHandler : IWebSocketHandler
|
||||
{
|
||||
private readonly OBSManager _manager;
|
||||
private readonly ILogger _logger;
|
||||
public int OperationCode { get; } = 5;
|
||||
|
||||
public EventMessageHandler(OBSManager manager, ILogger logger)
|
||||
public EventMessageHandler(
|
||||
ILogger logger
|
||||
)
|
||||
{
|
||||
_manager = manager;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
@@ -22,6 +21,8 @@ namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
{
|
||||
if (data is not EventMessage message || message == null)
|
||||
return;
|
||||
if (sender is not OBSSocketClient obs)
|
||||
return;
|
||||
|
||||
switch (message.EventType)
|
||||
{
|
||||
@@ -31,10 +32,10 @@ namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
|
||||
string? raw_state = message.EventData["outputState"].ToString();
|
||||
string? state = raw_state?.Substring(21).ToLower();
|
||||
_manager.Streaming = message.EventData["outputActive"].ToString().ToLower() == "true";
|
||||
obs.Streaming = message.EventData["outputActive"].ToString()!.ToLower() == "true";
|
||||
_logger.Warning("Stream " + (state != null && state.EndsWith("ing") ? "is " : "has ") + state + ".");
|
||||
|
||||
if (_manager.Streaming == false && state != null && !state.EndsWith("ing"))
|
||||
if (obs.Streaming == false && state != null && !state.EndsWith("ing"))
|
||||
{
|
||||
// Stream ended
|
||||
}
|
||||
|
||||
@@ -26,9 +26,9 @@ namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
|
||||
string? password = string.IsNullOrWhiteSpace(_configuration.Obs?.Password) ? null : _configuration.Obs.Password.Trim();
|
||||
_logger.Verbose("OBS websocket password: " + password);
|
||||
if (message.Authentication == null || string.IsNullOrWhiteSpace(password))
|
||||
if (message.Authentication == null || string.IsNullOrEmpty(password))
|
||||
{
|
||||
await sender.Send(1, new IdentifyMessage(message.RpcVersion, string.Empty, 1023 | 262144));
|
||||
await sender.Send(1, new IdentifyMessage(message.RpcVersion, null, 1023 | 262144));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
|
||||
string secret = password + salt;
|
||||
byte[] bytes = Encoding.UTF8.GetBytes(secret);
|
||||
string hash = null;
|
||||
string? hash = null;
|
||||
using (var sha = SHA256.Create())
|
||||
{
|
||||
bytes = sha.ComputeHash(bytes);
|
||||
|
||||
@@ -2,19 +2,16 @@ using CommonSocketLibrary.Abstract;
|
||||
using CommonSocketLibrary.Common;
|
||||
using Serilog;
|
||||
using TwitchChatTTS.OBS.Socket.Data;
|
||||
using TwitchChatTTS.OBS.Socket.Manager;
|
||||
|
||||
namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
{
|
||||
public class IdentifiedHandler : IWebSocketHandler
|
||||
{
|
||||
private readonly OBSManager _manager;
|
||||
private readonly ILogger _logger;
|
||||
public int OperationCode { get; } = 2;
|
||||
|
||||
public IdentifiedHandler(OBSManager manager, ILogger logger)
|
||||
public IdentifiedHandler(ILogger logger)
|
||||
{
|
||||
_manager = manager;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
@@ -22,20 +19,22 @@ namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
{
|
||||
if (data is not IdentifiedMessage message || message == null)
|
||||
return;
|
||||
if (sender is not OBSSocketClient obs)
|
||||
return;
|
||||
|
||||
_manager.Connected = true;
|
||||
obs.Identified = true;
|
||||
_logger.Information("Connected to OBS via rpc version " + message.NegotiatedRpcVersion + ".");
|
||||
|
||||
try
|
||||
{
|
||||
await _manager.GetGroupList(async groups => await _manager.GetGroupSceneItemList(groups));
|
||||
await obs.GetGroupList(async groups => await obs.GetGroupSceneItemList(groups));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.Error(e, "Failed to load OBS group info upon OBS identification.");
|
||||
}
|
||||
|
||||
await _manager.UpdateStreamingState();
|
||||
await obs.UpdateStreamingState();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,22 +5,16 @@ using Microsoft.Extensions.DependencyInjection;
|
||||
using Serilog;
|
||||
using Serilog.Context;
|
||||
using TwitchChatTTS.OBS.Socket.Data;
|
||||
using TwitchChatTTS.OBS.Socket.Manager;
|
||||
|
||||
namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
{
|
||||
public class RequestBatchResponseHandler : IWebSocketHandler
|
||||
{
|
||||
private readonly IWebSocketHandler _requestResponseHandler;
|
||||
private readonly ILogger _logger;
|
||||
public int OperationCode { get; } = 9;
|
||||
|
||||
public RequestBatchResponseHandler(
|
||||
[FromKeyedServices("obs-requestresponse")] IWebSocketHandler requestResponseHandler,
|
||||
ILogger logger
|
||||
)
|
||||
public RequestBatchResponseHandler(ILogger logger)
|
||||
{
|
||||
_requestResponseHandler = requestResponseHandler;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
@@ -28,40 +22,38 @@ namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
{
|
||||
if (data is not RequestBatchResponseMessage message || message == null)
|
||||
return;
|
||||
if (sender is not OBSSocketClient obs)
|
||||
return;
|
||||
|
||||
using (LogContext.PushProperty("obsrid", message.RequestId))
|
||||
var results = message.Results.ToList();
|
||||
_logger.Debug($"Received request batch response of {results.Count} messages.");
|
||||
|
||||
int count = results.Count;
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
if (results[i] == null)
|
||||
continue;
|
||||
|
||||
var results = message.Results.ToList();
|
||||
_logger.Debug($"Received request batch response of {results.Count} messages.");
|
||||
|
||||
int count = results.Count;
|
||||
for (int i = 0; i < count; i++)
|
||||
try
|
||||
{
|
||||
if (results[i] == null)
|
||||
_logger.Debug($"Request response from OBS request batch #{i + 1}/{count}: {results[i]}");
|
||||
var response = JsonSerializer.Deserialize<RequestResponseMessage>(results[i].ToString()!, new JsonSerializerOptions()
|
||||
{
|
||||
PropertyNameCaseInsensitive = false,
|
||||
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
|
||||
});
|
||||
if (response == null)
|
||||
continue;
|
||||
|
||||
try
|
||||
{
|
||||
_logger.Debug($"Request response from OBS request batch #{i + 1}/{count}: {results[i]}");
|
||||
var response = JsonSerializer.Deserialize<RequestResponseMessage>(results[i].ToString()!, new JsonSerializerOptions()
|
||||
{
|
||||
PropertyNameCaseInsensitive = false,
|
||||
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
|
||||
});
|
||||
if (response == null)
|
||||
continue;
|
||||
|
||||
await _requestResponseHandler.Execute(sender, response);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Error(ex, "Failed to process an item in a request batch message.");
|
||||
}
|
||||
await obs.ExecuteRequest(response);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Error(ex, "Failed to process an item in a request batch message.");
|
||||
}
|
||||
|
||||
_logger.Debug($"Finished processing all request in this batch.");
|
||||
}
|
||||
|
||||
_logger.Debug($"Finished processing all request in this batch.");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,19 +3,18 @@ using CommonSocketLibrary.Abstract;
|
||||
using CommonSocketLibrary.Common;
|
||||
using Serilog;
|
||||
using TwitchChatTTS.OBS.Socket.Data;
|
||||
using TwitchChatTTS.OBS.Socket.Manager;
|
||||
|
||||
namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
{
|
||||
public class RequestResponseHandler : IWebSocketHandler
|
||||
{
|
||||
private readonly OBSManager _manager;
|
||||
private readonly ILogger _logger;
|
||||
public int OperationCode { get; } = 7;
|
||||
|
||||
public RequestResponseHandler(OBSManager manager, ILogger logger)
|
||||
public RequestResponseHandler(
|
||||
ILogger logger
|
||||
)
|
||||
{
|
||||
_manager = manager;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
@@ -23,10 +22,12 @@ namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
{
|
||||
if (data is not RequestResponseMessage message || message == null)
|
||||
return;
|
||||
if (sender is not OBSSocketClient obs)
|
||||
return;
|
||||
|
||||
_logger.Debug($"Received an OBS request response [obs request id: {message.RequestId}]");
|
||||
|
||||
var requestData = _manager.Take(message.RequestId);
|
||||
var requestData = obs.Take(message.RequestId);
|
||||
if (requestData == null)
|
||||
{
|
||||
_logger.Warning($"OBS Request Response not being processed: request not stored [obs request id: {message.RequestId}]");
|
||||
@@ -42,7 +43,7 @@ namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
switch (request.RequestType)
|
||||
{
|
||||
case "GetOutputStatus":
|
||||
_logger.Debug($"Fetched stream's live status [live: {_manager.Streaming}][obs request id: {message.RequestId}]");
|
||||
_logger.Debug($"Fetched stream's live status [live: {obs.Streaming}][obs request id: {message.RequestId}]");
|
||||
break;
|
||||
case "GetSceneItemId":
|
||||
{
|
||||
@@ -206,7 +207,7 @@ namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
}
|
||||
|
||||
foreach (var sceneItem in sceneItems)
|
||||
_manager.AddSourceId(sceneItem.SourceName, sceneItem.SceneItemId);
|
||||
obs.AddSourceId(sceneItem.SourceName, sceneItem.SceneItemId);
|
||||
|
||||
requestData.ResponseValues = new Dictionary<string, object>()
|
||||
{
|
||||
@@ -237,9 +238,9 @@ namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
return;
|
||||
}
|
||||
|
||||
_manager.Streaming = outputActive?.ToString()!.ToLower() == "true";
|
||||
obs.Streaming = outputActive?.ToString()!.ToLower() == "true";
|
||||
requestData.ResponseValues = message.ResponseData;
|
||||
_logger.Information($"OBS is currently {(_manager.Streaming ? "" : "not ")}streaming.");
|
||||
_logger.Information($"OBS is currently {(obs.Streaming ? "" : "not ")}streaming.");
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user