Skip to content
This repository was archived by the owner on Apr 9, 2025. It is now read-only.

Commit ddff937

Browse files
committed
Add fullname/parent properties to the builders
1 parent 1b3082a commit ddff937

File tree

5 files changed

+71
-4
lines changed

5 files changed

+71
-4
lines changed

src/CommandAllExtension.cs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,9 +175,34 @@ private async Task DiscordClient_ReadyAsync(DiscordClient sender, ReadyEventArgs
175175
// Prevent the event handler from being executed multiple times.
176176
Client.Ready -= DiscordClient_ReadyAsync;
177177

178-
foreach (CommandBuilder command in CommandManager.CommandBuilders.Values)
178+
// Iterate through all the commands and ensure that all the parameters can be converted.
179+
foreach (CommandBuilder commandBuilder in CommandManager.CommandBuilders.Values)
179180
{
180-
SaturateParametersRecursively(command);
181+
if (!ArgumentConverterManager.TrySaturateParameters(commandBuilder.GetAllParameters(), out IEnumerable<CommandParameterBuilder>? failedParameters))
182+
{
183+
foreach (CommandParameterBuilder parameterBuilder in failedParameters!)
184+
{
185+
if (parameterBuilder.OverloadBuilder is null)
186+
{
187+
throw new InvalidOperationException($"OverloadBuilder is null on parameter {parameterBuilder}.");
188+
}
189+
else if (parameterBuilder.OverloadBuilder.Command is null)
190+
{
191+
throw new InvalidOperationException($"Command is null on overload {parameterBuilder.OverloadBuilder}.");
192+
}
193+
194+
parameterBuilder.OverloadBuilder.Flags |= CommandOverloadFlags.Disabled;
195+
if (parameterBuilder.OverloadBuilder.Command.Overloads.All(x => x.Flags.HasFlag(CommandOverloadFlags.Disabled)))
196+
{
197+
_logger.LogError("Disabling command {Command} due to all overloads being disabled.", commandBuilder);
198+
parameterBuilder.OverloadBuilder!.Command.Flags |= CommandFlags.Disabled;
199+
}
200+
else if (!parameterBuilder.OverloadBuilder.Command.Flags.HasFlag(CommandFlags.Disabled))
201+
{
202+
_logger.LogWarning("Disabling overload {CommandOverload} due to missing converters for the following parameters: {FailedParameters}", parameterBuilder.OverloadBuilder, parameterBuilder);
203+
}
204+
}
205+
}
181206
}
182207

183208
await _configureCommands.InvokeAsync(this, new ConfigureCommandsEventArgs(this, CommandManager));

src/Commands/Builders/Commands/CommandBuilder.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ public sealed class CommandBuilder : Builder
4141
/// <inheritdoc cref="Command.SlashMetadata"/>
4242
public CommandSlashMetadataBuilder SlashMetadata { get; set; }
4343

44+
/// <inheritdoc cref="Command.Parent"/>
45+
public CommandBuilder? Parent { get; set; }
46+
47+
/// <inheritdoc cref="Command.FullName"/>
48+
public string? FullName => Parent is null ? Name : $"{Parent.FullName} {Name}";
49+
4450
/// <inheritdoc/>
4551
public CommandBuilder(CommandAllExtension commandAllExtension) : base(commandAllExtension) => SlashMetadata = new(commandAllExtension);
4652

@@ -85,6 +91,22 @@ public void NormalizeOverloadPriorities()
8591
Overloads = overloads;
8692
}
8793

