DiscordのBotをC#でサーモンランのステージ情報を取得してみる

# DiscordのBotをC#でサーモンランのステージ情報を取得してみる

## 開発環境

- Visual Studio 2017 (C#)
- Discord.Net 1.0.2
- Microsoft.AspNet.WebApi.Client 5.2.4

## 初めに
前回、記事の[DiscordのBotをC#で作ってみる](https://qiita.com/HAGITAKO/items/fff2e029064ea38ff13a)でBotが動作するところまで確認しましたが、`Spla2 API`を使いサーモランのステージ情報をBotが回答する部分を今回は、実装してみようと思います。

## 参考
[Spla2 API](https://spla2.yuu26.com/)
`@otuhs_d`さんの記事
[Splatoon2チーム向けDiscord Bot『Roboty』を公開しました](https://qiita.com/otuhs_d/items/86fc7cda767b5682311f)

## 実装後のイメージ
![WS000026.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/08c508cb-9433-cf8e-17b9-4e4cae8ca201.jpeg)


## Visual Studio
### プロジェクトの作成
前回、作成した続きなので、プロジェクトの作成は、前回記事「[DiscordのBotをC#で作ってみる](https://qiita.com/HAGITAKO/items/fff2e029064ea38ff13a)」を確認してください。

### Nugetから「Microsoft.AspNet.WebApi.Client 5.2.4」インストール

- 「プロジェクトエクスプローラ」>「参照設定」を右クリック >「NuGetパッケージ管理」
- 「参照」タブを選択 > 検索欄に「Microsoft.AspNet.WebApi.Client」を入力します。
- 「Microsoft.AspNet.WebApi.Client」を選択します。
- 最新の安定版を選択して「インストール」ボタンを押下します。


### CoopExクラスの作成
- サーモンランのステージ情報を格納するクラスです。

```csharp:CoopEx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace Splatoo2ConsoleApp
{
    public class CoopEx
    {
        public CoopResult[] result { get; set; }
    }

    public class CoopResult
    {
        public DateTime start { get; set; }
        public DateTime start_utc { get; set; }
        public int start_t { get; set; }
        public DateTime end { get; set; }
        public DateTime end_utc { get; set; }
        public int end_t { get; set; }
        public Stage stage { get; set; }
        public Weapon[] weapons { get; set; }
    }

    public class Stage
    {
        public string image { get; set; }
        public string name { get; set; }
    }

    public class Weapon
    {
        public int id { get; set; }
        public string image { get; set; }
        public string name { get; set; }
    }
}
```

### Messagesクラスの作成
- Messagesクラスは、前回作成しているので、新しくコマンドを追加するだけです。
- 今回は、「.smn」とコメントすると、サーモンランのステージ情報を取得したいので、「smn」を作成します。

```csharp:Messages.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Discord.Commands;
using System.Net.Http;
using System.Net.Http.Headers;

using Newtonsoft.Json;

namespace Splatoo2ConsoleApp
{
    public class Messages : ModuleBase
    {
        [Command("smn")]
        public async Task smn()
        {
            using (HttpClient client = new HttpClient())
            {

                var result = new List<CoopResult>();

                string messages = string.Empty;


                client.BaseAddress = new Uri("https://spla2.yuu26.com/");
                client.DefaultRequestHeaders.Accept.Clear();

                using (HttpResponseMessage response = client.GetAsync("coop/schedule").Result)
                {
                    if (response.IsSuccessStatusCode)
                    {
                        messages += "・サーモンラン\n";

                        var str = await response.Content.ReadAsStringAsync();
                        var config = JsonConvert.DeserializeObject<CoopEx>(str);

                        for (int i = 0; i < 2; i++)
                        {
                            messages += "```";
                            messages += "時間：\n";
                            messages += " " + config.result[i].start + "～" + config.result[i].end + "\n";
                            messages += "マップ：\n";
                            messages += " " + config.result[i].stage.name;
                            messages += "ブキ：\n";

                            foreach (var item in config.result[i].weapons)
                            {
                                messages += " " + item.name + "\n";
                            }
                            messages += "```\n";
                        }

                    }
                }
                await ReplyAsync(messages);
            }

        }
    }
}
```

### 作成完了！

- ビルドを実行します。

![WS000024.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/7400425b-630b-7638-c787-b50fa68ad798.jpeg)

- Discordで「.smn」コメントしてみると、Botがランダムで返してくれます。

![WS000026.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/08c508cb-9433-cf8e-17b9-4e4cae8ca201.jpeg)


## まとめ

- NuGetに`Newtonsoft.Json`と`Microsoft.AspNet.WebApi.Client`があるので、APIクライアントで接続して、Newton.Jsonでデシリアライズを行うことで比較的簡単に作成することができました。