| @@ -13,7 +13,7 @@ namespace Discord.WebSocket | |||
| /// <returns> | |||
| /// The name of the executed command and its parents in hierarchical order. | |||
| /// </returns> | |||
| public static string[] GetCommandKeywords(this IApplicationCommandInteractionData data) | |||
| public static IList<string> GetCommandKeywords(this IApplicationCommandInteractionData data) | |||
| { | |||
| var keywords = new List<string> { data.Name }; | |||
| @@ -25,7 +25,7 @@ namespace Discord.WebSocket | |||
| child = child.Options?.ElementAtOrDefault(0); | |||
| } | |||
| return keywords.ToArray(); | |||
| return keywords; | |||
| } | |||
| /// <summary> | |||
| @@ -35,7 +35,7 @@ namespace Discord.WebSocket | |||
| /// <returns> | |||
| /// The name of the executed command and its parents in hierarchical order. | |||
| /// </returns> | |||
| public static string[] GetCommandKeywords(this IAutocompleteInteractionData data) | |||
| public static IList<string> GetCommandKeywords(this IAutocompleteInteractionData data) | |||
| { | |||
| var keywords = new List<string> { data.CommandName }; | |||
| @@ -47,7 +47,7 @@ namespace Discord.WebSocket | |||
| if (subcommand is not null) | |||
| keywords.Add(subcommand.Name); | |||
| return keywords.ToArray(); | |||
| return keywords; | |||
| } | |||
| } | |||
| } | |||
| @@ -64,23 +64,26 @@ namespace Discord.Interactions | |||
| return $"Autocomplete Command: \"{base.ToString()}\" for {context.User} in {context.Channel}"; | |||
| } | |||
| internal string[] GetCommandKeywords() | |||
| internal IList<string> GetCommandKeywords() | |||
| { | |||
| var keywords = new List<string>() { ParameterName, CommandName }; | |||
| var currentParent = Module; | |||
| while (currentParent != null) | |||
| if(!IgnoreGroupNames) | |||
| { | |||
| if (!string.IsNullOrEmpty(currentParent.SlashGroupName)) | |||
| keywords.Add(currentParent.SlashGroupName); | |||
| var currentParent = Module; | |||
| while (currentParent != null) | |||
| { | |||
| if (!string.IsNullOrEmpty(currentParent.SlashGroupName)) | |||
| keywords.Add(currentParent.SlashGroupName); | |||
| currentParent = currentParent.Parent; | |||
| currentParent = currentParent.Parent; | |||
| } | |||
| } | |||
| keywords.Reverse(); | |||
| return keywords.ToArray(); | |||
| return keywords; | |||
| } | |||
| } | |||
| } | |||
| @@ -40,7 +40,7 @@ namespace Discord.Interactions | |||
| /// <summary> | |||
| /// Gets whether this parameter is configured for Autocomplete Interactions. | |||
| /// </summary> | |||
| public bool IsAutocomplete => AutocompleteHandler is not null; | |||
| public bool IsAutocomplete { get; } | |||
| /// <summary> | |||
| /// Gets the Discord option type this parameter represents. | |||
| @@ -64,6 +64,7 @@ namespace Discord.Interactions | |||
| Description = builder.Description; | |||
| MaxValue = builder.MaxValue; | |||
| MinValue = builder.MinValue; | |||
| IsAutocomplete = builder.Autocomplete; | |||
| Choices = builder.Choices.ToImmutableArray(); | |||
| ChannelTypes = builder.ChannelTypes.ToImmutableArray(); | |||
| } | |||
| @@ -505,7 +505,7 @@ namespace Discord.Interactions | |||
| _componentCommandMap.AddCommand(interaction, interaction.IgnoreGroupNames); | |||
| foreach (var command in module.AutocompleteCommands) | |||
| _autocompleteCommandMap.AddCommand(command, command.IgnoreGroupNames); | |||
| _autocompleteCommandMap.AddCommand(command.GetCommandKeywords(), command); | |||
| foreach (var subModule in module.SubModules) | |||
| LoadModuleInternal(subModule); | |||
| @@ -675,11 +675,13 @@ namespace Discord.Interactions | |||
| { | |||
| var parameter = autocompleteHandlerResult.Command.Parameters.FirstOrDefault(x => string.Equals(x.Name, interaction.Data.Current.Name, StringComparison.Ordinal)); | |||
| if(parameter is not null) | |||
| if(parameter?.AutocompleteHandler is not null) | |||
| return await parameter.AutocompleteHandler.ExecuteAsync(context, interaction, parameter, services).ConfigureAwait(false); | |||
| } | |||
| } | |||
| keywords.Add(interaction.Data.Current.Name); | |||
| var commandResult = _autocompleteCommandMap.GetCommand(keywords); | |||
| if(!commandResult.IsSuccess) | |||
| @@ -35,14 +35,14 @@ namespace Discord.Interactions | |||
| _root.AddCommand(key, 0, command); | |||
| } | |||
| public void AddCommand(string[] input, T command) | |||
| public void AddCommand(IList<string> input, T command) | |||
| { | |||
| _root.AddCommand(input, 0, command); | |||
| } | |||
| public void RemoveCommand(T command) | |||
| { | |||
| string[] key = ParseCommandName(command); | |||
| var key = ParseCommandName(command); | |||
| _root.RemoveCommand(key, 0); | |||
| } | |||
| @@ -55,17 +55,17 @@ namespace Discord.Interactions | |||
| return GetCommand(new string[] { input }); | |||
| } | |||
| public SearchResult<T> GetCommand(string[] input) => | |||
| public SearchResult<T> GetCommand(IList<string> input) => | |||
| _root.GetCommand(input, 0); | |||
| private void AddCommand(T command) | |||
| { | |||
| string[] key = ParseCommandName(command); | |||
| var key = ParseCommandName(command); | |||
| _root.AddCommand(key, 0, command); | |||
| } | |||
| private string[] ParseCommandName(T command) | |||
| private IList<string> ParseCommandName(T command) | |||
| { | |||
| var keywords = new List<string>() { command.Name }; | |||
| @@ -81,7 +81,7 @@ namespace Discord.Interactions | |||
| keywords.Reverse(); | |||
| return keywords.ToArray(); | |||
| return keywords; | |||
| } | |||
| } | |||
| } | |||
| @@ -31,9 +31,9 @@ namespace Discord.Interactions | |||
| _wildCardStr = wildCardExp; | |||
| } | |||
| public void AddCommand (string[] keywords, int index, T commandInfo) | |||
| public void AddCommand (IList<string> keywords, int index, T commandInfo) | |||
| { | |||
| if (keywords.Length == index + 1) | |||
| if (keywords.Count == index + 1) | |||
| { | |||
| if (commandInfo.SupportsWildCards && commandInfo.Name.Contains(_wildCardStr)) | |||
| { | |||
| @@ -46,7 +46,7 @@ namespace Discord.Interactions | |||
| } | |||
| else | |||
| { | |||
| if (!_commands.TryAdd(commandInfo.Name, commandInfo)) | |||
| if (!_commands.TryAdd(keywords[index], commandInfo)) | |||
| throw new InvalidOperationException($"A {typeof(T).FullName} already exists with the same name: {string.Join(" ", keywords)}"); | |||
| } | |||
| } | |||
| @@ -57,9 +57,9 @@ namespace Discord.Interactions | |||
| } | |||
| } | |||
| public bool RemoveCommand (string[] keywords, int index) | |||
| public bool RemoveCommand (IList<string> keywords, int index) | |||
| { | |||
| if (keywords.Length == index + 1) | |||
| if (keywords.Count == index + 1) | |||
| return _commands.TryRemove(keywords[index], out var _); | |||
| else | |||
| { | |||
| @@ -70,11 +70,11 @@ namespace Discord.Interactions | |||
| } | |||
| } | |||
| public SearchResult<T> GetCommand (string[] keywords, int index) | |||
| public SearchResult<T> GetCommand (IList<string> keywords, int index) | |||
| { | |||
| string name = string.Join(" ", keywords); | |||
| if (keywords.Length == index + 1) | |||
| if (keywords.Count == index + 1) | |||
| { | |||
| if (_commands.TryGetValue(keywords[index], out var cmd)) | |||
| return SearchResult<T>.FromSuccess(name, cmd); | |||