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 4

【4日目】discord.jsで地震情報を出すコマンドを作ろう

Posted at

はじめに

こんにちは、なりかくんと申します。
今回は、discord.jsで地震情報を出すコマンドを作ろうと思います。

地震情報の取得元

今回使う地震情報の取得元は私(なりかくん)が公開している地震情報APIを利用します。
地震情報APIの仕様は以下に記載されていますので省略します。

今回使うモジュール: request

今回は、以前紹介したdiscord.jsと情報を取得する際に利用するrequestモジュールを利用します。
requestモジュールのインストールは、以下のコマンドでインストールできます。

npm install request

普通にrequestを書くとネストが深くなってしまうのでPromiseを使ってシンプルにします。
以下が地震情報APIからJSONデータを取得するコードです。

function getEarthquake() {
    return new Promise((resolve, reject) => {
        request({
            url: "https://dev.narikakun.net/webapi/earthquake/post_data.json",
            json: true
        }, function (error, response, body) {
            if (error) {
                reject(error);
            } else {
                resolve(body);
            }
        });
    });
}

データを表示する

では、データを表示するプログラムを作ってみましょう。APIのドキュメントをよく読み、コードを作っていきます。
今回私は、以下のようなコードになりました。

let getData = await getEarthquake();
let lines = [`> **${getData.Control.Title}**`];
if (getData.Control.Title == "震源・震度に関する情報" || getData.Control.Title == "震源に関する情報") {
    lines.push(`**発生時間**: ${getData.Body.Earthquake.OriginTime}`);
    lines.push(`**震源地名**: ${getData.Body.Earthquake.Hypocenter.Name}`);
    lines.push(`**深さ**: ${getData.Body.Earthquake.Hypocenter.Depth}km`);
    lines.push(`**規模**: M${getData.Body.Earthquake.Magnitude}`);			
}
if (getData.Control.Title == "震源・震度に関する情報" || getData.Control.Title == "震度速報") {
    lines.push(`**最大深度**: ${getData.Body.Intensity.Observation.MaxInt}`);
    let intensity = [];
    for (const prefObj of getData.Body.Intensity.Observation.Pref) {
        for (const areaObj of prefObj.Area) {
            intensity.push(`${areaObj.Name} [${areaObj.MaxInt}]`);
        }
    }
    lines.push(`\`\`\`\n${intensity}\n\`\`\``);
}
await interaction.reply(lines.join("\n"));

実行してみるとこのようになります。タイトルと地震の情報等をシンプルにマークダウン形式で表示する形になります。
image.png

コマンドファイルの全体

では、今回作成したコードのコマンドファイルの全体を公開します。

earthquake.js
const { SlashCommandBuilder } = require('discord.js');
const request = require("request");

module.exports = {
	data: new SlashCommandBuilder()
		.setName('earthquake')
		.setDescription('地震情報を取得'),
	async execute(interaction) {
		let getData = await getEarthquake();
		let lines = [`> **${getData.Control.Title}**`];
		if (getData.Control.Title == "震源・震度に関する情報" || getData.Control.Title == "震源に関する情報") {
			lines.push(`**発生時間**: ${getData.Body.Earthquake.OriginTime}`);
			lines.push(`**震源地名**: ${getData.Body.Earthquake.Hypocenter.Name}`);
			lines.push(`**深さ**: ${getData.Body.Earthquake.Hypocenter.Depth}km`);
			lines.push(`**規模**: M${getData.Body.Earthquake.Magnitude}`);			
		}
		if (getData.Control.Title == "震源・震度に関する情報" || getData.Control.Title == "震度速報") {
			lines.push(`**最大深度**: ${getData.Body.Intensity.Observation.MaxInt}`);
			let intensity = [];
			for (const prefObj of getData.Body.Intensity.Observation.Pref) {
				for (const areaObj of prefObj.Area) {
					intensity.push(`${areaObj.Name} [${areaObj.MaxInt}]`);
				}
			}
			lines.push(`\`\`\`\n${intensity}\n\`\`\``);
		}
		lines.push(getData.Head.Headline);
		await interaction.reply(lines.join("\n"));
		function getEarthquake() {
			return new Promise((resolve, reject) => {
				request({
					url: "https://dev.narikakun.net/webapi/earthquake/post_data.json",
					json: true
				}, function (error, response, body) {
					if (error) {
						reject(error);
					} else {
						resolve(body);
					}
				});
			});
		}
	},
};

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

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?