こんにちはななしひろゆきです
今回はdiscordBOTを作りました
この記事は再掲載です
まずindex.jx
index.js
const { Client, Collection, GatewayIntentBits, Partials ,MessageEmbed} = require('discord.js');
const { createAudioResource, createAudioPlayer, joinVoiceChannel } = require('@discordjs/voice');
const fs = require('fs');
const { LISTENER } = require('./config.json');
const Database = require('better-sqlite3');
const db = new Database('inm_discord_bot', { verbose: console.log });
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMembers,
GatewayIntentBits.GuildBans,
GatewayIntentBits.GuildEmojisAndStickers,
GatewayIntentBits.GuildIntegrations,
GatewayIntentBits.GuildWebhooks,
GatewayIntentBits.GuildInvites,
GatewayIntentBits.GuildVoiceStates,
GatewayIntentBits.GuildPresences,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.GuildMessageReactions,
GatewayIntentBits.GuildMessageTyping,
GatewayIntentBits.DirectMessages,
GatewayIntentBits.DirectMessageReactions,
GatewayIntentBits.DirectMessageTyping,
GatewayIntentBits.MessageContent,
GatewayIntentBits.GuildScheduledEvents,
],
partials: [
Partials.User,
Partials.Channel,
Partials.GuildMember,
Partials.Message,
Partials.Reaction,
Partials.GuildScheduledEvent,
Partials.ThreadMember,
],
});
client.commands = new Collection();
const commandFiles = fs.readdirSync('./commands').filter(file => file.endsWith('.js'));
for (const file of commandFiles) {
const command = require(`./commands/${file}`);
client.commands.set(command.data.name, command);
}
client.once('ready', () => {
console.log('起動完了');
});
client.on('interactionCreate', async interaction => {
if (!interaction.isCommand()) {
return;
}
const { commandName } = interaction;
const command = client.commands.get(commandName);
console.log(command);
if (!command) {
return;
}
try {
await command.execute(interaction);
} catch (error) {
console.error(error);
interaction.reply('There was an error trying to execute that command!');
}
});
client.on('messageCreate',async message => {
if (!message.author.bot && message.content.length > 0) {
console.log(message.content);
try {
const voiceChannel = message.member.voice.channel;
var filePath = '';
var file = ('%'+message.content+'%');
var check = db.prepare('SELECT voice_file_name.name,voice_select_name.* FROM voice_select_name INNER JOIN voice_file_name ON voice_file_name.id = voice_select_name.voice_file_name WHERE voice_select_name.name LIKE ?').get(file);
if(!check){
}else{
console.log(check.name);
var select_voice = db.prepare(' SELECT * FROM voice_file_name WHERE id = ?').get(check.voice_file_name);
filePath = './voice_file/'+select_voice.name;
console.log(filePath);
}
if (!fs.existsSync(filePath)) {
return await message.reply('指定されたWAVファイルが見つかりません。'+filename);
}
// ボイスコネクションを作成し、ボイスチャンネルに接続します。
const connection = joinVoiceChannel({
channelId: voiceChannel.id,
guildId: voiceChannel.guild.id,
adapterCreator: voiceChannel.guild.voiceAdapterCreator,
});
// 再生するオーディオリソースを作成します。
const resource = createAudioResource(filePath);
// オーディオプレーヤーを作成し、オーディオリソースを再生します。
const player = createAudioPlayer();
connection.subscribe(player);
player.play(resource);
} catch (error) {
console.error(error);
message.reply('There was an error trying to execute that command!');
}
}
});
client.login(LISTENER.TOKEN);
続いてdeploy_commands.js
deploy_commands.js
const { SlashCommandBuilder } = require('@discordjs/builders'); //SlashCommandBuilderを読み込む
const fs = require('fs');
const { REST } = require('@discordjs/rest'); //RESTを読み込む
const { Routes } = require('discord-api-types/v9'); //Routesを読み込む
const { LISTENER,GUILD_ID } = require('./config.json');
const client_id = LISTENER.CLIENT_ID //クライアントIDをclient_idに代入
const guild_id = GUILD_ID //サーバーIDをguild_idに代入
const token = LISTENER.TOKEN //トークン
const commandFiles = fs.readdirSync('./commands').filter(file => file.endsWith('.js'));
const test = [].map(command => command.toJSON());
for (const file of commandFiles) {
const commacommandBOTnd = require(`./commands/${file}`);
test.push(new SlashCommandBuilder().setName(commacommandBOTnd.data.name).setDescription(commacommandBOTnd.data.description));
}
const rest = new REST({ version: '9' }).setToken(token);
rest.put(Routes.applicationGuildCommands(client_id, guild_id), { body: test })
.then(() => console.log('Successfully registered application commands.'))
.catch(console.error); //指定したサーバーにコマンドを登録・更新
続いてvoicechat.js
voicechat.js
const { SlashCommandBuilder } = require('discord.js');
// BOTをVCに参加させるために必要。
const { joinVoiceChannel } = require('@discordjs/voice');
const { LISTENER } = require('../config.json');
module.exports = {
data: new SlashCommandBuilder()
// コマンドの名前
.setName('join')
// コマンドの説明文
.setDescription('VCに参加。'),
async execute(interaction) {
// VCに参加する処理
const connection = joinVoiceChannel({
guildId: interaction.guildId,
channelId: LISTENER.VC_ID,
adapterCreator: interaction.guild.voiceAdapterCreator,
});
await interaction.reply('参加しました!');
},
};
続いてcomandsファイルの中にあるコマンドを実行した際に起動するコード
join.js
const { SlashCommandBuilder } = require('@discordjs/builders');
// BOTをVCに参加させるために必要。
const { joinVoiceChannel } = require('@discordjs/voice');
const { LISTENER } = require('../config.json');
module.exports = {
data: new SlashCommandBuilder()
// コマンドの名前
.setName('join')
// コマンドの説明文
.setDescription('VCに参加。'),
async execute(interaction) {
// VCに参加する処理
const connection = joinVoiceChannel({
guildId: interaction.guildId,
channelId: LISTENER.VC_ID,
adapterCreator: interaction.guild.voiceAdapterCreator,
});
await interaction.reply('おまたせ');
},
};
disconnect.js
const { SlashCommandBuilder } = require('@discordjs/builders');
const { LISTENER } = require('../config.json');
const { joinVoiceChannel, getVoiceConnection } = require('@discordjs/voice');
module.exports = {
data: new SlashCommandBuilder()
.setName('disconnect')
.setDescription('ボイスチャンネルから切断します。'),
async execute(interaction) {
// 接続済みのボイスコネクションを取得します。
const connection = getVoiceConnection(interaction.guildId);
// もし接続が存在しなければ、エラーを返します。
if (!connection) {
return await interaction.reply('ボイスチャンネルに接続していません。');
}
// ボイスチャンネルから切断します。
connection.destroy();
// 成功メッセージを返します。
return await interaction.reply('ボイスチャンネルから切断しました。');
},
};
続いて
データベースに値を入れる為のjs
database.js
console.log('helloworld');
const Database = require('better-sqlite3');
const fs = require('fs');
const db = new Database('inm_discord_bot', { verbose: console.log });
const commandFiles = fs.readdirSync('./voice_file').filter(file => file.endsWith('.wav'));
console.log(commandFiles);
var stmt = db.prepare('INSERT INTO voice_file_name (name) VALUES (?);');
for (const file of commandFiles) {
var check = db.prepare('SELECT * FROM voice_file_name WHERE name = ?').get(file);
if(!check){
stmt.run(file);
}
}
const row = db.prepare('SELECT * FROM voice_file_name ').get();
console.log(row);
database.jsにてデータを入れたのちdeploy.jsを起動する事で呼び出すようにしてあります