スタッフブログ

メッセージをブックマークするDiscord Botを作ろう

こんにちは、鮎月 (あゆつき) です。

今回は、メッセージをブックマークできるDiscord Botを作ります。
選択したメッセージの内容をDMで送るものです。公式のブックマーク機能もあるにはありますが、Nitro限定なもので。その辺はケチっていきましょう。

プログラミングめんどい ┐(´・∀・`)┌ ワカラン って方は、同じ機能を持つDiscord Bot「唯香 -ゆいか-」を利用できます。詳しくはこちら。

メッセージをブックマークしようこんにちは。 今回は、メッセージを簡単にブックマークできる機能を紹介します。もちろん無料です。 やり方 これで理解...

それではよろしくお願いします。

環境構築

公式のガイドを参考に進めてください。本題はここでは無いので大幅割愛。

今回のNodeJSのバージョンは18.20.4で、Discord.jsのバージョンは14.16.3です。

これ以外には、dotenvもインストールしておきます。正直公開しなければdotenvいらない

Botのアカウントも準備しておきます。

コードを書く

私が書いたので皆さんはほぼコピペでおk。

require("dotenv").config();
const token = process.env.DISCORD_TOKEN;

const Discord = require("discord.js");
const intents = [Discord.GatewayIntentBits.MessageContent, Discord.GatewayIntentBits.DirectMessages, Discord.GatewayIntentBits.Guilds];
const partials = [Discord.Partials.Channel, Discord.Partials.Message]
const client = new Discord.Client({ intents: intents, partials: partials });

client.on("ready", () => {
	const cmds = [
		{
			name: "Message Memo",
			type: 3
		},
	];
	client.application.commands.set(cmds).catch(err => console.error(err));
	console.log("Discordへの接続完了です!:", client.user.tag);
});

client.on("interactionCreate", i => {
	switch (i.commandName) {
		case "Message Memo":
			msgMemo(i);
			break;
	
		default:
			break;
	}
});

async function msgMemo(i) {
	if (!i.user.dmChannel) await i.user.createDM();

	const msg = i.options.getMessage("message");

	if (!i.inGuild() && msg.embeds[0].title == "メッセージメモ") {
		// 削除する
		await i.reply({ content: "処理中です…", ephemeral: true });
		const msgLink = msg.embeds[0].description;
		msg.delete().then(async () => {
			await i.editReply({ content: `${msgLink.substr(0, msgLink.indexOf("です。"))}のメモを削除しました。`, ephemeral: true })
		}).catch(async () => {
			await i.editReply({ content: "削除に失敗しました。", ephemeral: true });
		});
	} else {
		await i.reply({ content: "処理中です…", ephemeral: true });

		const time = timeToJST(msg.createdTimestamp);
		const reactedCh = msg.channel;
		const reactedGuild = msg.guild;

		let hasContent;
		if (!msg.content) {
			hasContent = "なし";
		} else {
			hasContent = msg.content;
		}

		let hasFile;
		if (msg.attachments.size <= 0) {
			hasFile = "なし";
		} else {
			hasFile = msg.attachments.first().url;
		}

		const embed = new Discord.EmbedBuilder()
			.setTitle("メッセージメモ")
			.setDescription(`${msg.author.displayName}の[メッセージ](${msg.url})です。`)
			.addFields(
				{ name: "内容", value: hasContent },
				{ name: "添付ファイル", value: hasFile },
				{ name: "送信者", value: `${msg.author.displayName}\n(${msg.author.id})`, inline: true },
				{ name: "送信サーバー", value: `${reactedGuild.name}\n(${reactedGuild.id})`, inline: true },
				{ name: "送信チャンネル", value: `${reactedCh.name}\n(${reactedCh.id})`, inline: true },
				{ name: "送信時刻", value: time },
			)
			.setColor("e17050");
		i.user.dmChannel.send({ embeds: [ embed ] }).then(async () => {
			await i.editReply({ content: "DMに送信しました!", ephemeral: true });
		}).catch(async () => {
			await i.editReply({ content: "DMに送信できませんでした…。Discord上のDM設定を確認してみてね!", ephemeral: true });
		});
	}
}

function timeToJST(timestamp) {
	const dt = timeToJSTTimestamp(timestamp);
	const year = dt.getFullYear();
	const month = dt.getMonth() + 1;
	const date = dt.getDate();
	const hour = dt.getHours();
	const minute = dt.getMinutes();
	const second = dt.getSeconds();
	return `${year}/${month}/${date} ${hour}:${minute}:${second}`;
}

function timeToJSTTimestamp(timestamp) {
	let dt = new Date();
	let tz = dt.getTimezoneOffset(); // サーバーで設定されているタイムゾーンの世界標準時からの時差(分)
	tz = (tz + 540) * 60 * 1000; // 日本時間との時差(9時間=540分)を計算し、ミリ秒単位に変換
	dt = new Date(timestamp + tz); // 時差を調整した上でタイムスタンプ値を Date オブジェクトに変換
	return dt;
}

client.login(token);

.envファイルにTokenを書く作業だけお願いしますね

使ってみよう

メモしたいメッセージを右クリックし、【アプリ】→【ブックマーク (ピンメモ)】を実行すると、そのメッセージの内容がDMに送信されます。

メモとして送信されたメッセージに対して同じ操作を行うと、メモが削除されます。

万が一間違えて削除した場合、削除完了通知のメッセージ部分をクリックすることで、そのメッセージに再度アクセスできます。

自分で作るのもいいけど…

ちなみにこれはBotの入っているサーバーでしか使えません。

自分でサーバーの管理者にBot追加をお願いするのもアリですが、同じ機能がすでにあるBotを使うのも一つの手。

筆者の開発しているBot「唯香 -ゆいか-」なら、追加されている2,000以上のサーバーで、この機能を使うことができます

この機会に、追加してみてはいかがでしょうか?

 

 

ここまでお読みいただき、ありがとうございました。
それでは。

ABOUT ME
鮎月 / あゆつき
唯香 -ゆいか- の開発者・オーナーです。
Discord Bot「唯香 -ゆいか-」

「唯香 -ゆいか-」は、鮎月(あゆつき) が開発しているDiscordのおしゃべりBotで、チャットの単語に反応し、「いつもの会話を、ちょっぴり賑やかに。」します。

会話反応以外にも、話題提案やチャンネルの最初のメッセージ表示など、楽しい機能がたくさんあります!

あなたのサーバーにもBot追加して、チャットを楽しくしてみませんか?

Botを追加する!

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です