C#用NuGetパッケージ「SlackAPI」を使ってみる

## はじめに
本記事はC#用のNuGetパッケージ「SlackAPI」を使った際に得た、使い方をまとめることを目的としています。

## NuGetパッケージ「SlackAPI」とは
NuGetパッケージとは、C#(.NetFWや.NetCore)で使えるライブラリを簡単に共有するための仕組みです。詳細は[こちら](https://docs.microsoft.com/ja-jp/nuget/what-is-nuget)のMicrosoft公式記事を参照ください。その中でもNuGetパッケージ「SlackAPI」 (以後SlackAPIパッケージと呼称します) はSlackのWebAPIを便利に使うための機能がまとめられているパッケージです。SlackAPIパッケージのGitHubリポジトリは[こちら](https://github.com/Inumedia/SlackAPI)を、SlackAPIパッケージについては[こちら](https://www.nuget.org/packages/SlackAPI/)を参照ください。

## 使ってみる
今回は私が以前投稿しました[こちら](https://qiita.com/tat_tt/items/14b688ea48afbcd52505)の記事で作成した、チャンネル一覧とメッセージ一覧を取得するサービスをSlackAPIパッケージを使って作り直してみます。(画像を取得するサービスは今回実装していません。)
はじめに述べておきますが、前回と全く同じ振る舞いをするサービスは作れませんでした。理由は、チャンネル一覧の取得においてpublicチャンネルしか取得できなかったためです。publicチャンネルはSlack上でチャンネルの左に「#」がついているチャンネルです。(public以外のチャンネルを取得する方法はわかりませんでした。)

###  SlackAPIパッケージのインストール
まずは、SlackAPIパッケージをインストールします。インストール先のプロジェクトをVisualStudio上で右クリックして、[NuGetパッケージの管理]をクリックします。参照タブを選択して[SlackAPI]と検索ボックスに入力すると先頭に出るはずなので、画面右側のインストールボタンを押してインストールします。

![SlackAPIパッケージインストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452292/2f9a121d-b5a3-2249-b660-161dec233294.png)


### チャンネル一覧とメッセージ一覧を取得する
[こちら](https://qiita.com/tat_tt/items/14b688ea48afbcd52505)の記事と同様にSlackMessageGetServiceを作成しました。このサービスはチャンネル一覧とメッセージ一覧の取得を支援します。以下が実際のコードです。

```csharp
using System.Collections.Generic;
using System.Threading.Tasks;
using SlackAPI;

namespace SlackAPIUsing.Services
{
	/// <summary>
	/// Slackメッセージの取得に必要な機能を提供するサービス
	/// </summary>
	public class SlackMessageGetService
	{
		#region 公開サービス

		/// <summary>
		/// チャンネル一覧取得
		/// </summary>
		/// <param name="accessToken">アクセストークン</param>
		/// <returns>チャンネル一覧</returns>
		public static async Task<IEnumerable<Channel>> GetChannels(string accessToken)
		{
			var client = new SlackTaskClient(accessToken);
			var channleList = await client.GetChannelListAsync();
			return channleList.channels;
		}

		/// <summary>
		/// メッセージ一覧取得
		/// </summary>
		/// <param name="channel">チャンネル</param>
		/// <param name="accessToken">アクセストークン</param>
		/// <param name="count">取得するメッセージ数</param>
		/// <returns>メッセージ一覧</returns>
		public static async Task<IEnumerable<Message>> GetMessages(Channel channel, string accessToken, int count)
		{
			var client = new SlackTaskClient(accessToken);
			var messageHistory = await client.GetChannelHistoryAsync(channel,count:count);
			return messageHistory.messages;
		}

		#endregion
	}
}
```

GetChannelsメソッドとGetMessagesメソッドの2メソッドがあるため、それぞれ説明していきます。

#### GetChannelsメソッド
説明のためGetChannelsメソッドのコードを再掲します。

```csharp
/// <summary>
/// チャンネル一覧取得
/// </summary>
/// <param name="accessToken">アクセストークン</param>
/// <returns>チャンネル一覧</returns>
public static async Task<IEnumerable<Channel>> GetChannels(string accessToken)
{
	var client = new SlackTaskClient(accessToken);
	var channleList = await client.GetChannelListAsync();
	return channleList.channels;
}
```
行毎に説明をします。

- 1行目
    - SlackTaskClientクラスがSlackとのやり取りを受け持ってくれるクラスです。アクセストークンを渡してインスタンス生成するだけでSlackとのやり取りのクライアントとして機能するようになります。
- 2行目
    - GetChannelListAsyncでチャンネル一覧をChannelListResponse型で受け取っています。ChannelListResponse型はSlackAPIパッケージで定義されているクラスで、channelsプロパティでチャンネル一覧を保持しています。なお、各チャンネルはChannelクラスで表現されていて、これもSlackAPIパッケージで定義されているクラスです。Channelクラスはname(チャンネル名)、id(チャンネルID)などを持っています。
- 3行目
    - GetChannelListAsyncでもらったChannelListChannelListResponse型の値のchannelsプロパティを返すことで、チャンネル一覧を戻り値で返しています。

#### GetMessagesメソッド
説明のためGetMessagesメソッドを再掲します。

```csharp
/// <summary>
/// メッセージ一覧取得
/// </summary>
/// <param name="channel">チャンネル</param>
/// <param name="accessToken">アクセストークン</param>
/// <param name="count">取得するメッセージ数</param>
/// <returns>メッセージ一覧</returns>
public static async Task<IEnumerable<Message>> GetMessages(Channel channel, string accessToken, int count)
{
	var client = new SlackTaskClient(accessToken);
	var messageHistory = await client.GetChannelHistoryAsync(channel,count:count);
	return messageHistory.messages;
}
```
行毎に説明をします。

- 1行目
    - SlackTaskClientクラスのインスタンス生成は、GetChannelsメソッドと同じです。
- 2行目
    - GetChannelHistoryAsyncメソッドを使ってメッセージ一覧を取得しています。引数にはメッセージ取得先のチャンネル(Channel型)と取得メッセージ数を指定しています。
        - GetChannelHistoryAsyncメソッドは他にもlatest,oldest引数を使って、時間指定で取得するメッセージを限定できたりもするようです。latest,oldest引数は共にDateTime?型で、oldestで指定した時間からlatestで指定した時間の間にやり取りされたメッセージの取得ができます。
    - GetChannelHistoryAsyncメソッドは、ChannelMessageHistory型を返します。ChannelMessageHistory型もSlackAPIパッケージで定義されており、messagesプロパティでメッセージ一覧を持っています。各メッセージはMessageクラスで表現されており、これもSlackAPIパッケージで定義されています。なお、Message.textプロパティに本文が入っています。
- 3行目
    - GetChannelHistoryAsyncでもらったChannelMessageHistory型の値のmessagesプロパティを返すことで、メッセージ一覧を戻り値として返しています。

## 使ってみた所感
前回の[こちら](https://qiita.com/tat_tt/items/14b688ea48afbcd52505)の記事よりもかなり実装量が減っていることが分かるかと思います。なので、SlackAPIパッケージが提供している機能で、自分のやりたいことが十分にできるなら、パッケージを使うメリットはあると感じます。ただ、privateのチャンネル取得などの細かいSlackのWebAPIの呼び分けは、現時点で恐らく対応していないので、複雑なことをやりたい場合は自分でWebAPIを呼ぶ必要もあると思います。

## まとめ
本記事ではSlackAPIパッケージの使い方を簡単に紹介しました。今回紹介した機能は、全機能のほんの一部なので興味を持たれた方は自分で試してみてください。