@@ -13,7 +13,7 @@ namespace Discord.WebSocket | |||||
/// <returns> | /// <returns> | ||||
/// The name of the executed command and its parents in hierarchical order. | /// The name of the executed command and its parents in hierarchical order. | ||||
/// </returns> | /// </returns> | ||||
public static string[] GetCommandKeywords(this IApplicationCommandInteractionData data) | |||||
public static IList<string> GetCommandKeywords(this IApplicationCommandInteractionData data) | |||||
{ | { | ||||
var keywords = new List<string> { data.Name }; | var keywords = new List<string> { data.Name }; | ||||
@@ -25,7 +25,7 @@ namespace Discord.WebSocket | |||||
child = child.Options?.ElementAtOrDefault(0); | child = child.Options?.ElementAtOrDefault(0); | ||||
} | } | ||||
return keywords.ToArray(); | |||||
return keywords; | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
@@ -35,7 +35,7 @@ namespace Discord.WebSocket | |||||
/// <returns> | /// <returns> | ||||
/// The name of the executed command and its parents in hierarchical order. | /// The name of the executed command and its parents in hierarchical order. | ||||
/// </returns> | /// </returns> | ||||
public static string[] GetCommandKeywords(this IAutocompleteInteractionData data) | |||||
public static IList<string> GetCommandKeywords(this IAutocompleteInteractionData data) | |||||
{ | { | ||||
var keywords = new List<string> { data.CommandName }; | var keywords = new List<string> { data.CommandName }; | ||||
@@ -47,7 +47,7 @@ namespace Discord.WebSocket | |||||
if (subcommand is not null) | if (subcommand is not null) | ||||
keywords.Add(subcommand.Name); | 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}"; | 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 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(); | keywords.Reverse(); | ||||
return keywords.ToArray(); | |||||
return keywords; | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -40,7 +40,7 @@ namespace Discord.Interactions | |||||
/// <summary> | /// <summary> | ||||
/// Gets whether this parameter is configured for Autocomplete Interactions. | /// Gets whether this parameter is configured for Autocomplete Interactions. | ||||
/// </summary> | /// </summary> | ||||
public bool IsAutocomplete => AutocompleteHandler is not null; | |||||
public bool IsAutocomplete { get; } | |||||
/// <summary> | /// <summary> | ||||
/// Gets the Discord option type this parameter represents. | /// Gets the Discord option type this parameter represents. | ||||
@@ -64,6 +64,7 @@ namespace Discord.Interactions | |||||
Description = builder.Description; | Description = builder.Description; | ||||
MaxValue = builder.MaxValue; | MaxValue = builder.MaxValue; | ||||
MinValue = builder.MinValue; | MinValue = builder.MinValue; | ||||
IsAutocomplete = builder.Autocomplete; | |||||
Choices = builder.Choices.ToImmutableArray(); | Choices = builder.Choices.ToImmutableArray(); | ||||
ChannelTypes = builder.ChannelTypes.ToImmutableArray(); | ChannelTypes = builder.ChannelTypes.ToImmutableArray(); | ||||
} | } | ||||
@@ -505,7 +505,7 @@ namespace Discord.Interactions | |||||
_componentCommandMap.AddCommand(interaction, interaction.IgnoreGroupNames); | _componentCommandMap.AddCommand(interaction, interaction.IgnoreGroupNames); | ||||
foreach (var command in module.AutocompleteCommands) | foreach (var command in module.AutocompleteCommands) | ||||
_autocompleteCommandMap.AddCommand(command, command.IgnoreGroupNames); | |||||
_autocompleteCommandMap.AddCommand(command.GetCommandKeywords(), command); | |||||
foreach (var subModule in module.SubModules) | foreach (var subModule in module.SubModules) | ||||
LoadModuleInternal(subModule); | 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)); | 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); | return await parameter.AutocompleteHandler.ExecuteAsync(context, interaction, parameter, services).ConfigureAwait(false); | ||||
} | } | ||||
} | } | ||||
keywords.Add(interaction.Data.Current.Name); | |||||
var commandResult = _autocompleteCommandMap.GetCommand(keywords); | var commandResult = _autocompleteCommandMap.GetCommand(keywords); | ||||
if(!commandResult.IsSuccess) | if(!commandResult.IsSuccess) | ||||
@@ -35,14 +35,14 @@ namespace Discord.Interactions | |||||
_root.AddCommand(key, 0, command); | _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); | _root.AddCommand(input, 0, command); | ||||
} | } | ||||
public void RemoveCommand(T command) | public void RemoveCommand(T command) | ||||
{ | { | ||||
string[] key = ParseCommandName(command); | |||||
var key = ParseCommandName(command); | |||||
_root.RemoveCommand(key, 0); | _root.RemoveCommand(key, 0); | ||||
} | } | ||||
@@ -55,17 +55,17 @@ namespace Discord.Interactions | |||||
return GetCommand(new string[] { input }); | return GetCommand(new string[] { input }); | ||||
} | } | ||||
public SearchResult<T> GetCommand(string[] input) => | |||||
public SearchResult<T> GetCommand(IList<string> input) => | |||||
_root.GetCommand(input, 0); | _root.GetCommand(input, 0); | ||||
private void AddCommand(T command) | private void AddCommand(T command) | ||||
{ | { | ||||
string[] key = ParseCommandName(command); | |||||
var key = ParseCommandName(command); | |||||
_root.AddCommand(key, 0, command); | _root.AddCommand(key, 0, command); | ||||
} | } | ||||
private string[] ParseCommandName(T command) | |||||
private IList<string> ParseCommandName(T command) | |||||
{ | { | ||||
var keywords = new List<string>() { command.Name }; | var keywords = new List<string>() { command.Name }; | ||||
@@ -81,7 +81,7 @@ namespace Discord.Interactions | |||||
keywords.Reverse(); | keywords.Reverse(); | ||||
return keywords.ToArray(); | |||||
return keywords; | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -31,9 +31,9 @@ namespace Discord.Interactions | |||||
_wildCardStr = wildCardExp; | _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)) | if (commandInfo.SupportsWildCards && commandInfo.Name.Contains(_wildCardStr)) | ||||
{ | { | ||||
@@ -46,7 +46,7 @@ namespace Discord.Interactions | |||||
} | } | ||||
else | 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)}"); | 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 _); | return _commands.TryRemove(keywords[index], out var _); | ||||
else | 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); | string name = string.Join(" ", keywords); | ||||
if (keywords.Length == index + 1) | |||||
if (keywords.Count == index + 1) | |||||
{ | { | ||||
if (_commands.TryGetValue(keywords[index], out var cmd)) | if (_commands.TryGetValue(keywords[index], out var cmd)) | ||||
return SearchResult<T>.FromSuccess(name, cmd); | return SearchResult<T>.FromSuccess(name, cmd); | ||||