diff --git a/assets/sounds/animal-crossing-speak/0.wav b/assets/sounds/animal-crossing-speak/0.wav new file mode 100644 index 00000000..a5a9773f Binary files /dev/null and b/assets/sounds/animal-crossing-speak/0.wav differ diff --git a/assets/sounds/animal-crossing-speak/1.wav b/assets/sounds/animal-crossing-speak/1.wav new file mode 100644 index 00000000..f059b8d5 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/1.wav differ diff --git a/assets/sounds/animal-crossing-speak/2.wav b/assets/sounds/animal-crossing-speak/2.wav new file mode 100644 index 00000000..44e2896b Binary files /dev/null and b/assets/sounds/animal-crossing-speak/2.wav differ diff --git a/assets/sounds/animal-crossing-speak/3.wav b/assets/sounds/animal-crossing-speak/3.wav new file mode 100644 index 00000000..1e822112 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/3.wav differ diff --git a/assets/sounds/animal-crossing-speak/4.wav b/assets/sounds/animal-crossing-speak/4.wav new file mode 100644 index 00000000..0d6521ac Binary files /dev/null and b/assets/sounds/animal-crossing-speak/4.wav differ diff --git a/assets/sounds/animal-crossing-speak/5.wav b/assets/sounds/animal-crossing-speak/5.wav new file mode 100644 index 00000000..39c0d884 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/5.wav differ diff --git a/assets/sounds/animal-crossing-speak/6.wav b/assets/sounds/animal-crossing-speak/6.wav new file mode 100644 index 00000000..dcca996e Binary files /dev/null and b/assets/sounds/animal-crossing-speak/6.wav differ diff --git a/assets/sounds/animal-crossing-speak/7.wav b/assets/sounds/animal-crossing-speak/7.wav new file mode 100644 index 00000000..95d25c33 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/7.wav differ diff --git a/assets/sounds/animal-crossing-speak/8.wav b/assets/sounds/animal-crossing-speak/8.wav new file mode 100644 index 00000000..387b2795 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/8.wav differ diff --git a/assets/sounds/animal-crossing-speak/9.wav b/assets/sounds/animal-crossing-speak/9.wav new file mode 100644 index 00000000..d926899b Binary files /dev/null and b/assets/sounds/animal-crossing-speak/9.wav differ diff --git a/assets/sounds/animal-crossing-speak/a.wav b/assets/sounds/animal-crossing-speak/a.wav new file mode 100644 index 00000000..b5b57443 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/a.wav differ diff --git a/assets/sounds/animal-crossing-speak/b.wav b/assets/sounds/animal-crossing-speak/b.wav new file mode 100644 index 00000000..5c7b1eca Binary files /dev/null and b/assets/sounds/animal-crossing-speak/b.wav differ diff --git a/assets/sounds/animal-crossing-speak/c.wav b/assets/sounds/animal-crossing-speak/c.wav new file mode 100644 index 00000000..06b604af Binary files /dev/null and b/assets/sounds/animal-crossing-speak/c.wav differ diff --git a/assets/sounds/animal-crossing-speak/d.wav b/assets/sounds/animal-crossing-speak/d.wav new file mode 100644 index 00000000..0dad01e0 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/d.wav differ diff --git a/assets/sounds/animal-crossing-speak/e.wav b/assets/sounds/animal-crossing-speak/e.wav new file mode 100644 index 00000000..712e14a0 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/e.wav differ diff --git a/assets/sounds/animal-crossing-speak/f.wav b/assets/sounds/animal-crossing-speak/f.wav new file mode 100644 index 00000000..c37814d2 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/f.wav differ diff --git a/assets/sounds/animal-crossing-speak/g.wav b/assets/sounds/animal-crossing-speak/g.wav new file mode 100644 index 00000000..fdec7a12 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/g.wav differ diff --git a/assets/sounds/animal-crossing-speak/h.wav b/assets/sounds/animal-crossing-speak/h.wav new file mode 100644 index 00000000..d3496d57 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/h.wav differ diff --git a/assets/sounds/animal-crossing-speak/i.wav b/assets/sounds/animal-crossing-speak/i.wav new file mode 100644 index 00000000..be208561 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/i.wav differ diff --git a/assets/sounds/animal-crossing-speak/j.wav b/assets/sounds/animal-crossing-speak/j.wav new file mode 100644 index 00000000..3a54cdb4 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/j.wav differ diff --git a/assets/sounds/animal-crossing-speak/k.wav b/assets/sounds/animal-crossing-speak/k.wav new file mode 100644 index 00000000..8dd816e1 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/k.wav differ diff --git a/assets/sounds/animal-crossing-speak/l.wav b/assets/sounds/animal-crossing-speak/l.wav new file mode 100644 index 00000000..173dcf08 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/l.wav differ diff --git a/assets/sounds/animal-crossing-speak/m.wav b/assets/sounds/animal-crossing-speak/m.wav new file mode 100644 index 00000000..e3aec706 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/m.wav differ diff --git a/assets/sounds/animal-crossing-speak/n.wav b/assets/sounds/animal-crossing-speak/n.wav new file mode 100644 index 00000000..8ec8ff38 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/n.wav differ diff --git a/assets/sounds/animal-crossing-speak/o.wav b/assets/sounds/animal-crossing-speak/o.wav new file mode 100644 index 00000000..b8d689ef Binary files /dev/null and b/assets/sounds/animal-crossing-speak/o.wav differ diff --git a/assets/sounds/animal-crossing-speak/p.wav b/assets/sounds/animal-crossing-speak/p.wav new file mode 100644 index 00000000..a3c83747 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/p.wav differ diff --git a/assets/sounds/animal-crossing-speak/q.wav b/assets/sounds/animal-crossing-speak/q.wav new file mode 100644 index 00000000..b5c1ed36 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/q.wav differ diff --git a/assets/sounds/animal-crossing-speak/r.wav b/assets/sounds/animal-crossing-speak/r.wav new file mode 100644 index 00000000..0b66d7b2 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/r.wav differ diff --git a/assets/sounds/animal-crossing-speak/s.wav b/assets/sounds/animal-crossing-speak/s.wav new file mode 100644 index 00000000..59deec81 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/s.wav differ diff --git a/assets/sounds/animal-crossing-speak/t.wav b/assets/sounds/animal-crossing-speak/t.wav new file mode 100644 index 00000000..cac37343 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/t.wav differ diff --git a/assets/sounds/animal-crossing-speak/u.wav b/assets/sounds/animal-crossing-speak/u.wav new file mode 100644 index 00000000..883da5f9 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/u.wav differ diff --git a/assets/sounds/animal-crossing-speak/unknown.wav b/assets/sounds/animal-crossing-speak/unknown.wav new file mode 100644 index 00000000..b1f33eef Binary files /dev/null and b/assets/sounds/animal-crossing-speak/unknown.wav differ diff --git a/assets/sounds/animal-crossing-speak/v.wav b/assets/sounds/animal-crossing-speak/v.wav new file mode 100644 index 00000000..ad82bbb8 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/v.wav differ diff --git a/assets/sounds/animal-crossing-speak/w.wav b/assets/sounds/animal-crossing-speak/w.wav new file mode 100644 index 00000000..fea357b8 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/w.wav differ diff --git a/assets/sounds/animal-crossing-speak/x.wav b/assets/sounds/animal-crossing-speak/x.wav new file mode 100644 index 00000000..d491ba96 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/x.wav differ diff --git a/assets/sounds/animal-crossing-speak/y.wav b/assets/sounds/animal-crossing-speak/y.wav new file mode 100644 index 00000000..0abd7376 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/y.wav differ diff --git a/assets/sounds/animal-crossing-speak/z.wav b/assets/sounds/animal-crossing-speak/z.wav new file mode 100644 index 00000000..9ba63cd9 Binary files /dev/null and b/assets/sounds/animal-crossing-speak/z.wav differ diff --git a/commands/text-edit/animal-crossing-speak.js b/commands/text-edit/animal-crossing-speak.js new file mode 100644 index 00000000..cdca2b8c --- /dev/null +++ b/commands/text-edit/animal-crossing-speak.js @@ -0,0 +1,60 @@ +const { Command } = require('discord.js-commando'); +const path = require('path'); +const { wait } = require('../../util/Util'); + +module.exports = class AnimalCrossingSpeakCommand extends Command { + constructor(client) { + super(client, { + name: 'animal-crossing-speak', + aliases: ['animal-crossing-speech', 'ac-speak', 'ac-speech'], + group: 'text-edit', + memberName: 'animal-crossing-speak', + description: 'Converts text to Animal Crossing Speak.', + guildOnly: true, + throttling: { + usages: 1, + duration: 10 + }, + args: [ + { + key: 'text', + prompt: 'What text do you want to say?', + type: 'string', + parse: text => text.toLowerCase() + } + ] + }); + } + + 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.'); + try { + const connection = await channel.join(); + for (const letter of text.split('')) { + if (letter === ' ') await wait(500); + else if (!/[a-z0-9]/.test(letter)) await this.playLetter(connection, 'unknown'); + else await this.playLetter(connection, letter); + } + channel.leave(); + return null; + } catch (err) { + channel.leave(); + return msg.reply(`Oh no, an error occurred: \`${err.message}\`. Try again later!`); + } + } + + playLetter(connection, letter) { + const letterPath = path.join(__dirname, '..', '..', 'assets', 'sounds', 'animal-crossing-speak', `${letter}.wav`); + return new Promise((res, rej) => { + const dispatcher = connection.playFile(letterPath); + dispatcher.once('end', reason => res(reason)); + dispatcher.once('error', err => rej(err)); + }); + } +}; diff --git a/commands/text-edit/binary.js b/commands/text-edit/binary.js index c45bf1e4..754c1224 100644 --- a/commands/text-edit/binary.js +++ b/commands/text-edit/binary.js @@ -1,5 +1,6 @@ const { Command } = require('discord.js-commando'); -const { pad } = require('../../util/Util'); +const { list, pad } = require('../../util/Util'); +const modes = ['encode', 'decode']; module.exports = class BinaryCommand extends Command { constructor(client) { @@ -9,6 +10,17 @@ module.exports = class BinaryCommand extends Command { memberName: 'binary', description: 'Converts text to binary.', args: [ + { + key: 'mode', + prompt: `Would you like to ${list(modes, 'or')}?`, + type: 'string', + format: `<${modes.join('|')}>`, + validate: mode => { + if (modes.includes(mode.toLowerCase())) return true; + return `Invalid mode, please enter either ${list(modes, 'or')}.`; + }, + parse: mode => mode.toLowerCase() + }, { key: 'text', prompt: 'What text would you like to convert to binary?', @@ -22,14 +34,19 @@ module.exports = class BinaryCommand extends Command { }); } - run(msg, { text }) { - return msg.say(this.binary(text)); + run(msg, { mode, text }) { // eslint-disable-line consistent-return + if (mode === 'encode') return msg.say(this.binary(text)); + else if (mode === 'decode') return msg.say(this.unbinary(text)); } binary(text) { return text.split('').map(str => { const converted = str.charCodeAt(0).toString(2); return pad(converted, '00000000'); - }).join(''); + }).join(' '); + } + + unbinary(text) { + return text.split(' ').map(str => String.fromCharCode(parseInt(str, 2))).join(''); } }; diff --git a/commands/text-edit/qr-code.js b/commands/text-edit/qr-code.js index 96a98444..d7631c9c 100644 --- a/commands/text-edit/qr-code.js +++ b/commands/text-edit/qr-code.js @@ -22,10 +22,7 @@ module.exports = class QRCodeCommand extends Command { try { const { body } = await snekfetch .get('https://api.qrserver.com/v1/create-qr-code/') - .query({ - data: text, - size: '500x500' - }); + .query({ data: text }); return msg.say({ files: [{ attachment: body, name: 'qr-code.png' }] }); } catch (err) { return msg.reply(`Oh no, an error occurred: \`${err.message}\`. Try again later!`); diff --git a/package.json b/package.json index cedbf1b3..f75af8a1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "xiao", - "version": "59.0.0", + "version": "60.0.0", "description": "Your personal server companion.", "main": "Xiao.js", "scripts": {