Esempio n. 1
0
 public override Task <TypeConverterResult> ReadAsync(IInteractionContext context, IComponentInteractionData option, IServiceProvider services)
 => string.IsNullOrEmpty(option.Value) ? Task.FromResult(TypeConverterResult.FromSuccess(null)) : _typeConverter.ReadAsync(context, option, services);
        /// <inheritdoc/>
        public async Task <IResult> ExecuteAsync(IInteractionContext context, IEnumerable <CommandParameterInfo> paramList, IEnumerable <string> wildcardCaptures, IComponentInteractionData data,
                                                 IServiceProvider services)
        {
            var paramCount   = paramList.Count();
            var captureCount = wildcardCaptures?.Count() ?? 0;

            if (context.Interaction is not IComponentInteraction messageComponent)
            {
                return(ExecuteResult.FromError(InteractionCommandError.ParseFailed, $"Provided {nameof(IInteractionContext)} doesn't belong to a Component Command Interaction"));
            }

            try
            {
                var args = new object[paramCount];

                for (var i = 0; i < paramCount; i++)
                {
                    var parameter = Parameters.ElementAt(i);
                    var isCapture = i < captureCount;

                    if (isCapture ^ parameter.IsRouteSegmentParameter)
                    {
                        return(await InvokeEventAndReturn(context, ExecuteResult.FromError(InteractionCommandError.BadArgs, "Argument type and parameter type didn't match (Wild Card capture/Component value)")).ConfigureAwait(false));
                    }

                    var readResult = isCapture ? await parameter.TypeReader.ReadAsync(context, wildcardCaptures.ElementAt(i), services).ConfigureAwait(false) :
                                     await parameter.TypeConverter.ReadAsync(context, data, services).ConfigureAwait(false);

                    if (!readResult.IsSuccess)
                    {
                        return(await InvokeEventAndReturn(context, readResult).ConfigureAwait(false));
                    }

                    args[i] = readResult.Value;
                }

                return(await RunAsync(context, args, services).ConfigureAwait(false));
            }
            catch (Exception ex)
            {
                return(await InvokeEventAndReturn(context, ExecuteResult.FromError(ex)).ConfigureAwait(false));
            }
        }
Esempio n. 3
0
 public override Task <TypeConverterResult> ReadAsync(IInteractionContext context, IComponentInteractionData option, IServiceProvider services)
 {
     try
     {
         return(option.Type switch
         {
             ComponentType.SelectMenu => Task.FromResult(TypeConverterResult.FromSuccess(Convert.ChangeType(string.Join(",", option.Values), typeof(T)))),
             ComponentType.TextInput => Task.FromResult(TypeConverterResult.FromSuccess(Convert.ChangeType(option.Value, typeof(T)))),
             _ => Task.FromResult(TypeConverterResult.FromError(InteractionCommandError.ConvertFailed, $"{option.Type} doesn't have a convertible value."))
         });
     }
        public override async Task <TypeConverterResult> ReadAsync(IInteractionContext context, IComponentInteractionData option, IServiceProvider services)
        {
            var results = new List <TypeConverterResult>();

            foreach (var value in option.Values)
            {
                var result = await _typeReader.ReadAsync(context, value, services).ConfigureAwait(false);

                if (!result.IsSuccess)
                {
                    return(result);
                }

                results.Add(result);
            }

            var destination = Array.CreateInstance(_underlyingType, results.Count);

            for (var i = 0; i < results.Count; i++)
            {
                destination.SetValue(results[i].Value, i);
            }

            return(TypeConverterResult.FromSuccess(destination));
        }