Skip to content

Commit 4a96c4c

Browse files
committed
Add locally sent logs event
1 parent 59e186d commit 4a96c4c

File tree

3 files changed

+47
-34
lines changed

3 files changed

+47
-34
lines changed

Desktop/Backend/BackendHubManager.cs

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
1-
using System.Collections.Concurrent;
2-
using System.Globalization;
3-
using System.Reactive.Subjects;
4-
using MudBlazor.Extensions;
1+
using System.Reactive.Subjects;
52
using OpenShock.Desktop.Config;
6-
using OpenShock.Desktop.Models;
73
using OpenShock.Desktop.Models.BaseImpl;
8-
using OpenShock.Desktop.ModuleBase.Models;
9-
using OpenShock.Desktop.Services;
104
using OpenShock.MinimalEvents;
115
using OpenShock.SDK.CSharp.Hub;
126
using OpenShock.SDK.CSharp.Hub.Models;
@@ -22,14 +16,12 @@ public sealed class BackendHubManager
2216
private readonly OpenShockHubClient _openShockHubClient;
2317
private readonly OpenShockApi _openShockApi;
2418

25-
private string _liveConnectionId = string.Empty;
19+
private string _currentHubConnectionId = string.Empty;
2620

27-
public IAsyncMinimalEventObservable<LogEventArgs> OnRemoteControlledShocker => _onRemoteControlledShocker;
28-
private readonly AsyncMinimalEvent<LogEventArgs> _onRemoteControlledShocker = new();
21+
public IAsyncMinimalEventObservable<ShockerLogEventArgs> OnShockerLog => _onShockerLog;
22+
private readonly AsyncMinimalEvent<ShockerLogEventArgs> _onShockerLog = new();
2923

3024
public Subject<Guid?> OnHubStatusUpdated { get; } = new();
31-
32-
3325

3426
public BackendHubManager(ILogger<BackendHubManager> logger,
3527
ConfigManager configManager,
@@ -41,15 +33,15 @@ public BackendHubManager(ILogger<BackendHubManager> logger,
4133
_openShockApi = openShockApi;
4234

4335
_openShockHubClient.OnWelcome.SubscribeAsync(Welcome).AsTask().Wait();;
44-
_openShockHubClient.OnLog.SubscribeAsync(RemoteActivateShockers).AsTask().Wait();
36+
_openShockHubClient.OnLog.SubscribeAsync(OnShockerLogHandler).AsTask().Wait();
4537
_openShockHubClient.OnHubUpdate.SubscribeAsync(DeviceUpdate).AsTask().Wait();
4638

4739
_openShockHubClient.OnHubStatus.SubscribeAsync(HubStatus).AsTask().Wait();
4840
}
4941

5042
private Task Welcome(string connectionId)
5143
{
52-
_liveConnectionId = connectionId;
44+
_currentHubConnectionId = connectionId;
5345
_openShockApi.HubStates.Clear();
5446

5547
OnHubStatusUpdated.OnNext(null);
@@ -105,15 +97,15 @@ await _openShockHubClient.Setup(new HubClientOptions
10597
});
10698
}
10799

108-
private Task RemoteActivateShockers(LogEventArgs logEventArgs)
100+
private Task OnShockerLogHandler(LogEventArgs logEventArgs)
109101
{
110-
if (logEventArgs.Sender.ConnectionId == _liveConnectionId)
102+
var eventArgs = new ShockerLogEventArgs
111103
{
112-
_logger.LogDebug("Ignoring remote command log cause it was the local connection");
113-
return Task.CompletedTask;
114-
}
104+
LogEventArgs = logEventArgs,
105+
IsRemote = logEventArgs.Sender.ConnectionId != _currentHubConnectionId
106+
};
115107

116-
return _onRemoteControlledShocker.InvokeAsyncParallel(logEventArgs);
108+
return _onShockerLog.InvokeAsyncParallel(eventArgs);
117109
}
118110

119111
/// <summary>
@@ -134,5 +126,10 @@ public Task Control(IEnumerable<Control> shocks, string? customName = null)
134126
var shocksToSend = shocks.Where(x => enabledShockers.Contains(x.Id));
135127
return _openShockHubClient.Control(shocksToSend, customName);
136128
}
137-
129+
}
130+
131+
public readonly struct ShockerLogEventArgs
132+
{
133+
public required LogEventArgs LogEventArgs { get; init; }
134+
public required bool IsRemote { get; init; }
138135
}

