おはようございます、私です。
今回はタイトルの通りDiscord.jsで外部ファイルでコマンドを実行する方法を解説していいます。
作ろうと思ったわけ
前に紹介した沢城さんの記事があったじゃないですか。
あれ実は一つのファイルに全部書いていたせいでかなり重いしメンテナンスが楽じゃないしエラー吐いたら機能全部再起動されるし…etc
とデメリットのほうが多い気がしたので
「面倒くさいなら分ければいいじゃない」
というマリーアントワネットも驚きの発想で作りたいと思いました。
メリット・デメリット
外部ファイルに分けるメリットとデメリットについて説明します。
メリット
- メンテナンスが楽
- 機能ごとに分かれているのでいちいちコードの山から特定の機能を探さなくて済む
- リロードコマンドを作ることによりいちいちBotを再起動しなくても済む
デメリット
- 404 Not Found (デメリットが見つかりませんでした。)
とまあこんな感じにメリットのほうが多いです(個人の感想です、参考程度でお願いします。)。
それでは作っていきましょう
必要なもの
- Node.js環境
- Discord Botのある程度の知識
- 実行したいコマンド
- 根気やる気
また、今回は一つの例であり、他にもたくさんの方法があるので合わない場合は別も探すことをおすすめします
main(index).jsとcommand.js
最初に作るコードは main.jsとcommand.js
Main.jsとは?
main.jsに書くコード
- Token
- メッセージが送信されたときの移動先の指定
いわばBotの心臓部分です。
Command.jsとは?
送信されたメッセージが〇〇なら~などを書く部分です。
いわばBotの脳です。
コード
前置きが長くなりすぎました。コードを書いていきましょう
Main.js
const discord = require("discord.js");
const client = new discord.Client();
const prefix = "%%";
const fs = require("fs");
let command_int = 0
for (const file of commandFiles) {
command_int++;
const command = require(`./command/${file}`);
console.log(`${file} がロードされました。`)
client.commands.set(command.name, command);
}
console.log(`合計${command_int}個がロードされました。`)
client.on("message", async message => {
if (message.content.indexOf(prefix) !== 0) return;
const args = message.content
.slice(prefix.length)
.trim()
.split(/ +/g);
const command = args.shift().toLowerCase(); //引数
//↓command.jsの指定 'command'については以下に詳しく
client.commands.get('command').execute(client,command,args,message);
})
mainはたったこれだけです。簡単でしょう?
ちょっとだけ解説します
//コマンドのファイル数を計測
let command_int = 0
//コマンドファイルを読み込み
for (const file of commandFiles) {
command_int++;
//commandフォルダに入っているコマンドを読み込み
const command = require(`./command/${file}`);
console.log(`${file} がロードされました。`)
//commandファイル内にあるname:でコマンドを読み込み
client.commands.set(command.name, command);
}
console.log(`合計${command_int}個がロードされました。`)
わかりにくいかもしれませんので簡単に解説:
commandとついた名前のフォルダからjsファイルをすべて読み込み
client.commands.setでjsファイルを挿入(ここで読み込み完了)
Command.js
const Discord = require("discord.js");
const fs = require("fs");
const client = new Discord.Client();
module.exports = {
name:"command",
description: 'メイン',
async execute(client,command,args,message){
if (command == "test"){
message.channel.send('ここで処理を書いたよ')
}
if (command == "test2"){
client.commands.set('test2').execute(client,command,args,message)
}
}
}
たったこれだけです。簡単でしょう?
解説:
module.exports = { の下のname:””ではファイルを指定するときに使用する文字を挿入します。
例:
module.exports = {
name:”test2″,
}
client.commands.set(‘test2’).execute(以下略
test2はそれぞれ一致させましょう
test2.js
これが最後です。
const Discord = require("discord.js");
const fs = require("fs");
const client = new Discord.Client();
module.exports = {
name:"test2",
description: 'test2',
async execute(client,command,args,message){
message.channels.send('外部ファイルで処理をしたよ')
}
}
これだけです。ね?かんt(略
実行してみよう
それでは実行してみましょう
構成:
main.jsを任意のフォルダに入れた後、
commandフォルダを作成し、commands.jsとtest2.jsを入れてください
入れ終わったら
node main.js
を実行します。
%test
%test2
が実行されたら成功です。
終わりに
いかがだったでしょうか
私のメイド(Bot)も同じように書いているので成功するはずです。
自分でどんどん拡張することができるのでとてもおすすめです
Botを止めずにreloadしたりコマンド制限を書けたり…etc
それではこのへんで
さらだばー
node main.jsを実行しようとしたら、
node:internal/modules/cjs/loader:1078
throw err;
^
Error: Cannot find module ‘C:\Users\asaka\Downloads\BOT No.001\main.js’
[90m at Module._resolveFilename (node:internal/modules/cjs/loader:1075:15)[39m
[90m at Module._load (node:internal/modules/cjs/loader:920:27)[39m
[90m at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)[39m
[90m at node:internal/main/run_main_module:23:47[39m {
code: [32m’MODULE_NOT_FOUND'[39m,
requireStack: []
}
Node.js v18.14.2
このようなエラーが出ました。どうすればよいでしょうか?
ブログをお読みいただきありがとうございます。
そちらのエラーは、まずmain.jsというファイルが見つからないというエラーです。
nodeコマンドを実行しているディレクトリにmain.jsというプログラムファイルが存在するか確認をしてみてください。
前から知りたかったので、書いてくださりありがとうございます!
初星さんDiscordのBot作ってたのか!?
この記事の存在意義を見いだせたのでこちらこそありがとうございます!