【SwiftPM】SwiftでもSlack Botを作りたい

  
この記事は [リクルートライフスタイル Advent Calendar 2016](http://qiita.com/advent-calendar/2016/recruitlifestyle) の16日目の記事です。

# はじめに
ホットペッパービューティーでiOSの開発を担当してる@sotozakiです。
エンジニアのコミュニケーションツールといえばSlackですが、iOSエンジニアだって普段書いてる言語(Swift)でSlack Botを作りたい！

そんなわけで、今回はiOSエンジニアならみんな大好きなSwiftでSlack Botを作ってみます！


# 環境

||バージョン|
|:-:|:-:|
|Swift|3.0.1|
|Xcode|8.1|


# 完成したもの

<img width="698" alt="k.png" src="https://qiita-image-store.s3.amazonaws.com/0/55415/477fad4a-deef-f217-fa26-fef99e87d75a.png">

  
`swift`という発言に対してBotがGitHubのURLを答えてくれます。  

# 事前準備
こちらからBotのAPI Tokenを取得しておいてください
https://my.slack.com/services/new/bot

<img width="707" alt="bot.png" src="https://qiita-image-store.s3.amazonaws.com/0/55415/09236094-9b98-1fe4-b28f-236a6ff1287f.png">

<img width="829" alt="token.png" src="https://qiita-image-store.s3.amazonaws.com/0/55415/43a35c5e-ca76-6112-6639-1cecddd583be.png">


API Tokenは下記のような形式で与えられます。
`xoxb-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`

ここでIcon等の設定もしておくと良いと思います。

# Slack Botの作り方
今回はSwiftで書かれたSlack Client用のライブラリがあるのでこれを使います。
https://github.com/pvzig/SlackKit

iOS開発で一般的なライブラリ管理のCocoaPods, Carthageでインストールできますが、
今回はせっかくなのでSwiftと同時に公開されたSwift Package Manageer (SwiftPM)をつかってみます。

# プロジェクトのセットアップ
まずはSwiftPMを使ってプロジェクトを生成します

```zsh
$ mkdir SwiftBot
$ cd SwiftBot
$ swift package init --type executable
$ swift build
$ ./.build/debug/SwiftBot
Hello, world!
```
ここまででHello Worldが出来ています。SwiftPMも結構便利ですね！

## SlackKitの追加
Package.swiftを編集してSlackKitを追加してください

```Package.swift
import PackageDescription

let package = Package(
    name: "SwiftBot",
    dependencies: [
        .Package(url: "https://github.com/pvzig/SlackKit.git", majorVersion: 3)
    ]
)

```

追加した後にもう一度Buildすることでライブラリを追加できます。

```
$ swift build
```


# Xcodeプロジェクトの作成
iOS開発でおなじみのXcodeで編集したい方はXcodeプロジェクトも生成します。
Xcodeプロジェクトの生成もSwiftPMから簡単に行えます！

```zsh
$ swift package generate-xcodeproj
```

# Swift Botの実装
プロジェクトを開き、ソースを以下のように編集します。
API TokenはSlackから取得したものに置き換えてください

```Sources/main.swift
import Foundation
import SlackKit

class SwiftBot: MessageEventsDelegate {
    let bot: SlackKit
    init(token: String) {
        bot = SlackKit(withAPIToken: token)
        bot.onClientInitalization = { (client: Client) in
            client.messageEventsDelegate = self
        }
    }
    
    func received(_ message: Message, client: Client) {
        guard let text = message.text, let channel = message.channel else { return }
        if text == "swift" {
            client.webAPI.sendMessage(channel,
                                      text: "https://github.com/apple/swift",
                                      asUser: true,
                                      success: nil,
                                      failure: nil)
        }
    }
    func sent(_ message: Message, client: Client) {}
    func changed(_ message: Message, client: Client) {}
    func deleted(_ message: Message?, client: Client) {}
}

print("SwiftBot is Running")
let bot = SwiftBot(token: "xoxb-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
RunLoop.main.run()
```

ここではMessageEventsDelegateを適合したSwiftBotクラスを定義しています。
4つのDelegate Methodが用意されていますが、receivedメソッド内でSlackの発言を監視して応答しています。
SlackKitには他にもさまざまなDelegateが用意されているので詳しくはhttps://github.com/pvzig/SlackKit を参照してください。

# Botの起動

```
XcodeのRun(Cmd + R)
```

もしくは

```zsh
$ swift build
$ ./.build/debug/SwiftBot
SwiftBot is Running
```
で起動できます。
ここまででSlack上でオンラインになっていることを確認してください

<img width="210" alt="Screen Shot 2016-12-11 at 22.30.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/55415/59665255-43af-216b-32db-25f60493bc02.png">


# Botの応答 
Slackの適当なチャンネルにBotを招待して"swift"と発言してみましょう

<img width="698" alt="k.png" src="https://qiita-image-store.s3.amazonaws.com/0/55415/e459bf86-7df7-6430-2ac6-6eefa8cc571d.png">


ちゃんと動作してBotがswiftのGitHubレポジトリのURLを返してくれました！

# 終わりに
SwiftでSlack Botを作成する手法を紹介しました。
CIやfastlaneなどを連携すると面白いですね！