0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【目指せ完走賞】なりかくんのDiscordAdvent Calendar 2022

Day 8

【8日目】discord.jsでマイクラサーバーのステータスを表示する

Posted at

はじめに

こんにちは、なりかくんと申します。
今回は、マイクラサーバーのステータスを取得して表示する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))

コード全体

これらを踏まえて今回作ったコードは、以下のようなコードです。
サーバーがオンラインであれば、オンラインであり人数を表示してオフラインであればオフラインと出力するプログラムです。

mcserver.js
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を活用しているので非常にシンプルなコードで作ることが出来ます。このコードを実際に動かしてみると、オンラインの場合はしっかり人数が表示され、オフラインの場合はオフラインと表示されるように出来ました。
image.png

以上です、最後までお読みいただきありがとうございました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?