前書き

こんにちは!Swift愛好会&Kotlin愛好会主催の@jollyjoesterです。本書を手に取っていただき、ありがとうございます。

本書はSwiftを愛するメンバーが集まるSwift愛好会とKotlinを愛するメンバーが集まるKotlin愛好会の有志メンバーがネタを持ち寄って作成した技術同人です。言語についての話にとどまらず、Swift/Kotlinに関連の深いプラットフォームやサービスについての話など多岐にわたるネタについて盛り込んでいます。

各章は独立しています。著者紹介でそれぞれの章の概要を紹介しますので、興味を持った章から読み進めてください。楽しんでいただけるととても嬉しいです。

免責事項

本書に記載された内容は、情報の提供のみを目的としています。したがって、本書を用いた開発、製作、運用は、必ずご自身の責任と判断によって行ってください。これらの情報による開発、製作、運用の結果について、著者はいかなる責任も負いません。

著者紹介

@jollyjoester
Swift&Kotlin愛好会主催。SwiftやKotlinをわいわい楽しむための場やネタを作り続けています。今回のネタはSlackbot。オンラインコミュニケーションがより重要になってくるこのご時世だからこそSwiftで楽しんでいきましょう〜!
@417_72ki
元SEという名のなんでも屋(iOS、Android、バックエンド、etc...)。現在は資産運用系のスタートアップでiOSエンジニアをやっています。最近は副業を始めるか個人アプリを作るかが目下の悩み(
@kuma
飲食系ベンチャーでiOSエンジニアをやっています。個人開発ではAndroidアプリを作っています。会社でAndroid開発が始まるとか始まらないとかでそわそわしています。ボードゲーマーです。今回は、Androidのバージョンアップ体験で学んだことについて書きました。
@hotatekaoru
Twitterは、@purunkaoru。メドピアで、ヘルステック系のサービス開発をしています。サーバーサイドメインですが、iOSとAndroidもたまにやってます。最近ホットヨガはじめました。
@D_R_1009
StudyplusというEdTechベンチャーでAndroidエンジニアをやっている若宮(@koji-1009)です。最近iOSアプリ開発にも参加中です。Android Architecture ComponentsのPagingライブラリについて、その仕組みをコードを参考にしながら解説していきます。Pagingライブラリは、一見するとなぜそんなことができるのかわからないライブラリです。しかし一度その仕組みを理解してしまえば、手放せないライブラリとなります。本章を参考にPagingライブラリの導入を進めていただければ幸いです。

第1章 SwiftでSlackbotを作ろう

1.1 はじめに

ドーモ!@jollyjoesterです。 

今回はSlackKit*1を使ってSwiftでSlackbotを作っていきましょう!

 

新型コロナの影響でオンラインコミュニケーションはより重要性を増しています。普段みなさまが使っているだろうSlackに、オリジナルのbotを作ってオンライン生活をより楽しいものにしていけるといいですね。さまざまな言語でSlackbotは作れますが、ここはLove Swift。Swiftを使って楽しんでいきましょう。

 

なお、本記事は次の環境で試しています。

  • macOS Catalina 10.15.4
  • Xcode 11.4

1.2 Project作成

まずはSlackKitを使う上で必要なライブラリをMacにインストールします。Homebrew*2がインストールされてない場合はHomebrewのインストールからしてくださいね。

$ brew install libressl

次にSwift Package Managerでプロジェクトを作成していきましょう。適当な場所に`swiftbot`という名前の新しいディレクトリを作って次のようにプロジェクトを作成します。

$ mkdir swiftbot
$ cd swiftbot
$ swiftbot swift package init --type executable

`Package.swift`というファイルができているので2行ほど加えてSlackKitを追加します。Package.swift全体としては次のようになります。

Package.swift

import PackageDescription

let package = Package(
    name: "swiftbot",
    dependencies: [
        // ここを追加
        .package(url: "https://github.compvzig/SlackKit.git", from: "4.3.0")
    ],
    targets: [
        .target(
            name: "swiftbot",
            // ここも追加
            dependencies: ["SlackKit"]),
        .testTarget(
            name: "swiftbotTests",
            dependencies: ["swiftbot"]),
    ]
)

追加したらPackage.swiftをXcodeで開きましょう。次のコマンドを叩くか、Finderを開いてPackage.swiftをダブルクリックするとXcodeが起動します。

$ open Package.swift

Xcodeは次のような状態になっているはずです。さきほどPackage.swiftに設定したSlackKitとSlackKitに必要なライブラリはXcodeが自動的に追加してくれます。

Xcodeで開かれたswiftbotプロジェクト

図1.1: Xcodeで開かれたswiftbotプロジェクト

こちらでいったんswiftbot作成の準備はできました。次にSlackを操作するための設定をしていきましょう。

1.3 Slackの設定

1.3.1 Botの追加

SlackにBotユーザーを追加します。

 

次のURLにアクセスします。

 

https://my.slack.com/services/new/bot

 

まだ自分のワークスペースを持っていなかったら先に次のURLからワークスーペースを作ってください。

 

https://slack.com/create

 

開いた画面で次の操作をします。①ワークスペースを選んで②Botの名前(ここではswiftbot)を入力して③「Add bot integration」を押します

Botを追加

図1.2: Botを追加

1.3.2 API Tokenの取得

Botを追加し終わったら次のような画面が表示されます。

ここで大事なのが「Integration Settings API Token」です。外部からSlackを操作するために「xoxb-」から始まる文字列、API Tokenが必要になります。このあとすぐ使うのでどこかにコピーしておきましょう。

※このTokenを使えば誰でもご自身のSlackを操作できてしまうので、GitHubなどで公開しないように注意しましょう。

API Token

図1.3: API Token

1.4 実装

さて、いよいよBotの本体を実装していきます。

1.4.1 Botの初期化

Xcodeに戻り、「main.swift」を選択します。

メニューの「File -> New -> File」にて新しいファイルを作成し、「Swiftbot.swift」というファイル名にします。

File追加

図1.4: File追加

追加したSwiftbot.swiftファイル

図1.5: 追加したSwiftbot.swiftファイル

Swiftbot.swiftにSwiftbotクラスを実装します。このクラスでSlackKitも使うのでimportして変数も宣言しておきます。

Swiftbot.swift

import Foundation
import SlackKit

class Swiftbot {
    let bot: SlackKit

    // ここに初期化処理を後で書く
}

初期化処理を実装します。初期化処理はとりあえずコピペしてみてください。ざっくり次のような処理です。

  1. SlackKitにAPI Tokenをセットすること
  2. Botに向けたイベント(Botに向けてメンションされたりメッセージが投稿されたり)を受け取る
  3. Botで操作したい処理を書く(ここはあとで実装する)

Swiftbot.swift

import Foundation
import SlackKit

class Swiftbot {
    let bot: SlackKit

    // 初期化処理
    init(token: String) {
        bot = SlackKit()

        // 1. SlackKitにAPI Tokenをセット
        bot.addRTMBotWithAPIToken(token)
        bot.addWebAPIAccessWithToken(token)

        // 2. Botに向けたイベントが通知される
        bot.notificationForEvent(.message) { [weak self] (event, connection) in
            guard
                let message = event.message,
                let id = connection?.client?.authenticatedUser?.id,
                message.text?.contains(id) == true
            else {
                return
            }
            // 3. ここにBotで操作したい処理を書く
            self?.handleMessage(message)
        }
    }
}

1.4.2 Botの動作実装

いよいよBotの動作の実装です。handleMessageメソッドを次のように実装しましょう。Botにメンションされたら「何ですか?」とだけ聞き返す処理です。

Swiftbot.swift

    private func handleMessage(_ message: Message) {

        // channelの情報を取得して、メンションされたchannelにテキストを送信する
        if let channel = message.channel {
            bot.webAPI?.sendMessage(channel: channel, text: "何ですか?", success: nil, failure: nil)
            return
        }
    }

1.4.3 Botの呼び出し

最後にSlackbotを起動する処理をmain.swiftにSwiftbotクラスを実装します。tokenの部分は先にコピーしておいた"xoxb-"で始まる文字列をセットしてください。

main.swift

import Foundation

let slackbot = Swiftbot(token: "xoxb-xxxxxxxxx")

RunLoop.main.run()

1.5 実行

以上で準備は整いました!さっそくこのBotを実行しましょう。

Xcode画面左上の部分にてデバイスにMy Macを選択し、実行ボタンを押します。

デバイスにMacを選択して実行

図1.6: デバイスにMacを選択して実行

SlackにてBotユーザーをiniteします。

Botユーザーをinvite

図1.7: Botユーザーをinvite

Botにメンションしてみましょう!Botにメンションして返事が返ってきたら成功です!

Botにメンション

図1.8: Botにメンション

1.6 Botのカスタマイズ

Botにいろいろな動きをさせてみましょう。

Slackから受け取れるMessageオブジェクト

先に実装したhandleMessageメソッドの引数で受け取っているMessageオブジェクトはSlackでBotにメンションした際の「メッセージの情報」を持っています。Slackから通知を受けた際にもらえるこれらの情報を用いてBotの処理を実装していきます。

  • channel: メンションしたチャネル
  • text: メンション時のメッセージ文言
  • timestamp: メッセージのタイムスタンプ
  • user: メンションしたユーザー
  • などなど

1.6.1 リアクションする

Botへのメンションに対してリアクションするようにしてみましょう。handleMessageメソッドの中身を書き換えます。

SlackKit.WebAPIのaddReactionToMessageメソッドを使います。リアクションする絵文字の名前を文字列で指定します。

Swiftbot.swift

    private func handleMessage(_ message: Message) {

        // channelの情報とタイムスタンプを取得して、メンションされたにメッセージにリアクションする
        if let channel = message.channel, let timestamp = message.ts {
            bot.webAPI?.addReactionToMessage(name: "muscle",
                                                channel: channel,
                                                timestamp: timestamp,
                                                success: nil,
                                                failure: nil)
        }
    }

実行してBotにメンションすると次のようにリアクションがつきます。

Botからのリアクション

図1.9: Botからのリアクション

1.6.2 スレッドで返信する

Botにメンションしたらスレッドで返信してもらうようにします。

SlackKit.WebAPIのsendThreadedMessageメソッドを使います。channelとtimestampで返信するスレッドの元メッセージを指定し、textで返信内容を設定します。

Swiftbot.swift

    private func handleMessage(_ message: Message) {

        // channelの情報とタイムスタンプを取得して、メンションされたにメッセージにリアクションする
        if let channel = message.channel, let timestamp = message.ts {
            bot.webAPI?.sendThreadedMessage(channel: channel,
                                                thread: timestamp,
                                                text: "なーに?",
                                                success: nil,
                                                failure: nil)
            return
        }
    }

実行してBotにメンションするとスレッドに返信が届きます。

Botからスレッドへの返信

図1.10: Botからスレッドへの返信

1.6.3 メンションしたメッセージの文言次第で反応を変える

最後にメンションした文言の内容によって返答を変えるBotにしてみましょう。

Swiftbot.swift

    private func handleMessage(_ message: Message) {

        // textを取得し、その内容次第で返答の仕方を変える
        if let text = message.text, let channel = message.channel {
            var reply: String
            switch text {
            case text where text.contains("遊ぼ"):
                reply = "わーい:smile:"
            case text where text.contains("仕事して"):
                reply = "えー:scream:"
            default:
                reply = "なーに?"
            }

            bot.webAPI?.sendMessage(channel: channel,
                                        text: reply,
                                        success: nil,
                                        failure: nil)
            return
        }

実行して文言を変えてBotにメンションすると会話を楽しめます。

Botとお話

図1.11: Botとお話

1.7 まとめ

SlackKitを用いてMacにSlackbotを立てて遊んでみました。

 

SlackKitはもっといろいろなSlackAPIも使えます。他にもどんなことができるか試してみてください。もしお気に入りのBotが作れたらHerokuなどにDeployして常時遊べるBotにしてみるともっと楽しいと思います。

 

それではHave a nice オンライン生活!

試し読みはここまでです。
この続きは、製品版でお楽しみください。