using System.Management.Automation; using LANCommander.SDK.Enums; using LANCommander.SDK.Models; using LANCommander.SDK.PowerShell; namespace LANCommander.Server.Hubs; public partial class RpcHub { private readonly Dictionary _scripts = new Dictionary(); private string GetScriptSessionGroupName(Guid sessionId) => $"Script/Sessions/{sessionId}"; public async Task Script_ExecuteAsync(Guid scriptId) { var script = await scriptService.GetAsync(scriptId); var game = await gameService.GetAsync(script.GameId ?? Guid.Empty); if (script.Type == ScriptType.Package) { var debugHandler = new PowerShellDebugHandler(); debugHandler.OnDebugOutput += DebugOutput; debugHandler.OnDebugBreak += DebugBreak; debugHandler.OnDebugStart += DebugStart; await Groups.AddToGroupAsync(Context.ConnectionId, GetScriptSessionGroupName(debugHandler.SessionId)); await Clients.Group(GetScriptSessionGroupName(debugHandler.SessionId)) .Script_DebugStartAsync(debugHandler.SessionId); await client.Scripts.RunPackageScriptAsync(mapper.Map(script), mapper.Map(game), debugHandler); } } public async Task Script_ConsoleInputAsync(Guid sessionId, string input) { var debugHandler = client.Scripts.GetDebugHandler(sessionId); if (debugHandler != null) await debugHandler.ExecuteAsync(input); } private void DebugStart(object? sender, OnDebugStartEventArgs args) { if (sender is PowerShellDebugHandler debugHandler) Clients.Caller.Script_DebugStartAsync(debugHandler.SessionId); } private void DebugBreak(object? sender, OnDebugBreakEventArgs args) { if (sender is PowerShellDebugHandler debugHandler) Clients.Caller.Script_DebugBreakAsync(debugHandler.SessionId); } private void DebugOutput(object? sender, OnDebugOutputEventArgs args) { if (sender is PowerShellDebugHandler debugHandler) Clients.Caller.Script_DebugOutputAsync(debugHandler.SessionId, args.LogLevel, args.Message); } }