0コメント

【discord Bot】javaScriptでコマンドに受け答えするbotを作ろう。#1「導入編」

おはようございます。
今回は、ある目的が出来たのでbotを作ってみようかなと思いつき、それをまとめた記事。


※行き当たりばったりで検証していたので、・前提知識 のサイトでbot製作を進めていて同じ現象になった場合は ・まとめ に記述していることを実践してください。ほとんどは不要な作業です。

※環境はLinux Ubuntu 20.04LTSです。

成り行き

Minecraftサーバーを開発しているのだが、bashからdiscordのチャンネルにメッセージを送信するということがcurlで出来る。
しかし、物足りない・・・

やっぱりユーザーが何かしらコマンドを実行し、それに受け答えして情報を提供するというシステム、ちょっと憧れるじゃん?(?)

という訳で、なんとなくbotを作るためになんとなくjavaScriptに触れる(もちろん初めて)ということになる。

まあこの記事では導入にてこずりすぎて、応答する部分などに一切触れないのだが。

前提知識

よく目に入ったNode.jsについてからまず調べてみた。
Node.js はV8 JavaScriptエンジン上に構築されたJavaScript実行環境の1つである。イベント化された入出力を扱うサーバサイドJavaScript環境であり、Webサーバなどのスケーラブルなネットワークプログラムの記述を意図している。
とのこと。wikipediaによると。

ピンと来ないが、なんかネットワーク関連のプログラムとして向いてる・・・のかな。多分そう。
botの作り方についてはこのサイトを参考に進める。

早速行き詰る。

discordのbot事態を作成することは、前にもやったことがあったので出来た。トークンとcliant ID取得も出来た。
しかし、botをログイン状態にするところでいきなり詰まった。

スクリーンショット 2021-09-14 000414.png
この通り。「ENOENT: no such file or directory, open '....package.json'」

package.jsonが無いとWARN出してるらしい。

という訳で、このサイトを参照しnpm init --yesでpackage.jsonを生成。

しかし、その後unsupported engine for discord.js@13.1.0とある。

見るからに、多分バージョンが古いって指摘されている。

sudo apt install npm   nodejsでインストールしたが、これはミスだったか・・・?

行き詰った「バージョンが古すぎる問題」

このサイトを参考にし、npmの最新版を・・・

「Error: EACCES: permission denied, access '/usr/local/lib'」

どういうこった。

この方法を試してみる。

対策2を試したら、npm install -g npm-check-updatesを実行してもWARNが出たけどERRは出らずおそらく成功した。
でもdiscord.jsは相も変わらずバージョンが非対応とインストールできない。ちなみにnpm-check-updatesのncuコマンドを使ったがlatest表記。

もしかしてNode.js自体がそもそも古い説?

調べてみると、Node.js 16.9.1がリリースされてるのに、apt installで入ったNode.jsは10.19.0。
マジかよ。apt installだとダメらしい。

スクリーンショット 2021-09-14 001941.png

という訳でこのサイトの手順を踏んでインストールしてみる。

スクリーンショット 2021-09-14 002243.png

バージョン上がった。
でもサポートバージョンに到達してない気が・・・

物は試し

通った。

しかし別のエラーが発生。

「TypeError [CLIENT_MISSING_INTENTS]: Valid intents must be provided for the Client.」

やっぱNode.jsのバージョン最新にしたい。一応。

別の方法も探してみる。

curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh
を実行することで希望バージョンのNode.jsをインストールできるらしい。
今回は16.x.xがリリースされているのでsetup_16.xに書き換えて実行してみる。

スクリーンショット 2021-09-14 003158.png
ようやく最新版になった!!

最初からこの方法でやればよかったわけだ・・・

ここでnpm install discord.js --saveを実行するとWARNが出なかった。

そんでbot.jsを実行・・・

さっきと同じエラーになった。
これは・・・・・・

ここに書いてあったのが
const { Client, Intents } = require('discord.js');const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES] });
を使え、とのこと。
意味はもうまっっっっっったく分からん。でも大体今回のメインの流れのhttps://liginc.co.jp/370260 にかいてる
// discord.js モジュールのインポート
const Discord = require('discord.js');
// Discord Clientのインスタンス作成
const client = new Discord.Client();
の事だろう。置き換えてみる。

UnhandledPromiseRejectionWarning: ReferenceError: AbortController is not defined

と出た。is not definedって文は、Pythonでどんだけ凡ミスで出しまくった事か。「AbortControllerが定義されていない」という意味だろう。変数宣言する前に参照しようとしたりするとこうなったりする。

で、出てきたサイトがこれ
スクリーンショット 2021-09-14 004054.png
※google翻訳利用
Node.jsはv16.9.1を使ってるんだが・・・
過去のバージョンで実行しようとしている説・・・?そんなこと無いと思うが・・・

と思ったが、やはりnodebrewとか入れない限りは重複することはおそらくなさそうだ。この線は無し。

少し古いバージョンのdiscord.jsを入れてみることにする。複数サイトでこれも解決案に出ていたので。

discord.jsは13.1.0が入っていたのでとりあえずv12を試す。
このサイトを参考にダウングレード。
スクリーンショット 2021-09-14 005020.png

もっかい実行。

スクリーンショット 2021-09-14 005126.png

スクリーンショット 2021-09-14 005142.png

遂に来た!!!!!!!!!!!!!

無事オンライン状態にする事が出来ました。

追記:
スクリーンショット 2021-09-14 005426.png
このbot制作の参考にした最初のサイトのコードでも問題なくオンラインに出来ました。

まとめ

これを踏まえて
curl -sL https://deb.nodesource.com/setup_16.x -o nodesource_setup.sh
でNode.jsの最新版をインストールし、
〇npm i discord.js → npm i discord.js@12
でdiscord.jsはv12をインストール

することでこの問題は解決される、ようだ。

v13が何故動かないのかとかは、ド素人の私には全く分からなかったので、現状はこういう対処が必要だがv14とかこれからリリースされるバージョンでは問題なく動くようになることを願おう・・・


こんなこと書いてたら、明日も大学なのに午前一時になってしまった。

もしかしたらこの記事は参考になるかもしれないので。是非活用してもらえれば。。
0

この記事へのコメント