@@ -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, obj s.Count);
for (var i = 0; i < results.Count; i++)
destination.SetValue(results[i].Value , i);
for (var i = 0; i < obj s.Count; i++)
destination.SetValue(objs[i] , i);
return TypeConverterResult.FromSuccess(destination);
}