Discord.Netで作ったBotにサポートコマンドバッジを追加する(スラッシュコマンドの登録、解除)

# 概要
サポートコマンドバッジはスラッシュコマンドを登録すると自動で付くようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/17806271-82ee-7a57-4397-b4614642eb03.png)
HttpClientで登録、解除できます。

## 環境
- .NET Framework 4.8 コンソールアプリケーション
- Discord.Net 3.12.0(登録、解除だけなら不要)
- Newtonsoft.Json 13.0.2(なくても可)

## 参考
[C#でDiscord Bot開発 （スラッシュコマンドの登録）for Discord.Net](https://www.dice-programming-etc.com/c-sharp-discord-post-slashcommand/)

# 詳細
### 前提構造
```c#:C#
public class SlashCommand
{
    public static string token = "TOKEN";//ここに入力
    public static string applicationID = "APPLICATION_ID";//ここに入力

    /// <summary>
    /// スラッシュコマンドの登録
    /// </summary>
    public static async void Add()
    {
        //以下に記載
    }

    /// <summary>
    /// スラッシュコマンドの解除
    /// </summary>
    /// <param name="commandID">解除するコマンドID</param>
    public static async void Delete(string commandID)
    {
        //以下に記載
    }
}
```

### 登録
```c#:C#
/// <summary>
/// スラッシュコマンドの登録
/// </summary>
public static async void Add()
{
    string url = $"https://discord.com/api/v8/applications/{applicationID}/commands";
    //構造をわかりやすくできます
    Dictionary<string, object> json = new Dictionary<string, object>()
    {//細かいものを追加したい場合参考ページを参照してください
        { "name", "help" },
        { "description", "現在使用できません" }
    };
    using (HttpClient client = new HttpClient())
        try
        {
            string content = JsonConvert.SerializeObject(json);
            //もちろんJSONデータを直接でも可能
            //string content = "{\"name\":\"help\"},{ \"description\":\"現在使用できません\"}";
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url);
            request.Headers.Add("Authorization", $"Bot {token}");
            request.Content = new StringContent(content, Encoding.UTF8, "application/json");
            HttpResponseMessage response = await client.SendAsync(request);
            Console.WriteLine(response.Content.ReadAsStringAsync().Result);//"id":がスラッシュコマンドのID すでにある時も同じのが来る？
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
}
```
### 解除
```c#:C#
/// <summary>
/// スラッシュコマンドの解除
/// </summary>
/// <param name="commandID">解除するコマンドID</param>
public static async void Delete(string commandID)
{
    using (HttpClient client = new HttpClient())
        try
        {
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Delete, $"https://discord.com/api/v8/applications/{applicationID}/commands/{commandID}");
            request.Headers.Add("Authorization", $"Bot {token}");
            HttpResponseMessage response = await client.SendAsync(request);
            Console.WriteLine(response.Content.ReadAsStringAsync().Result);//成功すれば出力なし
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
}
```

### 呼び出し
```c#:C#
SlashCommand.Add();
SlashCommand.Delete("コマンドID");
```
登録成功すればIDなどが返ってきてしばらくすれば登録した通りに出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/f433c4a0-4e7e-0014-7e77-77681b8d07d1.png)
(「現在使用できません」は↑で設定したものです)

Discord.Net側で対応していないようで、普通に送信されたテキストを取得して最初の文字で判別するという方法を取るしかないようです。実行しても↓のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/344ec012-a862-5113-8498-6fbf34512a78.png)

# おまけ(的なもの)
[アクティブデベロッパーバッジ](https://discord.com/developers/active-developer)は別のツール([DiscordのActive Developperを習得する方法](https://qiita.com/noaxing/items/113f889d1044acea1fac))で既に取っていたためかすぐに付いたのでこの方法で新規に付けられるかはわかりませんができなければこのツールを使うといいと思います。

# まとめ
HttpClientで登録、解除可能