diff --git a/docs/.gitignore b/docs/.gitignore index 5309e1783..c48a717ef 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -2,3 +2,6 @@ _site Gemfile.lock .env .jekyll-metadata +.vscode/ +.bundle/ +vendor/ diff --git a/docs/_advanced/custom_routes.md b/docs/_advanced/custom_routes.md index 32b97c45f..d7fe74cd4 100644 --- a/docs/_advanced/custom_routes.md +++ b/docs/_advanced/custom_routes.md @@ -19,8 +19,8 @@ const receiver = new ExpressReceiver({ signingSecret: process.env.SLACK_SIGNING_ // Create the Bolt App, using the receiver const app = new App({ - token: process.env.SLACK_BOT_TOKEN, - receiver + token: process.env.SLACK_BOT_TOKEN, + receiver }); // Slack interactions are methods on app diff --git a/docs/_advanced/ja_authorization.md b/docs/_advanced/ja_authorization.md index 59e804d21..02b571171 100644 --- a/docs/_advanced/ja_authorization.md +++ b/docs/_advanced/ja_authorization.md @@ -1,28 +1,27 @@ --- -title: 承認 +title: 認可(Authorization) lang: ja-jp slug: authorization order: 2 ---
-承認は、特定の着信イベントの処理中にどの Slack 認証情報 (ボットトークンなど) を使用可能にするかを決定するプロセスです。 +認可(Authorization)は、Slack からのイベントを処理するにあたって、どの Slack クレデンシャル (ボットトークンなど) を使用可能にするかを決定するプロセスです。 -1 つのワークスペースにインストールされたカスタムアプリでは、`App` 初期化時に `token` オプションを使用できます。ただし、複数のワークスペースにインストールされる場合や、複数のユーザートークンにアクセスする必要がある場合など、アプリが複数のトークンを処理しなければならない場合には、代わりに `authorize` オプションを使用する必要があります。 +1 つだけのワークスペースにインストールされたカスタムアプリであれば `App` 初期化時に単に `token` オプションを使用するだけで OK です。一方で、複数のワークスペースにインストールされる、複数のユーザートークンを使用するといったケースのように、アプリが複数のトークンを処理しなければならない場合があります。このようなケースでは `token` の代わりに `authorize` オプションを使用する必要があります。 -`authorize` オプションは、イベントソースを入力値として受け取る関数に設定でき、許可された認証情報を含むオブジェクトに Promise を返す必要があります。ソースには、 `teamId` (常に利用可能)、 `userId`、`conversationId`、`enterpriseId` のようなプロパティを使用して、イベントの送信者や送信元に関する情報が含まれています。 +`authorize` オプションには、イベントソースを入力値として受け取り、許可された認可されたクレデンシャルを含むオブジェクトを Promise の値として返す関数を指定します。このイベントソースの情報には、 `teamId` (常に存在します)、 `userId`、`conversationId`、`enterpriseId` のような、イベントが誰によって発生させられたか、どこで発生したかに関する情報が含まれます。 -許可された認証情報には、`botToken`、`userToken`、`botId` (アプリがボット自体からのメッセージを無視するために必要)、 `botUserId` などの固有のプロパティもいくつか含まれています。その他、 [`context`](#context) オブジェクトを使用すれば他のプロパティの指定もできるようになります。 +許可されたクレデンシャルには、`botToken`、`userToken`、`botId` (アプリがボット自体からのメッセージを無視するために必要です)、 `botUserId` が含まれます。[`context`](#context) オブジェクトに、これ以外の他のプロパティを自由に設定することもできます。 -`botToken` プロパティと `userToken` プロパティは、一方または両方を必ず指定する必要があります。`say()` のようなヘルパーを動作させるには、どちらか一方は指定しなければなりません。両方指定した場合は、`botToken` が優先されます。 +`botToken` と `userToken` は、どちらか、またはその両方を必ず設定してください。`say()` のようなユーティリティを動作させるには、どちらか一方が存在している必要があります。両方指定した場合、`say()` では `botToken` が優先されます。
```javascript const app = new App({ authorize: authorizeFn, signingSecret: process.env.SLACK_SIGNING_SECRET }); // 注: これはデモの目的のみの例です -// 実際は重要なデータはセキュリティの高いデータベースに保存してください -// このアプリは bot トークンのみのしようと仮定、ここで使われるオブジェクトは、複数ワークスペースにアプリをインストールする際の認証情報を保管するモデルとします +// 実際は重要なデータはセキュリティの高いデータベースに保存してください。このアプリは bot トークンのみを使用すると仮定しています。ここで使われるオブジェクトは、複数ワークスペースにアプリをインストールした場合のクレデンシャルを保管するモデルです。 const installations = [ { @@ -41,11 +40,11 @@ const installations = [ ]; const authorizeFn = async ({ teamId, enterpriseId }) => { - // データベースから team 情報を取得 + // データベースから team(ワークスペース)を取得 for (const team of installations) { - // installations 配列から teamId と enterpriseId が一致するかチェック + // installations 配列から teamId と enterpriseId(Enterprise Grid の OrG の ID)が一致するかチェック if ((team.teamId === teamId) && (team.enterpriseId === enterpriseId)) { - // 一致したワークスペースの認証情報を使用 + // 一致したワークスペースのクレデンシャルを使用 return { // 代わりに userToken をセットしても OK botToken: team.botToken, @@ -55,6 +54,6 @@ const authorizeFn = async ({ teamId, enterpriseId }) => { } } - throw new Error('No matching authorizations'); // 認証エラー + throw new Error('No matching authorizations'); } ``` diff --git a/docs/_advanced/ja_context.md b/docs/_advanced/ja_context.md index 6866d68ba..3f7ccbfcc 100644 --- a/docs/_advanced/ja_context.md +++ b/docs/_advanced/ja_context.md @@ -6,9 +6,9 @@ order: 6 ---
-すべてのリスナーから、情報を追加してイベントを充実させるために使用できる `context` オブジェクトにアクセスすることができます。これはたとえば、サードパーティのシステムからユーザー情報を追加したり、チェーン内の次のミドルウェアの一時的な状態を追加したりする場合に使用します。 +`context` オブジェクトは、受信イベントに付加情報を提供するために使用されるもので、全てのリスナーがこれを使用できます。例えば、3rd party のシステムからユーザー情報を追加したり、ミドルウェアのチェインの中で次のミドルウェアが必要とする一時的な状態を追加したりといった用途に利用できます。 -`context` は単なるオブジェクトであるため、必要な情報をいくらでも追加、編集できます。 +`context` は、ただのオブジェクトなので、いくらでも属性を追加、編集することができます。
```javascript @@ -37,9 +37,9 @@ app.command('request', addTimezoneContext, async ({ command, ack, context }) => const requestText = `:large_blue_circle: *New request from <@${command.user_id}>*: ${command.text}`; - // 午前9時〜午後5時以外のリクエストの場合は明日 + // 午前 9 時〜午後 5 時以外のリクエストの場合は明日 if (local_hour > 17 || local_hour < 9) { - // ローカル時間の明日午前9時までの差分を取得する関数があると仮定 + // ローカル時間の明日午前 9 時までの差分を取得する関数があると仮定 const local_tomorrow = getLocalTomorrow(context.tz_offset); try { diff --git a/docs/_advanced/ja_conversation_store.md b/docs/_advanced/ja_conversation_store.md index a5f908a0a..d711364bb 100644 --- a/docs/_advanced/ja_conversation_store.md +++ b/docs/_advanced/ja_conversation_store.md @@ -1,5 +1,5 @@ --- -title: Conversation stores +title: 会話ストア lang: ja-jp slug: conversation-store order: 3 @@ -12,7 +12,7 @@ Bolt は、会話 (conversation) に関連する state を設定および取得 `conversationContext()` は、他のミドルウェアによる会話の更新を可能にする組み込みの[グローバルミドルウェア](#global-middleware)です。イベントを受け取ると、ミドルウェア関数は `context.updateConversation()` を使用して状態を設定でき、`context.conversation` を使用してその state を取得できます。 -組み込みの conversation store は、シンプルに会話の state をメモリーに格納します。状況によってはこれで十分ですが、アプリのインスタンスが複数実行されている場合、状態はプロセス間で共有されないため、データベースを使用して会話の state を取得する conversation store を実装することをお勧めします。 +組み込みの conversation store は、シンプルに会話の state をメモリーに格納します。状況によってはこれで十分ですが、アプリのインスタンスが複数実行されている場合、状態はプロセス間で共有されないため、データベースを使用して会話の state を取得する conversation store を実装することをおすすめします。 ```javascript diff --git a/docs/_advanced/ja_custom_routes.md b/docs/_advanced/ja_custom_routes.md new file mode 100644 index 000000000..785b07012 --- /dev/null +++ b/docs/_advanced/ja_custom_routes.md @@ -0,0 +1,42 @@ +--- +title: カスタム HTTP ルートの追加 +lang: ja-jp +slug: custom-routes +order: 9 +--- + +
+ +Bolt の組み込みの `ExpressReceiver` を使っているなら、カスタムの HTTP ルートを追加するのはとても簡単です。`v2.1.0` から `ExpressReceiver` には `router` というプロパティが追加されています。これは、さらにルートを追加できるように `App` 内部で保持している Exprss の [Router](http://expressjs.com/en/4x/api.html#router) を public にしたものです。 + +
+ +```javascript +const { App, ExpressReceiver } = require('@slack/bolt'); + +// Bolt の Receiver を明に生成 +const receiver = new ExpressReceiver({ signingSecret: process.env.SLACK_SIGNING_SECRET }); + +// App をこのレシーバーを指定して生成 +const app = new App({ + token: process.env.SLACK_BOT_TOKEN, + receiver +}); + +// Slack とのやりとりは App のメソッドで定義 +app.event('message', async ({ event, client }) => { + // Do some slack-specific stuff here + await client.chat.postMessage(...); +}); + +// それ以外の Web リクエストの処理は receiver.router のメソッドで定義 +receiver.router.post('/secret-page', (req, res) => { + // ここでは Express のリクエストやレスポンスをそのまま扱う + res.send('yay!'); +}); + +(async () => { + await app.start(8080); + console.log('app is running'); +}()); +``` diff --git a/docs/_advanced/ja_logging.md b/docs/_advanced/ja_logging.md index 3cf5e3b9c..72e16cea3 100644 --- a/docs/_advanced/ja_logging.md +++ b/docs/_advanced/ja_logging.md @@ -6,7 +6,7 @@ order: 7 ---
-デフォルトでは、Bolt はアプリからコンソールに情報をログします。ログ取集が行われる回数をカスタマイズするには、コンストラクタで `logLevel` を渡します。使用可能なログレベルは、レベルの高い方から順に、`DEBUG`、 `INFO`、`WARN`、および `ERROR` です。 +Bolt はデフォルトの設定では、標準出力のコンソールにログ上を出力します。どれくらいのどれくらいのログが出力されるかは、コンストラクターの引数の `logLevel` を指定して、カスタマイズできます。使用可能なログレベルは、頻度の高い方から順に、`DEBUG`、`INFO`、`WARN`、`ERROR` です。
```javascript @@ -27,7 +27,7 @@ const app = new App({
-ログの送信先をコンソール以外に設定するなど、logger をよりスマートに管理するには、カスタム logger を実装します。カスタム logger には、以下の特定のメソッド (`Logger` インターフェイスと呼ばれる) を実装する必要があります。 +ログの送信先をコンソール以外に設定したり、よりロガーを細かくコントロールしたい場合は、カスタムロガーを実装します。カスタムロガーは、以下のメソッド (`Logger` インターフェイスに定義されているもの) を実装する必要があります。 | メソッド | パラメーター | 戻り値の型 | |--------------|-------------------|-------------| @@ -50,7 +50,7 @@ const logWritable = createWriteStream('/var/my_log_file'); const app = new App({ token, signingSecret, - // リテラルオブジェクトとしてクラスを指定する感じで logger を生成。 + // リテラルオブジェクトとして logger を設定(必要なメソッドを持つクラスを指定するイメージで) logger: { debug(...msgs): { logWritable.write('debug: ' + JSON.stringify(msgs)); }, info(...msgs): { logWritable.write('info: ' + JSON.stringify(msgs)); }, diff --git a/docs/_advanced/ja_middleware_global.md b/docs/_advanced/ja_middleware_global.md index 9a42f97b8..33fb9a692 100644 --- a/docs/_advanced/ja_middleware_global.md +++ b/docs/_advanced/ja_middleware_global.md @@ -6,7 +6,7 @@ order: 4 ---
-グローバルミドルウェアは、すべての着信イベントに対して、リスナーミドルウェアより前に実行されます。`app.use(fn({payload,...,next}))` を使用すると、グローバルミドルウェアをいくつでもアプリに追加できます。 +グローバルミドルウェアは、すべての受信イベントに対して、リスナーミドルウェアより前に実行されます。`app.use(fn({payload,...,next}))` を使用すると、グローバルミドルウェアをいくつでもアプリに追加できます。 グローバルミドルウェアとリスナーミドルウェアは、いずれも、`await next()` を呼び出して実行チェーンの制御を次のミドルウェアに渡すか、`throw` を呼び出して以前に実行したミドルウェアチェーンにエラーを渡す必要があります。 diff --git a/docs/_advanced/ja_middleware_listener.md b/docs/_advanced/ja_middleware_listener.md index d9e016bbd..a2e2c280b 100644 --- a/docs/_advanced/ja_middleware_listener.md +++ b/docs/_advanced/ja_middleware_listener.md @@ -6,13 +6,13 @@ order: 5 ---
-リスナーミドルウェアは、全てではありませんが多くのリスナー関数を対象としたロジックに使用され、組み込みメソッド内のリスナー関数より先に引数として追加されます。ここでは任意の数のリスナーミドルウェアを追加することができます。 +リスナーミドルウェアは、多くのリスナー関数を対象(つまり、複数のリスナー関数を対象としますが、全てのリスナーに実行するわけではないものです)としたロジックの適用に使用でき、リスナーを追加する組み込みメソッドの引数リスト内で、リスナー関数より先に引数として追加されます。ここでは任意の数のリスナーミドルウェアを追加することができます。 組み込みリスナーミドルウェアはいくつか用意されており、例えば、メッセージのサブタイプをフィルタリングする `subtype()` や、ボットに直接 @ メンションしないメッセージを除外する `directMention()` のように使用することができます。 -ただしもちろん、よりカスタマイズされた機能を追加するために、独自のミドルウェアを作成することもできます。独自のミドルウェアを記述する際には、関数で `await next()` を呼び出して制御を次のミドルウェアに渡すか、`throw` を呼び出して以前に実行されたミドルウェアチェーンにエラーを渡す必要があります。 +もちろん、よりカスタマイズされた機能を追加するために独自のミドルウェアを実装することもできます。カスタムミドルウェアとして動作する関数の実装は `await next()` を呼び出して制御を次のミドルウェアに渡すか、`throw` を呼び出して以前に実行されたミドルウェアチェーンにエラーを投げる必要があります。 -たとえば、リスナーが人間からのメッセージのみを扱うのであれば、ボットメッセージを除外するリスナーミドルウェアを作成できます。 +例として、リスナーが人(ボットではないユーザー)からのメッセージのみを扱うケースを考えてみましょう。このためには、全てのボットメッセージを除外するリスナーミドルウェアを実装します。 *注: Bolt 2.x からミドルウェアが `async` 関数をサポートしました!この変更については [2.x マイグレーションガイド](https://slack.dev/bolt/ja-jp/tutorial/migration-v2)を参照してください。*
@@ -26,7 +26,7 @@ async function noBotMessages({ message, next }) { } // ボットではなく人間からのメッセージのみを受信するリスナー -app.message(noBotMessages, ({ message }) => console.log( +app.message(noBotMessages, async ({ message }) => console.log( `(MSG) User: ${message.user} Message: ${message.text}` )); diff --git a/docs/_advanced/ja_receiver.md b/docs/_advanced/ja_receiver.md index bb54a3629..e2c97b759 100644 --- a/docs/_advanced/ja_receiver.md +++ b/docs/_advanced/ja_receiver.md @@ -6,7 +6,7 @@ order: 8 ---
-レシーバーは、Slack から送信されたイベントを処理およびパースして発行するので、Bolt アプリがそのイベントにコンテキストを追加し、アプリのリスナーに渡すことができます。レシーバーは、レシーバーのインターフェイスに準拠している必要があります。 +レシーバーは、Slack からのイベントを受け付けてパースした後、それを Bolt アプリに伝える責務を担っています。Bolt アプリは、`context` 情報やリスナーへのイベントの引き渡しを行います。レシーバーの実装は `Receiver` インターフェイスに準拠している必要があります。 | メソッド | パラメーター | 戻り値の型 | |--------------|----------------------------------|-------------| @@ -14,12 +14,13 @@ order: 8 | `start()` | None | `Promise` | | `stop()` | None | `Promise` | -Bolt アプリでは `init()` が 2 回呼び出されます。このメソッドはレシーバーに `App` の参照を付与するため、これにより以下の呼び出しが可能になります。 +`init()` メソッドは Bolt for JavaScript アプリが生成されたときに呼び出されます。このメソッドはレシーバーに `App` インスタンスへの参照を与えます。レシーバーはこれを保持して、イベント受信時に呼び出します。 + * `await app.processEvent(event)` は Slack から送信されてくるイベントを受け取るたびに呼び出されます。ハンドリングされなかったエラーが発生した場合はそれを throw します。 -Bolt アプリを初期化するときにカスタムレシーバーをコンストラクタに渡すことで、そのカスタムレシーバーを使用できます。ここで紹介するのは、基本的なカスタムレシーバーです。 +カスタムのレシーバーを使用する場合は、それを `App` のコンストラクターに渡します。ここで紹介しているコード例は、基本的なカスタムレシーバーの実装例です。 -レシーバーについて詳しくは、[組み込み `ExpressReceiver` のソースコード](https://github.com/slackapi/bolt/blob/master/src/ExpressReceiver.ts)をお読みください。 +レシーバーについてより深く知りたい場合は、[組み込み `ExpressReceiver` のソースコード](https://github.com/slackapi/bolt-js/blob/master/src/ExpressReceiver.ts)を参照してください。
```javascript diff --git a/docs/_advanced/middleware_listener.md b/docs/_advanced/middleware_listener.md index 8846a97ba..84d0f46f0 100644 --- a/docs/_advanced/middleware_listener.md +++ b/docs/_advanced/middleware_listener.md @@ -26,7 +26,7 @@ async function noBotMessages({ message, next }) { } // The listener only receives messages from humans -app.message(noBotMessages, ({ message }) => console.log( +app.message(noBotMessages, async ({ message }) => console.log( `(MSG) User: ${message.user} Message: ${message.text}` )); diff --git a/docs/_advanced/receiver.md b/docs/_advanced/receiver.md index eb9af501a..e35933eb0 100644 --- a/docs/_advanced/receiver.md +++ b/docs/_advanced/receiver.md @@ -19,7 +19,7 @@ A receiver is responsible for handling and parsing any incoming events from Slac To use a custom receiver, you can pass it into the constructor when initializing your Bolt for JavaScript app. Here is what a basic custom receiver might look like. -For a more in-depth look at a receiver, [read the source code for the built-in `ExpressReceiver`](https://github.com/slackapi/bolt/blob/master/src/ExpressReceiver.ts) +For a more in-depth look at a receiver, [read the source code for the built-in `ExpressReceiver`](https://github.com/slackapi/bolt-js/blob/master/src/ExpressReceiver.ts)
```javascript diff --git a/docs/_basic/ja_acknowledging_requests.md b/docs/_basic/ja_acknowledging_requests.md index 52da488eb..87fbdfb48 100644 --- a/docs/_basic/ja_acknowledging_requests.md +++ b/docs/_basic/ja_acknowledging_requests.md @@ -6,9 +6,9 @@ order: 7 ---
-アクション、コマンド、およびオプションイベントは、常に `ack()` 関数を使用して確認する必要があります。これにより、Slack がイベントの受信を認識することができ、それに応じて Slack ユーザーインターフェイスが更新されます。イベントのタイプによっては、確認通知が異なることがあります。たとえば、ダイアログの送信を確認するときに、送信にエラーが含まれている場合は検証エラーを出して `ack()` を呼び出し、送信が有効な場合はパラメータなしで `ack()` を呼び出します。 +アクション(action)、コマンド(command)、およびオプション(options)イベントは、**必ず** `ack()` 関数を用いて確認する必要があります。これにより Slack 側にイベントが正常に受信されたことを知らせることができ、それに応じて Slack のユーザーインターフェイスが更新されます。イベントのタイプによっては、確認の通知方法が異なる場合があります。たとえば、ダイアログの送信を確認するとき、送信内容にエラーがあればバリデーションエラーとともに `ack()` を呼び出しますが、送信内容が問題なければ、そのようなパラメータなしで `ack()` を呼び出します。 -この ack() による応答は 3 秒以内にしなければならないので、新しいメッセージを送信したり、データベースから情報を取得したりする直前に `ack()` を呼び出すことをお勧めします。 +この `ack()` による応答は 3 秒以内に行う必要があります。新しいメッセージの送信や、データベースからの情報の取得などを行う前に、リクエストを受けてすぐに `ack()` を呼び出して応答を返してしまうことをおすすめします。
```javascript diff --git a/docs/_basic/ja_authenticating_oauth.md b/docs/_basic/ja_authenticating_oauth.md new file mode 100644 index 000000000..b3ad8b179 --- /dev/null +++ b/docs/_basic/ja_authenticating_oauth.md @@ -0,0 +1,104 @@ +--- +title: OAuth フローの実装 +lang: ja-jp +slug: authenticating-oauth +order: 14 +--- + +
+複数のワークスペースにインストールされる Slack アプリは OAuth フローを実装し、アクセストークンなどのインストール時に取得した情報をセキュアな方法で保存しておく必要があります。Bolt for JavaScript では、`clientId`、`clientSecret`、`stateSecret`、`scopes` を `App` 初期化時に指定すると OAuth フローのためのルートのセットアップや state パラメーターを検証する機能が有効になります。組み込みの OAuth サポートモジュールは `ExpressReceiver` を使用している場合のみ利用可能です。もしカスタムのレシーバーを実装して利用している場合は、私たちが提供している [OAuth ライブラリ](https://slack.dev/node-slack-sdk/oauth#slack-oauth)を利用していください。 Bolt for JavaScript の組み込みのモジュールもこれを内部的に利用しています。 + + +Bolt for JavaScript は、アプリのインストールフローを完了した後の遷移先の URL である **Redirect URL** のためのパスとして `slack/oauth_redirect` を有効にします。この URL を Slack アプリの設定画面の **OAuth and Permissions** セクション内で **Redirect URL** として指定してください。このsっていのカスタマイズは以下で説明する `installerOptions` を指定することで可能です。 + +Bolt for JavaScript は `slack/install` というパスも生成します。これは、Slack アプリのダイレクトインストールのために `Add to Slack` ボタンを置く場合に指定できる URL です。アプリはすでにインストールされていて、さらにユーザーから追加の認可情報(例:ユーザートークンの発行)な場合や、何らかの理由で動的にインストール用の URL を生成したい場合は、`app.installer.generateInstallUrl()` を用いてその URL を生成することができます。詳細は [OAuth ライブラリのドキュメント](https://slack.dev/node-slack-sdk/oauth#generating-an-installation-url)の `generateInstallUrl()` を参照してください。 + +Slack の OAuth インストールフローについてもっと知りたい場合は [API ドキュメント](https://api.slack.com/authentication/oauth-v2)を参照してください。 +
+ +```javascript +const app = new App({ + signingSecret: process.env.SLACK_SIGNING_SECRET, + clientId: process.env.SLACK_CLIENT_ID, + clientSecret: process.env.SLACK_CLIENT_SECRET + stateSecret: 'my-state-secret', + scopes: ['channels:read', 'groups:read', 'channels:manage', 'chat:write', 'incoming-webhook'], + installationStore: { + storeInstallation: (installation) => { + // TODO: 実際のデータベースに保存するために、ここのコードを変更 + return database.set(installation.team.id, installation); + }, + fetchInstallation: (InstallQuery) => { + // TODO: 実際のデータベースから取得するために、ここのコードを変更 + return database.get(InstallQuery.teamId); + }, + }, +}); +``` + +
+ +

OAuth デフォルト設定をカスタマイズ

+
+ +
+ +`installerOptions` を使って OAuth モジュールのデフォルト設定を上書きすることができます。このカスタマイズされた設定は `App` の初期化時に渡します。以下の情報を変更可能です: + +- `authVersion`: 新しい Slack アプリとクラシック Slack アプリの切り替えに使用 +- `metadata`: セッションに関連する情報の指定に使用 +- `installPath`: "Add to Slack" ボタンのためのパスを変更するために使用 +- `redirectUriPath`: Redirect URL を変更するために使用 +- `callbackOptions`: OAuth フロー完了時の成功・エラー完了画面をカスタマイズするために使用 +- `stateStore`: 組み込みの `ClearStatStore` の代わりにカスタムのデータストアを有効にするために使用 + +
+ +```javascript +const app = new App({ + signingSecret: process.env.SLACK_SIGNING_SECRET, + clientId: process.env.SLACK_CLIENT_ID, + clientSecret: process.env.SLACK_CLIENT_SECRET + scopes: ['channels:read', 'groups:read', 'channels:manage', 'chat:write', 'incoming-webhook'], + installerOptions: { + authVersion: 'v1', // デフォルトは 'v2' (クラシック Slack アプリは 'v1') + metadata: 'some session data', + installPath: '/slack/installApp', + redirectUriPath: '/slack/redirect', + callbackOptions: { + success: (installation, installOptions, req, res) => { + // ここで成功時のカスタムロジックを実装 + res.send('successful!'); + }, + failure: (error, installOptions , req, res) => { + // ここでエラー時のカスタムロジックを実装 + res.send('failure'); + } + }, + stateStore: { + // `stateStore` を指定する場合は `stateSecret` の設定が不要 + + // 第一引数は `generateInstallUrl` メソッドに渡される `InstallUrlOptions` オブジェクト、第二引数は日付オブジェクト + // state の文字列を応答 + generateStateParam: (installUrlOptions, date) => { + // URL の state パラメーターとして使用するランダムな文字列を生成 + const randomState = randomStringGenerator(); + // その値をキャッシュ、データベースに保存 + myDB.set(randomState, installUrlOptions); + // データベースに保存されたものを利用可能な値として返却 + return randomState; + }, + + // 第一引数は日付オブジェクトで、第二引数は state を表現する文字列 + // `installUrlOptions` オブジェクトを応答 + verifyStateParam: (date, state) => { + // state をキーに、データベースから保存された installOptions を取得 + const installUrlOptions = myDB.get(randomState); + return installUrlOptions; + } + }, + } +}); +``` + +
diff --git a/docs/_basic/ja_listening_actions.md b/docs/_basic/ja_listening_actions.md index e272615d8..6fbb83005 100644 --- a/docs/_basic/ja_listening_actions.md +++ b/docs/_basic/ja_listening_actions.md @@ -6,7 +6,7 @@ order: 5 ---
-アプリでは、ボタンのクリック、メニューの選択、メッセージショートカットなどのユーザーアクションを、 `action` メソッドを使用してリスニングすることができます。 +Bolt アプリは `action` メソッドを用いて、ボタンのクリック、メニューの選択、メッセージショートカットなどのユーザーのアクションをリスニングすることができます。 アクションは文字列型の `action_id` または RegExp オブジェクトでフィルタリングできます。 `action_id` は、Slack プラットフォーム上のインタラクティブコンポーネントの一意の識別子として機能します。 diff --git a/docs/_basic/ja_listening_events.md b/docs/_basic/ja_listening_events.md index cbd850b43..f2f8a7db7 100644 --- a/docs/_basic/ja_listening_events.md +++ b/docs/_basic/ja_listening_events.md @@ -6,15 +6,15 @@ order: 3 ---
-[Events API イベント](https://api.slack.com/events)をリスニングするには、 `event()` メソッドをアプリ設定でサブスクライブしてから使用します。これにより、Slack で何かが発生した (ユーザーがメッセージにリアクションした、チャンネルに参加したなど) ときに、アプリでアクションを実行できます。 +[Events API イベント](https://api.slack.com/events)のリスニングは、Slack アプリの設定画面でサブスクリプション設定を行った上で `event()` メソッドを使用します。これにより、Slack で何かが発生した (例:ユーザーがメッセージにリアクションした、チャンネルに参加した) ときに Bolt アプリ側で処理を実行できます。 -`event()` メソッドは、文字列型の `eventType` を必要とします。 +`event()` メソッドは、文字列型の `eventType` を指定する必要があります。
```javascript const welcomeChannelId = 'C12345'; -// ユーザーが新規でチームに加入した際に、指定のチャンネルにメッセージを送信して自己紹介を促す +// 新しいユーザーがワークスペースに加入したタイミングで、指定のチャンネルにメッセージを送信して自己紹介を促す app.event('team_join', async ({ event, context }) => { try { const result = await app.client.chat.postMessage({ @@ -36,9 +36,9 @@ app.event('team_join', async ({ event, context }) => {
-`message()` リスナーは `event('message')` に相当します。 +`message()` リスナーは `event('message')` と等価の機能を提供します。 -イベントのサブタイプをフィルタリングするには、組み込みの `matchEventSubtype()` ミドルウェアを使用します。 `bot_message` や `message_replied` のような一般的なメッセージサブタイプは、[メッセージイベントページ](https://api.slack.com/events/message#message_subtypes)にあります。 +イベントのサブタイプをフィルタリングしたい場合、組み込みの `matchEventSubtype()` ミドルウェアを使用できます。 `bot_message` や `message_replied` のような一般的なメッセージサブタイプの情報は、[メッセージイベントのドキュメント](https://api.slack.com/events/message#message_subtypes)を参照してください。
```javascript diff --git a/docs/_basic/ja_listening_messages.md b/docs/_basic/ja_listening_messages.md index 9b9ac4b91..f63ef87cf 100644 --- a/docs/_basic/ja_listening_messages.md +++ b/docs/_basic/ja_listening_messages.md @@ -6,9 +6,9 @@ order: 1 ---
-[アプリが受信権限を持っている](https://api.slack.com/messaging/retrieving#permissions)メッセージをリスニングするには、`message`型でないイベントを除外する`message()` メソッドを使用します。 +[アプリが受信可能な](https://api.slack.com/messaging/retrieving#permissions)メッセージをリスニングするには、`message` 型でないイベントを除外する `message()` メソッドを使用します。 -`message()` は、パターンと一致しないメッセージを除外する、 `string` 型の `pattern` パラメーター (オプション) または `RegExp` オブジェクトを受け入れます。 +`message()` は、`string` 型か `RegExp` 型の、指定パターンに一致しないメッセージを除外する `pattern` パラメーター(指定は必須ではありません)を受け付けます。
```javascript @@ -24,9 +24,9 @@ app.message(':wave:', async ({ message, say }) => {
-文字列の代わりに 正規表現(RegExp) パターンを使用すると、照合の精度を高めることができます。 +文字列の代わりに 正規表現(RegExp) パターンを使用すると、より細やかなマッチングが可能です。 -RegExp の一致結果はすべて `context.matches` に格納されます。 +RegExp の一致結果はすべて `context.matches` に保持されます。
```javascript diff --git a/docs/_basic/ja_listening_modals.md b/docs/_basic/ja_listening_modals.md index a9f13e65e..48aefb9bd 100644 --- a/docs/_basic/ja_listening_modals.md +++ b/docs/_basic/ja_listening_modals.md @@ -1,12 +1,12 @@ --- -title: モーダルビューでの送信のリスニング +title: モーダルでの送信のリスニング lang: ja-jp slug: view_submissions order: 12 ---
-モーダルビューのペイロードが入力のブロックを含む場合、その入力値を受け取るために view_submission のイベントをリスニングする必要があります。view_submission イベントをリスニングするためには、組み込みの view() メソッドを使用します。 +モーダルのペイロードが入力のブロックを含む場合、その入力値を受け取るために view_submission のイベントをリスニングする必要があります。view_submission イベントをリスニングするためには、組み込みの view() メソッドを使用します。 view() メソッドは、文字列型または RegeExp型 の callback_id を必要とします。 @@ -16,9 +16,9 @@ order: 12
```javascript -// モーダルビューでのデータ送信イベントを処理します +// モーダルでのデータ送信イベントを処理します app.view('view_b', async ({ ack, body, view, context }) => { - // モーダルビューでのデータ送信イベントを確認 + // モーダルでのデータ送信イベントを確認 await ack(); // 入力値を使ってやりたいことをここで実装 - ここでは DB に保存して送信内容の確認を送っている diff --git a/docs/_basic/ja_listening_responding_commands.md b/docs/_basic/ja_listening_responding_commands.md index 776e16fd5..d2fd8550f 100644 --- a/docs/_basic/ja_listening_responding_commands.md +++ b/docs/_basic/ja_listening_responding_commands.md @@ -6,15 +6,17 @@ order: 9 ---
-着信するスラッシュコマンドイベントをリスニングするには、アプリで `command()` メソッドを使用します。メソッドは文字列型の `commandName` を必要とします。 +スラッシュコマンドが実行されたイベントをリスニングするには、アプリで `command()` メソッドを使用します。メソッドの使用には文字列型の `commandName` の指定が必要です。 -アプリがイベントを受け取ったことを Slack に通知するには、コマンドを `ack()` で確認する必要があります。 +アプリがスラッシュコマンドのイベントを受け取ったことを `ack()` の実行によって Slack に通知する必要があります。 -スラッシュコマンドに応答する方法は 2 つあります。1 つ目の方法では、文字列または JSON ペイロードを受け入れる `say()` を使用します。2 つ目の方法では、 `response_url` のユーティリティである `response()` を使用します。これらについては、「[アクションへの応答](#action-respond)」セクションで詳しく説明しています。 +スラッシュコマンドへの応答には 2 つのやり方があります。1 つ目の方法は、文字列または JSON ペイロードを受け取る `say()` で、2 つ目は `response_url` を簡単に利用するためのユーティリティである `respond()` です。これらについては、「[アクションへの応答](#action-respond)」セクションで詳しく説明しています。 + +Slack アプリの管理画面でスラッシュコマンドを設定するとき、そのスラッシュコマンドの Request URL に(`https://{ドメイン}` に続いて) `/slack/events` を指定するようにしてください。
```javascript -// この echo コマンドは 単純にコマンドをエコー(こだま) +// この echo コマンドは ただ、その引数を(やまびこのように)おうむ返しする app.command('/echo', async ({ command, ack, say }) => { // コマンドリクエストを確認 await ack(); diff --git a/docs/_basic/ja_listening_responding_options.md b/docs/_basic/ja_listening_responding_options.md index 4a8aa4026..55a918dd1 100644 --- a/docs/_basic/ja_listening_responding_options.md +++ b/docs/_basic/ja_listening_responding_options.md @@ -6,11 +6,11 @@ order: 13 ---
-`option()` メソッドは、Slack からの着信オプションリクエストペイロードをリッスンします。 [`actions()` と同様](#action-listening)に、 `action_id` オブジェクトまたは制約付きオブジェクトが必要です。 +`options()` メソッドは、Slack からのオプション(セレクトメニュー内の動的な選択肢)をリクエストするペイロードをリッスンします。 [`action()` と同様](#action-listening)に、文字列型の `action_id` または制約付きオブジェクトが必要です。 -`external_select` メニューには `action_id` を使用することをお勧めしますが、ダイアログはまだ Block Kit をサポートしていないため、制約オブジェクトを用いて `callback_id` でフィルタリングする必要があります。 +`external_select` メニューには `action_id` を使用することをおすすめしますが、ダイアログはまだ Block Kit をサポートしていないため、制約オブジェクトを用いて `callback_id` でフィルタリングする必要があります。 -オプションリクエストに応答するためには、適切なオプションを指定して `ack()` を実行する必要があります。[external_select の応答の例](https://api.slack.com/reference/messaging/block-elements#external-select)も[ダイアログ応答の例](https://api.slack.com/dialogs#dynamic_select_elements_external)も API サイトで参照できます。 +オプションのリクエストへの応答には、適切なオプションを指定して `ack()` を実行する必要があります。API サイトに掲載されている[external_select の応答の例](https://api.slack.com/reference/messaging/block-elements#external-select)や[ダイアログ応答の例](https://api.slack.com/dialogs#dynamic_select_elements_external)を参考にしてください。
```javascript diff --git a/docs/_basic/ja_opening_modals.md b/docs/_basic/ja_opening_modals.md index 397e6c5af..fe218c50a 100644 --- a/docs/_basic/ja_opening_modals.md +++ b/docs/_basic/ja_opening_modals.md @@ -1,5 +1,5 @@ --- -title: views.open を使ったモーダルビューのオープン +title: モーダルの開始 lang: ja-jp slug: creating-modals order: 10 @@ -7,11 +7,11 @@ order: 10
-モーダルビューは、ユーザー情報を収集したり、情報の動的な表示を実現するためのインタフェースです。モーダルビューは、適切な trigger_idビュー部分のペイロード を組み込みの API クライアントによる views.open メソッドの呼び出しに渡すことでオープンすることができます。 +モーダルは、ユーザー情報を収集したり、動的な表示を実現するためのインターフェースです。モーダルは、有効な trigger_idビュー部分のペイロード を組み込みの API クライアントによる views.open メソッドの呼び出しに渡すことで開始することができます。 -trigger_id はコマンド、ボタンの押下、メニューの選択などによって Request URL に送信されたペイロードの項目として入手することができます。 +trigger_id はスラッシュコマンド、ボタンの押下、メニューの選択などによって Request URL に送信されたペイロードの項目として入手することができます。 -モーダルビューの作成についてのより詳細な情報は API ドキュメントを参照してください。 +モーダルの生成についてのより詳細な情報は API ドキュメントを参照してください。
```javascript diff --git a/docs/_basic/ja_responding_actions.md b/docs/_basic/ja_responding_actions.md index 021c5a4e2..f01fee895 100644 --- a/docs/_basic/ja_responding_actions.md +++ b/docs/_basic/ja_responding_actions.md @@ -6,9 +6,9 @@ order: 6 ---
-アクションに応答するには、主に 2 つの方法があります。1 つ目の (最も一般的な) 方法では、 `say` 関数を使用します。 `say` 関数は、着信イベントが発生した会話にメッセージを返します。 +アクションへの応答には、主に 2 つのやり方があります。1 つ目の (最も一般的な) やり方は `say` 関数の利用です。 `say` 関数は、Slack 内のイベントが発生した会話(チャンネルや DM)へメッセージを返します。 -アクションに応答する 2 つ目の方法では、 `respond()` を使用します。これは、アクションに関連付けられている `response_url` を使用するためのシンプルななユーティリティです。 +アクションに応答する 2 つ目の方法は `respond()` です。これはアクションに紐付けられている `response_url` を用いたメッセージの送信をシンプルに行うためのユーティリティです。
```javascript @@ -26,7 +26,7 @@ app.action('approve_button', async ({ ack, say }) => {
-`respond()` は `response_url` を呼び出すためのユーティリティであるため、同じ方法で動作します。新しいメッセージペイロードを使用して JSON オブジェクトを渡すことができます。このオブジェクトは、 `response_type` (値は `in_channel` または `ephemeral` )、 `replace_original` 、 `delete_original` のようなオプションのプロパティを使用して元の会話のソースにパブリッシュされます。 +`respond()` は `response_url` を呼び出すためのユーティリティであるため、それを直接使うときと同様に動作します。新しいメッセージのペイロードと、オプショナルな引数である `response_type` (値は `in_channel` または `ephemeral` )、 `replace_original` 、 `delete_original` を含む JSON オブジェクトを渡すことができます。
```javascript diff --git a/docs/_basic/ja_sending_messages.md b/docs/_basic/ja_sending_messages.md index 7b206f117..ee057e6fa 100644 --- a/docs/_basic/ja_sending_messages.md +++ b/docs/_basic/ja_sending_messages.md @@ -6,9 +6,9 @@ order: 2 ---
-リスナー関数内では、関連付けられている会話 (たとえば、リスナーをトリガーしたイベントやアクションが発生した会話) が存在するときにはいつでも `say()` を使用できます。 `say()` はパラメーターに文字列を入れて単純なテキストベースのメッセージを送信するか、もしくは、JSON を使ってより複雑なメッセージを送信します。渡されたメッセージペイロードは、関連付けられている会話に送信されます。 +リスナー関数内では、その実行に関連付けられた会話 (例:リスナー実行のトリガーが発生したイベント・アクションが発生したチャンネル) があるとき `say()` を使用できます。 `say()` は、シンプルなメッセージを送信するための文字列か、もっと複雑なメッセージを送信するための JSON ペイロードを受け付けます。渡されたメッセージのペイロードは、関連付けられた会話へ送信されます。 -リスナーの外部にメッセージを送信する場合、またはより高度な操作 (特定のエラーの処理など) を実行する場合は、[Bolt インスタンスにアタッチされたクライアントを使用](#web-api)して `chat.postMessage` を呼び出します。 +リスナー関数以外の場所でメッセージを送信したい場合や、より高度な操作 (特定のエラーの処理など) を実行したい場合は、[Bolt インスタンスにアタッチされた client を使用](#web-api)して `chat.postMessage` を呼び出します。
```javascript @@ -20,11 +20,11 @@ app.message('knock knock', async ({ message, say }) => {
-

ブロックを使用したメッセージの送信

+

ブロックを用いたメッセージの送信

-`say()` はより複雑なメッセージペイロードを受け入れて、メッセージに機能と構造を容易に追加できるようにします。 +`say()` は、より複雑なメッセージペイロードを受け付けるので、メッセージに機能やリッチな構造を与えることが容易です。 リッチなメッセージレイアウトをアプリに追加する方法については、[API サイトのガイド](https://api.slack.com/messaging/composing/layouts)を参照し、[Block Kit ビルダー](https://api.slack.com/tools/block-kit-builder?template=1)の一般的なアプリフローのテンプレートを確認してください。
diff --git a/docs/_basic/ja_updating_pushing_modals.md b/docs/_basic/ja_updating_pushing_modals.md index a239d64dd..0db9d0621 100644 --- a/docs/_basic/ja_updating_pushing_modals.md +++ b/docs/_basic/ja_updating_pushing_modals.md @@ -1,25 +1,25 @@ --- -title: モーダルビューの更新と多重表示 +title: モーダルの更新と多重表示 lang: ja-jp slug: updating-pushing-views order: 11 ---
-モーダルビューの表示は、複数のビューをスタックとして保持する場合があります。`views.open` という API を呼び出すと、まずルートのモーダルビューが生成されます。その最初の呼び出しの後で、`views.update` によって動的にそのビューを書き換えたり、`views.push` で新しいビューをその上に積み重ねて表示したりといったことができます。 +モーダルでは、複数のモーダルをスタックのように積み重ねて表示できます。`views.open` という API を呼び出すと、まず親の(最初の)モーダルが表示されます。この最初の呼び出しの後、`views.update` を実行することでそのビューを書き換えることもできますし、最初に述べたように `views.push` で新しいモーダルを積み重ねて表示することもできます。 views.update
-モーダルビューを更新するには組み込みの API クライアントを使って views.update を呼び出します。この API 呼び出しにはそのビューをオープンしたときに生成された view_id と、書き換えられた blocks の配列を渡します。ユーザーが既存のビューの中にある要素とインタラクションを行なったことをきっかけにビューを更新する場合は、そのリクエストの bodyview_id が含まれています。 +モーダルの更新には、組み込みの API クライアントを使って views.update を呼び出します。この API 呼び出しには、そのモーダルを開いたときに生成された view_id と、更新後の内容を表現する blocks の配列を含む新しい view を渡します。ユーザーが既存のモーダル内の要素とインタラクションを行なった(例:ボタンを押す、メニューから選択する)ことをトリガーにビューを更新する場合、そのリクエストの bodyview_id が含まれます。 views.push
-ビューのスタックに新しいビューを積み重ねるには、組み込みの API クライアントを使って views.push を呼び出します。この API 呼び出しには、適切な trigger_id と新しく生成する ビュー部分のペイロードを渡します。`views.push` の引数は ビューをオープンするときと同様です。最初のモーダルビューをオープンした後、その上にさらに二つまで追加のビューをスタックに積み重ねることができます。 +モーダルのスタックに新しいモーダルを積み重ねるためには、組み込みの API クライアントを用いて views.push を呼び出します。この API 呼び出しには、有効な trigger_id と、新しく生成する ビュー部分のペイロードを渡します。`views.push` の引数は モーダルを開始するときと同様です。最初のモーダルを開いた後、その上にさらに二つまで追加のモーダルをスタックに積み重ねることができます。 より詳細な情報は API ドキュメントを参照してください。
```javascript // action_id: button_abc のボタンを押すイベントをリッスン -// (そのボタンはモーダルビューの中にあるという想定) +// (そのボタンはモーダルの中にあるという想定) app.action('button_abc', async ({ ack, body, context }) => { // ボタンを押したイベントを確認 await ack(); diff --git a/docs/_basic/ja_web_api.md b/docs/_basic/ja_web_api.md index dabdfafee..3224a0c41 100644 --- a/docs/_basic/ja_web_api.md +++ b/docs/_basic/ja_web_api.md @@ -6,9 +6,9 @@ order: 4 ---
-[Web API メソッド](https://api.slack.com/methods)を呼び出すには、Bolt アプリに提供されている [`WebClient`](https://slack.dev/node-slack-sdk/web-api) を `app.client` として使用します (この場合、適切なアプリのスコープを設定が必要です)。クライアントのメソッドの 1 つを呼び出すと、Slack からの応答を含む Promise が返されます。 +[Web API メソッド](https://api.slack.com/methods)を呼び出すには、Bolt アプリに `app.client` として提供されている [`WebClient`](https://slack.dev/node-slack-sdk/web-api) を使用します (各 API に必要となるスコープの適切な設定が必要です)。クライアントが提供するメソッドを 1 つ呼び出すと、それへの Slack からの応答を含む Promise の値が返されます。 -Bolt の初期化に使用されるトークンは `context` オブジェクト内にあり、ほとんどの Web API メソッドで必須です。 +Bolt の初期化時に使用されたトークンは `context` オブジェクト内に保持されています。このトークンは、ほとんどの Web API メソッドの実行に必要となります。
```javascript diff --git a/docs/_basic/listening_responding_options.md b/docs/_basic/listening_responding_options.md index 92e4b856a..efd7d49d2 100644 --- a/docs/_basic/listening_responding_options.md +++ b/docs/_basic/listening_responding_options.md @@ -6,7 +6,7 @@ order: 13 ---
-The `option()` method listens for incoming option request payloads from Slack. [Similar to `actions()`](#action-listening), +The `options()` method listens for incoming option request payloads from Slack. [Similar to `action()`](#action-listening), an `action_id` or constraints object is required. While it's recommended to use `action_id` for `external_select` menus, dialogs do not yet support Block Kit so you'll have to diff --git a/docs/_basic/updating_pushing_modals.md b/docs/_basic/updating_pushing_modals.md index a161fa13a..13cf9fa1e 100644 --- a/docs/_basic/updating_pushing_modals.md +++ b/docs/_basic/updating_pushing_modals.md @@ -9,7 +9,7 @@ order: 11 Modals contain a stack of views. When you call `views.open`, you add the root view to the modal. After the initial call, you can dynamically update a view by calling `views.update`, or stack a new view on top of the root view by calling `views.push`. views.update
-To update a view, you can use the built-in client to call views.update with the view_id that was generated when you opened the view, and the updated blocks array. If you're updating the view when a user interacts with an element inside of an existing view, the view_id will be available in the body of the request. +To update a view, you can use the built-in client to call views.update with the view_id that was generated when you opened the view, and a new view including the updated blocks array. If you're updating the view when a user interacts with an element inside of an existing view, the view_id will be available in the body of the request. views.push
To push a new view onto the view stack, you can use the built-in client to call views.push with a valid trigger_id a new view payload. The arguments for `views.push` is the same as opening modals. After you open a modal, you may only push two additional views onto the view stack. diff --git a/docs/_includes/sidebar.html b/docs/_includes/sidebar.html index 5287a4dc8..a51b1c559 100644 --- a/docs/_includes/sidebar.html +++ b/docs/_includes/sidebar.html @@ -54,6 +54,6 @@
  • {{tutorial.title}}
  • {% endfor %} -
  • {{ site.t[page.lang].contribute }}
  • +
  • {{ site.t[page.lang].contribute }}
  • diff --git a/docs/_tutorials/hubot_migration.md b/docs/_tutorials/hubot_migration.md index 33ec8ceb7..eb08959d3 100644 --- a/docs/_tutorials/hubot_migration.md +++ b/docs/_tutorials/hubot_migration.md @@ -13,7 +13,7 @@ redirect_from:
    Bolt was created to reduce the time and complexity it takes to build Slack apps. It provides Slack developers a single interface to build using modern features and best practices. This guide is meant to step you through the process of migrating your app from using [Hubot](https://hubot.github.com/docs/) to Bolt for JavaScript. -If you already have an [app with a bot user](https://api.slack.com/bot-users#getting-started) or if you’re looking for code samples that translate Hubot code to Bolt for JavaScript code, you may find it valuable to start by reading through the [example script in the Bolt for JavaScript repository](https://github.com/slackapi/bolt/blob/master/examples/hubot-example/script.js). +If you already have an [app with a bot user](https://api.slack.com/bot-users#getting-started) or if you’re looking for code samples that translate Hubot code to Bolt for JavaScript code, you may find it valuable to start by reading through the [example script in the Bolt for JavaScript repository](https://github.com/slackapi/bolt-js/blob/master/examples/hubot-example/script.js).
    --- @@ -25,8 +25,8 @@ The default Bolt for JavaScript receiver is built to support the [Events API](ht There are a few other differences you may want to consider before creating a Bolt for JavaScript app: - The minimum version of Node for Bolt for JavaScript is `v10.0.0`. If the server you’re hosting your app from cannot support `v10`, it’s not possible to migrate your app to Bolt for JavaScript at the moment. -- Bolt for JavaScript doesn’t have support for external scripts. If your Hubot app uses external scripts that are necessary to your app’s functionality or deployment, you probably want to stay with Hubot for now. If you aren’t sure whether your app has any external scripts, you can check the `external-scripts.json` file. As we continue to invest in Bolt for JavaScript, we are thinking about the future and how to make development and deployment of Slack apps easier. If there’s a valuable external script that your app uses, we’d love to hear what it is [in the dedicated Github issue](https://github.com/slackapi/bolt/issues/119). -- Hubot apps are written in Coffeescript, which transpiles into Javascript. We decided to write Bolt in Typescript to give access to rich type information. Bolt apps can be developed using Typescript or Javascript. The [example script](https://github.com/slackapi/bolt/blob/master/examples/hubot-example/script.js) shows you how your Coffeescript may translate to Javascript. If your app is more than a few simple scripts, it may be worth looking into projects like [Decaffeinate](https://github.com/decaffeinate/decaffeinate) to convert your CoffeeScript to Javascript. +- Bolt for JavaScript doesn’t have support for external scripts. If your Hubot app uses external scripts that are necessary to your app’s functionality or deployment, you probably want to stay with Hubot for now. If you aren’t sure whether your app has any external scripts, you can check the `external-scripts.json` file. As we continue to invest in Bolt for JavaScript, we are thinking about the future and how to make development and deployment of Slack apps easier. If there’s a valuable external script that your app uses, we’d love to hear what it is [in the dedicated Github issue](https://github.com/slackapi/bolt-js/issues/119). +- Hubot apps are written in Coffeescript, which transpiles into Javascript. We decided to write Bolt in Typescript to give access to rich type information. Bolt apps can be developed using Typescript or Javascript. The [example script](https://github.com/slackapi/bolt-js/blob/master/examples/hubot-example/script.js) shows you how your Coffeescript may translate to Javascript. If your app is more than a few simple scripts, it may be worth looking into projects like [Decaffeinate](https://github.com/decaffeinate/decaffeinate) to convert your CoffeeScript to Javascript. --- @@ -79,7 +79,7 @@ Bolt’s interface was designed to conform to the Slack API language as much as Bolt for JavaScript doesn’t use `res` or expose the raw request from Slack. Instead, you can use the payload body from `payload`, or common functionality like sending a message using `say()`. -> ⚙️To make it easier, we’ve created a sample script on Github that [showcases Hubot’s core functionality using equivalent functionality written with Bolt for JavaScript](https://github.com/slackapi/bolt/blob/master/examples/hubot-example/script.js). +> ⚙️To make it easier, we’ve created a sample script on Github that [showcases Hubot’s core functionality using equivalent functionality written with Bolt for JavaScript](https://github.com/slackapi/bolt-js/blob/master/examples/hubot-example/script.js). #### Listening to patterns using `message()` Hubot scripts use `hear()` listen to messages with a matching pattern. Bolt for JavaScript instead uses `message()` and accepts a `string` or `RegExp` for the pattern. @@ -103,7 +103,7 @@ The arguments for Hubot’s `send()` and Bolt for JavaScript's `say()` are mostl In the previous section, you should have subscribed your app to the `app_mention` event if your Hubot script uses `respond()`, and `reaction_added` if you uses `react()`. -Bolt for JavaScript uses a method called `event()` that allows you to listen to any [Events API event](https://api.slack.com/events). To change your code, you’ll just change any `respond()` to `app.event(‘app_mention’)` and any `react()` to `app.event(‘reaction_added’)`. This is detailed more [in the example script](https://github.com/slackapi/bolt/blob/master/examples/hubot-example/script.js). +Bolt for JavaScript uses a method called `event()` that allows you to listen to any [Events API event](https://api.slack.com/events). To change your code, you’ll just change any `respond()` to `app.event(‘app_mention’)` and any `react()` to `app.event(‘reaction_added’)`. This is detailed more [in the example script](https://github.com/slackapi/bolt-js/blob/master/examples/hubot-example/script.js). > 👨‍💻👩‍💻Anywhere where you use `respond()` in your code, change it to use `app.event(‘app_mention’)`. Anywhere you use `react`, change it to `app.event(‘reaction_added’)`. @@ -166,4 +166,4 @@ Now that you have your flashy new Bolt for JavaScript app, you can explore how t - Read [the documentation](https://slack.dev/bolt/concepts) to explore what else is possible with Bolt for JavaScript. - Check out our [sample app](https://glitch.com/~slack-bolt) that shows you how to use events and interactive components. -And if you have difficulties while developing, reach out to our developer support team to at [developers@slack.com](mailto:developers@slack.com), and if you run into a problem with the framework [open an issue on Github](https://github.com/slackapi/bolt/issues/new). +And if you have difficulties while developing, reach out to our developer support team to at [developers@slack.com](mailto:developers@slack.com), and if you run into a problem with the framework [open an issue on Github](https://github.com/slackapi/bolt-js/issues/new). diff --git a/docs/_tutorials/ja_getting_started.md b/docs/_tutorials/ja_getting_started.md index 738ef479d..5c28d2596 100644 --- a/docs/_tutorials/ja_getting_started.md +++ b/docs/_tutorials/ja_getting_started.md @@ -20,7 +20,7 @@ redirect_from: ### アプリを作成する 最初にやるべきこと: Bolt で開発を始める前に、 [Slack アプリを作成](https://api.slack.com/apps/new)します。 -> 💡 いつもの仕事のさまたげにならないように、別に開発用のワークスペースを使用することをお勧めします — [新しいワークスペースを無料で作成](https://slack.com/get-started#create)できます。 +> 💡 いつもの仕事のさまたげにならないように、別に開発用のワークスペースを使用することをおすすめします — [新しいワークスペースを無料で作成](https://slack.com/get-started#create)できます。 アプリ名を入力し (後で変更可能)、インストール先のワークスペースを選択したら、`Create App` ボタンをクリックすると、アプリの **Basic Information** ページが表示されます。 @@ -130,7 +130,7 @@ node app.js

    開発用のローカルリクエスト URL

    -アプリの開発を始めたばかりの場合は、パブリック URL をまだお持ちでないかもしれません。最終的には自ら URL をセットアップすることになるかもしれませんが、現時点では [ngrok](https://ngrok.com/) のような開発プロキシを利用することをお勧めします。これにより、パブリック URL が作成され、リクエストが開発環境にトンネルされます。[Slack でのローカル開発に ngrok を使用](https://api.slack.com/tutorials/tunneling-with-ngrok)する方法についてのチュートリアルを作成しておきました。このチュートリアルに従えば、すべてをセットアップすることができます。 +アプリの開発を始めたばかりの場合は、パブリック URL をまだお持ちでないかもしれません。最終的には自ら URL をセットアップすることになるかもしれませんが、現時点では [ngrok](https://ngrok.com/) のような開発プロキシを利用することをおすすめします。これにより、パブリック URL が作成され、リクエストが開発環境にトンネルされます。[Slack でのローカル開発に ngrok を使用](https://api.slack.com/tutorials/tunneling-with-ngrok)する方法についてのチュートリアルを作成しておきました。このチュートリアルに従えば、すべてをセットアップすることができます。 開発用プロキシをインストールしたら、それを実行して特定のポートへのリクエストの転送を開始します (この例ではポート 3000 を使用していますが、アプリの初期化に使用するポートをカスタマイズした場合は、代わりにそのポートを使用してください)。 @@ -140,7 +140,7 @@ ngrok http 3000 ![Running ngrok](../../assets/ngrok.gif "Running ngrok") -使用可能な URL が生成され、出力されます ( `https://` で始まる URL をお勧めします)。この URL がリクエスト URL のベースになります。この例では `https://8e8ec2d7.ngrok.io` です。 +使用可能な URL が生成され、出力されます ( `https://` で始まる URL をおすすめします)。この URL がリクエスト URL のベースになります。この例では `https://8e8ec2d7.ngrok.io` です。 ---
    diff --git a/docs/_tutorials/ja_hubot_migration.md b/docs/_tutorials/ja_hubot_migration.md index 0a5da6667..5d7047d71 100644 --- a/docs/_tutorials/ja_hubot_migration.md +++ b/docs/_tutorials/ja_hubot_migration.md @@ -1,5 +1,5 @@ --- -title: Hubot のアプリを Bolt に移行する方法 +title: Hubot から Bolt に移行する方法 order: 2 slug: hubot-migration lang: ja-jp @@ -11,22 +11,22 @@ redirect_from: # Hubot のアプリを Bolt に移行する方法
    -Bolt は、Slack アプリを構築する時間と手間を減らすために作成されたフレームワークで、Slack 開発者のみなさんに最新機能とベストプラクティスを使用してアプリを構築できる単一のインターフェイスを提供します。このガイドでは、[Hubot で作成されたアプリを Bolt アプリに](https://hubot.github.com/docs/)移行するプロセスを順を追って説明します。 +Bolt は、Slack アプリを構築する時間と手間を減らすために作成されたフレームワークで、Slack 開発者のみなさんに最新機能とベストプラクティスを使用してアプリを構築できる単一のインターフェイスを提供します。このガイドでは、[Hubot で作成されたアプリを Bolt アプリに](https://hubot.github.com/docs/)移行するプロセスを順を追って説明します。 -すでに [ボットユーザーがいるアプリ](https://api.slack.com/bot-users#getting-started) を持っている方、または Hubot コードを Bolt コードに変換するコードサンプルをお探しの方は、はじめに[Bolt リポジトリのサンプルスクリプト](https://github.com/slackapi/bolt/blob/master/examples/hubot-example/script.js) を読むとよいでしょう。 +すでに [ボットユーザーがいるアプリ](https://api.slack.com/bot-users#getting-started) を持っている方、または Hubot コードを Bolt コードに変換するコードサンプルをお探しの方は、はじめに[Bolt リポジトリのサンプルスクリプト](https://github.com/slackapi/bolt-js/blob/master/examples/hubot-example/script.js) を読むとよいでしょう。
    --- ### まずはじめに -Hubot アプリを Bolt に変換するとき、それぞれが内部的にどのように機能しているかを把握しているとさらに理解を深めることができるでしょう。Slack の Hubot アダプターは、 WebSocket をベースとした [RTM API](https://api.slack.com/rtm) と接続するように実装されているので、Hubot アプリには一連のワークスペースイベントが一気にストリーミングされます。そして、RTM API は、新しいプラットフォーム機能をサポートしておらず、特にアプリが複数のまたは大規模な Slack チームにインストールされる場合には、膨大なリソースを消費する可能性があるため、ほとんどのユースケースでお勧めできません。 +Hubot アプリを Bolt に変換するとき、それぞれが内部的にどのように機能しているかを把握しているとさらに理解を深めることができるでしょう。Slack の Hubot アダプターは、 WebSocket をベースとした [RTM API](https://api.slack.com/rtm) と接続するように実装されているので、Hubot アプリには一連のワークスペースイベントが一気にストリーミングされます。そして、RTM API は、新しいプラットフォーム機能をサポートしておらず、特にアプリが複数のまたは大規模な Slack チームにインストールされる場合には、膨大なリソースを消費する可能性があるため、ほとんどのユースケースでおすすめできません。 デフォルトの Bolt レシーバーは、[Events API](https://api.slack.com/events-api) をサポートするように構築されています。これは、HTTP ベースのイベントサブスクリプションを使用して Bolt アプリに JSON ペイロードを送信します。Events API には、RTM にはない新機能のイベントも含まれており、より細かい制御が可能でスケーラブルですのでほとんどのユースケースで推奨されています。しかし例外として、RTM API を使用し続けなければならない理由の 1 つに、アプリをホストしているサーバーにファイアウォールがあり、HTTP 送信リクエストのみを許可して、受信リクエストを許可しないというようなケースが挙げられます。 Bolt アプリを作成する前に考慮に入れた方がよい違いがほかにもあります。 - Bolt は Node v10.0.0 以上で動作します。アプリをホストしているサーバーが、v10 をサポートできない場合は、現時点でアプリを Bolt に移行することはできません。 -- Bolt は、外部スクリプトをサポートしていません。Hubot アプリがアプリの機能または展開に必要な外部スクリプトを使用している場合、当面は Hubot のままでいいと思われます。アプリに外部スクリプトがあるかどうかわからない場合は、`external-scripts.json` ファイルをチェックしてください。Slack は Bolt の開発を続けていきますので、将来的にどう改良し続けていくかを常に検討しています。外部スクリプトでどうしても必要、というリクエストなどがある場合、[専用の Github の Issues で要望を 聞かせてください](https://github.com/slackapi/bolt/issues/119)。 -- Hubot アプリは、CoffeeScript で書かれており、JavaScript にトランスパイルされます。Slack は、Bolt を TypeScript で書くことでリッチな型情報にアクセスできるようにしました。Bolt アプリは、TypeScript または JavaScript を使用して開発できます。こちらの [サンプルスクリプト](https://github.com/slackapi/bolt/blob/master/examples/hubot-example/script.js) は、CoffeeScript がどのように JavaScript に変換されるかを示しています。あなたのアプリが比較的複雑なスクリプトである場合、[Decaffeinate](https://github.com/decaffeinate/decaffeinate) などのプロジェクトを調べて、CoffeeScript を JavaScript に変換するとよいかもしれません。 +- Bolt は、外部スクリプトをサポートしていません。Hubot アプリがアプリの機能または展開に必要な外部スクリプトを使用している場合、当面は Hubot のままでいいと思われます。アプリに外部スクリプトがあるかどうかわからない場合は、`external-scripts.json` ファイルをチェックしてください。Slack は Bolt の開発を続けていきますので、将来的にどう改良し続けていくかを常に検討しています。外部スクリプトでどうしても必要、というリクエストなどがある場合、[専用の Github の Issues で要望を 聞かせてください](https://github.com/slackapi/bolt-js/issues/119)。 +- Hubot アプリは、CoffeeScript で書かれており、JavaScript にトランスパイルされます。Slack は、Bolt を TypeScript で書くことでリッチな型情報にアクセスできるようにしました。Bolt アプリは、TypeScript または JavaScript を使用して開発できます。こちらの [サンプルスクリプト](https://github.com/slackapi/bolt-js/blob/master/examples/hubot-example/script.js) は、CoffeeScript がどのように JavaScript に変換されるかを示しています。あなたのアプリが比較的複雑なスクリプトである場合、[Decaffeinate](https://github.com/decaffeinate/decaffeinate) などのプロジェクトを調べて、CoffeeScript を JavaScript に変換するとよいかもしれません。 --- @@ -36,7 +36,7 @@ Bolt アプリを作成する前に考慮に入れた方がよい違いがほか #### Slack アプリを作成する まず最初に、Slack アプリを作成します。 -> 💡ここでは普段の仕事の支障にならないように、開発専用のワークスペースを使用することをお勧めします — [新しいワークスペースの作成はここから](https://api.slack.com/apps/new)。 +> 💡ここでは普段の仕事の支障にならないように、開発専用のワークスペースを使用することをおすすめします — [新しいワークスペースの作成はここから](https://api.slack.com/apps/new)。 アプリ名を入力し、インストール先のワークスペースを選択したら、`Create App` ボタンをクリックします。そうすると、アプリの **Basic Information** ページが表示されます。 @@ -78,7 +78,7 @@ Bolt のインターフェイスは、可能な限り Slack API 言語に適合 Bolt は、`res` を使用せず、Slack からの raw リクエストを公開しません。代わりに、`payload` 使ってペイロードボディを取得したり、`say()` を使ってメッセージを送信するといった一般的な機能を使用したりできます。 -> ⚙わかりやすくするために、サンプルスクリプトを Github 上に作成しました。このスクリプトは、[Bolt 用に書かれた機能と同等のものを使用している Hubot のコア機能を紹介しています。](https://github.com/slackapi/bolt/blob/master/examples/hubot-example/script.js) +> ⚙わかりやすくするために、サンプルスクリプトを Github 上に作成しました。このスクリプトは、[Bolt 用に書かれた機能と同等のものを使用している Hubot のコア機能を紹介しています。](https://github.com/slackapi/bolt-js/blob/master/examples/hubot-example/script.js) #### `message()` を使用したパターンのリスニング Hubot スクリプトは、`hear()` を使用して、一致するパターンを持つメッセージをリスニングします。代わりに、 Bolt は `message()` を使用して、そのパターンの `string` または `RegExp` を受け入れます。 @@ -101,7 +101,7 @@ Hubot の `send()` と Bolt の `say()` はほとんど同じですが、`say()` #### `respond` と `react` 前のセクションで、Hubot スクリプトで `respond()` が使用されている場合は `app_mention` イベントを、`react()` が使用されている場合は `reaction_added` をサブスクライブするようにアプリを設定しました。 -Bolt は、`event()` と呼ばれるメソッドを使用して、任意の [Events API イベント](https://api.slack.com/events) をリスニングできます。コードを変更するには、`respond()` を app.event(‘app_mention’) に、`react()` を `app.event(‘reaction_added’)` に変更するだけです。この点は、[サンプルスクリプト](https://github.com/slackapi/bolt/blob/master/examples/hubot-example/script.js) で詳しく説明されています。 +Bolt は、`event()` と呼ばれるメソッドを使用して、任意の [Events API イベント](https://api.slack.com/events) をリスニングできます。コードを変更するには、`respond()` を app.event(‘app_mention’) に、`react()` を `app.event(‘reaction_added’)` に変更するだけです。この点は、[サンプルスクリプト](https://github.com/slackapi/bolt-js/blob/master/examples/hubot-example/script.js) で詳しく説明されています。 > 👨‍💻👩‍💻コードで `respond()` が使用されている箇所はすべて、app.event ('app_mention') を使用するように変更してください。`react` が使用されている箇所はすべて `app.event('reaction_added')` に変更してください。 @@ -152,7 +152,7 @@ Hubot には、brain と呼ばれるメモリ内ストレージがあります - conversation ID を使用して `app.convoStore.get()` を呼び出して conversation の状態情報を取得する方法と、conversation ID、 conversation の状態情報 (キーと値のペア) 、オプションで `expriesAt` 時間 (ミリ秒) を使用して `app.convoStore.set()` を呼び出す方法です。 - リスナーミドルウェアでは、`context.updateConversation()` を呼び出して更新されたconversation の状態情報を得るか、`context.conversation` を使用して現在のconversation の状態情報にアクセスします。 -アプリのインスタンスが複数実行されている場合、組み込みの conversation store はプロセス間で共有されないため、データベースから conversation の状態を取得する conversation store を実装することをお勧めします。 +アプリのインスタンスが複数実行されている場合、組み込みの conversation store はプロセス間で共有されないため、データベースから conversation の状態を取得する conversation store を実装することをおすすめします。 [会話ストアについてもっと詳しく読む](https://slack.dev/bolt/ja-jp/concepts#conversation-store). @@ -164,4 +164,4 @@ Hubot には、brain と呼ばれるメモリ内ストレージがあります - こちらの [ドキュメント](https://slack.dev/bolt/ja-jp/concepts) を読んで、Bolt でほかに何ができるか探してみてください。 - イベントやインタラクティブコンポーネントの使用方法を示す [サンプルアプリ](https://glitch.com/~slack-bolt) をチェックしてみてください。 -開発中に問題が発生した場合は、Slack の開発者サポートチーム[developers@slack.com](mailto:developers@slack.com)までお問合せください。フレームワークで問題が発生した場合は、[Githubで issues を開いてください](https://github.com/slackapi/bolt/issues/new)。 +開発中に問題が発生した場合は、Slack の開発者サポートチーム[developers@slack.com](mailto:developers@slack.com)までお問合せください。フレームワークで問題が発生した場合は、[Githubで issues を開いてください](https://github.com/slackapi/bolt-js/issues/new)。