DiscordBotを作ったはなし
こんにちは。nanaseです。
最近仲間内でGolf It!というゲームをしています。
オンラインで何人でも遊べるゴルフゲームで大変白熱します。
ワークショップでユーザーの作ったコースも遊ぶことができ、その数なんと9000コース以上!
いつまでも飽きずに遊べる神ゲーですね😄
GolfBot
皆でGolf It!を遊んでるDiscordサーバーにGolfBotというネタBotを作りました。
別ゲーの話題なんかをすると "ゴルフをしろ" って問答無用で言ってくる <s>治安の悪い</s> とても気の利くやつです。
あと他にも以下みたいな事ができます。
ゲーム内アイテムの価格を検索する
ボイスチャンネルでの通話開始時に特定ロールにメンションを飛ばす
他にも随時機能追加中です。
で、今回初めてDiscordのbotを作ったのでTips的に何個かやったことをまとめ。
開発環境
node.js v14.4.0
discord.js v12.2.0
開発は基本的にMacかWindows Subsystem for Linux(WSL)上で行っています。
インフラにはherokuを採用してworkerで動かしています。
クレカ認証すれば1000h/月まで無料で使えるので、アプリケーションが1つであれば実質無料で24時間の運用が可能です。
※Botアカウントの作成に関しては この辺の記事 など、調べれば色々出てくるのでそちらを参照ください。
特定の単語が含まれる発言に対して応答する
メッセージを何か受け取ったハンドラは client.on('message') で受け取れます。
ここでblackListに対応する単語が含まれている場合に応答するようにすればOKです。
const Discord = require('discord.js');
const client = new Discord.Client();
const blackList = [
'VRChat',
'FF14',
'Getting Over It'
]client.on('message', msg => {
for(let i = 0; i<blackList.length; i++) {
if(msg.content.indexOf(blackList[i]) != -1) {
msg.channel.send('応答するメッセージ');
break;
}
}
カスタム絵文字を使う
サーバー内のカスタム絵文字をBotで使いたい場合。ただ単に `:custom_emoji:` のようにエイリアスを指定しただけでは返信できません。利用する方法としてはemojiのIDを直接指定するかエイリアスからIDを取得して返信するかの2通りがありますが、今回は後者の方法を取りました。
const emoji = msg.guild.emojis.cache.find(emoji => emoji.name === 'custom_emoji');
msg.channel.send(`${emoji}`);
この方法の場合、複数サーバーで動かしてもそれぞれのサーバーに同一エイリアスのemojiが存在していれば利用することが可能です。
但し、emojiのエイリアスを変更した場合正常に動作しなくなるので一部注意が必要です。
特定ロールにメンションを飛ばす
特定のロールにメンションを飛ばす方法。
こちらも同様にロール名を指定するだけでは飛びませんでした。
ロールIDを指定してあげる必要があります。
msg.channel.send(`<@&ロールID>`);
さて、今回はこの辺で。
VoiceChannel周りの知見もいくつか得たのでいつか書きます。多分。
あと現在node.jsからGo言語への書き換えを検討中です。
小規模でも動的型付けはつらい😇