Desktop/ModuleManager/Implementation/OpenShockControl.cs

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System.Collections.Immutable;
22
using OpenShock.Desktop.Backend;
3-
using OpenShock.Desktop.Models.BaseImpl;
43
using OpenShock.Desktop.ModuleBase.Api;
54
using OpenShock.Desktop.ModuleBase.Models;
65
using OpenShock.Desktop.Services;
@@ -14,27 +13,30 @@ public class OpenShockControl : IOpenShockControl, IAsyncDisposable
1413
private readonly BackendHubManager _backendHubManager;
1514
private readonly LiveControlManager _liveControlManager;
1615

17-
private readonly IAsyncDisposable _remoteControlledSubscription;
16+
private readonly IAsyncDisposable _onShockerLogSubscription;
1817

1918
public OpenShockControl(BackendHubManager backendHubManager, LiveControlManager liveControlManager)
2019
{
2120
_backendHubManager = backendHubManager;
2221
_liveControlManager = liveControlManager;
2322

24-
_remoteControlledSubscription = _backendHubManager.OnRemoteControlledShocker.SubscribeAsync(args =>
23+
_onShockerLogSubscription = _backendHubManager.OnShockerLog.SubscribeAsync(args =>
2524
{
26-
return _onRemoteControlledShocker.InvokeAsyncParallel(new RemoteControlledShockerArgs()
25+
var logEvent = args.LogEventArgs;
26+
var sender = logEvent.Sender;
27+
28+
var baseArgs = new RemoteControlledShockerArgs()
2729
{
2830
Sender = new ControlLogSender
2931
{
30-
Id = args.Sender.Id,
31-
Name = args.Sender.Name,
32-
Image = args.Sender.Image,
33-
AdditionalItems = args.Sender.AdditionalItems.AsReadOnly(),
34-
ConnectionId = args.Sender.ConnectionId,
35-
CustomName = args.Sender.CustomName,
32+
Id = sender.Id,
33+
Name = sender.Name,
34+
Image = sender.Image,
35+
AdditionalItems = sender.AdditionalItems.AsReadOnly(),
36+
ConnectionId = sender.ConnectionId,
37+
CustomName = sender.CustomName,
3638
},
37-
Logs = args.Logs.Select(log => new ControlLog
39+
Logs = logEvent.Logs.Select(log => new ControlLog
3840
{
3941
Duration = log.Duration,
4042
Intensity = log.Intensity,
@@ -46,7 +48,9 @@ public OpenShockControl(BackendHubManager backendHubManager, LiveControlManager
4648
Type = (ControlType)log.Type,
4749
ExecutedAt = log.ExecutedAt
4850
}).ToImmutableArray()
49-
});
51+
};
52+
53+
return args.IsRemote ? _onRemoteControlledShocker.InvokeAsyncParallel(baseArgs) : _onLocalControlledShocker.InvokeAsyncParallel(baseArgs);
5054
}).AsTask().Result;
5155
}
5256

@@ -68,6 +72,10 @@ public void ControlAllShockers(byte intensity, ControlType type)
6872
public IAsyncMinimalEventObservable<RemoteControlledShockerArgs> OnRemoteControlledShocker =>
6973
_onRemoteControlledShocker;
7074
private readonly AsyncMinimalEvent<RemoteControlledShockerArgs> _onRemoteControlledShocker = new();
75+
76+
public IAsyncMinimalEventObservable<RemoteControlledShockerArgs> OnLocalControlledShocker =>
77+
_onLocalControlledShocker;
78+
private readonly AsyncMinimalEvent<RemoteControlledShockerArgs> _onLocalControlledShocker = new();
7179

7280
private bool _disposed;
7381

@@ -76,7 +84,7 @@ public async ValueTask DisposeAsync()
7684
if (_disposed) return;
7785
_disposed = true;
7886

79-
await _remoteControlledSubscription.DisposeAsync();
87+
await _onShockerLogSubscription.DisposeAsync();
8088
GC.SuppressFinalize(this);
8189
}
8290

ModuleBase/Api/IOpenShockControl.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,13 @@ public interface IOpenShockControl
2828
/// <param name="type"></param>
2929
public void ControlAllShockers(byte intensity, ControlType type);
3030

31+
/// <summary>
32+
/// A shocker has been remotely controlled by another location.
33+
/// </summary>
3134
public IAsyncMinimalEventObservable<RemoteControlledShockerArgs> OnRemoteControlledShocker { get; }
35+
36+
/// <summary>
37+
/// This OpenShock Desktop instance has controlled a shocker.
38+
/// </summary>
39+
public IAsyncMinimalEventObservable<RemoteControlledShockerArgs> OnLocalControlledShocker { get; }
3240
}

0 commit comments

Comments
 (0)