74 lines
2.1 KiB
JavaScript
74 lines
2.1 KiB
JavaScript
const Discord = require('discord.js');
|
|
require('dotenv').config();
|
|
const tts = require('google-tts-api');
|
|
const fetch = require('node-fetch');
|
|
const fs = require('fs');
|
|
const sha1 = require('sha1');
|
|
|
|
let joinedVoiceChannels = [];
|
|
let modules = [];
|
|
const bot = new Discord.Client();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const api = {
|
|
isInVoiceChannel: (channel) => {
|
|
return joinedVoiceChannels.includes(channel);
|
|
},
|
|
|
|
getConnectionForVoiceChannel: (channel) => {
|
|
return bot.voice.connections.find((conn) => conn.channel === channel);
|
|
},
|
|
|
|
generateVoice: async (string) => {
|
|
const hash = sha1(string);
|
|
const filepath = process.env.VOICE_TMP_PATH + hash + ".mp3";
|
|
if (!fs.existsSync(filepath)) {
|
|
const url = tts.getAudioUrl(string, {lang: "en-us"});
|
|
console.log("Generated url: " + url);
|
|
const data = await fetch(url);
|
|
const contents = await data.arrayBuffer();
|
|
const buf = Buffer.from(contents);
|
|
fs.writeFileSync(filepath, buf);
|
|
}
|
|
return filepath;
|
|
},
|
|
|
|
joinChannel: async (channel) => {
|
|
if (!api.isInVoiceChannel(channel)) {
|
|
const res = await channel.join();
|
|
joinedVoiceChannels.push(channel);
|
|
}
|
|
},
|
|
|
|
leaveChannel: async (channel) => {
|
|
if (joinedVoiceChannels.includes(channel)) {
|
|
joinedVoiceChannels = joinedVoiceChannels.filter((chan) => chan !== channel);
|
|
await channel.leave();
|
|
}
|
|
},
|
|
|
|
speak: async (channel, message) => {
|
|
const conn = api.getConnectionForVoiceChannel(channel);
|
|
const filepath = await api.generateVoice(message);
|
|
if (conn) conn.play(filepath);
|
|
}
|
|
}
|
|
|
|
function registerModules() {
|
|
console.log(`Registering modules...`);
|
|
const moduleDirectories = fs.readdirSync('./modules');
|
|
moduleDirectories.forEach((dir) => {
|
|
modules.push(require(`./modules/${dir}/index.js`));
|
|
console.log(`Loading ./modules/${dir}/index.js`)
|
|
})
|
|
modules.forEach((mod) => mod(bot, api));
|
|
}
|
|
|
|
registerModules();
|
|
bot.login(process.env.TOKEN); |