diff --git a/.env.example b/.env.example index 59891e2..c58848a 100644 --- a/.env.example +++ b/.env.example @@ -11,6 +11,8 @@ TOKEN= MONGO=mongodb://localhost:27017/esmBot # Put snowflake ID of bot owner here OWNER= +# Put Lavalink password here +LAVAPASS=youshallnotpass ########### # Optional diff --git a/assets/audio/boat.opus b/assets/audio/boat.opus deleted file mode 100644 index a07d032..0000000 Binary files a/assets/audio/boat.opus and /dev/null differ diff --git a/assets/audio/boi.ogg b/assets/audio/boi.ogg new file mode 100644 index 0000000..8038dcd Binary files /dev/null and b/assets/audio/boi.ogg differ diff --git a/assets/audio/boi.opus b/assets/audio/boi.opus deleted file mode 100644 index bda7f67..0000000 Binary files a/assets/audio/boi.opus and /dev/null differ diff --git a/assets/audio/boom.ogg b/assets/audio/boom.ogg new file mode 100644 index 0000000..38b3479 Binary files /dev/null and b/assets/audio/boom.ogg differ diff --git a/assets/audio/bruh.ogg b/assets/audio/bruh.ogg new file mode 100644 index 0000000..6484950 Binary files /dev/null and b/assets/audio/bruh.ogg differ diff --git a/assets/audio/bruh.opus b/assets/audio/bruh.opus deleted file mode 100644 index 1619bea..0000000 Binary files a/assets/audio/bruh.opus and /dev/null differ diff --git a/assets/audio/bus.opus b/assets/audio/bus.opus deleted file mode 100644 index da36761..0000000 Binary files a/assets/audio/bus.opus and /dev/null differ diff --git a/assets/audio/explosion.ogg b/assets/audio/explosion.ogg new file mode 100644 index 0000000..e4dacc8 Binary files /dev/null and b/assets/audio/explosion.ogg differ diff --git a/assets/audio/explosion.opus b/assets/audio/explosion.opus deleted file mode 100644 index 7d2e7cb..0000000 Binary files a/assets/audio/explosion.opus and /dev/null differ diff --git a/assets/audio/fart.ogg b/assets/audio/fart.ogg new file mode 100644 index 0000000..75f0c56 Binary files /dev/null and b/assets/audio/fart.ogg differ diff --git a/assets/audio/fart.opus b/assets/audio/fart.opus deleted file mode 100644 index 26d1c21..0000000 Binary files a/assets/audio/fart.opus and /dev/null differ diff --git a/assets/audio/fbi.ogg b/assets/audio/fbi.ogg new file mode 100644 index 0000000..594c0de Binary files /dev/null and b/assets/audio/fbi.ogg differ diff --git a/assets/audio/fbi.opus b/assets/audio/fbi.opus deleted file mode 100644 index 64d8650..0000000 Binary files a/assets/audio/fbi.opus and /dev/null differ diff --git a/assets/audio/gethelp.opus b/assets/audio/gethelp.opus deleted file mode 100644 index 483e77b..0000000 Binary files a/assets/audio/gethelp.opus and /dev/null differ diff --git a/assets/audio/mail.ogg b/assets/audio/mail.ogg new file mode 100644 index 0000000..d7260c7 Binary files /dev/null and b/assets/audio/mail.ogg differ diff --git a/assets/audio/mail.opus b/assets/audio/mail.opus deleted file mode 100644 index 6936ccd..0000000 Binary files a/assets/audio/mail.opus and /dev/null differ diff --git a/assets/audio/oof.ogg b/assets/audio/oof.ogg new file mode 100644 index 0000000..58fbf64 Binary files /dev/null and b/assets/audio/oof.ogg differ diff --git a/assets/audio/oof.opus b/assets/audio/oof.opus deleted file mode 100644 index a4c01ce..0000000 Binary files a/assets/audio/oof.opus and /dev/null differ diff --git a/assets/audio/ping.ogg b/assets/audio/ping.ogg new file mode 100644 index 0000000..2f00d2f Binary files /dev/null and b/assets/audio/ping.ogg differ diff --git a/assets/audio/ping.opus b/assets/audio/ping.opus deleted file mode 100644 index 3d0b675..0000000 Binary files a/assets/audio/ping.opus and /dev/null differ diff --git a/assets/audio/prunejuice.opus b/assets/audio/prunejuice.opus deleted file mode 100644 index 1e2ab8a..0000000 Binary files a/assets/audio/prunejuice.opus and /dev/null differ diff --git a/assets/audio/winxp.opus b/assets/audio/winxp.ogg similarity index 100% rename from assets/audio/winxp.opus rename to assets/audio/winxp.ogg diff --git a/commands/boat.js b/commands/boat.js deleted file mode 100644 index fbd8c39..0000000 --- a/commands/boat.js +++ /dev/null @@ -1,9 +0,0 @@ -const playSound = require("../utils/soundplayer.js"); - -exports.run = async (message) => { - return playSound("./assets/audio/boat.opus", message); -}; - -exports.aliases = ["tape", "flextape", "phil", "philswift"]; -exports.category = 6; -exports.help = "Plays the Flex Tape boat sound effect"; \ No newline at end of file diff --git a/commands/boi.js b/commands/boi.js index bd033f9..12bef61 100644 --- a/commands/boi.js +++ b/commands/boi.js @@ -1,7 +1,7 @@ -const playSound = require("../utils/soundplayer.js"); +const soundPlayer = require("../utils/soundplayer.js"); exports.run = async (message) => { - return playSound("./assets/audio/boi.opus", message); + return soundPlayer.play("./assets/audio/boi.ogg", message); }; exports.aliases = ["boy", "neutron", "hugh"]; diff --git a/commands/boom.js b/commands/boom.js new file mode 100644 index 0000000..fa63fb4 --- /dev/null +++ b/commands/boom.js @@ -0,0 +1,9 @@ +const soundPlayer = require("../utils/soundplayer.js"); + +exports.run = async (message) => { + return soundPlayer.play("./assets/audio/boom.ogg", message); +}; + +exports.aliases = ["thud", "vine"]; +exports.category = 6; +exports.help = "Plays the Vine boom sound effect"; \ No newline at end of file diff --git a/commands/bruh.js b/commands/bruh.js index e165baa..9bbf0cf 100644 --- a/commands/bruh.js +++ b/commands/bruh.js @@ -1,7 +1,7 @@ -const playSound = require("../utils/soundplayer.js"); +const soundPlayer = require("../utils/soundplayer.js"); exports.run = async (message) => { - return playSound("./assets/audio/bruh.opus", message); + return soundPlayer.play("./assets/audio/bruh.ogg", message); }; exports.aliases = ["bro"]; diff --git a/commands/bus.js b/commands/bus.js deleted file mode 100644 index 06a24c6..0000000 --- a/commands/bus.js +++ /dev/null @@ -1,9 +0,0 @@ -const playSound = require("../utils/soundplayer.js"); - -exports.run = async (message) => { - return playSound("./assets/audio/bus.opus", message); -}; - -exports.aliases = ["noyelling", "busyell"]; -exports.category = 6; -exports.help = "Plays the \"no yelling on the bus\" sound effect"; \ No newline at end of file diff --git a/commands/explosion.js b/commands/explosion.js index 31b08d7..0f08378 100644 --- a/commands/explosion.js +++ b/commands/explosion.js @@ -1,7 +1,7 @@ -const playSound = require("../utils/soundplayer.js"); +const soundPlayer = require("../utils/soundplayer.js"); exports.run = async (message) => { - return playSound("./assets/audio/explosion.opus", message); + return soundPlayer.play("./assets/audio/explosion.ogg", message); }; exports.category = 6; diff --git a/commands/fakeping.js b/commands/fakeping.js index 69d95ab..b4b5be8 100644 --- a/commands/fakeping.js +++ b/commands/fakeping.js @@ -1,7 +1,7 @@ -const playSound = require("../utils/soundplayer.js"); +const soundPlayer = require("../utils/soundplayer.js"); exports.run = async (message) => { - return playSound("./assets/audio/ping.opus", message); + return soundPlayer.play("./assets/audio/ping.ogg", message); }; exports.aliases = ["notification", "notif"]; diff --git a/commands/fart.js b/commands/fart.js index 238fed6..c34f415 100644 --- a/commands/fart.js +++ b/commands/fart.js @@ -1,7 +1,7 @@ -const playSound = require("../utils/soundplayer.js"); +const soundPlayer = require("../utils/soundplayer.js"); exports.run = async (message) => { - return playSound("./assets/audio/fart.opus", message); + return soundPlayer.play("./assets/audio/fart.ogg", message); }; exports.aliases = ["toot"]; diff --git a/commands/fbi.js b/commands/fbi.js index 4cdebe4..c0bc49c 100644 --- a/commands/fbi.js +++ b/commands/fbi.js @@ -1,7 +1,7 @@ -const playSound = require("../utils/soundplayer.js"); +const soundPlayer = require("../utils/soundplayer.js"); exports.run = async (message) => { - return playSound("./assets/audio/fbi.opus", message); + return soundPlayer.play("./assets/audio/fbi.ogg", message); }; exports.aliases = ["openup"]; diff --git a/commands/mail.js b/commands/mail.js index e0f3c6a..d10563d 100644 --- a/commands/mail.js +++ b/commands/mail.js @@ -1,7 +1,7 @@ -const playSound = require("../utils/soundplayer.js"); +const soundPlayer = require("../utils/soundplayer.js"); exports.run = async (message) => { - return playSound("./assets/audio/mail.opus", message); + return soundPlayer.play("./assets/audio/mail.ogg", message); }; exports.aliases = ["yougotmail", "youvegotmail", "aol"]; diff --git a/commands/oof.js b/commands/oof.js index 6315b6f..ef05204 100644 --- a/commands/oof.js +++ b/commands/oof.js @@ -1,7 +1,7 @@ -const playSound = require("../utils/soundplayer.js"); +const soundPlayer = require("../utils/soundplayer.js"); exports.run = async (message) => { - return playSound("./assets/audio/oof.opus", message); + return soundPlayer.play("./assets/audio/oof.ogg", message); }; exports.aliases = ["roblox", "commitdie"]; diff --git a/commands/prunejuice.js b/commands/prunejuice.js deleted file mode 100644 index 41d4937..0000000 --- a/commands/prunejuice.js +++ /dev/null @@ -1,9 +0,0 @@ -const playSound = require("../utils/soundplayer.js"); - -exports.run = async (message) => { - return playSound("./assets/audio/prunejuice.opus", message); -}; - -exports.aliases = ["juice", "grandma"]; -exports.category = 6; -exports.help = "Plays the \"Drink yo prune juice\" sound effect"; \ No newline at end of file diff --git a/commands/winxp.js b/commands/winxp.js index f05be10..9eb702e 100644 --- a/commands/winxp.js +++ b/commands/winxp.js @@ -1,7 +1,7 @@ -const playSound = require("../utils/soundplayer.js"); +const soundPlayer = require("../utils/soundplayer.js"); exports.run = async (message) => { - return playSound("./assets/audio/winxp.opus", message); + return soundPlayer.play("./assets/audio/winxp.ogg", message); }; exports.aliases = ["windows", "xp"]; diff --git a/events/ready.js b/events/ready.js index 868e3f7..48105a2 100644 --- a/events/ready.js +++ b/events/ready.js @@ -7,6 +7,7 @@ const collections = require("../utils/collections.js"); const logger = require("../utils/logger.js"); const messages = require("../messages.json"); const misc = require("../utils/misc.js"); +const soundPlayer = require("../utils/soundplayer.js"); const helpGenerator = process.env.OUTPUT !== "" ? require("../utils/help.js") : null; const twitter = @@ -128,6 +129,8 @@ module.exports = async () => { }); }; + await soundPlayer.connect(); + // tweet stuff if (twitter !== null && twitter.active === false) { const blocks = await twitter.client.blocks.ids(); diff --git a/package-lock.json b/package-lock.json index b7a0faa..5e71ae2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,6 +24,30 @@ "js-tokens": "^4.0.0" } }, + "@lavacord/eris": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@lavacord/eris/-/eris-0.0.3.tgz", + "integrity": "sha512-o7w4pbiAFaB3m85RY/D73qRM45DWcdc4r4fB7QNWXRsZJqGHxgGc+VIvocL0MeOOCjgpxLt1uf4Iflv7xhngtQ==", + "requires": { + "lavacord": "^1.1.9" + }, + "dependencies": { + "lavacord": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/lavacord/-/lavacord-1.1.9.tgz", + "integrity": "sha512-haZghbblO1w3Hodc9q63ZWgV5zA/jB6xFKS17fImK5aIdn0PkKuZ6AsJBxMFpR275v8GNYOxg6cTQBYBQ+batQ==", + "requires": { + "node-fetch": "^2.6.0", + "ws": "^7.3.0" + } + }, + "ws": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", + "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==" + } + } + }, "@tokenizer/token": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.1.1.tgz", @@ -1438,6 +1462,22 @@ "colornames": "^1.1.1" } }, + "lavacord": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/lavacord/-/lavacord-1.1.9.tgz", + "integrity": "sha512-haZghbblO1w3Hodc9q63ZWgV5zA/jB6xFKS17fImK5aIdn0PkKuZ6AsJBxMFpR275v8GNYOxg6cTQBYBQ+batQ==", + "requires": { + "node-fetch": "^2.6.0", + "ws": "^7.3.0" + }, + "dependencies": { + "ws": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", + "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==" + } + } + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", diff --git a/package.json b/package.json index 286abc5..898551d 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "url": "git+https://github.com/TheEssem/esmBot.git" }, "dependencies": { + "@lavacord/eris": "0.0.3", "cowsay": "^1.4.0", "cron": "^1.8.2", "dblapi.js": "^2.4.0", @@ -27,6 +28,7 @@ "file-type": "^13.1.2", "gm": "github:TheEssem/gm", "jsqr": "^1.3.1", + "lavacord": "^1.1.9", "moment": "^2.26.0", "moment-duration-format": "^2.3.2", "mongoose": "^5.9.19", diff --git a/readme.md b/readme.md index 1844478..889e060 100644 --- a/readme.md +++ b/readme.md @@ -25,6 +25,8 @@ After that, you should install the rest of the dependencies using npm: npm install ``` +And set up Lavalink: https://github.com/Frederikam/Lavalink#server-configuration + Finally, fill in the info inside `.env.example`, rename it to `.env`, and run `app.js`. ## Credits diff --git a/utils/soundplayer.js b/utils/soundplayer.js index f448d84..0a82784 100644 --- a/utils/soundplayer.js +++ b/utils/soundplayer.js @@ -1,27 +1,47 @@ const client = require("./client.js"); const logger = require("./logger.js"); +const fetch = require("node-fetch"); +const { Manager } = require("@lavacord/eris"); -module.exports = async (sound, message) => { +const nodes = [ + { id: "1", host: "localhost", port: 2333, password: process.env.LAVAPASS } +]; + +let manager; + +exports.connect = async () => { + manager = new Manager(client, nodes, { + user: client.user.id + }); + const { length } = await manager.connect(); + logger.log(`Successfully connected to ${length} Lavalink node(s).`); + manager.on("error", (error, node) => { + logger.error(`An error occurred on Lavalink node ${node}: ${error}`); + }); +}; + +exports.play = async (sound, message) => { if (message.member.voiceState.channelID) { if (!message.channel.guild.members.get(client.user.id).permission.has("voiceConnect") || !message.channel.permissionsOf(client.user.id).has("voiceConnect")) return client.createMessage(message.channel.id, `${message.author.mention}, I can't join this voice channel!`); const voiceChannel = message.channel.guild.channels.get(message.member.voiceState.channelID); if (!voiceChannel.permissionsOf(client.user.id).has("voiceConnect")) return client.createMessage(message.channel.id, `${message.author.mention}, I don't have permission to join this voice channel!`); - const connection = await voiceChannel.join({ - opusOnly: true + const node = manager.idealNodes[0]; + const { tracks } = await fetch(`http://${node.host}:${node.port}/loadtracks?identifier=${sound}`, { headers: { Authorization: node.password } }).then(res => res.json()); + const connection = await manager.join({ + guild: voiceChannel.guild.id, + channel: voiceChannel.id, + node: node.id }); - if (connection.playing) return client.createMessage(message.channel.id, `${message.author.mention}, I'm already playing a sound!`); const playingMessage = await client.createMessage(message.channel.id, "🔊 Playing sound..."); - if (connection.playing) { - connection.stopPlaying(); - } - connection.play(sound); + await connection.play(tracks[0].track); connection.on("error", (error) => { - voiceChannel.leave(); + manager.leave(voiceChannel.guild.id); playingMessage.delete(); logger.error(error); }); - connection.once("end", () => { - voiceChannel.leave(); + connection.once("end", (data) => { + if (data.reason === "REPLACED") return; + manager.leave(voiceChannel.guild.id); playingMessage.delete(); }); } else {