Example #1
0
        private static void BuildModule(ModuleBuilder builder, TypeInfo typeInfo, CommandService service)
        {
            //gotta do this until i have the time to move everything from static fields/constructors over to
            // a service. This will ensure static constructors are ran >.<
            var instance = ReflectionUtils.CreateBuilder <IModuleBase>(typeInfo, service).Invoke(DependencyMap.Empty);

            var attributes = typeInfo.GetCustomAttributes();

            foreach (var attribute in attributes)
            {
                // TODO: C#7 type switch
                if (attribute is NameAttribute)
                {
                    builder.Prefix = (attribute as NameAttribute).Text;
                }
                else if (attribute is SummaryAttribute)
                {
                    builder.Summary = (attribute as SummaryAttribute).Text;
                }
                else if (attribute is RemarksAttribute)
                {
                    builder.Remarks = (attribute as RemarksAttribute).Text;
                }
                else if (attribute is AliasAttribute)
                {
                    builder.AddAliases((attribute as AliasAttribute).Aliases);
                }
                else if (attribute is GroupAttribute)
                {
                    var groupAttr = attribute as GroupAttribute;
                    builder.Name = builder.Name ?? groupAttr.Name;
                    builder.AddAliases(groupAttr.Prefix);
                }
                else if (attribute is PreconditionAttribute)
                {
                    builder.AddPrecondition(attribute as PreconditionAttribute);
                }
            }

            //Check for unspecified info
            if (builder.Aliases.Count == 0)
            {
                builder.AddAliases("");
            }
            if (builder.Name == null)
            {
                builder.Name = typeInfo.Name;
            }

            var validCommands = typeInfo.DeclaredMethods.Where(x => IsValidCommandDefinition(x));

            foreach (var method in validCommands)
            {
                builder.AddCommand((command) =>
                {
                    BuildCommand(command, typeInfo, method, service);
                });
            }
        }
Example #2
0
        private static void BuildCommand(CommandBuilder builder, TypeInfo typeInfo, MethodInfo method, CommandService service, IServiceProvider serviceprovider)
        {
            var attributes = method.GetCustomAttributes();

            foreach (var attribute in attributes)
            {
                switch (attribute)
                {
                case CommandAttribute command:
                    builder.AddAliases(command.Text);
                    builder.RunMode = command.RunMode;
                    builder.Name    = builder.Name ?? command.Text;
                    break;

                case NameAttribute name:
                    builder.Name = name.Text;
                    break;

                case PriorityAttribute priority:
                    builder.Priority = priority.Priority;
                    break;

                case SummaryAttribute summary:
                    builder.Summary = summary.Text;
                    break;

                case RemarksAttribute remarks:
                    builder.Remarks = remarks.Text;
                    break;

                case AliasAttribute alias:
                    builder.AddAliases(alias.Aliases);
                    break;

                case PreconditionAttribute precondition:
                    builder.AddPrecondition(precondition);
                    break;

                default:
                    builder.AddAttributes(attribute);
                    break;
                }
            }

            if (builder.Name == null)
            {
                builder.Name = method.Name;
            }

            var parameters = method.GetParameters();
            int pos = 0, count = parameters.Length;

            foreach (var paramInfo in parameters)
            {
                builder.AddParameter((parameter) =>
                {
                    BuildParameter(parameter, paramInfo, pos++, count, service, serviceprovider);
                });
            }

            var createInstance = ReflectionUtils.CreateBuilder <IModuleBase>(typeInfo, service);

            async Task <IResult> ExecuteCallback(ICommandContext context, object[] args, IServiceProvider services, CommandInfo cmd)
            {
                var instance = createInstance(services);

                instance.SetContext(context);

                try
                {
                    instance.BeforeExecute(cmd);

                    var task = method.Invoke(instance, args) as Task ?? Task.Delay(0);
                    if (task is Task <RuntimeResult> resultTask)
                    {
                        return(await resultTask.ConfigureAwait(false));
                    }
                    else
                    {
                        await task.ConfigureAwait(false);

                        return(ExecuteResult.FromSuccess());
                    }
                }
                finally
                {
                    instance.AfterExecute(cmd);
                    (instance as IDisposable)?.Dispose();
                }
            }

            builder.Callback = ExecuteCallback;
        }
        private static void BuildCommand(CommandBuilder builder, TypeInfo typeInfo, MethodInfo method, CommandService service)
        {
            var attributes = method.GetCustomAttributes();

            foreach (var attribute in attributes)
            {
                // TODO: C#7 type switch
                if (attribute is CommandAttribute)
                {
                    var cmdAttr = attribute as CommandAttribute;
                    builder.AddAliases(cmdAttr.Text);
                    builder.RunMode = cmdAttr.RunMode;
                    builder.Name    = builder.Name ?? cmdAttr.Text;
                }
                else if (attribute is NameAttribute)
                {
                    builder.Name = (attribute as NameAttribute).Text;
                }
                else if (attribute is PriorityAttribute)
                {
                    builder.Priority = (attribute as PriorityAttribute).Priority;
                }
                else if (attribute is SummaryAttribute)
                {
                    builder.Summary = (attribute as SummaryAttribute).Text;
                }
                else if (attribute is RemarksAttribute)
                {
                    builder.Remarks = (attribute as RemarksAttribute).Text;
                }
                else if (attribute is AliasAttribute)
                {
                    builder.AddAliases((attribute as AliasAttribute).Aliases);
                }
                else if (attribute is PreconditionAttribute)
                {
                    builder.AddPrecondition(attribute as PreconditionAttribute);
                }
            }

            if (builder.Name == null)
            {
                builder.Name = method.Name;
            }

            var parameters = method.GetParameters();
            int pos = 0, count = parameters.Length;

            foreach (var paramInfo in parameters)
            {
                builder.AddParameter((parameter) =>
                {
                    BuildParameter(parameter, paramInfo, pos++, count, service);
                });
            }

            var createInstance = ReflectionUtils.CreateBuilder <IModuleBase>(typeInfo, service);

            builder.Callback = async(ctx, args, map) =>
            {
                var instance = createInstance(map);
                instance.SetContext(ctx);
                try
                {
                    instance.BeforeExecute();
                    var task = method.Invoke(instance, args) as Task ?? Task.Delay(0);
                    await task.ConfigureAwait(false);
                }
                finally
                {
                    instance.AfterExecute();
                    (instance as IDisposable)?.Dispose();
                }
            };
        }