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)); } }
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)); }