※ 本記事は2021年に書いた記事を移植したものです.少々情報が古いかもしれません.
概要
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の作成」の項で分かりやすく説明されているので,こちらを参照ください.
Discord Developer Portal - API Docs for Bots and Developers
Bot の実行
以下の手順で Bot の実行ができます. 1. 作成した Bot のトークンをコピー 2. Repl.it の環境変数 “TOKEN” に,1のトークンを設定 3. エディタ上の「Run」ボタンを押す
詳細はこの記事の「Botを作成する」の項で分かりやすく説明されているので,こちらを参照ください.
【Discord.js v12】repl.itとuptimerobotで24時間起動Discord 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 を動かす方法でした.