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);