久々にDiscrod BOTを触ってみてます。なんか前にも同じようなメモ書いた気もしてる...
こんな感じにユーザーが発言したチャンネルによって処理のハンドリングをさせたいってメモです。
基本
自分用おさらいとしてメモ残しておきます。
Discord.jsのトップページのサンプルと一緒ですが、 サンプルの方はパッと見トークンをどこに入れれば良いのか分からないので注意。
const Discord = require('discord.js');
const client = new Discord.Client();
client.on('ready', () => {
console.log(`Logged in as ${client.user.tag}!`);
});
client.on('message', msg => {
if (msg.content === 'ping') {
msg.reply('Pong!');
}
});
client.login(`アクセストークン`);
client.login()
の箇所に取得したアクセストークンを指定して起動すればOKです。
Webhook URLなど指定せずにローカルで試せます。
まずはこれでping/pongを試せます。
チャンネルの取得をしてハンドリング
msg.channel.id
でチャンネルのIDを指定するか、msg.channel.name
でチャンネル名を指定するかが良さそうです。
チャンネルIDの場合
チャンネルIDでハンドリングしたい場合はmsg.channel.id
を利用します。
Discordのチャンネルを開いてる時のURLは以下のような形式です。
https://discord.com/channels/XXXXXX/YYYYYY
このXXXXXXX
の部分がサーバーごとのID
になり、YYYYYY
の部分がチャンネルごとのIDになります。
ちなみにDMの場合は以下のような形式になります。
https://discord.com/channels/@me/YYYYYY
URLの最後のYYYYYY
がチャンネルIDになるので以下のようにハンドリング出来ます。
//省略
//特定の部屋での発言
if(msg.channel.id === 'YYYYYY'){
msg.channel.send('今日の会議の議事録はこちらです! https://hogehoge.com');
}
//それ以外の部屋では反応しない
else{
msg.reply('この部屋で設定されている会議はありません。');
}
//省略
チャンネル名の場合
チャンネル名でハンドリングしたい場合はmsg.channel.name
を利用します。
↑のように表示されてる名前です。ただ、この場合名前が合ってればという判定なので、運用で部屋の名前を変更した際などに想定している動作にならなくなるので注意が必要そうです。
//省略
//特定の部屋での発言
if(msg.channel.name === 'n0bi-playground'){
msg.channel.send('今日の会議の議事録はこちらです! https://hogehoge.com');
}
//それ以外の部屋では反応しない
else{
msg.reply('この部屋で設定されている会議はありません。');
}
//省略
コード全体
const Discord = require('discord.js');
const client = new Discord.Client();
client.on('ready', () => {
console.log(`Logged in as ${client.user.tag}!`);
});
client.on('message', msg => {
if (msg.content === 'ping') {
msg.reply('Pong!');
}
if(msg.content === '会議URL教えて'){
if(msg.channel.id === 'YYYYYY'){
msg.channel.send('https://hogehoge.com/hugahuga');
}else{
msg.reply('現在の部屋では設定されてるURLがありません。');
}
}
});
client.login(`アクセストークン`);
補足: 発言させるmsg.channel.send
とmsg.reply
どっちもBOTを発言させるときですが、以下の違いがあります。
- msg.channel.sendを使うとそのチャンネルでBOTが発言
- msg.replyで発言者にリプライ付きでBOTが返信