この記事は リクルートライフスタイル Advent Calendar 2016 の16日目の記事です。
はじめに
ホットペッパービューティーでiOSの開発を担当してる@sotozakiです。
エンジニアのコミュニケーションツールといえばSlackですが、iOSエンジニアだって普段書いてる言語(Swift)でSlack Botを作りたい!
そんなわけで、今回はiOSエンジニアならみんな大好きなSwiftでSlack Botを作ってみます!
環境
バージョン | |
---|---|
Swift | 3.0.1 |
Xcode | 8.1 |
完成したもの
![k.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F55415%2F477fad4a-deef-f217-fa26-fef99e87d75a.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=6294adcc1c1a0d66f93e5a3c42279536)
swift
という発言に対してBotがGitHubのURLを答えてくれます。
事前準備
こちらからBotのAPI Tokenを取得しておいてください
https://my.slack.com/services/new/bot
![bot.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F55415%2F09236094-9b98-1fe4-b28f-236a6ff1287f.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=10639769aebaf76ef1b0091192364fd5)
![token.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F55415%2F43a35c5e-ca76-6112-6639-1cecddd583be.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=2a003b601d26affd24fbcc41d5fddd8f)
API Tokenは下記のような形式で与えられます。
xoxb-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ここでIcon等の設定もしておくと良いと思います。
Slack Botの作り方
今回はSwiftで書かれたSlack Client用のライブラリがあるのでこれを使います。
https://github.com/pvzig/SlackKit
iOS開発で一般的なライブラリ管理のCocoaPods, Carthageでインストールできますが、
今回はせっかくなのでSwiftと同時に公開されたSwift Package Manageer (SwiftPM)をつかってみます。
プロジェクトのセットアップ
まずはSwiftPMを使ってプロジェクトを生成します
$ mkdir SwiftBot
$ cd SwiftBot
$ swift package init --type executable
$ swift build
$ ./.build/debug/SwiftBot
Hello, world!
ここまででHello Worldが出来ています。SwiftPMも結構便利ですね!
SlackKitの追加
Package.swiftを編集してSlackKitを追加してください
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から簡単に行えます!
$ swift package generate-xcodeproj
Swift Botの実装
プロジェクトを開き、ソースを以下のように編集します。
API TokenはSlackから取得したものに置き換えてください
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)
もしくは
$ swift build
$ ./.build/debug/SwiftBot
SwiftBot is Running
で起動できます。
ここまででSlack上でオンラインになっていることを確認してください
![Screen Shot 2016-12-11 at 22.30.57.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F55415%2F59665255-43af-216b-32db-25f60493bc02.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=079ea3128723ae8bb5f9536ba402681c)
Botの応答
Slackの適当なチャンネルにBotを招待して"swift"と発言してみましょう
![k.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F55415%2Fe459bf86-7df7-6430-2ac6-6eefa8cc571d.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=af73ee78220c34e854fe0343c6d36138)
ちゃんと動作してBotがswiftのGitHubレポジトリのURLを返してくれました!
終わりに
SwiftでSlack Botを作成する手法を紹介しました。
CIやfastlaneなどを連携すると面白いですね!