概要
TECHCAFE×TAIR Advent Calenderの20日目です. 本日は TypeScript と Repl.it を用いて,Discord Bot を作成する方法を解説します. この Bot はユーザーが入力したコマンドに対して応答を行います. また,説明にあたって Repl.it のテンプレートを作りました. これを Fork することで,手軽に Bot を動かすことができます.
- テンプレート
使うもの
- TypeScript
- Repl.it
- Discord.js (v12.5.3)
Discord.js のバージョン
Repl.it の環境は,Discord.js の最新バージョン(v13)に対応していません. このバージョンに必要な Node のバージョンは12です. しかし,Repl.it で使える Node のバージョンは 10.24.1 なので,これに対応している v12 の最終バージョンを使用します.
Bot の作成
Discord Developer Portal で Bot を作成・招待してください. 詳細はこの記事の「Discord上のBotの作成」の項で分かりやすく説明されているので,こちらを参照ください.
Bot の実行
以下の手順で Bot の実行ができます. 1. 作成した Bot のトークンをコピー 2. Repl.it の環境変数 “TOKEN” に,1のトークンを設定 3. エディタ上の「Run」ボタンを押す
詳細はこの記事の「Botを作成する」の項で分かりやすく説明されているので,こちらを参照ください.
ソースコードの説明
Bot の実行に用いるソースコードの説明をします.
必要パッケージのインポート
import * as http from 'http';
import * as discord from "discord.js"- http
- サーバーの作成に用います
- discord
- Discord Bot の実行に用います
コマンドの定義
async function ping(message: discord.Message) {
message.channel.send('pong!');
}
async function pong(message: discord.Message) {
message.channel.send('ping!');
}コマンドを関数として定義します. - ping - Bot は “pong!” を返します - pong - Bot は “ping!” を返します
コマンドリストの定義
const messageResponseDic: {
[command: string]: (message: discord.Message, args?: string[]) => void;
} = {
ping: ping,
pong: pong,
};コマンドのリストを連想配列として定義します. 今回は用いませんが,args はコマンドの引数として用います.
メッセージに応答する関数の定義
async function messageResponse(message: discord.Message) {
const prefix = '!';
const [command, ...args] = message.content.slice(prefix.length).split(' ');
const isCommand = !message.author.bot && message.content.startsWith(prefix);
if (!isCommand) return messageResponseDic[command](message, args);
}メッセージに応答する関数を定義します. 最後の行でコマンドを実行します.
Bot が行う応答のリストの定義
const clientStateResponseDic: { [state: string]: (...args: any) => void } = {
ready: () => {
console.log('This bot is ready');
},
message: messageResponse,
};Bot が行う応答のリストを連想配列で定義します. - ready - Bot の実行準備が完了したら,コンソールに “This bot is ready” と出力します - message - メッセージを送信が行われた場合に,これがコマンドであれば応答をします
サーバーの作成
function requestListener(_: http.IncomingMessage, res: http.ServerResponse) {
res.write('This bot is online');
res.end();
}
http.createServer(requestListener).listen(8080);Bot の実行に用いるサーバーを作成します.
Bot の実行
const client = new discord.Client();
for (let [state, response] of Object.entries(clientStateResponseDic)) {
client.on(state, response);
}Bot を実行する処理です. Bot の状態に応じて,Bot は応答を行います.
Bot のログイン
const token = process.env['TOKEN']client.login(token)上で定義したトークンを用いて,Bot のサーバーへのログインを行います.
まとめ
以上が TypeScript と Repl.it で Discord Bot を動かす方法でした.
参考資料
- Bot の作成
- Bot の実行
Nov’s AI Blog
