【基本】discord.js v14 でボット作成 #1 ～ボットの作成と初起動～

## 前書き
ぐっどもーにんぐはろーぐっどいぶにんぐ。
どうも、ヒトリユウです。
皆さんはDiscordBot開発、楽しめておりますでしょうか？
私は最近あまりQiitaにも顔を出せていませんでした。
最近、**discord.jsがv13からv14にアップデートされた**ので、今回はdiscord.js v14でボットをイチからココからニニから開発をしていきます。

また、本記事は以下の記事を参考にして作成しています。

https://qiita.com/hitori_yuu/items/02eae8b14dc6a9c91c0d

:::note warn
**注意**
最近キーボードを変えたのでタイプミスが乱発する可能性が高いです。細心の注意を払っていますが、もし誤字脱字等ございましたらコメントしてくださるとうれしいです。
:::

## 開発する環境を整える
今回、ボットを開発するためにあたって、以下の物が必要になっていきます。

* パソコン（スマホでも可能ですが、本記事はパソコンを使用して開発していきます）
* Node.js（最低要件[^1]: `16.9.0`）
* npm（Node.jsをインストールするとついてくるので気にする必要はありません）
* discord.js v14
* コードエディタ OR IDE（総合開発環境）

## 「インストール」と「ダウンロード」
皆さんは普段何気なく **「インストール完了したわ！マジｻｲｺｫｫ！」** や **「ダウンロードミスったってぇぇ！！( ◉◞౪◟◉)」** という言葉を使っていると思います。
実は「インストール」と「ダウンロード」には違いがあります。

**ダウンロード**
ネット上にあるファイルを手元の端末にコピーすること。

**インストール**
アプリなどのソフトウェアをスマホやパソコンの中で使用できる状態にすること。

ですが、いちいち使い分けるのも **面倒くさい** ので、本記事では **「インストール」に統一します。**

## コードエディタとIDE（総合開発環境）
プログラミングを始めるとなった時に、「コードエディタはこれがおすすめなんじゃ」や「IDEしか勝たんって」というのを耳にしたことがあると思います。両方とも、文字を書いて保存する。という点には何ら差異はありません。では、なぜこのように2つの物があるのでしょうか。


**IDE（総合開発環境）**
IDE（総合開発環境　以下「IDE」）は名前に「総合」がついていることから想像できる通り、いろいろなものが一通りそろった状態でインストール、使用することができます。
いろいろな環境でも使用することができることが多く、大抵の事はIDEを使えば完結できることが多いです。
しかし、一通りそろった状態から始まるため、ファイルのサイズが大きかったり、起動するのに時間がかかったりと、低スペックマシンでは
使用するのに不便なことがあります。

**コードエディタ**
コードエディタは最初の状態だと、文字を書いて保存（+α）、というメモ帳の上位互換のような感じです。
しかし、様々なプラグイン等を入れて自分好みの機能にさせ、より便利にカスタマイズすることが可能です。
もともとの状態はIDEよりもサイズが小さく、低スぺックマシンでも快適に動作させることができます。
しかし、プラグインを入れすぎて重くなったという話もあるみたいなので気を付けましょう。

### Node.js のインストール
まず、以下のリンクをクリックし、サイトへ進んでください。

https://nodejs.org/ja/download/

今回、「**discord.js v14**」を使用するにあたって最低でも **「Node.js」のバージョンは16.9.0以上である必要** があります。
そのため、「最新版」をクリックしてダウンロードしてください。
![37ca3e4877bc76f2f3f517569c3ac5dd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/0f6683ab-a6e3-bcb6-2a8a-a494798f3533.png)
今回は「`node-v18.8.0-x64.msi`」をインストールしました。

先ほどインストールしたものを開くと次のようなインストーラーが出てきます。
基本的にインストーラーの指示に従えば良いです。特にいじらず「Next」をクリックしていけばよいと思われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/f36c0b04-c1c6-1475-c393-9d2cca83a468.png)
インストールが完了すれば次の画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/0828c449-63be-2c02-20bf-c7f9f4ed7546.png)
#### インストールできたか確認
**コマンドプロンプト**[^2]を開きます。
コマンドプロンプトの使用方法は次をご覧ください > https://eng-entrance.com/cmd-usage
<details><summary> **コマンドプロンプトの開き方**
</summary>［Windows］＋［R］キーを押し、［名前］入力ボックスに「cmd」と入力し[Enter]または[OK]をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/b0491389-eb98-2348-ad70-4663d4e1bdda.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/f7fb1f5f-50be-f5ab-2f6f-3d7456184ffe.png)

