Added several redemption actions. Added certain login features. Fixed OBS command. Added more logging.
This commit is contained in:
@ -22,14 +22,6 @@ namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
|
||||
sender.Connected = true;
|
||||
_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);*/
|
||||
}
|
||||
}
|
||||
}
|
@ -23,12 +23,12 @@ namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
if (data is not RequestResponseMessage message || message == null)
|
||||
return;
|
||||
|
||||
_logger.Debug($"Received an OBS request response [response id: {message.RequestId}]");
|
||||
_logger.Debug($"Received an OBS request response [obs request id: {message.RequestId}]");
|
||||
|
||||
var requestData = _manager.Take(message.RequestId);
|
||||
if (requestData == null)
|
||||
{
|
||||
_logger.Warning($"OBS Request Response not being processed: request not stored [response id: {message.RequestId}]");
|
||||
_logger.Warning($"OBS Request Response not being processed: request not stored [obs request id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -44,54 +44,149 @@ namespace TwitchChatTTS.OBS.Socket.Handlers
|
||||
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}]");
|
||||
}
|
||||
_logger.Debug($"Fetched stream's live status [live: {client.Live}][obs request 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;
|
||||
}
|
||||
if (!request.RequestData.TryGetValue("sceneName", out object? sceneName) || sceneName == null)
|
||||
{
|
||||
_logger.Warning($"Failed to find the scene name that was requested [obs request id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
if (!request.RequestData.TryGetValue("sourceName", out object? sourceName) || sourceName == null)
|
||||
{
|
||||
_logger.Warning($"Failed to find the scene item name that was requested [scene: {sceneName}][obs request id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
if (message.ResponseData == null)
|
||||
{
|
||||
_logger.Warning($"OBS Response is null [scene: {sceneName}][scene item: {sourceName}][obs request id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
if (!message.ResponseData.TryGetValue("sceneItemId", out object? sceneItemId) || sceneItemId == null)
|
||||
{
|
||||
_logger.Warning($"Failed to fetch the scene item id [scene: {sceneName}][scene item: {sourceName}][obs request 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()));
|
||||
_logger.Debug($"Found the scene item by name [scene: {sceneName}][source: {sourceName}][id: {sceneItemId}][obs request id: {message.RequestId}].");
|
||||
//_manager.AddSourceId(sceneName.ToString(), sourceName.ToString(), (long) sceneItemId);
|
||||
|
||||
requestData.ResponseValues = new Dictionary<string, object>
|
||||
{
|
||||
{ "sceneItemId", sceneItemId }
|
||||
};
|
||||
break;
|
||||
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;
|
||||
}
|
||||
if (!request.RequestData.TryGetValue("sceneName", out object? sceneName) || sceneName == null)
|
||||
{
|
||||
_logger.Warning($"Failed to find the scene name that was requested [obs request id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
if (!request.RequestData.TryGetValue("sceneItemId", out object? sceneItemId) || sceneItemId == null)
|
||||
{
|
||||
_logger.Warning($"Failed to find the scene item name that was requested [scene: {sceneName}][obs request id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
if (message.ResponseData == null)
|
||||
{
|
||||
_logger.Warning($"OBS Response is null [scene: {sceneName}][scene item id: {sceneItemId}][obs request id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
if (!message.ResponseData.TryGetValue("sceneItemTransform", out object? transformData) || transformData == null)
|
||||
{
|
||||
_logger.Warning($"Failed to fetch the OBS transformation data [obs request id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
|
||||
_logger.Verbose("Fetching OBS transformation data: " + transformData?.ToString());
|
||||
requestData.ResponseValues = new Dictionary<string, object>
|
||||
_logger.Debug($"Fetched OBS transformation data [scene: {sceneName}][scene item id: {sceneItemId}][transformation: {transformData}][obs request id: {message.RequestId}]");
|
||||
requestData.ResponseValues = new Dictionary<string, object>
|
||||
{
|
||||
{ "sceneItemTransform", transformData }
|
||||
};
|
||||
break;
|
||||
}
|
||||
case "GetSceneItemEnabled":
|
||||
{
|
||||
{ "sceneItemTransform", transformData }
|
||||
};
|
||||
break;
|
||||
if (!request.RequestData.TryGetValue("sceneName", out object? sceneName) || sceneName == null)
|
||||
{
|
||||
_logger.Warning($"Failed to find the scene name that was requested [obs request id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
if (!request.RequestData.TryGetValue("sceneItemId", out object? sceneItemId) || sceneItemId == null)
|
||||
{
|
||||
_logger.Warning($"Failed to find the scene item name that was requested [scene: {sceneName}][obs request id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
if (message.ResponseData == null)
|
||||
{
|
||||
_logger.Warning($"OBS Response is null [scene: {sceneName}][scene item id: {sceneItemId}][obs request id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
if (!message.ResponseData.TryGetValue("sceneItemEnabled", out object? sceneItemVisibility) || sceneItemVisibility == null)
|
||||
{
|
||||
_logger.Warning($"Failed to fetch the scene item visibility [scene: {sceneName}][scene item id: {sceneItemId}][obs request id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
|
||||
_logger.Debug($"Fetched OBS scene item visibility [scene: {sceneName}][scene item id: {sceneItemId}][visibility: {sceneItemVisibility}][obs request id: {message.RequestId}]");
|
||||
requestData.ResponseValues = new Dictionary<string, object>
|
||||
{
|
||||
{ "sceneItemEnabled", sceneItemVisibility }
|
||||
};
|
||||
break;
|
||||
}
|
||||
case "SetSceneItemTransform":
|
||||
{
|
||||
if (!request.RequestData.TryGetValue("sceneName", out object? sceneName) || sceneName == null)
|
||||
{
|
||||
_logger.Warning($"Failed to find the scene name that was requested [obs request id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
if (!request.RequestData.TryGetValue("sceneItemId", out object? sceneItemId) || sceneItemId == null)
|
||||
{
|
||||
_logger.Warning($"Failed to find the scene item name that was requested [scene: {sceneName}][obs request id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
_logger.Debug($"Received response from OBS for updating scene item transformation [scene: {sceneName}][scene item id: {sceneItemId}][obs request id: {message.RequestId}]");
|
||||
break;
|
||||
}
|
||||
case "SetSceneItemEnabled":
|
||||
{
|
||||
if (!request.RequestData.TryGetValue("sceneName", out object? sceneName) || sceneName == null)
|
||||
{
|
||||
_logger.Warning($"Failed to find the scene name that was requested [obs request id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
if (!request.RequestData.TryGetValue("sceneItemId", out object? sceneItemId) || sceneItemId == null)
|
||||
{
|
||||
_logger.Warning($"Failed to find the scene item name that was requested [scene: {sceneName}][obs request id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
_logger.Debug($"Received response from OBS for updating scene item visibility [scene: {sceneName}][scene item id: {sceneItemId}][obs request id: {message.RequestId}]");
|
||||
break;
|
||||
}
|
||||
case "Sleep":
|
||||
{
|
||||
if (!request.RequestData.TryGetValue("sleepMillis", out object? sleepMillis) || sleepMillis == null)
|
||||
{
|
||||
_logger.Warning($"Failed to find the scene name that was requested [obs request id: {message.RequestId}]");
|
||||
return;
|
||||
}
|
||||
_logger.Debug($"Received response from OBS for sleeping [sleep: {sleepMillis}][obs request id: {message.RequestId}]");
|
||||
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])}]");
|
||||
_logger.Warning($"OBS Request Response not being processed [type: {request.RequestType}][{string.Join(Environment.NewLine, message.ResponseData?.Select(kvp => kvp.Key + " = " + kvp.Value?.ToString()) ?? [])}]");
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Error(ex, $"Failed to process the response from OBS for a request [type: {request.RequestType}]");
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (requestData.Callback != null)
|
||||
|
@ -43,7 +43,7 @@ namespace TwitchChatTTS.OBS.Socket.Manager
|
||||
public async Task Send(IEnumerable<RequestMessage> messages)
|
||||
{
|
||||
string uid = GenerateUniqueIdentifier();
|
||||
_logger.Debug($"Sending OBS request batch of {messages.Count()} messages [obsid: {uid}].");
|
||||
_logger.Debug($"Sending OBS request batch of {messages.Count()} messages [obs request id: {uid}].");
|
||||
|
||||
// Keep track of requests to know what we requested.
|
||||
foreach (var message in messages)
|
||||
@ -52,7 +52,7 @@ namespace TwitchChatTTS.OBS.Socket.Manager
|
||||
var data = new RequestData(message, uid);
|
||||
_requests.Add(message.RequestId, data);
|
||||
}
|
||||
_logger.Debug($"Generated uid for all OBS request messages in batch [obsid: {uid}]: {string.Join(", ", messages.Select(m => m.RequestType + "=" + m.RequestId))}");
|
||||
_logger.Debug($"Generated uid for all OBS request messages in batch [obs request id: {uid}][obs request ids: {string.Join(", ", messages.Select(m => m.RequestType + "=" + m.RequestId))}]");
|
||||
|
||||
var client = _serviceProvider.GetRequiredKeyedService<SocketClient<WebSocketMessage>>("obs");
|
||||
await client.Send(8, new RequestBatchMessage(uid, messages));
|
||||
@ -61,7 +61,7 @@ namespace TwitchChatTTS.OBS.Socket.Manager
|
||||
public async Task Send(RequestMessage message, Action<Dictionary<string, object>>? callback = null)
|
||||
{
|
||||
string uid = GenerateUniqueIdentifier();
|
||||
_logger.Debug($"Sending an OBS request [obsid: {uid}]");
|
||||
_logger.Debug($"Sending an OBS request [type: {message.RequestType}][obs request id: {uid}]");
|
||||
|
||||
// Keep track of requests to know what we requested.
|
||||
message.RequestId = GenerateUniqueIdentifier();
|
||||
@ -87,22 +87,18 @@ namespace TwitchChatTTS.OBS.Socket.Manager
|
||||
|
||||
public async Task UpdateTransformation(string sceneName, string sceneItemName, Action<OBSTransformationData> action)
|
||||
{
|
||||
var m1 = new RequestMessage("GetSceneItemId", string.Empty, new Dictionary<string, object>() { { "sceneName", sceneName }, { "sourceName", sceneItemName } });
|
||||
await Send(m1, async (d) =>
|
||||
{
|
||||
if (!d.TryGetValue("sceneItemId", out object value) || !long.TryParse(value.ToString(), out long sceneItemId))
|
||||
return;
|
||||
if (action == null)
|
||||
return;
|
||||
|
||||
_logger.Debug($"Fetched scene item id from OBS [scene: {sceneName}][sceneItemName: {sceneItemName}][obsid: {m1.RequestId}]: {sceneItemId}");
|
||||
await GetSceneItemById(sceneName, sceneItemName, async (sceneItemId) =>
|
||||
{
|
||||
var m2 = new RequestMessage("GetSceneItemTransform", string.Empty, new Dictionary<string, object>() { { "sceneName", sceneName }, { "sceneItemId", sceneItemId } });
|
||||
await Send(m2, async (d) =>
|
||||
{
|
||||
if (d == null)
|
||||
return;
|
||||
if (!d.TryGetValue("sceneItemTransform", out object transformData))
|
||||
if (d == null || !d.TryGetValue("sceneItemTransform", out object? transformData) || transformData == null)
|
||||
return;
|
||||
|
||||
_logger.Verbose($"Current transformation data [scene: {sceneName}][sceneItemName: {sceneItemName}][sceneItemId: {sceneItemId}][obsid: {m2.RequestId}]: {transformData}");
|
||||
_logger.Verbose($"Current transformation data [scene: {sceneName}][sceneItemName: {sceneItemName}][sceneItemId: {sceneItemId}][transform: {transformData}][obs request id: {m2.RequestId}]");
|
||||
var transform = JsonSerializer.Deserialize<OBSTransformationData>(transformData.ToString(), new JsonSerializerOptions()
|
||||
{
|
||||
PropertyNameCaseInsensitive = false,
|
||||
@ -110,88 +106,121 @@ namespace TwitchChatTTS.OBS.Socket.Manager
|
||||
});
|
||||
if (transform == null)
|
||||
{
|
||||
_logger.Warning($"Could not deserialize the transformation data received by OBS [scene: {sceneName}][sceneItemName: {sceneItemName}][sceneItemId: {sceneItemId}][obsid: {m2.RequestId}].");
|
||||
_logger.Warning($"Could not deserialize the transformation data received by OBS [scene: {sceneName}][sceneItemName: {sceneItemName}][sceneItemId: {sceneItemId}][obs request id: {m2.RequestId}].");
|
||||
return;
|
||||
}
|
||||
|
||||
//double fr = (transform.Rotation + rotation) % 360;
|
||||
double w = transform.Width;
|
||||
double h = transform.Height;
|
||||
|
||||
// double ox = w * Math.Cos(r) - h * Math.Sin(r);
|
||||
// double oy = w * Math.Sin(r) + h * Math.Cos(r);
|
||||
//var oo = (fr > 45 && fr < 225 ? 0 : 1);
|
||||
// var ww = fr >= 135 && fr < 225 ? h : w;
|
||||
// var hh = fr >= 315 || fr < 45 ? h : w;
|
||||
//double dx = h * Math.Sin(r);
|
||||
//double dy = w * Math.Cos(fr > 90 && fr < 270 ? Math.PI - r : r); // * (fr >= 135 && fr < 225 || fr >= 315 || fr <= 45 ? -1 : 1);
|
||||
|
||||
int a = transform.Alignment;
|
||||
bool hasBounds = transform.BoundsType != "OBS_BOUNDS_NONE";
|
||||
|
||||
if (hasBounds)
|
||||
{
|
||||
// Take care of bounds, for most cases.
|
||||
// 'Crop to Bounding Box' might be unsupported.
|
||||
w = transform.BoundsWidth;
|
||||
h = transform.BoundsHeight;
|
||||
a = transform.BoundsAlignment;
|
||||
}
|
||||
else if (transform.CropBottom + transform.CropLeft + transform.CropRight + transform.CropTop > 0)
|
||||
{
|
||||
w -= transform.CropLeft + transform.CropRight;
|
||||
h -= transform.CropTop + transform.CropBottom;
|
||||
}
|
||||
|
||||
if (a != (int)OBSAlignment.Center)
|
||||
{
|
||||
if (hasBounds)
|
||||
transform.BoundsAlignment = a = (int)OBSAlignment.Center;
|
||||
else
|
||||
transform.Alignment = a = (int)OBSAlignment.Center;
|
||||
|
||||
transform.PositionX = transform.PositionX + w / 2;
|
||||
transform.PositionY = transform.PositionY + h / 2;
|
||||
}
|
||||
|
||||
// if (hasBounds)
|
||||
// {
|
||||
// // Take care of bounds, for most cases.
|
||||
// // 'Crop to Bounding Box' might be unsupported.
|
||||
// w = transform.BoundsWidth;
|
||||
// h = transform.BoundsHeight;
|
||||
// a = transform.BoundsAlignment;
|
||||
// }
|
||||
// else if (transform.CropBottom + transform.CropLeft + transform.CropRight + transform.CropTop > 0)
|
||||
// {
|
||||
// w -= transform.CropLeft + transform.CropRight;
|
||||
// h -= transform.CropTop + transform.CropBottom;
|
||||
// }
|
||||
|
||||
action?.Invoke(transform);
|
||||
|
||||
// double ax = w * Math.Cos(ir) - h * Math.Sin(ir);
|
||||
// double ay = w * Math.Sin(ir) + h * Math.Cos(ir);
|
||||
// _logger.Information($"ax: {ax} ay: {ay}");
|
||||
|
||||
// double bx = w * Math.Cos(r) - h * Math.Sin(r);
|
||||
// double by = w * Math.Sin(r) + h * Math.Cos(r);
|
||||
// _logger.Information($"bx: {bx} by: {by}");
|
||||
|
||||
// double ddx = bx - ax;
|
||||
// double ddy = by - ay;
|
||||
// _logger.Information($"dx: {ddx} dy: {ddy}");
|
||||
|
||||
// double arctan = Math.Atan(ddy / ddx);
|
||||
// _logger.Information("Angle: " + arctan);
|
||||
|
||||
// var xs = new int[] { 0, 0, 1, 1 };
|
||||
// var ys = new int[] { 0, 1, 1, 0 };
|
||||
// int i = ((int)Math.Floor(fr / 90) + 8) % 4;
|
||||
// double dx = xs[i] * w * Math.Cos(rad) - ys[i] * h * Math.Sin(rad);
|
||||
// double dy = xs[i] * w * Math.Sin(rad) + ys[i] * h * Math.Cos(rad);
|
||||
|
||||
|
||||
//transform.Rotation = fr;
|
||||
//_logger.Information($"w: {w} h: {h} fr: {fr} r: {r} rot: {rotation}");
|
||||
//_logger.Information($"dx: {dx} ox: {ox} oox: {oox}");
|
||||
//_logger.Information($"dy: {dy} oy: {oy} ooy: {ooy}");
|
||||
|
||||
var m3 = new RequestMessage("SetSceneItemTransform", string.Empty, new Dictionary<string, object>() { { "sceneName", sceneName }, { "sceneItemId", sceneItemId }, { "sceneItemTransform", transform } });
|
||||
await Send(m3);
|
||||
_logger.Debug($"New transformation data [scene: {sceneName}][sceneItemName: {sceneItemName}][sceneItemId: {sceneItemId}][transform: {transformData}][obs request id: {m2.RequestId}]");
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
public async Task ToggleSceneItemVisibility(string sceneName, string sceneItemName)
|
||||
{
|
||||
LogExceptions(async () =>
|
||||
{
|
||||
await GetSceneItemById(sceneName, sceneItemName, async (sceneItemId) =>
|
||||
{
|
||||
var m1 = new RequestMessage("GetSceneItemEnabled", string.Empty, new Dictionary<string, object>() { { "sceneName", sceneName }, { "sceneItemId", sceneItemId } });
|
||||
await Send(m1, async (d) =>
|
||||
{
|
||||
if (d == null || !d.TryGetValue("sceneItemEnabled", out object? visible) || visible == null)
|
||||
return;
|
||||
|
||||
var m2 = new RequestMessage("SetSceneItemEnabled", string.Empty, new Dictionary<string, object>() { { "sceneName", sceneName }, { "sceneItemId", sceneItemId }, { "sceneItemEnabled", visible.ToString().ToLower() == "true" ? false : true } });
|
||||
await Send(m2);
|
||||
});
|
||||
});
|
||||
}, "Failed to toggle OBS scene item visibility.");
|
||||
}
|
||||
|
||||
public async Task UpdateSceneItemVisibility(string sceneName, string sceneItemName, bool isVisible)
|
||||
{
|
||||
LogExceptions(async () =>
|
||||
{
|
||||
await GetSceneItemById(sceneName, sceneItemName, async (sceneItemId) =>
|
||||
{
|
||||
var m = new RequestMessage("SetSceneItemEnabled", string.Empty, new Dictionary<string, object>() { { "sceneName", sceneName }, { "sceneItemId", sceneItemId }, { "sceneItemEnabled", isVisible } });
|
||||
await Send(m);
|
||||
});
|
||||
}, "Failed to update OBS scene item visibility.");
|
||||
}
|
||||
|
||||
public async Task UpdateSceneItemIndex(string sceneName, string sceneItemName, int index)
|
||||
{
|
||||
LogExceptions(async () =>
|
||||
{
|
||||
await GetSceneItemById(sceneName, sceneItemName, async (sceneItemId) =>
|
||||
{
|
||||
var m = new RequestMessage("SetSceneItemIndex", string.Empty, new Dictionary<string, object>() { { "sceneName", sceneName }, { "sceneItemId", sceneItemId }, { "sceneItemIndex", index } });
|
||||
await Send(m);
|
||||
});
|
||||
}, "Failed to update OBS scene item index.");
|
||||
}
|
||||
|
||||
private async Task GetSceneItemById(string sceneName, string sceneItemName, Action<long> action)
|
||||
{
|
||||
var m1 = new RequestMessage("GetSceneItemId", string.Empty, new Dictionary<string, object>() { { "sceneName", sceneName }, { "sourceName", sceneItemName } });
|
||||
await Send(m1, async (d) =>
|
||||
{
|
||||
if (d == null || !d.TryGetValue("sceneItemId", out object? value) || value == null || !long.TryParse(value.ToString(), out long sceneItemId))
|
||||
return;
|
||||
|
||||
_logger.Debug($"Fetched scene item id from OBS [scene: {sceneName}][scene item: {sceneItemName}][scene item id: {sceneItemId}][obs request id: {m1.RequestId}]");
|
||||
action.Invoke(sceneItemId);
|
||||
});
|
||||
}
|
||||
|
||||
private string GenerateUniqueIdentifier()
|
||||
{
|
||||
return Guid.NewGuid().ToString("N");
|
||||
}
|
||||
|
||||
private void LogExceptions(Action action, string description)
|
||||
{
|
||||
try
|
||||
{
|
||||
action.Invoke();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.Error(e, description);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class RequestData
|
||||
|
Reference in New Issue
Block a user