94+
public IReadOnlyList<CommandParameterBuilder> GetAllParameters()
95+
{
96+
List<CommandParameterBuilder> parameters = new();
97+
foreach (CommandOverloadBuilder overload in Overloads)
98+
{
99+
parameters.AddRange(overload.Parameters);
100+
}
101+
102+
foreach (CommandBuilder subcommand in Subcommands)
103+
{
104+
parameters.AddRange(subcommand.GetAllParameters());
105+
}
106+
107+
return parameters.AsReadOnly();
108+
}
109+
88110
/// <inheritdoc/>
89111
[MemberNotNull(nameof(Name), nameof(Description))]
90112
public override void Verify()
@@ -227,6 +249,7 @@ private static bool TryParse(CommandAllExtension commandAllExtension, Type type,
227249
// Take the description from the first overload that has it.
228250
foreach (CommandOverloadBuilder overload in builder.Overloads)
229251
{
252+
overload.Command = builder;
230253
if (overload.Method.GetCustomAttribute<DescriptionAttribute>() is DescriptionAttribute descriptionAttribute)
231254
{
232255
builder.Description = descriptionAttribute.Description;
@@ -264,6 +287,11 @@ private static bool TryParse(CommandAllExtension commandAllExtension, Type type,
264287
Subcommands = new(commandBuilders),
265288
};
266289

290+
foreach (CommandBuilder subcommand in builder.Subcommands)
291+
{
292+
subcommand.Parent = builder;
293+
}
294+
267295
builders = new[] { builder };
268296
error = null;
269297
return true;

src/Commands/Builders/Commands/CommandOverloadBuilder.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using OoLunar.DSharpPlus.CommandAll.Attributes;
88
using OoLunar.DSharpPlus.CommandAll.Commands.Builders.SlashMetadata;
99
using OoLunar.DSharpPlus.CommandAll.Commands.Enums;
10+
using OoLunar.DSharpPlus.CommandAll.Commands.System.Commands;
1011
using OoLunar.DSharpPlus.CommandAll.Exceptions;
1112

1213
namespace OoLunar.DSharpPlus.CommandAll.Commands.Builders.Commands
@@ -32,6 +33,9 @@ public sealed class CommandOverloadBuilder : Builder
3233
/// <inheritdoc cref="CommandOverload.SlashMetadata"/>
3334
public CommandOverloadSlashMetadataBuilder SlashMetadata { get; set; }
3435

36+
/// <inheritdoc cref="CommandOverload.Command"/>
37+
public CommandBuilder? Command { get; set; }
38+
3539
/// <inheritdoc/>
3640
public CommandOverloadBuilder(CommandAllExtension commandAllExtension) : base(commandAllExtension) => SlashMetadata = new(commandAllExtension);
3741

@@ -141,6 +145,7 @@ public static bool TryParse(CommandAllExtension commandAllExtension, MethodInfo
141145
return false;
142146
}
143147

148+
parameterBuilder.OverloadBuilder = builder;
144149
parameterBuilders.Add(parameterBuilder);
145150
}
146151

src/Commands/Builders/Commands/CommandParameterBuilder.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using OoLunar.DSharpPlus.CommandAll.Commands.Arguments;
1212
using OoLunar.DSharpPlus.CommandAll.Commands.Builders.SlashMetadata;
1313
using OoLunar.DSharpPlus.CommandAll.Commands.Enums;
14+
using OoLunar.DSharpPlus.CommandAll.Commands.System.Commands;
1415
using OoLunar.DSharpPlus.CommandAll.Converters;
1516
using OoLunar.DSharpPlus.CommandAll.Exceptions;
1617

@@ -46,6 +47,9 @@ public sealed class CommandParameterBuilder : Builder
4647
/// <inheritdoc cref="CommandParameter.SlashMetadata"/>
4748
public CommandParameterSlashMetadataBuilder SlashMetadata { get; set; }
4849

50+
/// <inheritdoc cref="CommandParameter.Overload"/>
51+
public CommandOverloadBuilder? OverloadBuilder { get; set; }
52+
4953
/// <inheritdoc/>
5054
public CommandParameterBuilder(CommandAllExtension commandAllExtension) : base(commandAllExtension) => SlashMetadata = new(commandAllExtension);
5155

src/Managers/CommandManager.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Microsoft.Extensions.Logging;
88
using OoLunar.DSharpPlus.CommandAll.Commands;
99
using OoLunar.DSharpPlus.CommandAll.Commands.Builders.Commands;
10+
using OoLunar.DSharpPlus.CommandAll.Commands.Enums;
1011
using OoLunar.DSharpPlus.CommandAll.Commands.System.Commands;
1112
using OoLunar.DSharpPlus.CommandAll.Exceptions;
1213

@@ -79,12 +80,16 @@ public void BuildCommands()
7980
{
8081
try
8182
{
82-
if (!commandBuilder.TryVerify(out Exception? error))
83+
if (commandBuilder.Flags.HasFlag(CommandFlags.Disabled))
84+
{
85+
continue;
86+
}
87+
else if (!commandBuilder.TryVerify(out Exception? error))
8388
{
8489
_logger.LogError(error, "Failed to verify command builder {CommandBuilder}", commandBuilder);
8590
continue;
8691
}
87-
else if (commands.TryGetValue(commandBuilder.Name!, out Command? existingCommand))
92+
else if (commands.TryGetValue(commandBuilder.Name, out Command? existingCommand))
8893
{
8994
_logger.LogError("Command {ExistingCommand} already has the name {ExistingCommandName}. Unable to add {CommandBuilder}", existingCommand, existingCommand.Name, commandBuilder);
9095
continue;

0 commit comments

Comments
 (0)