Local DECTalk

This commit is contained in:
Dragon Fire
2021-04-03 11:07:24 -04:00
parent d88b914407
commit b4b64a935f
5 changed files with 50 additions and 22 deletions
+7 -5
View File
@@ -1,5 +1,7 @@
const Command = require('../../structures/Command');
const { execSync } = require('child_process');
const { exec } = require('child_process');
const { promisify } = require('util');
const execAsync = promisify(exec);
const { stripIndents } = require('common-tags');
const { XIAO_GITHUB_REPO_USERNAME, XIAO_GITHUB_REPO_NAME, GITHUB_ACCESS_TOKEN } = process.env;
@@ -23,12 +25,12 @@ module.exports = class ExecCommand extends Command {
});
}
run(msg, { command }) {
async run(msg, { command }) {
if (command === 'git pull') {
const repo = `${XIAO_GITHUB_REPO_USERNAME}/${XIAO_GITHUB_REPO_NAME}`;
command = `git pull https://${GITHUB_ACCESS_TOKEN}@github.com/${repo}.git`;
}
const results = this.exec(command);
const results = await this.exec(command);
return msg.reply(stripIndents`
_${results.err ? 'An error occurred:' : 'Successfully executed.'}_
\`\`\`sh
@@ -37,9 +39,9 @@ module.exports = class ExecCommand extends Command {
`);
}
exec(command) {
async exec(command) {
try {
const stdout = execSync(command, { timeout: 30000, encoding: 'utf8' });
const stdout = await execAsync(command, { timeout: 30000, encoding: 'utf8' });
return { err: false, std: stdout.trim() };
} catch (err) {
return { err: true, std: err.stderr.trim() };
+23 -10
View File
@@ -1,6 +1,10 @@
const Command = require('../../structures/Command');
const request = require('node-superfetch');
const { Readable } = require('stream');
const { exec } = require('child_process');
const { promisify } = require('util');
const execAsync = promisify(exec);
const { writeFile, unlink, readFile } = require('fs/promises');
const path = require('path');
const { reactIfAble } = require('../../util/Util');
const { LOADING_EMOJI_ID } = process.env;
@@ -19,12 +23,6 @@ module.exports = class DECTalkCommand extends Command {
},
userPermissions: ['CONNECT', 'SPEAK'],
credit: [
{
name: 'calzoneman',
url: 'https://github.com/calzoneman',
reason: 'API',
reasonURL: 'https://github.com/calzoneman/aeiou'
},
{
name: 'Digital Equipment Corporation',
url: 'http://gordonbell.azurewebsites.net/digital/timeline/tmlnhome.htm',
@@ -57,9 +55,7 @@ module.exports = class DECTalkCommand extends Command {
if (this.client.dispatchers.has(msg.guild.id)) return msg.reply('I am already playing audio in this server.');
try {
await reactIfAble(msg, this.client.user, LOADING_EMOJI_ID, '💬');
const { body } = await request
.get('http://tts.cyzon.us/tts')
.query({ text });
const body = await this.tts(msg.guild.id, text);
const dispatcher = connection.play(Readable.from([body]));
this.client.dispatchers.set(msg.guild.id, dispatcher);
dispatcher.once('finish', () => this.client.dispatchers.delete(msg.guild.id));
@@ -71,4 +67,21 @@ module.exports = class DECTalkCommand extends Command {
return msg.reply(`Oh no, an error occurred: \`${err.message}\`. Try again later!`);
}
}
async tts(id, input) {
await writeFile(path.join(__dirname, '..', '..', 'tmp', `${id}.txt`), input);
await execAsync(`xvfb-run wine say.exe -w ${id}.wav < ${path.join(__dirname, '..', '..', 'tmp', `${id}.txt`)}`, {
cwd: path.join(__dirname, '..', '..', 'dectalk'),
timeout: 30000
});
let result;
try {
result = await readFile(path.join(__dirname, '..', '..', 'tmp', `${id}.wav`));
await unlink(path.join(__dirname, '..', '..', 'tmp', `${id}.txt`));
await unlink(path.join(__dirname, '..', '..', 'tmp', `${id}.wav`));
} catch {
if (!result) result = null;
}
return result;
}
};