| @@ -1,5 +1,7 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Diagnostics.CodeAnalysis; | |||
| using System.Linq; | |||
| using System.Threading.Tasks; | |||
| namespace Discord.Interactions | |||
| @@ -17,27 +19,56 @@ namespace Discord.Interactions | |||
| throw new InvalidOperationException($"{nameof(DefaultArrayComponentConverter<T>)} cannot be used to convert a non-array type."); | |||
| _underlyingType = typeof(T).GetElementType(); | |||
| _typeReader = interactionService.GetTypeReader(_underlyingType); | |||
| _typeReader = true switch | |||
| { | |||
| _ when typeof(IUser).IsAssignableFrom(_underlyingType) | |||
| || typeof(IChannel).IsAssignableFrom(_underlyingType) | |||
| || typeof(IMentionable).IsAssignableFrom(_underlyingType) | |||
| || typeof(IRole).IsAssignableFrom(_underlyingType) => null, | |||
| _ => interactionService.GetTypeReader(_underlyingType) | |||
| }; | |||
| } | |||
| public override async Task<TypeConverterResult> ReadAsync(IInteractionContext context, IComponentInteractionData option, IServiceProvider services) | |||
| { | |||
| var results = new List<TypeConverterResult>(); | |||
| var objs = new List<object>(); | |||
| if(_typeReader is not null && option.Values.Count > 0) | |||
| foreach (var value in option.Values) | |||
| { | |||
| var result = await _typeReader.ReadAsync(context, value, services).ConfigureAwait(false); | |||
| if (!result.IsSuccess) | |||
| return result; | |||
| foreach (var value in option.Values) | |||
| objs.Add(result.Value); | |||
| } | |||
| else | |||
| { | |||
| var result = await _typeReader.ReadAsync(context, value, services).ConfigureAwait(false); | |||
| var users = new Dictionary<ulong, IUser>(); | |||
| if (option.Users is not null) | |||
| foreach (var user in option.Users) | |||
| users[user.Id] = user; | |||
| if(option.Members is not null) | |||
| foreach(var member in option.Members) | |||
| users[member.Id] = member; | |||
| objs.AddRange(users.Values); | |||
| if (!result.IsSuccess) | |||
| return result; | |||
| if(option.Roles is not null) | |||
| objs.AddRange(option.Roles); | |||
| results.Add(result); | |||
| if (option.Channels is not null) | |||
| objs.AddRange(option.Channels); | |||
| } | |||
| var destination = Array.CreateInstance(_underlyingType, results.Count); | |||
| var destination = Array.CreateInstance(_underlyingType, objs.Count); | |||
| for (var i = 0; i < results.Count; i++) | |||
| destination.SetValue(results[i].Value, i); | |||
| for (var i = 0; i < objs.Count; i++) | |||
| destination.SetValue(objs[i], i); | |||
| return TypeConverterResult.FromSuccess(destination); | |||
| } | |||