おはようございます。
今回は、ある目的が出来たので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をログイン状態にするところでいきなり詰まった。
この通り。「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だとダメらしい。
という訳でこのサイトの手順を踏んでインストールしてみる。
バージョン上がった。
でもサポートバージョンに到達してない気が・・・
物は試し
通った。
しかし別のエラーが発生。
「TypeError [CLIENT_MISSING_INTENTS]: Valid intents must be provided for the Client.」
やっぱNode.jsのバージョン最新にしたい。一応。
別の方法も探してみる。
を実行することで希望バージョンのNode.jsをインストールできるらしい。
今回は16.x.xがリリースされているのでsetup_16.xに書き換えて実行してみる。
ようやく最新版になった!!
最初からこの方法でやればよかったわけだ・・・
ここで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が定義されていない」という意味だろう。変数宣言する前に参照しようとしたりするとこうなったりする。
で、出てきたサイトがこれ
※google翻訳利用
Node.jsはv16.9.1を使ってるんだが・・・
過去のバージョンで実行しようとしている説・・・?そんなこと無いと思うが・・・
と思ったが、やはりnodebrewとか入れない限りは重複することはおそらくなさそうだ。この線は無し。
少し古いバージョンのdiscord.jsを入れてみることにする。複数サイトでこれも解決案に出ていたので。
discord.jsは13.1.0が入っていたのでとりあえずv12を試す。
このサイトを参考にダウングレード。
もっかい実行。
遂に来た!!!!!!!!!!!!!
無事オンライン状態にする事が出来ました。
追記:
この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とかこれからリリースされるバージョンでは問題なく動くようになることを願おう・・・
こんなこと書いてたら、明日も大学なのに午前一時になってしまった。
もしかしたらこの記事は参考になるかもしれないので。是非活用してもらえれば。。
この記事へのコメント