</details>

そしたら黒い画面に以下のコマンドを入力してください。

```shell:cmd
node --version
```

以下のような文が表示されたらインストールは成功です。

```shell:cmd
v18.8.0
```

必要な物という中に「npm」というものが入っていたと思います。
しかしこちらは「Node.js」をインストールした際にセットで入っているため **npm自体はインストールする必要はありません。**

一応npmも入っているのか確認してみましょう、先ほどのコマンドプロンプト（黒い画面）にて、今度は以下のコマンドを入力してください。

```shell:cmd
npm --version
```

そうしたら、次のような文が表示されるはずです。

```shell:cmd
8.15.1
```

これで、必要な物のうち、二つがインストールできました。

- [x]  Node.js
- [x]  npm
- [ ]  discord.js v14
- [ ]  コードエディタ or IDE

### discord.js v14 のインストール
「discord.js v14」のインストールの方法はかなり簡単です。
しかし、**まだインストールはしなくて大丈夫です。** 今は、方法だけを紹介しますが、**実際にインストールするのは後程紹介** いたします。
**開発をしたいフォルダの中で** コマンドプロンプトを開いたら、以下のコマンドを入力します。

```shell:cmd
npm install discord.js
```

## ボットのアカウント作成
以下のリンクをクリックし、DEVELOPER PORTALにアクセスしてください。

https://discord.com/developers/applications

上記のリンクをクリックすると、以下のような画面に移ると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/d573086e-491f-4c5b-f784-e4a65299b9f6.png)

右上の「New Applications」というボタンをクリックし、「NAME」のところに任意の名前を入力してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/8136181c-e951-2eab-97cf-e7b34249ad91.png)

名前を入力（今回は「ｱﾋｬの助侍」）したら、「Create」ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/e402bd56-2a8b-5aae-73dd-57ef83fd72ef.png)

左の「SETTINGS」の列にある「Bot」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/401540d9-696d-2053-6dba-361c70811fcd.png)

右にある「Add Bot」をクリックし、ボットを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/8cd53e4a-3354-f1a7-37a0-38e63ffb9946.png)

作成に成功していれば、以下のような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/7f64357e-3b6c-57a5-f78c-83150b9aae11.png)

### サーバーに招待
今度は「Setting」列から「OAuth2」を選択し、「URL Generator」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/ed640219-b6e0-2fdc-bf38-89437773a4dc.png)

「SCOPES」ボックスの中から「bot」にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/be5a3112-572e-baf6-a75a-3b13cded46cf.png)

すると、下に何やらなにやらレトロ感を感じるラーメン屋のメニューくらいずらっと選択項目があるボックスが出てきました。「ニンニクﾏｼﾏｼｰｯ!!!(‘Д‘ｎ）(‘Д‘ｎ）(‘Д‘ｎ）」
これは招待する際にボットに付与される権限を選択する項目です。ほかの人に宣伝するときなどはここから任意の権限を選択しましょう。
今回は「Administrator（管理者）」のところにチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/33b3291a-51d5-343c-c141-c2f36bfcb070.png)

そしたら「**ふわっふわもちもちプリンが完成！**」なんてことはありませんのでご安心を。
下にURLが生成されました。これをコピーし、開きましょう。
（ちなみに今回管理者の権限を選択したため「`permissions=`」の後の数字が「`8`」になっています。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/e1662e4e-05aa-3685-ec04-89c438ce5f54.png)

そしたら、真ん中の「Select a server」のところをクリックし、ボットを入れたいサーバーを選択し、「Continue」をクリックしてボットを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/0c3aac25-8b40-a06b-59c6-8e22297e759d.png)


### インテンツ(Intents)
そしたら少し下にスクロールし、「Privileged Gateway Intents」の設定に移ります。
「Intents」って何？って思った方はぜひこちらの記事を見てみて下さい。 >>> [猿でもわかる！discord.pyのIntentsについて！](https://zenn.dev/disneyresidents/articles/discordintents)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/38e7514e-16db-47bc-c2bd-335d3eb4807f.png)

「**PRESENCE INTENT**」「**SERVER MEMBERS INTENT**」「**MESSAGE CONTENT INTENT**」の三つにチェックを入れ、下に出てきた「Save Changes」をクリックし変更を保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/83127f97-f571-5b6c-38e8-d8f58cb3c4f8.png)

:::note warn
注意
「MESSAGE CONTENT INTENT」は2022年4月30日まで施行されません。
:::

