はじめに
こんにちは。Never3924です。
突然ですが皆様は明治のたけのこの里かきのこの里1をご存知でしょうか?
そしてどちらが好きでしょうか。
私はきのこの山です。
計画
「きのこの山とたけのこの里どっちが好き?」と投稿されたら「きのこの山」と即レスするbotを作ります。
あと言論統制もします
NodeJS x discord.js で行こうと思います
Bot作成
まずBotを作成します。

名前を決めて…

説明文も決めて画像も出しましょう。
トークンをコピーするのを忘れないようにしてください。
そして.envにAPI_KEYとして記述しておきます。
プログラムする
import { Client, Events, GatewayIntentBits } from "discord.js";
import { config } from "dotenv";
config();
function getEnv(key) {
const value = process.env[key];
if (value === undefined) {
throw new Error(`Key ${key} is not defined`);
}
return value;
}
async function main() {
const API_KEY = getEnv("API_KEY");
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent,
],
});
client.once(Events.ClientReady, (readyClient) => {
console.log(`Ready! Logged in as ${readyClient.user.tag}`);
});
// ここに処理書く
client.login(API_KEY);
}
main();
ドキュメントからコピペしてきたテンプレですね。
即レス
即レス部分から作ります。
メッセージが送信されたイベントを取得し、それに
「きのこの山」「たけのこの里」「どっち」「好き」
が含まれていたら
「きのこの山」
とレスします。(順不同)
const validate =
/(?=.*き.*の.*こ.*の.*山)(?=.*た.*け.*の.*こ.*の.*里)(?=.*ど.*っ.*ち)(?=.*好.*き)/;
client.on(Events.MessageCreate, (msg) => {
if (validate.test(msg.content)) {
// 即レス
}
こんなもんでしょう。次は即レスです
await msg.reply("きのこの山");
一行で終わってハッピー
動作確認
+α
これだけだとつまんないですし、言論統制でもしましょうか。
「たけのこの里」を検知すると伏せ字またはきのこの山に置き換えるとか。
今回は置き換えの方でいきます。
先ほどの検知と被るとめんどくさいので、即レスしたあとに付け足しておきましょう。
// イベントごとに再定義していると若干重いかもしれないので外で定義しておく
const validateTake = /た.*け.*の.*こ.*の.*里/g;
// ... 略 ...
if (validateTake.test(msg.content)) {
await msg.edit(msg.content.replace(validateTake, "きのこの山")); // 言論統制!
}
動作確認
DiscordAPIError[50005]: Cannot edit a message authored by another user
... 略 ...
どうやら、他人のメッセージを編集することは出来ないようですね。残念。
最後に
きのこの山即レスBotを作りました。なにげに語の間にスラッシュとか入れられても反応します。
この記事には対立を煽る意図はありません。
ただのクソアプリとして楽しんでいただけたら幸いです。
では、さようなら。
-
この並びに意図はありません。 ↩
