Exemple #1
0
        internal CommandInfo(Builders.ICommandBuilder builder, ModuleInfo module, InteractionService commandService)
        {
            CommandService = commandService;
            Module         = module;

            Name             = builder.Name;
            MethodName       = builder.MethodName;
            IgnoreGroupNames = builder.IgnoreGroupNames;
            RunMode          = builder.RunMode != RunMode.Default ? builder.RunMode : commandService._runMode;
            Attributes       = builder.Attributes.ToImmutableArray();
            Preconditions    = builder.Preconditions.ToImmutableArray();

            _action = builder.Callback;
            _groupedPreconditions = builder.Preconditions.ToLookup(x => x.Group, x => x, StringComparer.Ordinal);
        }
Exemple #2
0
        private static object GetMember(InteractionService commandService, IServiceProvider services, Type memberType, TypeInfo ownerType)
        {
            if (memberType == typeof(InteractionService))
            {
                return(commandService);
            }
            if (memberType == typeof(IServiceProvider) || memberType == services.GetType())
            {
                return(services);
            }
            var service = services.GetService(memberType);

            if (service != null)
            {
                return(service);
            }
            throw new InvalidOperationException($"Failed to create \"{ownerType.FullName}\", dependency \"{memberType.Name}\" was not found.");
        }
Exemple #3
0
        internal ModuleInfo(ModuleBuilder builder, InteractionService commandService, IServiceProvider services, ModuleInfo parent = null)
        {
            CommandService = commandService;

            Name                 = builder.Name;
            SlashGroupName       = builder.SlashGroupName;
            Description          = builder.Description;
            Parent               = parent;
            DefaultPermission    = builder.DefaultPermission;
            SlashCommands        = BuildSlashCommands(builder).ToImmutableArray();
            ContextCommands      = BuildContextCommands(builder).ToImmutableArray();
            ComponentCommands    = BuildComponentCommands(builder).ToImmutableArray();
            AutocompleteCommands = BuildAutocompleteCommands(builder).ToImmutableArray();
            SubModules           = BuildSubModules(builder, commandService, services).ToImmutableArray();
            Attributes           = BuildAttributes(builder).ToImmutableArray();
            Preconditions        = BuildPreconditions(builder).ToImmutableArray();
            IsTopLevelGroup      = IsSlashGroup && CheckTopLevel(parent);
            DontAutoRegister     = builder.DontAutoRegister;

            GroupedPreconditions = Preconditions.ToLookup(x => x.Group, x => x, StringComparer.Ordinal);
        }
Exemple #4
0
        internal static Func <IServiceProvider, T> CreateBuilder(TypeInfo typeInfo, InteractionService commandService)
        {
            var constructor = GetConstructor(typeInfo);
            var parameters  = constructor.GetParameters();
            var properties  = GetProperties(typeInfo);

            return((services) =>
            {
                var args = new object[parameters.Length];
                for (int i = 0; i < parameters.Length; i++)
                {
                    args[i] = GetMember(commandService, services, parameters[i].ParameterType, typeInfo);
                }

                var obj = InvokeConstructor(constructor, args, typeInfo);
                foreach (var property in properties)
                {
                    property.SetValue(obj, GetMember(commandService, services, property.PropertyType, typeInfo));
                }
                return obj;
            });
        }
Exemple #5
0
 /// <inheritdoc/>
 public virtual void OnModuleBuilding(InteractionService commandService, ModuleInfo module)
 {
 }
 internal ComponentCommandInfo(ComponentCommandBuilder builder, ModuleInfo module, InteractionService commandService) : base(builder, module, commandService)
 {
     Parameters = builder.Parameters.Select(x => x.Build(this)).ToImmutableArray();
 }
