-
-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathShockOSCModule.cs
More file actions
130 lines (105 loc) · 4.37 KB
/
ShockOSCModule.cs
File metadata and controls
130 lines (105 loc) · 4.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using System.Net;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using MudBlazor;
using OpenShock.Desktop.ModuleBase;
using OpenShock.Desktop.ModuleBase.Config;
using OpenShock.Desktop.ModuleBase.Navigation;
using OpenShock.ShockOSC;
using OpenShock.ShockOSC.Config;
using OpenShock.ShockOSC.Services;
using OpenShock.ShockOSC.Ui.Pages.Dash.Tabs;
using OscQueryLibrary;
// ReSharper disable InconsistentNaming
[assembly: DesktopModule(typeof(ShockOSCModule), "openshock.shockosc", "ShockOSC")]
namespace OpenShock.ShockOSC;
public sealed class ShockOSCModule : DesktopModuleBase, IAsyncDisposable
{
private IAsyncDisposable? _onRemoteControlSubscription;
public override IconOneOf Icon => IconOneOf.FromPath("OpenShock/ShockOSC/Resources/ShockOSC-Icon.svg");
public override IReadOnlyCollection<NavigationItem> NavigationComponents { get; } =
[
new()
{
Name = "Settings",
ComponentType = typeof(ConfigTab),
Icon = IconOneOf.FromSvg(Icons.Material.Filled.Settings)
},
new()
{
Name = "Groups",
ComponentType = typeof(GroupsTab),
Icon = IconOneOf.FromSvg(Icons.Material.Filled.Group)
},
new()
{
Name = "Chatbox",
ComponentType = typeof(ChatboxTab),
Icon = IconOneOf.FromSvg(Icons.Material.Filled.Chat)
},
new()
{
Name = "Debug",
ComponentType = typeof(DebugTab),
Icon = IconOneOf.FromSvg(Icons.Material.Filled.BugReport)
}
];
public override async Task Setup()
{
var config = await ModuleInstanceManager.GetModuleConfig<ShockOscConfig>();
ModuleServiceProvider = BuildServices(config);
}
private IServiceProvider BuildServices(IModuleConfig<ShockOscConfig> config)
{
var loggerFactory = ModuleInstanceManager.AppServiceProvider.GetRequiredService<ILoggerFactory>();
var services = new ServiceCollection();
services.AddSingleton(loggerFactory);
services.AddLogging();
services.AddSingleton(config);
services.AddSingleton(ModuleInstanceManager.OpenShock);
services.AddSingleton<ShockOscData>();
services.AddSingleton<OscClient>();
services.AddSingleton<OscHandler>();
services.AddSingleton<ChatboxService>();
services.AddSingleton(_ =>
{
var listenAddress = config.Config.Osc.QuestSupport ? IPAddress.Any : IPAddress.Loopback;
return new OscQueryServer("ShockOSC", listenAddress);
});
services.AddSingleton<ShockOsc>();
services.AddSingleton<UnderscoreConfig>();
return services.BuildServiceProvider();
}
public override async Task Start()
{
var config = ModuleServiceProvider.GetRequiredService<IModuleConfig<ShockOscConfig>>();
await ModuleServiceProvider.GetRequiredService<ShockOsc>().Start();
if (config.Config.Osc.OscQuery) ModuleServiceProvider.GetRequiredService<OscQueryServer>().Start();
var chatboxService = ModuleServiceProvider.GetRequiredService<ChatboxService>();
var oscHandler = ModuleServiceProvider.GetRequiredService<OscHandler>();
_onRemoteControlSubscription =
await ModuleInstanceManager.OpenShock.Control.OnRemoteControlledShocker.SubscribeAsync(async args =>
{
// Dont do anything if there are no logs
if (args.Logs.Count <= 0) return;
foreach (var controlLog in args.Logs)
{
await chatboxService.SendRemoteControlMessage(controlLog.Shocker.Name, args.Sender.Name,
args.Sender.CustomName, controlLog.Intensity, controlLog.Duration, controlLog.Type);
var now = DateTimeOffset.UtcNow;
oscHandler.SetLastControlCommand(new OscHandler.LastControlLogEntry()
{
ControlLog = controlLog,
Timestamp = now,
});
}
});
}
private bool _disposed;
public async ValueTask DisposeAsync()
{
if (_disposed) return;
_disposed = true;
if (_onRemoteControlSubscription != null) await _onRemoteControlSubscription.DisposeAsync();
}
}