はじめに
DiscordBotを作った
discord.jsがv13にアップデートされて日本語文献が大幅に減少し、初学者的にはむちゃくちゃ沼ったのでメモ
TypeScriptを採用した(生まれて初めてみた親の顔がTypeScriptなので使ってる)辛さも含まれてる
ボタンとか実装できるようになったのは嬉しい
※イベントで使う用のbotで作成期間が徹夜前提でタイムリミットが8時間とかしかなかったのもあり、とりあえず動けば良い時用の知識になってるので、他の良い記述方法あったら教えてください
目次
#1. 環境構築
雑にTypeScriptの環境構築
npm install discord.js
npm install dotenv
npm install typescript --save-dev
npm install --save-dev eslint
npx tsc --init
前回作った(半年前)のBotのコードをコピペしたらエラーの嵐
特に、Node.jsのバージョンが低いことに起因するエラーで30分くらい悩んだ
Node.js 16.6.0が必要だと公式ドキュメントに書いてあるのでちゃんと読むべき…
動いた環境
node -v
v16.13.0
npm -v
7.24.0
.gitignoreを先に書く癖をつける
.envファイルやnode_modulesをGitHubに公開するをやらかす
node_modules/
/.env
/src/.js
#2. dotenvのインポート
Before
import dotenv from "dotenv";
dotenv.config();
動かなかったので
After
import * as dotenv from "dotenv";
dotenv.config();
追記
起動時オプションでも設定できるし、以下の記述でも動くらしいです。
import { config } from 'dotenv';
config();
#3. clientの記述
const client = new Client({
intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES],
});
discord.js v12と書き方が大幅変わってた
メッセージを送るためにはIntents.FLAGS.GUILD_MESSAGESが必要
#4. 指定のチャンネルにメッセージを送信する
本題
初学者が理解しやすい記事はオウム返しが主流で、他のチャンネルに送信する文献が少なかった
const postchannel = client.channels.cache.get(channel_id);
postchannel.send("");
でいけるとdiscord.jsのDiscordコミュニティでは言われていたが、そもそもclient.channels.cache.get(channel_id)以下にsendが生えてなさそうなので困った
1時間強くらいネットの海を彷徨った結果、stackoverflowで解決策を見つけることができた
import { TextChannel } from "discord.js";
const postchannel = client.channels.cache.get(channel_id) as TextChannel;
postchannel.send({ embeds: [goalEmbed] });
#5. 参考文献