こんにちは、鮎月 (あゆつき) です。
今回は、メッセージをブックマークできる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以上のサーバーで、この機能を使うことができます。
この機会に、追加してみてはいかがでしょうか?
ここまでお読みいただき、ありがとうございました。
それでは。
「唯香 -ゆいか-」は、鮎月(あゆつき) が開発しているDiscordのおしゃべりBotで、チャットの単語に反応し、「いつもの会話を、ちょっぴり賑やかに。」します。
会話反応以外にも、話題提案やチャンネルの最初のメッセージ表示など、楽しい機能がたくさんあります!
あなたのサーバーにもBot追加して、チャットを楽しくしてみませんか?