LANCommander/LANCommander.Server/Hubs/Script.cs

59 lines
2.2 KiB
C#
Raw Permalink Normal View History

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<Guid, Script> _scripts = new Dictionary<Guid, Script>();
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);
2025-09-15 20:48:56 -05:00
await client.Scripts.RunPackageScriptAsync(mapper.Map<SDK.Models.Script>(script), mapper.Map<SDK.Models.Game>(game), debugHandler);
}
}
2025-09-15 20:48:56 -05:00
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);
}
}