Add ILogger, GlaxLogger

Renamed variables to match private
Added try-catch clauses to websocket requests
This commit is contained in:
glax 2024-04-16 20:45:01 +02:00
parent 5f4af37c34
commit 208e3b7958
3 changed files with 95 additions and 62 deletions

View File

@ -1,4 +1,5 @@
using Newtonsoft.Json.Linq; using Microsoft.Extensions.Logging;
using Newtonsoft.Json.Linq;
using OBSBlur.Window; using OBSBlur.Window;
using OBSWebsocketDotNet; using OBSWebsocketDotNet;
using OBSWebsocketDotNet.Communication; using OBSWebsocketDotNet.Communication;
@ -9,35 +10,37 @@ namespace OBSBlur.OBS;
public class Blur public class Blur
{ {
WindowManager windowManager = new (); private readonly WindowManager _windowManager = new ();
private OBSWebsocket _websocket = new (); private readonly OBSWebsocket _websocket = new ();
private string currentScene; private string _currentObsScene = "";
private string[] enabledScenes; private readonly List<string> _enabledObsScenes = new();
private string[] blurPrograms; private readonly List<string> _blurPrograms = new();
private Dictionary<IntPtr, uint> windowHandleSceneItems = new(); private readonly Dictionary<IntPtr, uint> _windowHandleSceneItems = new();
private readonly ILogger? _logger;
public Blur(string obsUrl, string obsPassword, string[] enabledScenes, string[] blurPrograms) public Blur(string obsUrl, string obsPassword, string[] enabledObsScenes, string[] blurPrograms, ILogger? logger = null)
{ {
this.enabledScenes = enabledScenes; this._logger = logger;
this.blurPrograms = blurPrograms; this._enabledObsScenes.AddRange(enabledObsScenes);
this._blurPrograms.AddRange(blurPrograms);
_websocket.CurrentProgramSceneChanged += WebsocketOnCurrentProgramSceneChanged; _websocket.CurrentProgramSceneChanged += WebsocketOnCurrentProgramSceneChanged;
_websocket.Connected += WebsocketOnConnected; _websocket.Connected += WebsocketOnConnected;
_websocket.Disconnected += WebsocketOnDisconnected; _websocket.Disconnected += WebsocketOnDisconnected;
_websocket.ConnectAsync(obsUrl, obsPassword); _websocket.ConnectAsync(obsUrl, obsPassword);
windowManager.WindowsChanged += WindowManagerOnWindowsChanged; _windowManager.WindowsChanged += WindowManagerOnWindowsChanged;
windowManager.WindowZOrderChanged += WindowManagerOnWindowZOrderChanged; _windowManager.WindowZOrderChanged += WindowManagerOnWindowZOrderChanged;
} }
private void UpdateBlurs() private void UpdateBlurs()
{ {
if (!enabledScenes.Contains(currentScene)) if (!_enabledObsScenes.Contains(_currentObsScene))
return; return;
if (!_websocket.IsConnected) if (!_websocket.IsConnected)
return; return;
WindowInfo[] windowInfos = windowManager.WindowInfos; WindowInfo[] windowInfos = _windowManager.WindowInfos;
IntPtr[] zOrder = windowManager.WindowZOrder; IntPtr[] zOrder = _windowManager.WindowZOrder;
bool maximixedWindowReached = false; bool maximixedWindowReached = false;
@ -57,22 +60,22 @@ public class Blur
maximixedWindowReached = true; maximixedWindowReached = true;
} }
foreach(IntPtr blurredWindow in windowHandleSceneItems.Keys.ToArray()) foreach(IntPtr blurredWindow in _windowHandleSceneItems.Keys.ToArray())
if(windowInfos.All(w => w.WindowHandle != blurredWindow)) if(windowInfos.All(w => w.WindowHandle != blurredWindow))
DeleteBlur(blurredWindow); DeleteBlur(blurredWindow);
} }
private bool GetBlurWindow(WindowInfo windowInfo) private bool GetBlurWindow(WindowInfo windowInfo)
{ {
foreach(string program in blurPrograms) foreach(string program in _blurPrograms)
if (windowInfo.ProcessInfo.ProcessName.Contains(program)) if (windowInfo.ProcessInfo.ProcessName.Contains(program, StringComparison.OrdinalIgnoreCase))
return true; return true;
return false; return false;
} }
private void BlurWindow(WindowInfo windowInfo) private void BlurWindow(WindowInfo windowInfo)
{ {
if(windowHandleSceneItems.ContainsKey(windowInfo.WindowHandle)) if(_windowHandleSceneItems.ContainsKey(windowInfo.WindowHandle))
MoveBlur(windowInfo); MoveBlur(windowInfo);
else else
AddBlur(windowInfo); AddBlur(windowInfo);
@ -80,27 +83,32 @@ public class Blur
private void AddBlur(WindowInfo windowInfo) private void AddBlur(WindowInfo windowInfo)
{ {
Dictionary<string, object> request = new() Dictionary<string, object> duplicateSceneItemRequest = new()
{ {
{"sceneName", currentScene}, {"sceneName", _currentObsScene},
{"sceneItemId", GetBlurSource()} {"sceneItemId", GetBlurSource()}
}; };
try try
{ {
JObject response = _websocket.SendRequest("DuplicateSceneItem", JObject.FromObject(request)); JObject response = _websocket.SendRequest("DuplicateSceneItem", JObject.FromObject(duplicateSceneItemRequest));
windowHandleSceneItems.Add(windowInfo.WindowHandle, response["sceneItemId"]!.Value<uint>()); if (!response.ContainsKey("sceneItemId"))
{
_logger?.LogWarning("Request DuplicateSceneItem: Response did not include 'sceneItemId'.");
return;
}
_windowHandleSceneItems.Add(windowInfo.WindowHandle, response["sceneItemId"]!.Value<uint>());
MoveBlur(windowInfo); MoveBlur(windowInfo);
} }
catch (ErrorResponseException e) catch (ErrorResponseException e)
{ {
Console.WriteLine("No Scene Item with name 'Blur' found."); _logger?.LogError(e, "Request DuplicateSceneItem");
throw; throw;
} }
} }
private void MoveBlur(WindowInfo windowInfo) private void MoveBlur(WindowInfo windowInfo)
{ {
if (!windowHandleSceneItems.ContainsKey(windowInfo.WindowHandle)) if (!_windowHandleSceneItems.ContainsKey(windowInfo.WindowHandle))
return; return;
SceneItemTransformInfo info = new() SceneItemTransformInfo info = new()
@ -113,35 +121,59 @@ public class Blur
Alignnment = 5 Alignnment = 5
}; };
Dictionary<string, object> request = new() Dictionary<string, object> setSceneItemTransformRequest = new()
{ {
{"sceneName", currentScene}, {"sceneName", _currentObsScene},
{"sceneItemId", windowHandleSceneItems[windowInfo.WindowHandle]}, {"sceneItemId", _windowHandleSceneItems[windowInfo.WindowHandle]},
{"sceneItemTransform", info} {"sceneItemTransform", info}
}; };
_websocket.SendRequest("SetSceneItemTransform", JObject.FromObject(request)); try
Dictionary<string, object> request2 = new()
{ {
{"sceneName", currentScene}, _websocket.SendRequest("SetSceneItemTransform", JObject.FromObject(setSceneItemTransformRequest));
{"sceneItemId", windowHandleSceneItems[windowInfo.WindowHandle]}, }
catch (ErrorResponseException e)
{
_logger?.LogError(e, "Request SetSceneItemTransform");
throw;
}
Dictionary<string, object> setSceneItemEnabledRequest = new()
{
{"sceneName", _currentObsScene},
{"sceneItemId", _windowHandleSceneItems[windowInfo.WindowHandle]},
{"sceneItemEnabled", true} {"sceneItemEnabled", true}
}; };
_websocket.SendRequest("SetSceneItemEnabled", JObject.FromObject(request2)); try
{
_websocket.SendRequest("SetSceneItemEnabled", JObject.FromObject(setSceneItemEnabledRequest));
}
catch (ErrorResponseException e)
{
_logger?.LogError(e, "Request SetSceneItemEnabled");
throw;
}
} }
private void DeleteBlur(IntPtr windowHandle) private void DeleteBlur(IntPtr windowHandle)
{ {
if (!windowHandleSceneItems.ContainsKey(windowHandle)) if (!_windowHandleSceneItems.TryGetValue(windowHandle, out uint sceneItemId))
return; return;
Dictionary<string, object> request = new() Dictionary<string, object> removeSceneItemRequest = new()
{ {
{"sceneName", currentScene}, {"sceneName", _currentObsScene},
{"sceneItemId", windowHandleSceneItems[windowHandle]} {"sceneItemId", sceneItemId}
}; };
_websocket.SendRequest("RemoveSceneItem", JObject.FromObject(request)); try
windowHandleSceneItems.Remove(windowHandle); {
_websocket.SendRequest("RemoveSceneItem", JObject.FromObject(removeSceneItemRequest));
_windowHandleSceneItems.Remove(windowHandle);
}
catch (ErrorResponseException e)
{
_logger?.LogError(e, "Request RemoveSceneItem");
throw;
}
} }
private void DeleteBlur(WindowInfo windowInfo) private void DeleteBlur(WindowInfo windowInfo)
@ -153,17 +185,19 @@ public class Blur
{ {
Dictionary<string, string> request = new() Dictionary<string, string> request = new()
{ {
{"sceneName", currentScene}, {"sceneName", _currentObsScene},
{"sourceName", "Blur"} {"sourceName", "Blur"}
}; };
try try
{ {
JObject response = _websocket.SendRequest("GetSceneItemId", JObject.FromObject(request)); JObject response = _websocket.SendRequest("GetSceneItemId", JObject.FromObject(request));
if (!response.ContainsKey("sceneItemId"))
throw new KeyNotFoundException("sceneItemId not in response.");
return response["sceneItemId"]!.Value<uint>(); return response["sceneItemId"]!.Value<uint>();
} }
catch (ErrorResponseException e) catch (Exception e)
{ {
Console.WriteLine("No Scene Item with name 'Blur' found."); _logger?.LogError(e, "Request GetSceneItemId");
throw; throw;
} }
} }
@ -172,47 +206,44 @@ public class Blur
{ {
uint i = 0; uint i = 0;
string prnt = ""; string prnt = $"Z-order changed\n{"Z",3} | {"hWnd",8} | {"PID",8} | {"Name",17} | {"Window Title",-17} | {"Vis",-8} | {"State",-13} | BBox\n";
foreach (IntPtr windowHandle in neworder) foreach (IntPtr windowHandle in neworder)
{ {
WindowInfo windowInfo = windowManager.WindowInfos.FirstOrDefault(w => w.WindowHandle == windowHandle); WindowInfo windowInfo = _windowManager.WindowInfos.FirstOrDefault(w => w.WindowHandle == windowHandle);
if (windowInfo.WindowHandle is 0x0) if (windowInfo.WindowHandle is 0x0)
continue; continue;
prnt += $"{++i,3} | {windowInfo}\n"; prnt += $"{++i,3} | {windowInfo}\n";
} }
Console.WriteLine($"Z-order changed {DateTime.UtcNow:O}"); _logger?.LogInformation(prnt);
Console.WriteLine($"{"Z",3} | {"hWnd",8} | {"PID",8} | {"Name",17} | {"Window Title",-17} | {"Vis",-8} | {"State",-13} | Rectangle");
Console.WriteLine(prnt);
UpdateBlurs(); UpdateBlurs();
} }
private void WindowManagerOnWindowsChanged(WindowInfo[] before, WindowInfo[] after) private void WindowManagerOnWindowsChanged(WindowInfo[] before, WindowInfo[] after)
{ {
string prnt = ""; string prnt = "Window changed\n";
foreach (WindowInfo windowInfo in after) foreach (WindowInfo windowInfo in after)
prnt += $"{windowInfo}\n"; prnt += $"{windowInfo}\n";
Console.WriteLine($"Windows changed {DateTime.UtcNow:O}"); _logger?.LogInformation(prnt);
Console.WriteLine(prnt);
UpdateBlurs(); UpdateBlurs();
} }
private void WebsocketOnDisconnected(object? sender, ObsDisconnectionInfo e) private void WebsocketOnDisconnected(object? sender, ObsDisconnectionInfo e)
{ {
Console.WriteLine($"Obs Disconnected {DateTime.UtcNow:O}"); _logger?.LogInformation("Obs Disconnected");
} }
private void WebsocketOnConnected(object? sender, EventArgs e) private void WebsocketOnConnected(object? sender, EventArgs e)
{ {
currentScene = _websocket.GetCurrentProgramScene(); _currentObsScene = _websocket.GetCurrentProgramScene();
Console.WriteLine($"Obs Connected. Current Scene {currentScene} {DateTime.UtcNow:O}"); _logger?.LogInformation($"Obs Connected. Current Scene {_currentObsScene}");
UpdateBlurs(); UpdateBlurs();
} }
private void WebsocketOnCurrentProgramSceneChanged(object? sender, ProgramSceneChangedEventArgs e) private void WebsocketOnCurrentProgramSceneChanged(object? sender, ProgramSceneChangedEventArgs e)
{ {
currentScene = e.SceneName; _currentObsScene = e.SceneName;
Console.WriteLine($"Obs Scene Changed -> {currentScene} {DateTime.UtcNow:O}"); _logger?.LogInformation($"Obs Scene Changed -> {_currentObsScene}");
UpdateBlurs(); UpdateBlurs();
} }

View File

@ -8,6 +8,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="GlaxLogger" Version="1.0.7.2" />
<PackageReference Include="obs-websocket-dotnet" Version="5.0.0.3" /> <PackageReference Include="obs-websocket-dotnet" Version="5.0.0.3" />
</ItemGroup> </ItemGroup>

View File

@ -1,8 +1,9 @@
using OBSBlur.OBS; using GlaxLogger;
using Microsoft.Extensions.Logging;
using OBSBlur.OBS;
Logger logger = new (filteredLevel: LogLevel.Trace, consoleOut: Console.Out);
Blur _ = new ("ws://localhost:4444", "", new []{"Desktop"}, new []{ "Discord", "VRCX", "thunderbird", "Signal" }, logger);
Blur _ = new ("ws://localhost:4444", "", new []{"Desktop"}, new []{ "Discord", "VRCX" });
while (true) while (true)
Thread.Sleep(100); Thread.Sleep(100);