Revised the redeem system, activated via channel point redeems. Added OBS transformation to redeems. Logs changed & writes to logs folder as well. Removed most use of IServiceProvider.
This commit is contained in:
@@ -7,31 +7,29 @@ namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
{
|
||||
public class EventMessageHandler : IWebSocketHandler
|
||||
{
|
||||
private ILogger _logger { get; }
|
||||
private IServiceProvider _serviceProvider { get; }
|
||||
public int OperationCode { get; set; } = 5;
|
||||
private readonly ILogger _logger;
|
||||
public int OperationCode { get; } = 5;
|
||||
|
||||
public EventMessageHandler(ILogger logger, IServiceProvider serviceProvider)
|
||||
public EventMessageHandler(ILogger logger)
|
||||
{
|
||||
_logger = logger;
|
||||
_serviceProvider = serviceProvider;
|
||||
}
|
||||
|
||||
public async Task Execute<Data>(SocketClient<WebSocketMessage> sender, Data message)
|
||||
public async Task Execute<Data>(SocketClient<WebSocketMessage> sender, Data data)
|
||||
{
|
||||
if (message is not EventMessage obj || obj == null)
|
||||
if (data is not EventMessage message || message == null)
|
||||
return;
|
||||
|
||||
switch (obj.EventType)
|
||||
switch (message.EventType)
|
||||
{
|
||||
case "StreamStateChanged":
|
||||
case "RecordStateChanged":
|
||||
if (sender is not OBSSocketClient client)
|
||||
return;
|
||||
|
||||
string? raw_state = obj.EventData["outputState"].ToString();
|
||||
string? raw_state = message.EventData["outputState"].ToString();
|
||||
string? state = raw_state?.Substring(21).ToLower();
|
||||
client.Live = obj.EventData["outputActive"].ToString() == "True";
|
||||
client.Live = message.EventData["outputActive"].ToString() == "True";
|
||||
_logger.Warning("Stream " + (state != null && state.EndsWith("ing") ? "is " : "has ") + state + ".");
|
||||
|
||||
if (client.Live == false && state != null && !state.EndsWith("ing"))
|
||||
@@ -40,7 +38,7 @@ namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
}
|
||||
break;
|
||||
default:
|
||||
_logger.Debug(obj.EventType + " EVENT: " + string.Join(" | ", obj.EventData?.Select(x => x.Key + "=" + x.Value?.ToString()) ?? new string[0]));
|
||||
_logger.Debug(message.EventType + " EVENT: " + string.Join(" | ", message.EventData?.Select(x => x.Key + "=" + x.Value?.ToString()) ?? new string[0]));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,30 +10,30 @@ namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
{
|
||||
public class HelloHandler : IWebSocketHandler
|
||||
{
|
||||
private ILogger _logger { get; }
|
||||
public int OperationCode { get; set; } = 0;
|
||||
private HelloContext _context { get; }
|
||||
private readonly HelloContext _context;
|
||||
private readonly ILogger _logger;
|
||||
public int OperationCode { get; } = 0;
|
||||
|
||||
public HelloHandler(ILogger logger, HelloContext context)
|
||||
public HelloHandler(HelloContext context, ILogger logger)
|
||||
{
|
||||
_logger = logger;
|
||||
_context = context;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task Execute<Data>(SocketClient<WebSocketMessage> sender, Data message)
|
||||
public async Task Execute<Data>(SocketClient<WebSocketMessage> sender, Data data)
|
||||
{
|
||||
if (message is not HelloMessage obj || obj == null)
|
||||
if (data is not HelloMessage message || message == null)
|
||||
return;
|
||||
|
||||
_logger.Verbose("OBS websocket password: " + _context.Password);
|
||||
if (obj.Authentication == null || string.IsNullOrWhiteSpace(_context.Password))
|
||||
if (message.Authentication == null || string.IsNullOrWhiteSpace(_context.Password))
|
||||
{
|
||||
await sender.Send(1, new IdentifyMessage(obj.RpcVersion, string.Empty, 1023 | 262144));
|
||||
await sender.Send(1, new IdentifyMessage(message.RpcVersion, string.Empty, 1023 | 262144));
|
||||
return;
|
||||
}
|
||||
|
||||
var salt = obj.Authentication.Salt;
|
||||
var challenge = obj.Authentication.Challenge;
|
||||
var salt = message.Authentication.Salt;
|
||||
var challenge = message.Authentication.Challenge;
|
||||
_logger.Verbose("Salt: " + salt);
|
||||
_logger.Verbose("Challenge: " + challenge);
|
||||
|
||||
@@ -52,7 +52,7 @@ namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
}
|
||||
|
||||
_logger.Verbose("Final hash: " + hash);
|
||||
await sender.Send(1, new IdentifyMessage(obj.RpcVersion, hash, 1023 | 262144));
|
||||
await sender.Send(1, new IdentifyMessage(message.RpcVersion, hash, 1023 | 262144));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,21 +7,29 @@ namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
{
|
||||
public class IdentifiedHandler : IWebSocketHandler
|
||||
{
|
||||
private ILogger Logger { get; }
|
||||
public int OperationCode { get; set; } = 2;
|
||||
private readonly ILogger _logger;
|
||||
public int OperationCode { get; } = 2;
|
||||
|
||||
public IdentifiedHandler(ILogger logger)
|
||||
{
|
||||
Logger = logger;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task Execute<Data>(SocketClient<WebSocketMessage> sender, Data message)
|
||||
public async Task Execute<Data>(SocketClient<WebSocketMessage> sender, Data data)
|
||||
{
|
||||
if (message is not IdentifiedMessage obj || obj == null)
|
||||
if (data is not IdentifiedMessage message || message == null)
|
||||
return;
|
||||
|
||||
sender.Connected = true;
|
||||
Logger.Information("Connected to OBS via rpc version " + obj.NegotiatedRpcVersion + ".");
|
||||
_logger.Information("Connected to OBS via rpc version " + message.NegotiatedRpcVersion + ".");
|
||||
|
||||
await Task.Delay(TimeSpan.FromSeconds(5));
|
||||
|
||||
/*var messages = new RequestMessage[] {
|
||||
//new RequestMessage("Sleep", string.Empty, new Dictionary<string, object>() { { "sleepMillis", 5000 } }),
|
||||
new RequestMessage("GetSceneItemId", string.Empty, new Dictionary<string, object>() { { "sceneName", "Generic" }, { "sourceName", "ABCDEF" } }),
|
||||
};
|
||||
await _manager.Send(messages);*/
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,18 +11,17 @@ namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
{
|
||||
public class RequestBatchResponseHandler : IWebSocketHandler
|
||||
{
|
||||
private OBSRequestBatchManager _manager { get; }
|
||||
private IServiceProvider _serviceProvider { get; }
|
||||
private ILogger _logger { get; }
|
||||
private JsonSerializerOptions _options;
|
||||
public int OperationCode { get; set; } = 9;
|
||||
private readonly IWebSocketHandler _requestResponseHandler;
|
||||
private readonly ILogger _logger;
|
||||
public int OperationCode { get; } = 9;
|
||||
|
||||
public RequestBatchResponseHandler(OBSRequestBatchManager manager, JsonSerializerOptions options, IServiceProvider serviceProvider, ILogger logger)
|
||||
public RequestBatchResponseHandler(
|
||||
[FromKeyedServices("obs-requestresponse")] IWebSocketHandler requestResponseHandler,
|
||||
ILogger logger
|
||||
)
|
||||
{
|
||||
_manager = manager;
|
||||
_serviceProvider = serviceProvider;
|
||||
_requestResponseHandler = requestResponseHandler;
|
||||
_logger = logger;
|
||||
_options = options;
|
||||
}
|
||||
|
||||
public async Task Execute<Data>(SocketClient<WebSocketMessage> sender, Data data)
|
||||
@@ -32,54 +31,37 @@ namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
|
||||
using (LogContext.PushProperty("obsrid", message.RequestId))
|
||||
{
|
||||
|
||||
|
||||
var results = message.Results.ToList();
|
||||
_logger.Debug($"Received request batch response of {results.Count} messages.");
|
||||
|
||||
var requestData = _manager.Take(message.RequestId);
|
||||
if (requestData == null || !results.Any())
|
||||
{
|
||||
_logger.Verbose($"Received request batch response of {results.Count} messages.");
|
||||
return;
|
||||
}
|
||||
|
||||
IList<Task> tasks = new List<Task>();
|
||||
int count = Math.Min(results.Count, requestData.RequestTypes.Count);
|
||||
int count = results.Count;
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
Type type = requestData.RequestTypes[i];
|
||||
|
||||
using (LogContext.PushProperty("type", type.Name))
|
||||
if (results[i] == null)
|
||||
continue;
|
||||
|
||||
try
|
||||
{
|
||||
try
|
||||
_logger.Debug($"Request response from OBS request batch #{i + 1}/{count}: {results[i]}");
|
||||
var response = JsonSerializer.Deserialize<RequestResponseMessage>(results[i].ToString(), new JsonSerializerOptions()
|
||||
{
|
||||
var handler = GetResponseHandlerForRequestType(type);
|
||||
_logger.Verbose($"Request handled by {handler.GetType().Name}.");
|
||||
tasks.Add(handler.Execute(sender, results[i]));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Error(ex, "Failed to process an item in a request batch message.");
|
||||
}
|
||||
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.");
|
||||
}
|
||||
}
|
||||
|
||||
_logger.Verbose($"Waiting for processing to complete.");
|
||||
await Task.WhenAll(tasks);
|
||||
|
||||
_logger.Debug($"Finished processing all request in this batch.");
|
||||
}
|
||||
}
|
||||
|
||||
private IWebSocketHandler? GetResponseHandlerForRequestType(Type type)
|
||||
{
|
||||
if (type == typeof(RequestMessage))
|
||||
return _serviceProvider.GetRequiredKeyedService<IWebSocketHandler>("obs-requestresponse");
|
||||
else if (type == typeof(RequestBatchMessage))
|
||||
return _serviceProvider.GetRequiredKeyedService<IWebSocketHandler>("obs-requestbatcresponse");
|
||||
else if (type == typeof(IdentifyMessage))
|
||||
return _serviceProvider.GetRequiredKeyedService<IWebSocketHandler>("obs-identified");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,36 +2,100 @@ 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 ILogger Logger { get; }
|
||||
public int OperationCode { get; set; } = 7;
|
||||
private readonly OBSManager _manager;
|
||||
private readonly ILogger _logger;
|
||||
public int OperationCode { get; } = 7;
|
||||
|
||||
public RequestResponseHandler(ILogger logger)
|
||||
public RequestResponseHandler(OBSManager manager, ILogger logger)
|
||||
{
|
||||
Logger = logger;
|
||||
_manager = manager;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task Execute<Data>(SocketClient<WebSocketMessage> sender, Data message)
|
||||
public async Task Execute<Data>(SocketClient<WebSocketMessage> sender, Data data)
|
||||
{
|
||||
if (message is not RequestResponseMessage obj || obj == null)
|
||||
if (data is not RequestResponseMessage message || message == null)
|
||||
return;
|
||||
|
||||
switch (obj.RequestType)
|
||||
{
|
||||
case "GetOutputStatus":
|
||||
if (sender is not OBSSocketClient client)
|
||||
return;
|
||||
_logger.Debug($"Received an OBS request response [response id: {message.RequestId}]");
|
||||
|
||||
if (obj.RequestId == "stream")
|
||||
{
|
||||
client.Live = obj.ResponseData["outputActive"].ToString() == "True";
|
||||
Logger.Warning("Updated stream's live status to " + client.Live);
|
||||
}
|
||||
break;
|
||||
var requestData = _manager.Take(message.RequestId);
|
||||
if (requestData == null)
|
||||
{
|
||||
_logger.Warning($"OBS Request Response not being processed: request not stored [response id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
|
||||
var request = requestData.Message;
|
||||
if (request == null)
|
||||
return;
|
||||
|
||||
try
|
||||
{
|
||||
switch (request.RequestType)
|
||||
{
|
||||
case "GetOutputStatus":
|
||||
if (sender is not OBSSocketClient client)
|
||||
return;
|
||||
|
||||
if (message.RequestId == "stream")
|
||||
{
|
||||
client.Live = message.ResponseData["outputActive"].ToString() == "True";
|
||||
_logger.Warning($"Updated stream's live status to {client.Live} [response id: {message.RequestId}]");
|
||||
}
|
||||
break;
|
||||
case "GetSceneItemId":
|
||||
if (!request.RequestData.TryGetValue("sceneName", out object sceneName))
|
||||
{
|
||||
_logger.Warning($"Failed to find the scene name that was requested [response id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
if (!request.RequestData.TryGetValue("sourceName", out object sourceName))
|
||||
{
|
||||
_logger.Warning($"Failed to find the scene item name that was requested [scene: {sceneName}][response id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
if (!message.ResponseData.TryGetValue("sceneItemId", out object sceneItemId)) {
|
||||
_logger.Warning($"Failed to fetch the scene item id [scene: {sceneName}][scene item: {sourceName}][response id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
|
||||
_logger.Information($"Added scene item id [scene: {sceneName}][source: {sourceName}][id: {sceneItemId}][response id: {message.RequestId}].");
|
||||
_manager.AddSourceId(sceneName.ToString(), sourceName.ToString(), long.Parse(sceneItemId.ToString()));
|
||||
|
||||
requestData.ResponseValues = new Dictionary<string, object>
|
||||
{
|
||||
{ "sceneItemId", sceneItemId }
|
||||
};
|
||||
break;
|
||||
case "GetSceneItemTransform":
|
||||
if (!message.ResponseData.TryGetValue("sceneItemTransform", out object? transformData))
|
||||
{
|
||||
_logger.Warning($"Failed to find the OBS scene item [response id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
|
||||
_logger.Verbose("Fetching OBS transformation data: " + transformData?.ToString());
|
||||
requestData.ResponseValues = new Dictionary<string, object>
|
||||
{
|
||||
{ "sceneItemTransform", transformData }
|
||||
};
|
||||
break;
|
||||
default:
|
||||
_logger.Warning($"OBS Request Response not being processed [type: {request.RequestType}][{string.Join(Environment.NewLine, message.ResponseData?.Select(kvp => kvp.Key + " = " + kvp.Value?.ToString()) ?? new string[0])}]");
|
||||
break;
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (requestData.Callback != null)
|
||||
requestData.Callback(requestData.ResponseValues);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user