### トークン(TOKEN)
先ほどの画面から一番上にスライドし、現在のアイコンやボットの名前が表示されている部分に行きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/aa3086f8-2ff8-8a3b-a5e9-ddbbd69bfabf.png)

「TOKEN」と小さく書いてある部分の「Copy」をクリックし、トークンをコピーしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/13fcce8a-e8ed-0160-726f-3bf5d15b41d4.png)

:::note alert
トークンの扱い
**今コピーしたトークンは漏洩しないよう厳重に管理してください。**
::: 

**これでボットのアカウント作成等は完了です。早速開発をしましょう！**

## 早速開発をしていく（コーディング[^3]）
コーディングをする環境には、大きく分けて**二つの方法**があります。

**オンライン上で開発**
GlitchやRepl.itのようにオンライン上で開発し、実行することができるものがあります。

**自分のPCで開発**
その名の通り自分のPC上で開発をし、実行します。（実行の際にはサーバーにファイルを送信して、実行することもあります）

### オンライン上で開発
今回は「Repl.it」で開発していきたいと思います。
以下のURLをクリックすると私が事前に作成しておいたテンプレートに飛びますので、右上にある「Fork Repl」をクリックしてください。

https://replit.com/@HitoriYuu/discordjs-v14-template?v=1

そしたら左のタブの中に鍵のマークがあるのでそれを開き以下の画像のように入力してください。
「value」のボックスの中には先ほどコピーしたボットのトークンを入力してください。

![d6b09dc0e30a31bb290a9fac1782cf77.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/aa8310f9-a617-cd77-aa41-8216b9ce5659.png)

そして、一番上の真ん中にある「Run」というボタンをクリックするとあなたのボットが **♰闇の活動を開始♰** すると思います。
後はいろいろ調べてコードを改造してみてくださいね(o^―^o)ﾆｺ

### 自分のPCで開発
先ほども書きましたが、編集主はWindows10を使用しているため、紹介するのもWindows10を使用している方向けになっています。予めご了承ください。
また、コードエディタまたはIDE(総合開発環境)は開発の際にほぼ必須となってくるので、必ず使えるようにしておきましょう。
今回は「 **Visual Studio Code** 」というコードエディタのインストール方法を紹介します。

#### Visual Studio Code のインストール
下記のサイトにアクセスします。

https://azure.microsoft.com/ja-jp/products/visual-studio-code/

トップにある「今すぐダウンロード」をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/f51850e0-cf31-b379-743e-98efd7e04062.png)

そしたら、自分のプラットフォームにあったものをクリックしインストールしてください。
今回は「`VSCodeUserSetup-x64-1.71.2.exe`」をインストールしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/a9282f7e-2e33-7703-fb68-9bf5446cfa9f.png)

使用許諾契約書に同意したら、後はインストーラーの指示に従うだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/7afcbd30-747d-23ef-3053-0da2483d0e8b.png)

**これでVisual Studio Codeのインストールは完了しました。**
開発に戻ります。

一応Cドライブ直下ではないデスクトップなど、別でもどこのフォルダでも構いませんがいつでもアクセスできやすい場所に任意の📁フォルダーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/2b6670b6-0ee0-184a-d3cd-f2c0f65dc889.png)
そしたらそのフォルダでコマンドプロンプトを開きます。
開き方はファイルのパスの部分に「`cmd`」と入力すればおｋです。
![cmdの開き方.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/9fcb63fa-d400-ebd5-0055-603ab3810be8.png)
そしたら以下のように黒い画面が出てくるので、「npm init」と入力します。

```shell:cmd
npm init
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/e2eb843c-0263-262f-5cdf-7520d17659cc.png)
色々出てきますが、最初の「package name」以外は基本的に「Enter」を押し続けるでおｋだと思われます。
「package name」はテキトーな名前を付けておいてください。今回は「`test`」にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/b2276068-525e-f919-aeb6-93117ac1f751.png)
そしたら今度は「`npm install discord.js`」と入力します。

```shell:cmd
npm install discord.js
npm install dotenv
```

以下の画面になればdiscord.jsのインストールは成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/72cdd2b0-b2a4-cfd9-8717-34021411ed74.png)

そしたら今度は以下のコマンドを打ちます。
```shell:cmd
npm install dotenv
```

そしたら、作成したフォルダ内で右クリック（なんかポップアップが出てくる方）し、「Code で開く」をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/73643f4f-100b-8e20-aa76-ae3d0522b819.png)

すると、以下のような画面になります（背景や一番左のタブの内容は違う可能性があります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/6e035e9e-da66-f37e-a602-54cb7719bf00.png)

いろいろなファイルがあるところの上にある4つのボタンの中から
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/76f15010-a43d-e16c-71d3-0c9343bc2b28.png)

このボタンをクリックすると新しいファイルを作成することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/78c7227c-718e-937a-cf93-fe97320091f8.png)

そしたらファイル名を「`index.js`」にします（任意のものでおｋなはず...　一応`index.js`にした方が良いと思われます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940116/57e27e1d-5978-513d-310a-ac1a5359f4d1.png)

作成し終えたらそのファイルを開き、以下の様なコードを書きます。

```javascript:index.js
const { Client, GatewayIntentBits, Partials } = require('discord.js'); //discord.js から読み込む

