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); }
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."); }
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); }
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; }); }
/// <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(); }
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; }); }
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) { }
/// <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; }); }
internal static T CreateObject(TypeInfo typeInfo, InteractionService commandService, IServiceProvider services = null) => CreateBuilder(typeInfo, commandService)(services);
/// <inheritdoc/> public virtual void Construct(Builders.ModuleBuilder builder, InteractionService commandService) { }
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; }
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(); }
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(); }