From 92eb2224c70c8f6698d925196fdf96181f49f1a3 Mon Sep 17 00:00:00 2001 From: Daniel Odendahl Jr Date: Sun, 1 Oct 2017 07:18:24 +0000 Subject: [PATCH] DECTalk --- commands/random/soundboard.js | 11 +++++- commands/text-edit/dec-talk.js | 72 ++++++++++++++++++++++++++++++++++ package.json | 2 +- 3 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 commands/text-edit/dec-talk.js diff --git a/commands/random/soundboard.js b/commands/random/soundboard.js index af1dcaaa..ccfad47e 100644 --- a/commands/random/soundboard.js +++ b/commands/random/soundboard.js @@ -17,6 +17,7 @@ module.exports = class SoundboardCommand extends Command { usages: 1, duration: 15 }, + clientPermissions: ['ADD_REACTIONS', 'READ_MESSAGE_HISTORY'], args: [ { key: 'sound', @@ -45,8 +46,14 @@ module.exports = class SoundboardCommand extends Command { try { const connection = await channel.join(); const dispatcher = connection.playFile(path.join(__dirname, '..', '..', 'assets', 'sounds', `${sound}.mp3`)); - dispatcher.once('end', () => channel.leave()); - dispatcher.once('error', () => channel.leave()); + dispatcher.once('end', async () => { + channel.leave(); + await msg.react('✅'); + }); + dispatcher.once('error', async () => { + channel.leave(); + await msg.react('⚠'); + }); return null; } catch (err) { channel.leave(); diff --git a/commands/text-edit/dec-talk.js b/commands/text-edit/dec-talk.js new file mode 100644 index 00000000..5f645db8 --- /dev/null +++ b/commands/text-edit/dec-talk.js @@ -0,0 +1,72 @@ +const { Command } = require('discord.js-commando'); +const snekfetch = require('snekfetch'); +const path = require('path'); +const { promisify } = require('util'); +const fs = require('fs'); +const writeFileAsync = promisify(fs.writeFile); +const unlinkAsync = promisify(fs.unlink); +const crypto = require('crypto'); + +module.exports = class DECTalkCommand extends Command { + constructor(client) { + super(client, { + name: 'dec-talk', + aliases: ['moon-base-alpha', 'text-to-speech', 'tts'], + group: 'fun', + memberName: 'dec-talk', + description: 'The world\'s best Text-to-Speech.', + guildOnly: true, + throttling: { + usages: 1, + duration: 15 + }, + clientPermissions: ['ADD_REACTIONS', 'READ_MESSAGE_HISTORY'], + args: [ + { + key: 'text', + prompt: 'What text do you want to convert to TTS?', + type: 'string', + validate: text => { + if (text.length < 1000) return true; + return 'Invalid text, please keep the text under 1000 characters.'; + } + } + ] + }); + } + + async run(msg, { text }) { + const channel = msg.member.voiceChannel; + if (!channel) return msg.say('Please enter a voice channel first.'); + if (!channel.permissionsFor(this.client.user).has(['CONNECT', 'SPEAK'])) { + return msg.say('Missing the "Connect" or "Speak" permission for the voice channel.'); + } + if (!channel.joinable) return msg.say('Your voice channel is not joinable.'); + if (this.client.voiceConnections.has(channel.guild.id)) return msg.say('I am already playing a sound.'); + const file = path.join(__dirname, '..', '..', 'assets', `${crypto.randomBytes(5).toString('hex')}.mp3`); + try { + const connection = await channel.join(); + const { body } = await snekfetch + .get('http://tts.cyzon.us/tts', { followRedirects: true }) + .query({ text }); + await writeFileAsync(file, body, { encoding: 'binary' }); + await msg.react('🔉'); + const dispatcher = connection.playFile(file); + dispatcher.once('end', async () => { + await unlinkAsync(file); + channel.leave(); + await msg.react('✅'); + }); + dispatcher.once('error', async () => { + await unlinkAsync(file); + channel.leave(); + await msg.react('⚠'); + }); + return null; + } catch (err) { + channel.leave(); + if (fs.existsSync(file)) await unlinkAsync(file); + return msg.say(`Oh no, an error occurred: \`${err.message}\`. Try again later!`); + } + } +}; diff --git a/package.json b/package.json index 082c5bd7..6f44c3bc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "xiaobot", - "version": "43.2.0", + "version": "43.3.0", "description": "Your personal server companion.", "main": "Shard.js", "scripts": {