const client = new Client({
	intents: [
		GatewayIntentBits.Guilds,
		GatewayIntentBits.GuildMembers,
		GatewayIntentBits.GuildBans,
		GatewayIntentBits.GuildEmojisAndStickers,
		GatewayIntentBits.GuildIntegrations,
		GatewayIntentBits.GuildWebhooks,
		GatewayIntentBits.GuildInvites,
		GatewayIntentBits.GuildVoiceStates,
		GatewayIntentBits.GuildPresences,
		GatewayIntentBits.GuildMessages,
		GatewayIntentBits.GuildMessageReactions,
		GatewayIntentBits.GuildMessageTyping,
		GatewayIntentBits.DirectMessages,
		GatewayIntentBits.DirectMessageReactions,
		GatewayIntentBits.DirectMessageTyping,
		GatewayIntentBits.MessageContent,
		GatewayIntentBits.GuildScheduledEvents,
	],
	partials: [
		Partials.User,
		Partials.Channel,
		Partials.GuildMember,
		Partials.Message,
		Partials.Reaction,
		Partials.GuildScheduledEvent,
		Partials.ThreadMember,
	],
}); //clientインスタンスを作成する

client.once('ready', () => { //ここにボットが起動した際のコードを書く(一度のみ実行)
	console.log('起動完了'); //黒い画面(コンソール)に「起動完了」と表示させる
});

client.login('トークン'); //ログインする
```

`intents:`と`partials:` には任意のインテンツを入れます。
下記のものを丸パクリしてもらったほうが早いと思います。

```js:インテンツの指定例
const client = new Client({
	intents: [
		GatewayIntentBits.Guilds,
		GatewayIntentBits.GuildMembers,
		GatewayIntentBits.GuildBans,
		GatewayIntentBits.GuildEmojisAndStickers,
		GatewayIntentBits.GuildIntegrations,
		GatewayIntentBits.GuildWebhooks,
		GatewayIntentBits.GuildInvites,
		GatewayIntentBits.GuildVoiceStates,
		GatewayIntentBits.GuildPresences,
		GatewayIntentBits.GuildMessages,
		GatewayIntentBits.GuildMessageReactions,
		GatewayIntentBits.GuildMessageTyping,
		GatewayIntentBits.DirectMessages,
		GatewayIntentBits.DirectMessageReactions,
		GatewayIntentBits.DirectMessageTyping,
		GatewayIntentBits.MessageContent,
		GatewayIntentBits.GuildScheduledEvents,
	],
	partials: [
		Partials.User,
		Partials.Channel,
		Partials.GuildMember,
		Partials.Message,
		Partials.Reaction,
		Partials.GuildScheduledEvent,
		Partials.ThreadMember,
	],
});
```

インテンツに関して**超絶スーパーエキゾチックハイパー理解しやすい**記事があったので載せておきます。

https://zenn.dev/disneyresidents/articles/discordintents

`トークン` には先ほどコピーしたトークンを貼り付けます。

そしたらまた先程の要領でコマンドプロンプトを開きます。
今度は以下のコマンドを打ちます。

```console:cmd
node index.js
```

:::note notice
`package.json` 内に `main:index.js` と書いてあれば `node .`で実行可能です。
:::

Discordでボットがオンラインになり、黒い画面に「起動完了」と表示されれば成功です。

## 参考文献
https://scalapedia.com/articles/57/%E3%80%902020%E3%80%91IDE%E3%81%A8%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF%EF%BC%9FVSCode%E3%82%92%E4%BD%BF%E3%81%86%E3%81%B9%E3%81%8D%EF%BC%9F

[^1]: 最低でも必要な条件の事。今回は「バージョン16.6.0以上必須」
[^2]: コマンドプロンプトは「cmd」と呼ばれることも多いです。
[^3]: プログラミング言語を使ってプログラミングコードを記述していく作業のこと