Browse Source

bug fixes

pull/2169/head
Cenk Ergen 3 years ago
parent
commit
46db9d8185
5 changed files with 48 additions and 18 deletions
  1. +2
    -2
      src/Discord.Net.Interactions/Builders/ModuleClassBuilder.cs
  2. +7
    -0
      src/Discord.Net.Interactions/Builders/Parameters/ModalCommandParameterBuilder.cs
  3. +29
    -13
      src/Discord.Net.Interactions/Info/Commands/ModalCommandInfo.cs
  4. +8
    -1
      src/Discord.Net.Interactions/Info/Parameters/ModalCommandParameterInfo.cs
  5. +2
    -2
      src/Discord.Net.Interactions/TypeReaders/DefaultSnowflakeReader.cs

+ 2
- 2
src/Discord.Net.Interactions/Builders/ModuleClassBuilder.cs View File

@@ -309,8 +309,8 @@ namespace Discord.Interactions.Builders
if (parameters.Count(x => typeof(IModal).IsAssignableFrom(x.ParameterType)) > 1)
throw new InvalidOperationException($"A modal command can only have one {nameof(IModal)} parameter.");

if (!parameters.All(x => x.ParameterType == typeof(string) || typeof(IModal).IsAssignableFrom(x.ParameterType)))
throw new InvalidOperationException($"All parameters of a modal command must be either a string or an implementation of {nameof(IModal)}");
if (!typeof(IModal).IsAssignableFrom(parameters.Last().ParameterType))
throw new InvalidOperationException($"Last parameter of a modal command must be an implementation of {nameof(IModal)}");

var attributes = methodInfo.GetCustomAttributes();



+ 7
- 0
src/Discord.Net.Interactions/Builders/Parameters/ModalCommandParameterBuilder.cs View File

@@ -20,6 +20,11 @@ namespace Discord.Interactions.Builders
/// </summary>
public bool IsModalParameter => Modal is not null;

/// <summary>
/// Gets the <see cref="TypeReader"/> assigned to this parameter, if <see cref="IsModalParameter"/> is <see langword="true"/>.
/// </summary>
public TypeReader TypeReader { get; private set; }

internal ModalCommandParameterBuilder(ICommandBuilder command) : base(command) { }

/// <summary>
@@ -35,6 +40,8 @@ namespace Discord.Interactions.Builders
{
if (typeof(IModal).IsAssignableFrom(type))
Modal = ModalUtils.GetOrAdd(type, Command.Module.InteractionService);
else
TypeReader = Command.Module.InteractionService.GetTypeReader(type);

return base.SetParameterType(type);
}


+ 29
- 13
src/Discord.Net.Interactions/Info/Commands/ModalCommandInfo.cs View File

@@ -47,24 +47,40 @@ namespace Discord.Interactions

try
{
var args = new List<object>();
var args = new object[Parameters.Count];
var captureCount = additionalArgs.Length;

if (additionalArgs is not null)
args.AddRange(additionalArgs);
for(var i = 0; i < Parameters.Count; i++)
{
var parameter = Parameters.ElementAt(i);

var modalResult = await Modal.CreateModalAsync(context, services, Module.CommandService._exitOnMissingModalField).ConfigureAwait(false);
if(i < captureCount)
{
var readResult = await parameter.TypeReader.ReadAsync(context, additionalArgs[i], services).ConfigureAwait(false);

if(!modalResult.IsSuccess)
{
await InvokeModuleEvent(context, modalResult).ConfigureAwait(false);
return modalResult;
}
if(!readResult.IsSuccess)
{
await InvokeModuleEvent(context, readResult).ConfigureAwait(false);
return readResult;
}
args[i] = readResult.Value;
}
else
{
var modalResult = await Modal.CreateModalAsync(context, services, Module.CommandService._exitOnMissingModalField).ConfigureAwait(false);

if(modalResult is ParseResult parseResult)
args.Add(parseResult.Value);
else
return ExecuteResult.FromError(InteractionCommandError.BadArgs, "Command parameter parsing failed for an unknown reason.");
if (!modalResult.IsSuccess)
{
await InvokeModuleEvent(context, modalResult).ConfigureAwait(false);
return modalResult;
}

if (modalResult is ParseResult parseResult)
args[i] = parseResult.Value;
else
return ExecuteResult.FromError(InteractionCommandError.BadArgs, "Command parameter parsing failed for an unknown reason.");
}
}
return await RunAsync(context, args.ToArray(), services);
}
catch (Exception ex)


+ 8
- 1
src/Discord.Net.Interactions/Info/Parameters/ModalCommandParameterInfo.cs View File

@@ -15,7 +15,12 @@ namespace Discord.Interactions
/// <summary>
/// Gets whether this parameter is an <see cref="IModal"/>
/// </summary>
public bool IsModalParameter => Modal is not null;
public bool IsModalParameter { get; }

/// <summary>
/// Gets the <see cref="TypeReader"/> assigned to this parameter, if <see cref="IsModalParameter"/> is <see langword="true"/>.
/// </summary>
public TypeReader TypeReader { get; }

/// <inheritdoc/>
public new ModalCommandInfo Command => base.Command as ModalCommandInfo;
@@ -23,6 +28,8 @@ namespace Discord.Interactions
internal ModalCommandParameterInfo(ModalCommandParameterBuilder builder, ICommandInfo command) : base(builder, command)
{
Modal = builder.Modal;
IsModalParameter = builder.IsModalParameter;
TypeReader = builder.TypeReader;
}
}
}

+ 2
- 2
src/Discord.Net.Interactions/TypeReaders/DefaultSnowflakeReader.cs View File

@@ -13,7 +13,7 @@ namespace Discord.Interactions
if (!ulong.TryParse(option, out var snowflake))
return TypeConverterResult.FromError(InteractionCommandError.ConvertFailed, $"{option} isn't a valid snowflake thus cannot be converted into {typeof(T).Name}");

var result = GetEntity(snowflake, context);
var result = await GetEntity(snowflake, context).ConfigureAwait(false);

if (result is not null)
return TypeConverterResult.FromSuccess(result);
@@ -37,7 +37,7 @@ namespace Discord.Interactions
}

internal sealed class DefaultRoleReader<T> : DefaultSnowflakeReader<T>
where T : class, IUser
where T : class, IRole
{
protected override Task<T> GetEntity(ulong id, IInteractionContext ctx) => Task.FromResult(ctx.Guild?.GetRole(id) as T);
}


Loading…
Cancel
Save