紹介

[Discord.js V13] ReplitでDiscordのBotを作る【本気で作りたい人向け】

このページのコードはDiscord.js V13用です。

最新版のV14では動きません。

こんにちは。鮎月です。

ReplitでDiscord.js v13のBotを作る方法をサクッと紹介します。

また、ここではコマンドのファイル分けなど、普通ではあまり見かけないようなことも扱います。

必ずドキュメントや公式ガイドをお供にお読みください。

なお、この記事では「スラッシュコマンド」を使用します。嫌な方は別の方の記事を参考にしてください。

この記事では、700サーバー以上に導入されているBot「唯香 -ゆいか-」の開発者である私が開発中に思った後悔などを活かした事も書いてあります。

なので初心者向け…とは言いにくいものになります。

しかしながら、Node.jsやJavaScriptを勉強した方は(コードの汚さ以外は)飲み込めると思いますので、頑張ってください!

一応テンプレ(このページの最後にリンクを貼っておきます)のフォークでも動くはずです…。

アカウント作成

この記事を参考に、アカウントの作成を済ませてください。

環境構築

先ほどの記事を参考にReplの作成を済ませたら、必要なパッケージのインストールを行います。 必要なのはこの5つ。

  1. discord.js
  2. @discordjs/builders
  3. @discordjs/rest
  4. discord-api-types
  5. express

5番目はUptimeRobot用です。

このように検索窓に入れてインストール出来ます。

 

「(パッケージ名) was successfully installed to package.json」が表示されれば成功です。

コードを書いていく

index.js

情報量が前回よりやや多いぞ。覚悟!(!?)

Discordのログイントークンをこのファイルに書いてはいけません。

Replitの仕様上、誰でも見れてしまうのでセキュリティなんて概念がないからです。

APIキーなども同様です。

なので、Tokenなどの大切な情報はReplitの環境変数として設定します。
(.envファイルは非推奨になりました)

環境変数

左側メニューの「Secrets」より、keyに DISCORD_TOKEN 、value にトークンを入力します。

トークンの取得方法は知っての通りですね。

Discord Developer Portalから行います。

終わったらAdd new secretをクリック。これでOKです。

config.js

設定系ファイルです。

適宜追加したり変えたりしてください。

コマンドハンドリング

今回は、コマンドのコードファイルを分けていきます。

この方がメンテナンスしやすいのは火を見るよりも明らかですよね。

Add folderより commandsという名前のフォルダを作ります。

なんと今回はその中でのフォルダ分けも行います。

generalというフォルダを中に作り、そこにAdd file より ping.js ファイルを作ります。

最終的にこんな感じ。

ping.js はこのように書いてください。

詳しく知りたい方はこちらでどうぞ。

イベントハンドリング

イベントハンドリングも行いますよ。

ちなみにここではジャンル分けはしません。コマンドほど増えないと思いますし(面倒なだけ

例としてこの3つを作成します。

それぞれこんな感じに書きましょう。

ready.js

guild_create.js

guild_delete.js

execute関数の引数

例を紹介します。

messageCreateイベント

execute(message, client)

messageUpdateイベント

execute(oldMessage, newMessage, client)

これで分かりますよね。

詳しく知りたい方はこちらでどうぞ。

functions.js

関数をまとめて書くファイルです。

add_command.js

スラッシュコマンドを登録するためのファイルです。

起動前にこれを実行しないとコマンドが使えません!

詳しく知りたい方はこちらでどうぞ。

起動&動作確認

スラッシュコマンドの登録

右側のShellタブより、node add_command.js を実行しましょう。

こうなればOKです。

以下のようなエラーが出た場合は、スラッシュコマンドを登録できるサーバーが無いことを示します。

https://discord.com/oauth2/authorize?client_id=Bot_ID&scope=bot+applications.commands という形式でもう一度Botを入れ直しましょう。

/home/runner/djs-v13-template/node_modules/@discordjs/rest/dist/index.js:708
        throw new DiscordAPIError(data, "code" in data ? data.code : data.error, res.status, method, url, requestData);
              ^

DiscordAPIError[50001]: Missing Access

Botを起動

いよいよ起動していきます。

画面上部のRunボタンを押して起動しましょう。

config.js で指定したチャンネルにメッセージが送信されればOKです。

ちゃんとコマンドも使えてますね!

UptimeRobotの設定

このままでも動きますが、Replitでは何もしないと30分でプロセスが終了してしまいますので、UptimeRobotを使いましょう。

アカウント作成をしてない方はサクッと済ませておいてください。

ログインしたら、「Add New Monitor」をクリックします。

それぞれ、次のように設定します。

  • Monitor Type: HTTP(s)
  • Friendly Name: (適当に名前を付けてください)
  • URL: https://[Replの名前].[Repl.itのユーザー名].repl.co
  • Monitoring Interval 5~30の間(20くらいがおすすめ)

URLに関しては、エディター画面右上のこの部分です。

アラート通知先は適当にチェックを入れておきましょう。ここで設定した場所にダウンアラートが届きます。

最終的にはこんな感じ。

おわりに

以上で一通りの解説は終わりです。お疲れ様でした!

ここまでガチで1から解説してるサイトは公式ガイドくらいだと思います(多分)

また、今回のコードはこちらにまとめてあります。

ぜひ、Bot開発頑張ってくださいね!

それでは。

 

ABOUT ME
鮎月 / あゆつき
DiscordのBot作ったり、気まぐれで小説書いたりする人。

POSTED COMMENT

  1. セカンド より:

    URlが出てこないんですけど

    • こんにちは。
      コメントありがとうございます。

      URLが出てこないとの事ですが、具体的にはどのURLでしょうか?
      ReplitでのURL([Replの名前].[Replitのユーザー名].repl.co)でしたら、index.jsファイルにサーバーを開く処理が書かれていないかもしれません。ご確認ください。

      • セカンド より:

        処理は書いてありましたが実行してもURlが出てきていません

        • Botを起動した状態で、 [Replの名前].[Replitのユーザー名].repl.co にブラウザから直接アクセスしても何もありませんか?
          これでも無理なら正直分からないので、Google検索等で対応していただければと思います。

          • セカンド より:

            Repl Unavailable
            This Repl is really popular! Try again soon.
            こんなのが出てきました

          • コメントありがとうございます。
            申し訳ないですが私には分からないので、Google等で検索していただければと思います…。

  2. D より:

    node add_command.js を実行すると、エラーが発生します。
    エラー⇓
    /home/runner/Bot01/node_modules/@discordjs/rest/dist/index.js:827
    throw new Error(“Expected token to be set for this request, but none was present”);
    ^

    Error: Expected token to be set for this request, but none was present

  3. ヨッシー より:

    手順通りやったのにrunを押すとエラーが発生しました。config.jsに書いたidが悪いのでしょうか。