はじめに
こんにちは、なりかくんと申します。
今回は、マイクラサーバーのステータスを取得して表示するDiscord Botをdiscord.jsで作ろうと思います。
ステータスの取得方法
まず最初にマイクラサーバーのステータスを取得する方法です。取得するには、APIを使うことが一番簡単です。
Minecraft Server Status APIというのを有志の方が作成されており、これを使うと非常に簡単に取得が出来ます。
リクエストURLは、以下のようになります。
エディション | URL |
---|---|
Java版 | https://api.mcsrvstat.us/2/ |
統合版 | https://api.mcsrvstat.us/bedrock/2/ |
これらを踏まえて、Java版で取得する関数を作るとこのようなコードになりました。
function getServerStatus(ipAddress) {
return new Promise((resolve, reject) => {
request({
url: "https://api.mcsrvstat.us/2/"+encodeURIComponent(ipAddress),
json: true
}, function (error, response, body) {
if (error) {
reject(error);
} else {
resolve(body);
}
});
});
}
スラッシュコマンドでオプションをつける
では、今回からスラッシュコマンドでオプションを扱っていこうと思います。SlashCommandBuilder
で以下のようにすれば文字列を入力させることが出来ます。非常に簡単でオプションは増やすことが出来るので出来ることは非常に増えます。
new SlashCommandBuilder()
.setName('mcserver')
.setDescription('マイクラサーバーの状態を表示します')
.addStringOption(option =>
option.setName('ip')
.setDescription('サーバーアドレスを指定')
.setRequired(true))
コード全体
これらを踏まえて今回作ったコードは、以下のようなコードです。
サーバーがオンラインであれば、オンラインであり人数を表示してオフラインであればオフラインと出力するプログラムです。
const { SlashCommandBuilder } = require('discord.js');
const request = require("request");
module.exports = {
data: new SlashCommandBuilder()
.setName('mcserver')
.setDescription('マイクラサーバーの状態を表示します')
.addStringOption(option =>
option.setName('ip')
.setDescription('サーバーアドレスを指定')
.setRequired(true)),
async execute(interaction) {
let getResult = await getServerStatus(interaction.options.getString("ip"));
if (getResult.online) {
await interaction.reply({ content: `このサーバーはオンラインで、${getResult.players.online}人がオンラインです。` });
} else {
await interaction.reply({ content: "このサーバーはオフラインです。" });
}
function getServerStatus(ipAddress) {
return new Promise((resolve, reject) => {
request({
url: "https://api.mcsrvstat.us/2/"+encodeURIComponent(ipAddress),
json: true
}, function (error, response, body) {
if (error) {
reject(error);
} else {
resolve(body);
}
});
});
}
},
};
まあ、APIを活用しているので非常にシンプルなコードで作ることが出来ます。このコードを実際に動かしてみると、オンラインの場合はしっかり人数が表示され、オフラインの場合はオフラインと表示されるように出来ました。
以上です、最後までお読みいただきありがとうございました。