using SharpChat.Packet; using System; using System.Threading; namespace SharpChat.Commands { public class ShutdownRestartCommand : IChatCommand { private readonly ManualResetEvent WaitHandle; private readonly Func ShutdownCheck; public ShutdownRestartCommand(ManualResetEvent waitHandle, Func shutdownCheck) { WaitHandle = waitHandle ?? throw new ArgumentNullException(nameof(waitHandle)); ShutdownCheck = shutdownCheck ?? throw new ArgumentNullException(nameof(shutdownCheck)); } public bool IsMatch(ChatCommandContext ctx) { return ctx.NameEquals("shutdown") || ctx.NameEquals("restart"); } public void Dispatch(ChatCommandContext ctx) { if(ctx.User.UserId != 1) { ctx.User.Send(new LegacyCommandResponse(LCR.COMMAND_NOT_ALLOWED, true, $"/{ctx.Name}")); return; } if(!ShutdownCheck()) return; if(ctx.NameEquals("restart")) lock(ctx.Chat.ConnectionsAccess) foreach(ChatConnection conn in ctx.Chat.Connections) conn.PrepareForRestart(); ctx.Chat.Update(); WaitHandle?.Set(); } } }