namespace Sandbox; public static partial class ConsoleSystem { /// /// Run this command. This should be a single command. /// public static void Run( string command ) { if ( command.Contains( ' ' ) ) { var parts = command.SplitQuotesStrings(); if ( parts.Length == 0 ) return; if ( parts.Length == 1 ) { RunInternal( new ConsoleCommand { Name = command } ); return; } RunInternal( new ConsoleCommand( parts[0], parts.Skip( 1 ).ToArray() ) ); return; } RunInternal( new ConsoleCommand { Name = command } ); } /// /// Run this command, along with the arguments. We'll automatically convert them to strings and handle quoting. /// public static void Run( string command, params object[] arguments ) { //Log.Info( $"Run: {command} {arguments}" ); if ( arguments == null || arguments.Length == 0 ) { Run( command ); return; } // TODO - we should serialize better RunInternal( new ConsoleCommand { Name = command, Arguments = arguments.Select( x => $"{x}" ).ToArray() } ); } static bool CanRunCommand( string name ) { // Menu can do whatever the fuck it wants if ( Game.IsMenu ) return true; var command = ConVarSystem.Find( name ); // // If we can't find the command in our managed library, we can't run it // Are there any exceptions here? // if ( command is null ) return false; // // Game code can't run protected commands/convars // if ( command.IsProtected ) return false; // Maybe we can any command that is managed based? return true; } /// /// Actually do the business of trying to run a command. Will return (not throw) an exception /// object if an exception is thrown of command isn't found. /// private static void RunInternal( ConsoleCommand command ) { if ( !CanRunCommand( command.Name ) ) { Log.Info( $"Can't run command {command.Name}" ); throw new System.Exception( $"Can't run '{command.Name}'" ); } var commandString = command.ToStringCommand(); ConVarSystem.Run( commandString ); } private struct ConsoleCommand { public string Name; public string[] Arguments; internal ConsoleCommand( string name, string[] arguments ) { Name = name; Arguments = arguments; } internal string ToStringCommand() { if ( Arguments == null ) return Name; return $"{Name} {string.Join( " ", Arguments.Select( x => $"{x}".QuoteSafe() ) )}"; } } }