0
1

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 17

【17日目】discord.jsでモーダルウィンドウを使って年齢確認をする

Last updated at Posted at 2022-12-17

はじめに

こんにちは、なりかくんです。
今回は、discord.jsでモーダルウィンドウを使って年齢確認を実装してみようと思います。まず、年齢確認を作る目的ですがR18サーバーの場合にチャンネルに年齢制限はかけられますがサーバー自体にかけることはできません。ですので、モーダルウィンドウで入力させて自作します。

モーダルウィンドウについて

モーダルウィンドウについては、16日目の記事にまとめていますのでそちらをお読みください。

プログラムを作る

では今回作ったコードは以下のようになります。入力された値が18歳以上かを確認して、18歳以上であればロールを付与するというものです。

const { ModalBuilder, TextInputBuilder, ActionRowBuilder, TextInputStyle } = require('discord.js');

const modal = new ModalBuilder()
    .setCustomId('ageTest')
    .setTitle('年齢確認');

const ageInput = new TextInputBuilder()
    .setCustomId('ageInput')
    .setLabel("年齢を入力")
    .setStyle(TextInputStyle.Short);

modal.addComponents(new ActionRowBuilder().addComponents(ageInput));

await interaction.showModal(modal);
const filter = (mInteraction) => mInteraction.customId === 'ageTest';
interaction.awaitModalSubmit({ filter, time: 60000 })
    .then(async mInteraction => {
        const age = parseInt(mInteraction.fields.getTextInputValue('ageInput'));
        if (age >= 18) {
            await mInteraction.reply(`ようこそ!R18の世界へ。`);
            await mInteraction.member.roles.add(<roleId>);
        } else {
            await mInteraction.reply(`18歳未満の方はご利用いただけません。`);
        }
    })
    .catch(console.error);

実際に動かしてみます。まず最初に、/r18コマンドを実行します。
image.png
すると、年齢入力フォームが表示されます。5歳と入力してみます。
image.png
すると、ご利用いただけないと表示されます。
image.png

次に45歳と入力してみます。
image.png
すると、ようこそと送信されてロールが付与されます。
image.png

これを利用して、チャンネルに権限設定をすればいい感じになりますね(笑)

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

最後に今回作ったコード全体をおいておきます。是非参考にしてみてください。

r18.js
const { SlashCommandBuilder, ModalBuilder, TextInputBuilder, ActionRowBuilder, TextInputStyle } = require('discord.js');

module.exports = {
	data: new SlashCommandBuilder()
		.setName('r18')
		.setDescription('年齢確認'),
	async execute(interaction) {
		const modal = new ModalBuilder()
			.setCustomId('ageTest')
			.setTitle('年齢確認');

		const ageInput = new TextInputBuilder()
			.setCustomId('ageInput')
			.setLabel("年齢を入力")
			.setStyle(TextInputStyle.Short);

		modal.addComponents(new ActionRowBuilder().addComponents(ageInput));

		await interaction.showModal(modal);
		const filter = (mInteraction) => mInteraction.customId === 'ageTest';
		interaction.awaitModalSubmit({ filter, time: 60000 })
			.then(async mInteraction => {
				const age = parseInt(mInteraction.fields.getTextInputValue('ageInput'));
				if (age >= 18) {
					await mInteraction.reply(`ようこそ!R18の世界へ。`);
					await mInteraction.member.roles.add(<roleId>);
				} else {
					await mInteraction.reply(`18歳未満の方はご利用いただけません。`);
				}
			})
			.catch(console.error);
	},
};
0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?