client.on(String, function)
ドキュメントのEvent項目を見る限り、"command_error"というイベントは存在しないですね。
私はDiscord.js自体は利用していなくてドキュメントを見ただけの推測ですが、
onメソッド使っている所からNode.jsに提供されているEvents、またはEventEmitterを利用しながら
Discord.jsの開発者陣が用意したEvent処理の仕組みですね。
(イベント定義して待つ仕組みを作る場合、開発者がこの流れに乗っからない理由はない)
なので、都合よく開発者陣が"command_error"なるイベントを作っているなら使えますが……
まぁ無いですね。
そもそも「コマンド」だなんて概念はDiscord.jsにはありません。
BOTを作っている質問者さんが「受け取ったメッセージを解析して、自作のルールに一致する文字列をコマンド扱いにしよう!」と言ってるだけの話ですからね。
仮に同名のイベントが存在していたとして、質問者さんの意図通りの動きをするとは思えません。
さて、上記を踏まえつつどうすれば良いか?
質問者さんがコマンドと呼んでいるものは、
全てmessage
イベントで受け取っているはずです。
DiscodeというSNSに接続するNode.jsのクライアントは、
参加者の発言を受け取ったら兎に角messageイベントを叩いて、client.on("message")
で受けるような実装になっているはずですからね。
js
1client.on("message", async message => {
2 // メッセージを解析してpingという文字列を抜き出してコマンドが存在したと言っている
3 if (message.content.startsWith(`${prefix}ping`)) {
4message.channel.send(‘ping’)
5 }}
6);
この中でコマンドが存在するか否かを判別するしかありません。
私だったらこんな感じの実装するという体で進めてみましょうか。
js
1// キー名: 関数という形式でコマンド一覧を定義
2const commands = {
3 ping: message => {
4 // pingにはpongで返すのがお約束なのでこちらに変更
5 message.channel.send("pong");
6 },
7 // 配列一覧を展開して返すだけのしょぼいコマンド付け足してみた
8 show: (message, args) => {
9 message.channel.send(JSON.stringify(args));
10 }
11};
12
13client.on("message", async message => {
14 if (!message.content.startsWith(prefix)) return;
15 const [command, ...args] = message.content.replace(prefix, "").split(" ");
16
17 // 上記のcommandsで定義されているキーで無ければ
18 // コマンドが存在しないものとして処理
19 if (commands[command] == null) {
20 // 質問文冒頭のエラー処理部分をコピペしてきた
21 message.channel.send({
22 embed: {
23 color: "0x0fc0303",
24 description: 'コマンドが存在しません'
25 }
26 });
27 return;
28 }
29
30 commands[command](message, args);
31});
この流れは半角スペースを引数の区切りとして使いたくない場合に禍根になるので
やりたい内容からするとノイズになるから今回の回答からは省いているけど、工夫の余地はあるね。
val == null
はnullやundefined値を見分ける時によく使うイディオム
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/28 11:46 編集
2021/11/28 11:51 編集
2021/11/28 13:44
2021/11/28 14:03