Add generic [AutocompleteAttribute] (#2611)

* add generic AutocompleteAttribute

* fancy syntax

* it didn't work -_-

---------

Co-authored-by: Misha133 <mihagribkov133@gmail.com>
This commit is contained in:
Cenk Ergen
2024-01-17 00:11:29 +03:00
committed by GitHub
parent ff9b9b4256
commit 12179a93d7
2 changed files with 39 additions and 27 deletions

View File

@@ -1,36 +1,46 @@
using System;
namespace Discord.Interactions
namespace Discord.Interactions;
/// <summary>
/// Set the <see cref="ApplicationCommandOptionProperties.IsAutocomplete"/> to <see langword="true"/>.
/// </summary>
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)]
public class AutocompleteAttribute : Attribute
{
/// <summary>
/// Set the <see cref="ApplicationCommandOptionProperties.IsAutocomplete"/> to <see langword="true"/>.
/// Type of the <see cref="AutocompleteHandler"/>.
/// </summary>
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)]
public class AutocompleteAttribute : Attribute
public Type AutocompleteHandlerType { get; }
/// <summary>
/// Set the <see cref="ApplicationCommandOptionProperties.IsAutocomplete"/> to <see langword="true"/> and define a <see cref="AutocompleteHandler"/> to handle
/// Autocomplete interactions targeting the parameter this <see cref="Attribute"/> is applied to.
/// </summary>
/// <remarks>
/// <see cref="InteractionServiceConfig.EnableAutocompleteHandlers"/> must be set to <see langword="true"/> to use this constructor.
/// </remarks>
public AutocompleteAttribute(Type autocompleteHandlerType)
{
/// <summary>
/// Type of the <see cref="AutocompleteHandler"/>.
/// </summary>
public Type AutocompleteHandlerType { get; }
if (!typeof(IAutocompleteHandler).IsAssignableFrom(autocompleteHandlerType))
throw new InvalidOperationException($"{autocompleteHandlerType.FullName} isn't a valid {nameof(IAutocompleteHandler)} type");
/// <summary>
/// Set the <see cref="ApplicationCommandOptionProperties.IsAutocomplete"/> to <see langword="true"/> and define a <see cref="AutocompleteHandler"/> to handle
/// Autocomplete interactions targeting the parameter this <see cref="Attribute"/> is applied to.
/// </summary>
/// <remarks>
/// <see cref="InteractionServiceConfig.EnableAutocompleteHandlers"/> must be set to <see langword="true"/> to use this constructor.
/// </remarks>
public AutocompleteAttribute(Type autocompleteHandlerType)
{
if (!typeof(IAutocompleteHandler).IsAssignableFrom(autocompleteHandlerType))
throw new InvalidOperationException($"{autocompleteHandlerType.FullName} isn't a valid {nameof(IAutocompleteHandler)} type");
AutocompleteHandlerType = autocompleteHandlerType;
}
/// <summary>
/// Set the <see cref="ApplicationCommandOptionProperties.IsAutocomplete"/> to <see langword="true"/> without specifying a <see cref="AutocompleteHandler"/>.
/// </summary>
public AutocompleteAttribute() { }
AutocompleteHandlerType = autocompleteHandlerType;
}
/// <summary>
/// Set the <see cref="ApplicationCommandOptionProperties.IsAutocomplete"/> to <see langword="true"/> without specifying a <see cref="AutocompleteHandler"/>.
/// </summary>
public AutocompleteAttribute() { }
}
/// <summary>
/// Set the <see cref="ApplicationCommandOptionProperties.IsAutocomplete"/> to <see langword="true"/>.
/// </summary>
/// <typeparam name="T">Type of the <see cref="AutocompleteHandler"/> that will be used to handle Autocomplete interactions targeting the parameter.</typeparam>
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)]
public class AutocompleteAttribute<T> : AutocompleteAttribute
where T : class, IAutocompleteHandler
{
public AutocompleteAttribute() : base(typeof(T)) { }
}

View File

@@ -3,12 +3,14 @@
<Import Project="../../StyleAnalyzer.targets" />
<PropertyGroup>
<TargetFrameworks Condition=" '$(OS)' == 'Windows_NT' ">net6.0;net5.0;net461;netstandard2.0;netstandard2.1</TargetFrameworks>
<LangVersion>preview</LangVersion>
<TargetFrameworks Condition=" '$(OS)' != 'Windows_NT' ">net6.0;net5.0;netstandard2.0;netstandard2.1</TargetFrameworks>
<RootNamespace>Discord.Interactions</RootNamespace>
<AssemblyName>Discord.Net.Interactions</AssemblyName>
<Description>A Discord.Net extension adding support for Application Commands.</Description>
<WarningLevel>5</WarningLevel>
<TreatWarningsAsErrors>True</TreatWarningsAsErrors>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>
<ItemGroup>