예제 #1
0
파일: Command.cs 프로젝트: snowfox0x/Devcom
        internal bool Run(Context context, params string[] args)
        {
            var currentContextType = context.GetType();

            // Check context type compatability
            if ((!currentContextType.IsSubclassOf(_contextType) && currentContextType != _contextType) || !ContextFilter.Test(currentContextType, Filter))
            {
                context.PostCommandNotFound(QualifiedName);
                return false;
            }

            int argc = args.Length;
            int paramc = _paramList.Length - 1;
            try
            {
                if ((_hasParamsArgument && argc < paramc) || (argc < paramc - _numOptionalParams) || (!_hasParamsArgument && argc > paramc))
                {
                    context.Notify("Parameter count mismatch.");
                    return false;
                }

                var boxed = Enumerable.Repeat(Type.Missing, paramc).ToArray();

                // Convert parameters to the proper types
                for (int i = 0; i < paramc; i++)
                {
                    boxed[i] = Util.ChangeType(args[i], _paramList[(i >= paramc ? paramc - 1 : i) + 1].ParameterType);
                }

                var argsFormatted = new List<object> { context };

                // Add all arguments except for any marked as 'params'
                argsFormatted.AddRange(boxed.Take(_hasParamsArgument ? paramc - 1 : paramc));

                // Insert params argument as an array (it needs to be represented as a single object)
                if (_hasParamsArgument)
                {
                    argsFormatted.Add(args.Where((o, i) => i >= paramc - 1).ToArray());
                }

                // Call the method with our parameters
                _method.Invoke(null, argsFormatted.ToArray());
            }
            catch(Exception ex)
            {
                if (SystemConvars.Throws)
                {
                    throw;
                }
                context.Notify("Error: " + ex);
                return false;
            }
            return true;
        }
예제 #2
0
파일: Command.cs 프로젝트: snowfox0x/Devcom
        internal CallArgs TranslateArgs(Context context, string[] args)
        {
            var currentContextType = context.GetType();

            // Check context type compatability
            if ((!currentContextType.IsSubclassOf(_contextType) && currentContextType != _contextType) || !ContextFilter.Test(currentContextType, Filter))
            {
                throw new ArgumentException(String.Concat("Incompatible context type: '", currentContextType.Name, "'"));
            }

            int argc = args.Length;
            int paramc = _paramList.Length - 1;
            if ((_hasParamsArgument && argc < paramc) || (argc < paramc - _numOptionalParams) || (!_hasParamsArgument && argc > paramc))
            {
                throw new ArgumentException("Parameter count mismatch.");
            }

            var boxed = Enumerable.Repeat(Type.Missing, paramc).ToArray();

            // Convert parameters to the proper types
            for (int i = 0; i < paramc; i++)
            {
                boxed[i] = Util.ChangeType(args[i], _paramList[(i >= paramc ? paramc - 1 : i) + 1].ParameterType);
            }

            var argsFormatted = new List<object> { context };

            // Add all arguments except for any marked as 'params'
            argsFormatted.AddRange(boxed.Take(_hasParamsArgument ? paramc - 1 : paramc));

            // Insert params argument as an array (it needs to be represented as a single object)
            if (_hasParamsArgument)
            {
                argsFormatted.Add(args.Where((o, i) => i >= paramc - 1).ToArray());
            }

            return new CallArgs(_method, argsFormatted);
        }
예제 #3
0
 public static void ListCommands(Context context)
 {
     var contextType = context.GetType();
     context.Notify(
         Devcom.Commands.Where(cmd => ContextFilter.Test(contextType, cmd.Value.Filter) &&
             (cmd.Value.ContextType == contextType || contextType.IsSubclassOf(cmd.Value.ContextType)))
         .Select(cmd => cmd.Key)
         .Aggregate((accum, name) => accum + "\n" + name));
 }