Display name support for enum type converter (#2156)

* Display name support for enum type converter

* allow display attribute on enum type converter

* update docs/examples to include enum Display sample

* Revert "allow display attribute on enum type converter"

This reverts commit a0eec5b7555d366f9de7421f6fcf6bc71f2a4557.

* adds ChoiceDisplay for enum type converters

* Update EnumChoiceAttribute.cs

* fix renamed folder issue

* fix namespace

Co-authored-by: Xeno <eliotd@gmail.com>
This commit is contained in:
Quin Lynch
2022-03-02 19:23:51 -04:00
committed by GitHub
parent 9ba64f62d1
commit c80067425a
4 changed files with 46 additions and 6 deletions

View File

@@ -1,16 +1,18 @@
[SlashCommand("blep", "Send a random adorable animal photo")] [SlashCommand("blep", "Send a random adorable animal photo")]
public async Task Blep([Choice("Dog", "dog"), Choice("Cat", "cat"), Choice("Penguin", "penguin")] string animal) public async Task Blep([Choice("Dog", "dog"), Choice("Cat", "cat"), Choice("Guinea pig", "GuineaPig")] string animal)
{ {
... ...
} }
// In most cases, you can use an enum to replace the seperate choice attributes in a command. // In most cases, you can use an enum to replace the separate choice attributes in a command.
public enum Animal public enum Animal
{ {
Cat, Cat,
Dog, Dog,
Penguin // You can also use the ChoiceDisplay attribute to change how they appear in the choice menu.
[ChoiceDisplay("Guinea pig")]
GuineaPig
} }
[SlashCommand("blep", "Send a random adorable animal photo")] [SlashCommand("blep", "Send a random adorable animal photo")]

View File

@@ -1,3 +1,11 @@
using Discord.Interactions;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace InteractionFramework namespace InteractionFramework
{ {
public enum ExampleEnum public enum ExampleEnum
@@ -5,6 +13,8 @@ namespace InteractionFramework
First, First,
Second, Second,
Third, Third,
Fourth Fourth,
[ChoiceDisplay("Twenty First")]
TwentyFirst
} }
} }

View File

@@ -0,0 +1,25 @@
using System;
namespace Discord.Interactions
{
/// <summary>
/// Customize the displayed value of a slash command choice enum. Only works with the default enum type converter.
/// </summary>
[AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)]
public class ChoiceDisplayAttribute : Attribute
{
/// <summary>
/// Gets the name of the parameter.
/// </summary>
public string Name { get; } = null;
/// <summary>
/// Modify the default name and description values of a Slash Command parameter.
/// </summary>
/// <param name="name">Name of the parameter.</param>
public ChoiceDisplayAttribute(string name)
{
Name = name;
}
}
}

View File

@@ -2,6 +2,7 @@ using Discord.WebSocket;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Discord.Interactions namespace Discord.Interactions
@@ -27,12 +28,14 @@ namespace Discord.Interactions
var choices = new List<ApplicationCommandOptionChoiceProperties>(); var choices = new List<ApplicationCommandOptionChoiceProperties>();
foreach (var member in members) foreach (var member in members)
{
var displayValue = member.GetCustomAttribute<ChoiceDisplayAttribute>()?.Name ?? member.Name;
choices.Add(new ApplicationCommandOptionChoiceProperties choices.Add(new ApplicationCommandOptionChoiceProperties
{ {
Name = member.Name, Name = displayValue,
Value = member.Name Value = member.Name
}); });
}
properties.Choices = choices; properties.Choices = choices;
} }
} }