Exemple #7
0
 internal ModalCommandInfo(Builders.ModalCommandBuilder builder, ModuleInfo module, InteractionService commandService) : base(builder, module, commandService)
 {
     Parameters = builder.Parameters.Select(x => x.Build(this)).ToImmutableArray();
     Modal      = Parameters.Last().Modal;
 }
 internal static ContextCommandInfo Create(Builders.ContextCommandBuilder builder, ModuleInfo module, InteractionService commandService)
 {
     return(builder.CommandType switch
     {
         ApplicationCommandType.User => new UserCommandInfo(builder, module, commandService),
         ApplicationCommandType.Message => new MessageCommandInfo(builder, module, commandService),
         _ => throw new InvalidOperationException("This command type is not a supported Context Command"),
     });
 internal ContextCommandInfo(Builders.ContextCommandBuilder builder, ModuleInfo module, InteractionService commandService)
     : base(builder, module, commandService)
 {
     CommandType              = builder.CommandType;
     DefaultPermission        = builder.DefaultPermission;
     IsEnabledInDm            = builder.IsEnabledInDm;
     DefaultMemberPermissions = builder.DefaultMemberPermissions;
     Parameters = builder.Parameters.Select(x => x.Build(this)).ToImmutableArray();
 }
        /// <summary>
        /// Create a type initializer using compiled lambda expressions
        /// </summary>
        internal static Func <IServiceProvider, T> CreateLambdaBuilder(TypeInfo typeInfo, InteractionService commandService)
        {
            var constructor = GetConstructor(typeInfo);
            var parameters  = constructor.GetParameters();
            var properties  = GetProperties(typeInfo);

            var lambda = CreateLambdaMemberInit(typeInfo, constructor);

            return((services) =>
            {
                var args = new object[parameters.Length];
                var props = new object[properties.Length];

                for (int i = 0; i < parameters.Length; i++)
                {
                    args[i] = GetMember(commandService, services, parameters[i].ParameterType, typeInfo);
                }

                for (int i = 0; i < properties.Length; i++)
                {
                    props[i] = GetMember(commandService, services, properties[i].PropertyType, typeInfo);
                }

                var instance = lambda(args, props);

                return instance;
            });
        }
Exemple #11
0
 public TypeMap(InteractionService interactionService, IDictionary <Type, TConverter> concretes = null, IDictionary <Type, Type> generics = null)
 {
     _interactionService = interactionService;
     _concretes          = concretes is not null ? new(concretes) : new();
     _generics           = generics is not null ? new(generics) : new();
 }
 internal MessageCommandInfo(Builders.ContextCommandBuilder builder, ModuleInfo module, InteractionService commandService)
     : base(builder, module, commandService)
 {
 }
Exemple #13
0
        /// <summary>
        /// Create a type initializer using compiled lambda expressions
        /// </summary>
        internal static Func <IServiceProvider, T> CreateLambdaBuilder(TypeInfo typeInfo, InteractionService commandService)
        {
            var constructor = GetConstructor(typeInfo);
            var parameters  = constructor.GetParameters();
            var properties  = GetProperties(typeInfo);

            var argsExp  = Expression.Parameter(typeof(object[]), "args");
            var propsExp = Expression.Parameter(typeof(object[]), "props");

            var parameterExps = new Expression[parameters.Length];

            for (var i = 0; i < parameters.Length; i++)
            {
                var indexExp  = Expression.Constant(i);
                var accessExp = Expression.ArrayIndex(argsExp, indexExp);
                parameterExps[i] = Expression.Convert(accessExp, parameters[i].ParameterType);
            }

            var newExp = Expression.New(constructor, parameterExps);

            var memberExps = new MemberAssignment[properties.Length];

            for (var i = 0; i < properties.Length; i++)
            {
                var indexEx   = Expression.Constant(i);
                var accessExp = Expression.Convert(Expression.ArrayIndex(propsExp, indexEx), properties[i].PropertyType);
                memberExps[i] = Expression.Bind(properties[i], accessExp);
            }
            var memberInit = Expression.MemberInit(newExp, memberExps);
            var lambda     = Expression.Lambda <Func <object[], object[], T> >(memberInit, argsExp, propsExp).Compile();

            return((services) =>
            {
                var args = new object[parameters.Length];
                var props = new object[properties.Length];

                for (int i = 0; i < parameters.Length; i++)
                {
                    args[i] = GetMember(commandService, services, parameters[i].ParameterType, typeInfo);
                }

                for (int i = 0; i < properties.Length; i++)
                {
                    props[i] = GetMember(commandService, services, properties[i].PropertyType, typeInfo);
                }

                var instance = lambda(args, props);

                return instance;
            });
        }
Exemple #14
0
 internal static T CreateObject(TypeInfo typeInfo, InteractionService commandService, IServiceProvider services = null) =>
 CreateBuilder(typeInfo, commandService)(services);
Exemple #15
0
 /// <inheritdoc/>
 public virtual void Construct(Builders.ModuleBuilder builder, InteractionService commandService)
 {
 }
Exemple #16
0
 internal AutocompleteCommandInfo(AutocompleteCommandBuilder builder, ModuleInfo module, InteractionService commandService) : base(builder, module, commandService)
 {
     Parameters    = builder.Parameters.Select(x => x.Build(this)).ToImmutableArray();
     ParameterName = builder.ParameterName;
     CommandName   = builder.CommandName;
 }
Exemple #17
0
        internal SlashCommandInfo(Builders.SlashCommandBuilder builder, ModuleInfo module, InteractionService commandService) : base(builder, module, commandService)
        {
            Description         = builder.Description;
            DefaultPermission   = builder.DefaultPermission;
            Parameters          = builder.Parameters.Select(x => x.Build(this)).ToImmutableArray();
            FlattenedParameters = FlattenParameters(Parameters).ToImmutableArray();

            for (var i = 0; i < FlattenedParameters.Count - 1; i++)
            {
                if (!FlattenedParameters.ElementAt(i).IsRequired&& FlattenedParameters.ElementAt(i + 1).IsRequired)
                {
                    throw new InvalidOperationException("Optional parameters must appear after all required parameters, ComplexParameters with optional parameters must be located at the end.");
                }
            }

            _flattenedParameterDictionary = FlattenedParameters?.ToDictionary(x => x.Name, x => x).ToImmutableDictionary();
        }
Exemple #18
0
 internal SlashCommandInfo(Builders.SlashCommandBuilder builder, ModuleInfo module, InteractionService commandService) : base(builder, module, commandService)
 {
     Description       = builder.Description;
     DefaultPermission = builder.DefaultPermission;
     Parameters        = builder.Parameters.Select(x => x.Build(this)).ToImmutableArray();
 }