diff --git a/discord.js b/discord.js index 9f71e86..59f62ea 100755 --- a/discord.js +++ b/discord.js @@ -1,28 +1,29 @@ // Import modules -const { Client } = require('discord.js'), - fs = require('fs'), - path = require('path'), - moment = require('moment'), - timers = require('./lib/timers.js'), - staticCommands = require('./lib/static-commands.js'), +const { Client } = require("discord.js"), + fs = require("fs"), + path = require("path"), + axios = require("axios"), + moment = require("moment"), + timers = require("./lib/timers.js"), + staticCommands = require("./lib/static-commands.js"), //cooldowns = require('./lib/cooldowns.js'), - ankhbotCommands = require('./lib/ankhbot-commands.js'), - config = require('./config.json'); + ankhbotCommands = require("./lib/ankhbot-commands.js"), + config = require("./config.json"); // Set up Discord client const client = new Client(); // Set up SFX -const sfxFilePath = path.join(__dirname, 'sfx'); +const sfxFilePath = path.join(__dirname, "sfx"); const allowedSfxChannels = new RegExp(config.allowedSfxChannels); -let playOptions = {volume: config.sfxVolume, passes: config.passes}; +let playOptions = { volume: config.sfxVolume, passes: config.passes }; let playing = false; // Read in sfx directory, filenames are the commands let sfxList = readSfxDirectory(sfxFilePath); // Watch directory for changes and update the list fs.watch(sfxFilePath, (eventType, filename) => { - if (eventType === 'rename') { + if (eventType === "rename") { sfxList = readSfxDirectory(sfxFilePath); } }); @@ -30,7 +31,7 @@ fs.watch(sfxFilePath, (eventType, filename) => { // @todo DRY this shit up // Read in fun facts -const funFactsFilePath = path.join(__dirname, 'conf', 'funfacts'); +const funFactsFilePath = path.join(__dirname, "conf", "funfacts"); let funFacts = parseLines(funFactsFilePath); fs.watchFile(funFactsFilePath, (curr, prev) => { if (curr.mtime !== prev.mtime) { @@ -39,7 +40,7 @@ fs.watchFile(funFactsFilePath, (curr, prev) => { }); // Read in ham facts -const hamFactsFilePath = path.join(__dirname, 'conf', 'hamfacts'); +const hamFactsFilePath = path.join(__dirname, "conf", "hamfacts"); let hamFacts = parseLines(hamFactsFilePath); fs.watchFile(hamFactsFilePath, (curr, prev) => { if (curr.mtime !== prev.mtime) { @@ -49,107 +50,139 @@ fs.watchFile(hamFactsFilePath, (curr, prev) => { // Set up the native commands to handle const commands = { - 'sfx': (msg, disconnectAfter) => { + sfx: (msg, disconnectAfter) => { if (!allowedSfxChannels.test(msg.channel.name)) return; - let sfx = msg.content.split(' ')[1]; - if (sfx == '' || sfx === undefined) return msg.channel.send('```'+sfxList.join(', ')+'```'); + let sfx = msg.content.split(" ")[1]; - if (playing === true) return msg.channel.send('Already playing, please wait.'); + // retrieve sfx list from pastebin + if (sfx == "" || sfx === undefined) { + axios + .get("https://pastebin.com/raw/vRsZxrrw") + .then(res => { + return msg.channel.send("```" + res.data + "```"); + }) + .catch(console.error); + + return true; + } + + if (playing === true) + return msg.channel.send("Already playing, please wait."); // make sure this file exists either as an mp3 or wav let sfxPath; - if (fs.existsSync(path.join(sfxFilePath, sfx + '.mp3'))) { - sfxPath = path.join(sfxFilePath, sfx + '.mp3'); - } else if (fs.existsSync(path.join(sfxFilePath, sfx + '.wav'))) { - sfxPath = path.join(sfxFilePath, sfx + '.wav'); + if (fs.existsSync(path.join(sfxFilePath, sfx + ".mp3"))) { + sfxPath = path.join(sfxFilePath, sfx + ".mp3"); + } else if (fs.existsSync(path.join(sfxFilePath, sfx + ".wav"))) { + sfxPath = path.join(sfxFilePath, sfx + ".wav"); } else { - return msg.reply('This sound effect does not exist!'); + return msg.reply("This sound effect does not exist!"); } - if (!msg.guild.voiceConnection) return joinVoiceChannel(msg).then(() => commands.sfx(msg, disconnectAfter)); + if (!msg.guild.voiceConnection) + return joinVoiceChannel(msg).then(() => + commands.sfx(msg, disconnectAfter) + ); - disconnectAfter = (typeof disconnectAfter !== "undefined") ? disconnectAfter : true; + disconnectAfter = + typeof disconnectAfter !== "undefined" ? disconnectAfter : true; playing = true; (function play(sfxFile) { - const dispatcher = msg.guild.voiceConnection.playFile(sfxFile, playOptions); - dispatcher.on('end', reason => { - playing = false; - if (disconnectAfter) msg.guild.voiceConnection.disconnect(); - }) - .on('error', error => { - playing = false; - if (disconnectAfter) msg.guild.voiceConnection.disconnect(); - }) - .on('start', () => {}); + const dispatcher = msg.guild.voiceConnection.playFile( + sfxFile, + playOptions + ); + dispatcher + .on("end", reason => { + playing = false; + if (disconnectAfter) msg.guild.voiceConnection.disconnect(); + }) + .on("error", error => { + playing = false; + if (disconnectAfter) msg.guild.voiceConnection.disconnect(); + }) + .on("start", () => {}); })(sfxPath.toString()); }, - 'funfact': (msg) => { + funfact: msg => { if (funFacts.length > 0) { // return random element from funFacts, unless one is specifically requested let el; - let req = parseInt(msg.content.split(' ')[1]); - if (Number.isNaN(req) || typeof funFacts[req-1] === 'undefined') { + let req = parseInt(msg.content.split(" ")[1]); + if (Number.isNaN(req) || typeof funFacts[req - 1] === "undefined") { el = Math.floor(Math.random() * funFacts.length); } else { el = req - 1; } - let displayNum = (el+1).toString(); - let funFact = funFacts[el] - msg.channel.send({embed: { - "title": "FunFact #"+displayNum, - "color": 0x21c629, - "description": funFact - }}).catch(console.error); + let displayNum = (el + 1).toString(); + let funFact = funFacts[el]; + msg.channel + .send({ + embed: { + title: "FunFact #" + displayNum, + color: 0x21c629, + description: funFact + } + }) + .catch(console.error); } else { msg.channel.send("No fun facts found!"); } }, - 'hamfact': (msg) => { + hamfact: msg => { if (hamFacts.length > 0) { // return random element from hamFacts, unless one is specifically requested let el; - let req = parseInt(msg.content.split(' ')[1]); - if (Number.isNaN(req) || typeof hamFacts[req-1] === 'undefined') { + let req = parseInt(msg.content.split(" ")[1]); + if (Number.isNaN(req) || typeof hamFacts[req - 1] === "undefined") { el = Math.floor(Math.random() * hamFacts.length); } else { el = req - 1; } - let displayNum = (el+1).toString(); - let hamFact = hamFacts[el] - msg.channel.send({embed: { - "title": "HamFact #"+displayNum, - "color": 0x21c629, - "description": hamFact - }}).catch(console.error); + let displayNum = (el + 1).toString(); + let hamFact = hamFacts[el]; + msg.channel + .send({ + embed: { + title: "HamFact #" + displayNum, + color: 0x21c629, + description: hamFact + } + }) + .catch(console.error); } else { msg.channel.send("No ham facts found!"); } }, - 'dance': (msg) => { - msg.channel.send("*┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛ ┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛ ┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛ ┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛*"); + dance: msg => { + msg.channel.send( + "*┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛ ┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛ ┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛ ┏(-_-)┓┏(-_-)┛┗(-_- )┓┗(-_-)┛┏(-_-)┛*" + ); }, - 'join': (msg) => { - if (!msg.guild.voiceConnection) { - joinVoiceChannel(msg).then(() => { - // - }).catch(console.error); + join: msg => { + if (!msg.guild.voiceConnection) { + joinVoiceChannel(msg) + .then(() => { + // + }) + .catch(console.error); } else { return msg.reply(`I'm already in a voice channel!`); } }, - 'leave': (msg) => { - if (msg.guild.voiceConnection) { - msg.content = '!sfx bye'; + leave: msg => { + if (msg.guild.voiceConnection) { + msg.content = "!sfx bye"; commands.sfx(msg); //msg.guild.voiceConnection.disconnect(); } else { return msg.reply(`If ya don't eat your meat, ya can't have any pudding!`); } }, - 'listen': (msg) => { + listen: msg => { // listen for a particular member to speak and respond appropriately if (msg.guild.voiceConnection) { // get the guild member @@ -160,103 +193,125 @@ const commands = { let listenInterval = 1000; setInterval(() => { if (guildMember.speaking === true) { - msg.content = '!sfx stfu'; + msg.content = "!sfx stfu"; commands.sfx(msg, false); } }, listenInterval); } else { - console.error(`Could not find specified guild member: ${guildMemberId}!`); + console.error( + `Could not find specified guild member: ${guildMemberId}!` + ); msg.guild.voiceConnection.disconnect(); } } else { // join the voice channel then call this command again - joinVoiceChannel(msg).then(() => { - commands.listen(msg); - }).catch(console.error); + joinVoiceChannel(msg) + .then(() => { + commands.listen(msg); + }) + .catch(console.error); } }, - 'reboot': (msg) => { + reboot: msg => { if (msg.author.id == config.adminID) process.exit(); //Requires a node module like Forever to work. } }; // Wait for discord to be ready, handle messages -client.on('ready', () => { - console.log(`${config.botName} is connected and ready`); - let botChannel = client.channels.find('name', config.botChannel); -// Listen for commands for the bot to respond to across all channels -}).on('message', msg => { - msg.originalContent = msg.content; - msg.content = msg.content.toLowerCase(); +client + .on("ready", () => { + console.log(`${config.botName} is connected and ready`); + let botChannel = client.channels.find("name", config.botChannel); + // Listen for commands for the bot to respond to across all channels + }) + .on("message", msg => { + msg.originalContent = msg.content; + msg.content = msg.content.toLowerCase(); - // Make sure it starts with the configured prefix - if (!msg.content.startsWith(config.prefix)) return; + // Make sure it starts with the configured prefix + if (!msg.content.startsWith(config.prefix)) return; - // And that it's not on cooldown - /*let cooldownKey = config.botName + msg.content + msg.channel.id; + // And that it's not on cooldown + /*let cooldownKey = config.botName + msg.content + msg.channel.id; cooldowns.get(cooldownKey, config.textCmdCooldown) .then(onCooldown => { if (onCooldown === false) {*/ - // Not on CD, check for native or static command - let commandNoPrefix = msg.content.slice(config.prefix.length).split(' ')[0]; - console.log(`'${commandNoPrefix}' received in #${msg.channel.name} from @${msg.author.username}`); + // Not on CD, check for native or static command + let commandNoPrefix = msg.content.slice(config.prefix.length).split(" ")[0]; + console.log( + `'${commandNoPrefix}' received in #${msg.channel.name} from @${msg.author.username}` + ); - // check for native command first - if (commands.hasOwnProperty(commandNoPrefix)) { - commands[commandNoPrefix](msg); - // then a static command we've manually added - } else if (staticCommands.exists(commandNoPrefix)) { - let result = staticCommands.get(commandNoPrefix); - msg.channel.send({embed: { - "title": commandNoPrefix, - "color": 0x21c629, - "description": result - }}).then(sentMessage => {}/*cooldowns.set(cooldownKey, config.textCmdCooldown)*/) - .catch(console.error); - // then a command exported from ankhbot - } else if (ankhbotCommands.exists(commandNoPrefix)) { - let result = ankhbotCommands.get(commandNoPrefix); - msg.channel.send({embed: { - "title": commandNoPrefix, - "color": 0x21c629, - "description": result - }}).then(sentMessage => {}/*cooldowns.set(cooldownKey, config.textCmdCooldown)*/) - .catch(console.error); - } else { - // Not a command we recognize, ignore - } - /*} else { + // check for native command first + if (commands.hasOwnProperty(commandNoPrefix)) { + commands[commandNoPrefix](msg); + // then a static command we've manually added + } else if (staticCommands.exists(commandNoPrefix)) { + let result = staticCommands.get(commandNoPrefix); + msg.channel + .send({ + embed: { + title: commandNoPrefix, + color: 0x21c629, + description: result + } + }) + .then( + sentMessage => {} /*cooldowns.set(cooldownKey, config.textCmdCooldown)*/ + ) + .catch(console.error); + // then a command exported from ankhbot + } else if (ankhbotCommands.exists(commandNoPrefix)) { + let result = ankhbotCommands.get(commandNoPrefix); + msg.channel + .send({ + embed: { + title: commandNoPrefix, + color: 0x21c629, + description: result + } + }) + .then( + sentMessage => {} /*cooldowns.set(cooldownKey, config.textCmdCooldown)*/ + ) + .catch(console.error); + } else { + // Not a command we recognize, ignore + } + /*} else { // DM the user that it's on CD dmUser(msg, `**${msg.content}** is currently on cooldown for another *${onCooldown} seconds!*`); } }) .catch(console.error);*/ -}).login(config.d_token); + }) + .login(config.d_token); -function readSfxDirectory(path) -{ +function readSfxDirectory(path) { let sfxList = fs.readdirSync(sfxFilePath); sfxList.forEach(function(el, index, a) { - a[index] = el.split('.')[0]; + a[index] = el.split(".")[0]; }); return sfxList; } -function joinVoiceChannel(msg) -{ +function joinVoiceChannel(msg) { return new Promise((resolve, reject) => { const voiceChannel = msg.member.voiceChannel; - if (!voiceChannel || voiceChannel.type !== 'voice') return msg.reply('I couldn\'t connect to your voice channel...'); - voiceChannel.join().then(connection => resolve(connection)).catch(err => reject(err)); + if (!voiceChannel || voiceChannel.type !== "voice") + return msg.reply("I couldn't connect to your voice channel..."); + voiceChannel + .join() + .then(connection => resolve(connection)) + .catch(err => reject(err)); }); } // Read/parse text lines from a file -function parseLines(filePath) -{ +function parseLines(filePath) { let lines = []; - let data = fs.readFileSync(filePath, 'utf-8'); - let splitLines = data.toString().split('\n'); + let data = fs.readFileSync(filePath, "utf-8"); + let splitLines = data.toString().split("\n"); splitLines.forEach(function(line) { if (line.length > 0) { lines.push(line); @@ -265,13 +320,13 @@ function parseLines(filePath) return lines; } -function dmUser(originalMessage, newMessage) -{ +function dmUser(originalMessage, newMessage) { // check that this isn't already a DM before sending - if (originalMessage.channel.type === 'dm') { + if (originalMessage.channel.type === "dm") { originalMessage.channel.send(newMessage); } else { - originalMessage.member.createDM() + originalMessage.member + .createDM() .then(channel => { channel.send(newMessage); }) @@ -280,4 +335,4 @@ function dmUser(originalMessage, newMessage) } // catch Promise errors -process.on('unhandledRejection', console.error); \ No newline at end of file +process.on("unhandledRejection", console.error); diff --git a/fgfm.TODO b/fgfm.TODO deleted file mode 100755 index 24c6aad..0000000 --- a/fgfm.TODO +++ /dev/null @@ -1,108 +0,0 @@ -TODO: - ☐ Web interface for viewers to issue commands - ☐ Organized room / video list, one-click add-to-queue - ☐ Admin panel on website for control - ☐ Add support for a command to mute/unmute audio sources - ☐ Don't re-create queue on start if it already exists - ☐ Handle socket disconnect - ☐ Decouple twitch chat from GHOBS - ☐ Move anything that calls director.state from app into fgfm lib - ☐ Restrict # of requests a user can have in the queue at once - ☐ Room vid requests / import - ☐ Improved interface for viewer requests - ☐ Web interface? Twitch extension? - ☐ Improvements - ☐ When playing a room back, loop it at slower speeds for a few iterations - ☐ Support adding sets of videos to the queue at once (like the entire ttas or all gold segments) - ☐ Tool to output list of video ID's / descriptions - ☐ Stream alerts for chat - ☐ Rotating background images (leftside) - ☐ Support gif's via command through gifph - - !slowdance - - !bender - - !carlton - - !weeb - ☐ Fix commercial playing issue (switches back to scene early) - ☐ Change $auw and $meme to queue up the videos just like the others (don't switch scenes) - ☐ Stats tracking for games - ☐ Most won/lost gambling - ☐ Most trivia answered - ☐ Last time jackpot was hit - ☐ Allow %'s for !gamble - ☐ Make a separate twitch user for the stream bot - -Ideas: - -StreamWebRemote: - - OBS Websocket Connection Mgmt - - Stream Start/Stop/Restart - - Video Queue Mgmt - - Video DB Mgmt - Users: - - use twitch login - - video requests - - room requests - -___________________ -Archive: - ✔ Spotify integration @done (18-12-28 17:46) @project(TODO) - ✔ shuffle on/off @done (18-12-11 11:22) @project(TODO) - ✔ repeat mode control @done (18-12-11 11:22) @project(TODO) - ✔ ability to change the playlist (setplaylist ) @done (18-12-11 10:52) @project(TODO) - ✔ volume -- volume adjustment @done (18-12-04 19:49) @project(TODO) - ✔ pause / resume @done (18-12-04 11:49) @project(TODO) - ✔ skip -- mods auto-skip @done (18-12-04 11:47) @project(TODO) - ✔ song -- display current song + link @done (18-12-04 11:24) @project(TODO) - ✔ playlist -- display current context / album @done (18-12-04 11:24) @project(TODO) - ✔ Stop @done (18-11-06 21:54) @project(TODO) - ✔ video starting/ending/skipped @done (18-11-06 21:53) @project(TODO) - ✔ show status changing @done (18-11-06 21:53) @project(TODO) - ✔ Have director emit events for bots to listen to @done (18-11-06 21:53) @project(TODO) - ✔ Auto-enable vrmode timer when show starts (listen for event) @done (18-11-06 21:53) @project(TODO) - ✔ hide sources before switching to credits @done (18-11-06 21:41) @project(TODO) - ✔ Support a delay for Start Streaming @done (18-11-06 21:41) @project(TODO) - ✔ Add a $rooms alias for $room @done (18-11-06 15:05) @project(TODO) - ✔ Remove currently playing video from vote choices @done (18-10-30 11:51) @project(TODO) - ✔ track votes for the current playing video @done (18-10-30 11:48) @project(TODO) - ✔ if threshold is met, skip @done (18-10-30 11:48) @project(TODO) - ✔ config item for how many votes are required to skip @done (18-10-30 11:48) @project(TODO) - ✔ clear votes after video finishes @done (18-10-30 11:48) @project(TODO) - ✔ Support viewer $skip voting @done (18-10-30 11:48) @project(TODO) - ✔ update director showStatus to 'PAUSED' @done (18-10-30 11:33) @project(TODO) - ✔ have nextVideo check for PAUSED @done (18-10-30 11:33) @project(TODO) - ✔ Support for $pause (pauses queue after current video finishes) @done (18-10-30 11:33) @project(TODO) - ✔ Move vrmode timer to this bot, delete from SLCB @done (18-10-30 11:20) @project(TODO) - ✔ Don't auto-init GHOBS or FGFM, make them on-demand @done (18-10-30 08:26) @project(TODO) - ✔ Switch to credits with 1 minute remaining @done (18-10-30 08:15) @project(TODO) - ✔ Stop Stream @done (18-10-30 08:15) @project(TODO) - ✔ Stop @done (18-10-30 08:15) @project(TODO) - ✔ Parameter for how long until the stream should end @done (18-10-30 08:15) @project(TODO) - ✔ Fade out audio sources with 5 seconds left @done (18-10-30 08:15) @project(TODO) - ✔ Add parameter for countdown @done (18-10-30 08:15) @project(TODO) - ✔ Set up the queue upon init so it can be managed during startup @done (18-10-30 08:14) @project(TODO) - ✔ Starting Soon is shown until countdown is triggered @done (18-10-26 09:44) @project(TODO) - ✔ Start stream @done (18-10-26 09:44) @project(TODO) - ✔ Add cooldowns @done (18-10-02 10:16) @project(TODO) - ✔ video length @done (18-09-28 09:33) @project(TODO) - ✔ root folder name @done (18-09-28 09:33) @project(TODO) - ✔ room ID @done (18-09-28 09:33) @project(TODO) - ✔ original file name @done (18-09-28 09:33) @project(TODO) - ✔ keywords @done (18-09-28 09:33) @project(TODO) - ✔ dungeon (parse from root folder name) @done (18-09-28 09:33) @project(TODO) - ✔ Store the following as metadata: @done (18-09-28 09:33) @project(TODO) - ✔ Read the Y:\media\videos\ALttP\my-vids\room-vids directory @done (18-09-28 09:33) @project(TODO) - ✔ Go through each folder and get all the .mp4 files @done (18-09-28 09:33) @project(TODO) - ✔ Look into just making the video loop instead of hiding at the end @done (18-09-26 18:29) @project(TODO) - ✔ specify # of loops in video object @done (18-09-26 18:28) @project(TODO) - ✔ change source to loop? calculate time? @done (18-09-26 18:28) @project(TODO) - ✔ Update the queue to support looping @done (18-09-26 18:28) @project(TODO) - ✔ Fix queue to only return first 20 or so @done (18-09-26 12:04) @project(TODO) - ✔ Importing @done (18-09-26 08:25) @project(TODO) - ✔ Move vods to their own config @done (18-09-25 15:40) @project(TODO) - ✔ Modularize OBS and Twitch code @done (18-09-25 15:39) @project(TODO) - ✔ Ability to include/exclude vods from shuffle in config @done (18-09-25 15:39) @project(TODO) - ✔ Add random chance for room grind playlist to show for certain amount of time @done (18-09-21 12:28) @project(TODO) - ✔ show commercials after a video length cap is hit -- show at conclusion of video @done (18-09-19 11:11) @project(TODO) - ✔ add memes to commercial scene @done (18-09-19 11:11) @project(TODO) - ✔ add $setcurrent support (to update text label through obs websocket instead of chat) @done (18-09-17 18:06) @project(TODO) - ✔ remember the last X vids played, remove these from shuffle choices @done (18-09-17 14:34) @project(TODO) diff --git a/fgfm.js b/fgfm.js deleted file mode 100755 index af8a10c..0000000 --- a/fgfm.js +++ /dev/null @@ -1,730 +0,0 @@ -/** - * FG.fm Automation - */ - -// Import 3rd party packages -const irc = require('irc'); -const schedule = require('node-schedule'); -const md5 = require('md5'); -const moment = require('moment'); - -// Import local packages -const GHOBS = require('./lib/ghobs'); -const FGFM = require('./lib/fgfm'); -const cooldowns = require('./lib/cooldowns'); -const util = require('./lib/util'); -const Spotify = require('./lib/spotify'); - -// Read internal configuration -let config = require('./config.json'); -config.vods = require(config.vodConfigFile); -config.rooms = require(config.roomConfigFile); -let snesGames = require('./conf/snesgames.json'); -let timersList = require('./conf/timers.json'); - -let activeTimers = []; -let skipVote = {target: null, count: 0}; - -// Main screen turn on -const obs = new GHOBS(config); -obs.init() -.then(() => twitchInit(config.twitch)) -.then(twitch => streamInit(config, twitch)) -.catch(console.error); - -// Connect to twitch, set up basic event listeners -const twitchInit = (config) => { - return new Promise((resolve, reject) => { - let controlRoom = `#chatrooms:${config.channelId}:${config.controlRoomId}`; - - console.log(`Connecting to Twitch / ${config.channel} / ${controlRoom}`); - - let defaultTwitchConfig = { - autoRejoin: true, - retryCount: 10, - channels: [config.channel, controlRoom], - debug: config.debug - }; - - // Connect to Twitch with the bot account - let botChat = new irc.Client( - config.ircServer, - config.botLogin.username, - Object.assign({password: config.botLogin.oauth}, defaultTwitchConfig) - ); - - // Connect to Twitch with an editor account - let editorChat = new irc.Client( - config.ircServer, - config.editorLogin.username, - Object.assign({password: config.editorLogin.oauth}, defaultTwitchConfig) - ); - - let twitchErrorHandler = message => { - if (message.command != 'err_unknowncommand') { - console.error('Error from Twitch IRC Server: ', message); - } - }; - - // Set up bare minimum event listeners for Twitch - botChat.addListener('error', twitchErrorHandler); - editorChat.addListener('error', twitchErrorHandler); - - resolve({"botChat": botChat, "editorChat": editorChat, "controlRoom": controlRoom}); - }); -}; - -// Initialize Stream automation -const streamInit = (config, twitch) => { - - // All your comfy are belong to us - const director = new FGFM({config: config, obs: obs}); - - // Handle show events from the director - director.on('SHOW_STARTED', () => { - manageTimer('vr', 'on'); - }); - director.on('SHOW_PAUSED', () => { - manageTimer('vr', 'off'); - }); - director.on('SHOW_RESUMED', () => { - manageTimer('vr', 'on'); - }); - - director.on('SHOW_ENDING', (secondsUntilCredits) => { - manageTimer('vr', 'off'); - - // Let the chat know the stream is ending soon - twitch.botChat.say(config.twitch.channel, `The stream will be ending in ${parseFloat(secondsUntilCredits/60).toFixed(0)} minutes!`); - }); - - director.on('CREDITS_SHOWN', (secondsUntilEnd) => { - twitch.editorChat.say(config.twitch.channel, `Thanks to everyone for watching and lurking! Have a wonderful night and stay comfy. greenhComfy`); - }); - - // Spotify integration - const spotify = new Spotify(config.spotify); - spotify.init(); - - // Chat commands - const commands = { - admin: { - - init: (cmd) => { - let streamStartDelaySeconds = cmd.args[1] || 1; - let showStartDelaySeconds = cmd.args[2] || 300; - - director.startingSoon(streamStartDelaySeconds, showStartDelaySeconds); - }, - - - start: (cmd) => { - director.startTheShow(); - }, - - - end: (cmd) => { - let creditsDelay = cmd.args[1] || 1; - let endDelay = cmd.args[2] || 60; - director.endTheShow(creditsDelay, endDelay); - }, - - - changevis: (cmd, newVisibility) => { - let sceneItem = command.args[1] || false; - if (!sceneItem) { - twitch.botChat.say(cmd.to, `A scene item name is required!`); - return; - } - - let sceneOrGroup = command.args[2] || obs.currentScene; - obs.setVisible(sceneItem, sceneOrGroup, newVisibility).catch(console.error); - }, - - - show: (cmd) => { - commands.admin.changevis(cmd, true); - }, - - - hide: (cmd) => { - commands.admin.changevis(cmd, false); - }, - - - t: (cmd) => { - let sceneItem = cmd.args[1] || false; - if (!sceneItem) { - twitch.botChat.say(cmd.to, `A scene item name is required!`); - return; - } - - obs.toggleVisible(sceneItem).catch(console.error); - }, - - - timer: (cmd) => { - let timerName = cmd.args[1] || false; - if (!timerName) { - twitch.botChat.say(cmd.to, `A timer name is required!`); - return; - } - - let timerStatus = cmd.args[2] || false; - - try { - manageTimer(timerName, timerStatus); - } catch (e) { - twitch.botChat.say(cmd.to, e); - } - }, - - - auw: (cmd) => { - director.showMeme('auw'); - }, - - - meme: (cmd) => { - let memeId = cmd.args[1] || false; - if (memeId) { - console.log(`${memeId} meme requested by ${cmd.from}`); - if ( config.vods.memes.findIndex(e => e.id === memeId) === -1) { - twitch.botChat.say(cmd.to, `No meme with that ID exists!`); - return; - } - } else { - memeId = config.vods.memes.sort(util.randSort)[0].id; - console.log(`${memeId} meme randomly selected`); - } - - director.showMeme(memeId); - }, - - - switch: (cmd) => { - let newScene = cmd.args[1] || false; - if (!newScene) { - twitch.botChat.say(cmd.to, `A scene name is required!`); - return; - } - - obs.switchToScene(newScene).catch(console.error); - }, - - - setact: (cmd) => { - let newActivity = cmd.args.slice(1).join(' '); - if (!newActivity) { - twitch.botChat.say(cmd.to, `Please provide a new activity`); - return; - } - - obs.showActivity(newActivity).catch(console.error); - }, - - - showact: (cmd) => { - obs.showActivity().catch(console.error); - }, - - - hideact: (cmd) => { - obs.hideActivity().catch(console.error); - }, - - - add: (cmd) => { - // @TODO: DRY this out with the checks in vr - let requestedVideoId = cmd.args[1] || false; - if (requestedVideoId === false) { - twitch.botChat.say(cmd.to, `Missing video ID`); - return; - } - - // make sure request vid isn't in the queue already - // @TODO: Move into FGFM - if (director.state.videoQueue.findIndex(e => e.id == requestedVideoId) !== -1) { - twitch.botChat.say(cmd.to, `That video is in the queue already!`); - return; - } - - // search for req'd vid by id in config.vods.alttp - let vodIndex = config.vods.alttp.findIndex(e => e.id == requestedVideoId); - if (vodIndex === -1) { - twitch.botChat.say(cmd.to, `A video with that ID does not exist!`); - return; - } - - // add to queue if it exists - // @TODO: Move into FGFM - if (director.addVideo(config.vods.alttp[vodIndex])) { - twitch.botChat.say(cmd.to, `${config.vods.alttp[vodIndex].chatName} has been added to the queue [${director.state.videoQueue.length}]`); - } else { - twitch.botChat.say(cmd.to, `Video could not be added to queue!`); - } - }, - - - skip: (cmd) => { - director.skip(); - }, - - - pause: (cmd) => { - director.pause(); - }, - - - resume: (cmd) => { - director.resume(); - }, - - - clear: (cmd) => { - director.clearQueue(); - }, - - - startvote: (cmd) => { - videoVoteJob.reschedule(`*/${config.videoPollIntervalMinutes} * * * *`); - twitch.botChat.say(cmd.to, `Video Queue Voting will start in ${config.videoPollIntervalMinutes} minutes!`); - }, - - - pausevote: (cmd) => { - clearInterval(rtvInterval); - videoVoteJob.cancel(); - twitch.botChat.say(cmd.to, `Video Queue Voting has been paused.`); - }, - - - songskip: (cmd) => { - spotify.skip(); - }, - - songpause: (cmd) => { - spotify.pause(); - }, - - songresume: (cmd) => { - spotify.resume(); - }, - - songvol: (cmd) => { - let volume = parseInt(cmd.args[1]) || 100; - spotify.setVolume(volume) - .then(res => twitch.botChat.say(cmd.to, `Volume set to ${volume}`)) - .catch(err => twitch.botChat.say(cmd.to, `Error setting spotify volume: ${JSON.stringify(err)}`)); - }, - - songplay: (cmd) => { - let url = cmd.args[1] || false; - if (url === false) { - return twitch.botChat.say(cmd.to, `You must provide a link to a spotify playlist or album!`); - } - - // parse+validate url - let spotifyUri = false; - - // check for native spotify URI first - if (url.includes('spotify:')) { - let parsedUrl = url.match(/spotify:(playlist|album):([A-Za-z0-9]{22})/); - if (parsedUrl !== null) { - spotifyUri = parsedUrl[0]; - } - } else if (url.includes('spotify.com')) { - // determine if it's an album or playlist - if (!url.includes('/playlist/') && !url.includes('/album/')) { - return twitch.botChat.say(cmd.to, `Spotify URL must be a playlist or album!`); - } - - // parse the URL to get the resource type and ID - let parsedUrl = url.match(/(playlist|album)\/([A-Za-z0-9]{22})/); - if (parsedUrl !== null) { - spotifyUri = `spotify:${parsedUrl[1]}:${parsedUrl[2]}`; - } else { - return twitch.botChat.say(cmd.to, `Unable to parse spotify URL!`); - } - } else { - return twitch.botChat.say(cmd.to, `Invalid spotify URL!`); - } - - if (spotifyUri !== false) { - spotify.playContext(spotifyUri) - .then(res => twitch.botChat.say(cmd.to, `Changed playlist!`)) - .catch(err => twitch.botChat.say(cmd.to, `Error changing playlist: ${JSON.stringify(err)}`)); - } else { - return twitch.botChat.say(cmd.to, `Unable to parse Spotify URL!`); - } - }, - - songshuffle: (cmd) => { - let state = cmd.args[1] || true; - - if (state === 'off' || state === 'false') { - state = false; - } else { - state = true; - } - - spotify.shuffle(state) - .then(res => twitch.botChat.say(cmd.to, `Updated shuffle state!`)) - .catch(err => twitch.botChat.say(cmd.to, `Error changing shuffle state: ${JSON.stringify(err)}`)) - }, - - songrepeat: (cmd) => { - let state = cmd.args[1] || false; - if (state === false) { - return twitch.botChat.say(cmd.to, `You must provide a repeat mode (track, context, or off)!`); - } - - if (!['track', 'context', 'off'].includes(state)) { - return twitch.botChat.say(cmd.to, `You must provide a valid repeat mode (track, context, or off)!`); - } - - spotify.repeat(state) - .then(res => twitch.botChat.say(cmd.to, `Updated repeat mode!`)) - .catch(err => twitch.botChat.say(cmd.to, `Error changing repeat mode: ${JSON.stringify(err)}`)) - }, - - reboot: (cmd) => { - console.log('Received request from admin to reboot...'); - twitch.botChat.say(cmd.to, 'Rebooting...'); - process.exit(0); // requires process manager with autoreboot to work - } - }, - - user: { - - vote: (cmd) => { - let userVote = cmd.args[1] || false; - - if (userVote === false) { - rockTheVote(); - return; - } - - userVote = Number.parseInt(userVote); - - if (!Number.isInteger(userVote) || userVote < 1 || userVote > currentChoices.length) { - return twitch.botChat.say(cmd.to, `@${from}, please choose an option from 1 - ${currentChoices.length}!`); - } - - // Check for uniqueness of vote - // if it's not unique, update the vote - let prevVote = userVotes.findIndex(e => e.from === from); - if (prevVote !== -1) { - if (userVotes[prevVote].vote !== userVote) { - // update vote and inform the user - userVotes[prevVote].vote = userVote; - twitch.botChat.say(cmd.to, `@${from}, your vote has been updated!`); - } else { - twitch.botChat.say(cmd.to, `@${from}, your vote is already in!`); - } - } else { - // log user vote - userVotes.push({"from": from, "vote": userVote}); - twitch.botChat.say(cmd.to, `@${from}, your vote has been logged!`); - } - }, - - - queue: (cmd) => { - // @TODO: Move into FGFM - if (director.state.videoQueue.length > 0) { - let chatQueue = director.state.videoQueue.slice(0, 10).map((c, i) => { - return `[${i+1}] ${c.chatName}`; - }); - twitch.botChat.say(cmd.to, chatQueue.join(' | ')); - } else { - twitch.botChat.say(cmd.to, `No videos currently in queue!`); - } - }, - - - current: (cmd) => { - // @TODO: Move retrieval of currentVideo into FGFM - twitch.botChat.say(cmd.to, `Now Playing: ${director.state.currentVideo.chatName}`); - }, - - - next: (cmd) => { - // @TODO: Move retrieval of videoQueue into FGFM - if (director.state.videoQueue.length > 0) { - twitch.botChat.say(cmd.to, `Next Video: ${director.state.videoQueue[0].chatName}`); - } else { - twitch.botChat.say(cmd.to, `No videos currently in queue!`); - } - }, - - - vr: (cmd) => { - let requestedVideoId = cmd.args[1] || false; - if (requestedVideoId === false) { - twitch.botChat.say(cmd.to, `Useage: ${config.twitch.cmdPrefix}vr | Videos: https://pastebin.com/qv0wDkvB`); - return; - } - - // make sure request vid isn't in the queue already - // @TODO: Move check into FGFM - if (director.state.videoQueue.findIndex(e => e.id === requestedVideoId) !== -1) { - twitch.botChat.say(cmd.to, `That video is in the queue already!`); - return; - } - - // search for req'd vid by id in config.vods.alttp - let vodIndex = config.vods.alttp.findIndex(e => e.id === requestedVideoId); - if (vodIndex === -1) { - twitch.botChat.say(cmd.to, `A video with that ID does not exist!`); - return; - } - - // @TODO: Make sure user hasn't met the request limit - - config.vods.alttp[vodIndex].requestedBy = cmd.from; - - // add to queue if it exists - // @TODO: Return queue position from addVideo - if (director.addVideo(config.vods.alttp[vodIndex])) { - twitch.botChat.say(cmd.to, `${config.vods.alttp[vodIndex].chatName} has been added to the queue [${director.state.videoQueue.length}]`); - } else { - twitch.botChat.say(cmd.to, `${config.vods.alttp[vodIndex].chatName} could not be added to the queue!`); - } - }, - - - room: (cmd) => { - let roomId = cmd.args[1] || false; - let room; - - if (roomId !== false) { - let roomIndex = config.rooms.findIndex(e => e.id === parseInt(roomId)); - - if (roomIndex === -1) { - twitch.botChat.say(cmd.to, `No room found matching that ID!`); - return; - } - - room = config.rooms[roomIndex]; - } else { - twitch.botChat.say(cmd.to, `Useage: ${config.twitch.cmdPrefix}room | Rooms: https://goo.gl/qoNmuH`); - return; - } - - // @TODO: Make sure user hasn't met the request limit - - room.requestedBy = cmd.from; - - director.addRoomVideo(room); - // @TODO: Return new queue position from addRoomVideo and use below - twitch.botChat.say(cmd.to, `Added ${room.dungeonName||'?'} - ${room.roomName||'?'} to the queue [${director.state.videoQueue.length}]!`); - }, - - - rngames: (cmd) => { - twitch.botChat.say(cmd.to, snesGames.sort(util.randSort).slice(0, 10).join(' | ')); - }, - - // voting to skip current video - skip: (cmd) => { - // check if there is an existing vote to skip for the director.state.currentVideo - if (skipVote.target === director.state.currentVideo.id) { - // if yes, add the vote, check if threshold is met, skip if necessary - skipVote.count++; - } else { - skipVote.target = director.state.currentVideo.id; - skipVote.count = 1; - } - - if (skipVote.count >= config.skipVoteThreshold) { - director.skip(); - skipVote.target = null; - } - }, - - song: async (cmd) => { - spotify.getCurrentSong() - .then(async song => { - let artists = []; - await util.asyncForEach(song.artists, async (artist) => artists.push(artist.name)); - twitch.botChat.say(cmd.to, `Current Song: ${artists.join(',')} - ${song.name} | ${song.url}`); - }) - .catch(err => twitch.botChat.say(cmd.to, `Error retrieving current song: ${JSON.stringify(err)}`)); - }, - - playlist: (cmd) => { - spotify.getCurrentPlaylist() - .then(playlist => twitch.botChat.say(cmd.to, `Current Playlist: ${playlist}`)) - .catch(err => twitch.botChat.say(cmd.to, `Error retrieving current playlist: ${JSON.stringify(err)}`)); - } - } - }; - - // Aliases for chat commands - const aliases = { - "rooms": "room" - }; - - // Listen for the above commands - twitch.botChat.addListener('message', (from, to, message) => { - // Ignore everything from blacklisted users - if (config.twitch.blacklistedUsers.includes(from)) return; - - // Ignore commands that don't start with the designated prefix - if (!message.startsWith(config.twitch.cmdPrefix)) return; - - // Remove command prefix for parsing - let noPrefix = message.slice(config.twitch.cmdPrefix.length); - - // Ignore blank commands - if (noPrefix.length === 0) return; - - // Parse command arguments - let args = noPrefix.split(' '); - let key = args[0] || ''; - - // Ignore messages without a command - if (!key || key.length === 0) return; - - // Case-insensitive - key.toLowerCase(); - - // Check for aliased commands - if (aliases.hasOwnProperty(key)) key = aliases[key]; - - // Ignore unrecognized commands - if (!commands.admin.hasOwnProperty(key) && !commands.user.hasOwnProperty(key)) return; - - // Check if the command is on cooldown for this user in this channel (admins bypass this) - let cooldownKey = md5(from+to+key); - cooldowns.get(cooldownKey, config.twitch.defaultUserCooldown) - .then(onCooldown => { - if (onCooldown === false || config.twitch.admins.includes(from)) { - let command = {message: message, from: from, to: to, key: key, args: args}; - - // Handle admin commands - if (commands.admin.hasOwnProperty(command.key) && config.twitch.admins.includes(from)) { - return commands.admin[command.key](command); - } - - // Handle all other user commands - if (commands.user.hasOwnProperty(command.key)) { - // Place this command on cooldown for the user - cooldowns.set(cooldownKey, config.twitch.defaultUserCooldown); - return commands.user[command.key](command); - } - } - }) - .catch(console.error); - }); - - const manageTimer = (timerName, timerStatus) => { - // search timers for matching name - let theTimerIndex = timersList.findIndex(e => e.name === timerName); - if (theTimerIndex === -1) { - throw("Invalid timer name!"); - } - - let theTimer = timersList[theTimerIndex]; - - // look in activeTimers for current status - let currentTimerIndex = activeTimers.findIndex(e => e.name === timerName); - - if (!timerStatus || timerStatus !== 'on' || timerStatus !== 'off') { - // toggle by default - if (currentTimerIndex === -1) { - timerStatus = 'on'; - } else { - timerStatus = 'off'; - } - } - - if (currentTimerIndex === -1 && timerStatus === 'on') { - let timerFunc = () => { - twitch.botChat.say(config.twitch.channel, theTimer.value); - }; - let timerInterval = setInterval(timerFunc, theTimer.interval*1000); - activeTimers.push({name: theTimer.name, timer: timerInterval}); - timerFunc(); - } else if (timerStatus === 'off') { - clearInterval(activeTimers[currentTimerIndex].timer); - activeTimers.splice(currentTimerIndex, 1); - } - - return; - } - - // @TODO: Modularize timed events - //console.log(`Initializing stream timers...`); - let userVotes = currentChoices = []; - let rockTheVote = () => {}; - // @TODO: Move this interval to config - let rtvInterval = setInterval(() => {rockTheVote()}, 300000); - let videoVoteJob = new schedule.Job(async () => { - // Tally votes from previous election (if there was one), add the winner to the queue - let winner; - if (currentChoices.length > 0) { - if (userVotes.length === 0) { - // choose a random element from currentChoices - winner = util.randElement(currentChoices); - console.log(`VIDEO CHOSEN RANDOMLY: ${winner.chatName}`); - twitch.botChat.say(config.twitch.channel, `No Votes Logged -- Next Video Chosen at Random: ${winner.chatName}`); - } else { - // tally and sort votes - let voteTallies = []; - await util.asyncForEach(userVotes, async (vote) => { - tallyIndex = voteTallies.findIndex(e => e.id === vote.vote); - if (tallyIndex !== -1) { - voteTallies[tallyIndex].count++; - } else { - voteTallies.push({id: vote.vote, count: 1}); - } - }); - voteTallies.sort((a, b) => { - if (a.count < b.count) { - return -1; - } - if (a.count > b.count) { - return 1; - } - // a must be equal to b - return 0; - }); - - console.log(`Voting Results: ${JSON.stringify(voteTallies)}`); - winner = currentChoices[voteTallies[0].id-1]; - console.log(`WINNER OF THE VOTE: ${winner.chatName}`); - twitch.botChat.say(config.twitch.channel, `Winner of the Video Vote: ${winner.chatName}`); - - // clear user votes - userVotes = []; - } - - director.addVideo(winner); - } - - // choose more random videos from config.vods.alttp (that aren't already in the queue) - // @TODO: Move into FGFM - let vodsNotInQueue = config.vods.alttp.filter(e => { - let inQueue = (director.state.videoQueue.findIndex(q => q.id === e.id) !== -1) && (director.state.currentVideo.id !== e.id); - return !inQueue; - }); - currentChoices = vodsNotInQueue.sort(util.randSort).slice(0, config.videoPollSize); - - // Poll the chat - let chatChoices = currentChoices.map((c, i) => { - return `[${i+1}] ${c.chatName}`; - }); - - rockTheVote = () => { - twitch.botChat.say(config.twitch.channel, `Vote for which video you'd like to add to the queue using ${config.twitch.cmdPrefix}vote #: ${chatChoices.join(' | ')}`) - }; - clearInterval(rtvInterval); - rockTheVote(); - rtvInterval = setInterval(() => {rockTheVote()}, 300000); - }); -}; - -// catches Promise errors -process.on('unhandledRejection', console.error); diff --git a/package-lock.json b/package-lock.json index 551f275..9187b13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,10 +9,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "asn1": { @@ -20,7 +20,7 @@ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": "~2.1.0" } }, "assert-plus": { @@ -33,7 +33,7 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "requires": { - "lodash": "4.17.11" + "lodash": "^4.17.10" } }, "async-limiter": { @@ -56,14 +56,22 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "requires": { + "follow-redirects": "1.5.10" + } + }, "babel-polyfill": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", "requires": { - "babel-runtime": "6.26.0", - "core-js": "2.5.7", - "regenerator-runtime": "0.10.5" + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" } }, "babel-runtime": { @@ -71,8 +79,8 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.5.7", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" }, "dependencies": { "regenerator-runtime": { @@ -88,7 +96,7 @@ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "bindings": { @@ -121,7 +129,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -154,8 +162,8 @@ "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-2.6.0.tgz", "integrity": "sha512-KGfDDTjBIx85MnVYcdhLccoJH/7jcYW+5Z/t3Wsg2QlJhmmjf+97z+9sQftS71lopOYYapjEKEvmWaCsym5Z4g==", "requires": { - "is-nan": "1.2.1", - "moment-timezone": "0.5.21" + "is-nan": "^1.2.1", + "moment-timezone": "^0.5.0" } }, "crypt": { @@ -168,13 +176,14 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, "requires": { "ms": "2.0.0" } @@ -184,7 +193,7 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "requires": { - "object-keys": "1.0.12" + "object-keys": "^1.0.12" } }, "delayed-stream": { @@ -197,11 +206,11 @@ "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-11.4.2.tgz", "integrity": "sha512-MDwpu0lMFTjqomijDl1Ed9miMQe6kB4ifKdP28QZllmLv/HVOJXhatRgjS8urp/wBlOfx+qAYSXcdI5cKGYsfg==", "requires": { - "long": "4.0.0", - "prism-media": "0.0.3", - "snekfetch": "3.6.4", - "tweetnacl": "1.0.0", - "ws": "4.1.0" + "long": "^4.0.0", + "prism-media": "^0.0.3", + "snekfetch": "^3.6.4", + "tweetnacl": "^1.0.0", + "ws": "^4.0.0" }, "dependencies": { "tweetnacl": { @@ -217,8 +226,8 @@ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "optional": true, "requires": { - "jsbn": "0.1.1", - "safer-buffer": "2.1.2" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, "extend": { @@ -251,8 +260,26 @@ "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz", "integrity": "sha1-yVLeIkD4EuvaCqgAbXd27irPfXQ=", "requires": { - "async": "2.6.1", - "which": "1.3.1" + "async": ">=0.2.9", + "which": "^1.1.1" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } } }, "forever-agent": { @@ -265,9 +292,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.7", - "mime-types": "2.1.21" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, "formidable": { @@ -280,7 +307,7 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "har-schema": { @@ -293,8 +320,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^5.3.0", + "har-schema": "^2.0.0" } }, "http-signature": { @@ -302,9 +329,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.2" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "iconv": { @@ -313,7 +340,7 @@ "integrity": "sha1-4ITWDut9c9p/CpwJbkyKvgkL+u0=", "optional": true, "requires": { - "nan": "2.10.0" + "nan": "^2.3.5" } }, "inherits": { @@ -326,9 +353,9 @@ "resolved": "https://registry.npmjs.org/irc/-/irc-0.5.2.tgz", "integrity": "sha1-NxT0doNlqW0LL3dryRFmvrJGS7w=", "requires": { - "iconv": "2.2.3", - "irc-colors": "1.4.3", - "node-icu-charset-detector": "0.2.0" + "iconv": "~2.2.1", + "irc-colors": "^1.1.0", + "node-icu-charset-detector": "~0.2.0" } }, "irc-colors": { @@ -346,7 +373,7 @@ "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.2.1.tgz", "integrity": "sha1-n69ltvttskt/XAYoR16nH5iEAeI=", "requires": { - "define-properties": "1.1.3" + "define-properties": "^1.1.1" } }, "is-typedarray": { @@ -421,9 +448,9 @@ "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "1.1.6" + "charenc": "~0.0.1", + "crypt": "~0.0.1", + "is-buffer": "~1.1.1" } }, "memcache": { @@ -451,7 +478,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", "requires": { - "mime-db": "1.37.0" + "mime-db": "~1.37.0" } }, "moment": { @@ -464,7 +491,7 @@ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.21.tgz", "integrity": "sha512-j96bAh4otsgj3lKydm3K7kdtA3iKf2m6MY2iSYCzCm5a1zmHo1g+aK3068dDEeocLZQIS9kU8bsdQHLqEvgW0A==", "requires": { - "moment": "2.22.2" + "moment": ">= 2.9.0" } }, "ms": { @@ -482,8 +509,8 @@ "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-4.2.0.tgz", "integrity": "sha512-obRu6/f7S024ysheAjoYFEEBqqDWv4LOMNJEuO8vMeEw2AT4z+NCzO4hlc2lhI4vATzbCQv6kke9FVdx0RbCOw==", "requires": { - "clone": "2.1.2", - "lodash": "4.17.11" + "clone": "2.x", + "lodash": "4.x" } }, "node-icu-charset-detector": { @@ -492,7 +519,7 @@ "integrity": "sha1-wjINo3Tdy2cfxUy0oOBB4Vb/1jk=", "optional": true, "requires": { - "nan": "2.10.0" + "nan": "^2.3.3" } }, "node-opus": { @@ -500,10 +527,10 @@ "resolved": "https://registry.npmjs.org/node-opus/-/node-opus-0.2.9.tgz", "integrity": "sha512-+IIOdav5D7vHsuLDNk55t17kK2s6c1w4DbfKw8UQxZ635n+AO/SqDE3RpuO3PZKqpWjPtL/chzYZNVxz8/4TUQ==", "requires": { - "bindings": "1.2.1", - "commander": "2.11.0", - "nan": "2.10.0", - "ogg-packet": "1.0.0" + "bindings": "~1.2.1", + "commander": "^2.9.0", + "nan": "^2.10.0", + "ogg-packet": "^1.0.0" } }, "node-schedule": { @@ -511,9 +538,9 @@ "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-1.3.0.tgz", "integrity": "sha512-NNwO9SUPjBwFmPh3vXiPVEhJLn4uqYmZYvJV358SRGM06BR4UoIqxJpeJwDDXB6atULsgQA97MfD1zMd5xsu+A==", "requires": { - "cron-parser": "2.6.0", + "cron-parser": "^2.4.0", "long-timeout": "0.1.1", - "sorted-array-functions": "1.2.0" + "sorted-array-functions": "^1.0.0" } }, "oauth-sign": { @@ -531,10 +558,10 @@ "resolved": "https://registry.npmjs.org/obs-websocket-js/-/obs-websocket-js-1.2.0.tgz", "integrity": "sha1-aE/Br0r+JlV4wXd2dqW7LKKrwGw=", "requires": { - "babel-polyfill": "6.26.0", - "debug": "3.1.0", - "sha.js": "2.4.11", - "ws": "5.2.2" + "babel-polyfill": "^6.26.0", + "debug": "^3.1.0", + "sha.js": "^2.4.9", + "ws": "^5.1.0" }, "dependencies": { "debug": { @@ -550,7 +577,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", "requires": { - "async-limiter": "1.0.0" + "async-limiter": "~1.0.0" } } } @@ -561,7 +588,7 @@ "integrity": "sha1-RbiFchrI991c8iOR1CEGrlM6xng=", "optional": true, "requires": { - "ref-struct": "1.1.0" + "ref-struct": "*" } }, "performance-now": { @@ -599,13 +626,13 @@ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "ref": { @@ -614,9 +641,9 @@ "integrity": "sha512-2cBCniTtxcGUjDpvFfVpw323a83/0RLSGJJY5l5lcomZWhYpU2cuLdsvYqMixvsdLJ9+sTdzEkju8J8ZHDM2nA==", "optional": true, "requires": { - "bindings": "1.2.1", - "debug": "2.6.9", - "nan": "2.10.0" + "bindings": "1", + "debug": "2", + "nan": "2" } }, "ref-struct": { @@ -625,8 +652,8 @@ "integrity": "sha1-XV7mWtQc78Olxf60BYcmHkee3BM=", "optional": true, "requires": { - "debug": "2.6.9", - "ref": "1.3.5" + "debug": "2", + "ref": "1" } }, "regenerator-runtime": { @@ -639,26 +666,26 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.8.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.2", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.1.0", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.19", - "oauth-sign": "0.9.0", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "tough-cookie": "2.4.3", - "tunnel-agent": "0.6.0", - "uuid": "3.3.2" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" }, "dependencies": { "combined-stream": { @@ -666,7 +693,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "extend": { @@ -679,9 +706,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { - "asynckit": "0.4.0", + "asynckit": "^0.4.0", "combined-stream": "1.0.6", - "mime-types": "2.1.19" + "mime-types": "^2.1.12" } }, "mime-db": { @@ -694,7 +721,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", "requires": { - "mime-db": "1.35.0" + "mime-db": "~1.35.0" } }, "qs": { @@ -719,8 +746,8 @@ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "snekfetch": { @@ -738,7 +765,7 @@ "resolved": "https://registry.npmjs.org/spotify-web-api-node/-/spotify-web-api-node-4.0.0.tgz", "integrity": "sha512-FQAX4qiP9xfjmJpkSfF5PEVr7RVorUZiLvcdVTlhVFLYAmQ8VSsZlyb0yTK0GExKhAcgJy9GfWxqjSB2r9SrjA==", "requires": { - "superagent": "3.8.3" + "superagent": "^3.7.0" } }, "sshpk": { @@ -746,15 +773,15 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "requires": { - "asn1": "0.2.4", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.2", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.2", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "safer-buffer": "2.1.2", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" } }, "string_decoder": { @@ -762,7 +789,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } }, "superagent": { @@ -770,16 +797,16 @@ "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.2", - "debug": "3.2.6", - "extend": "3.0.2", - "form-data": "2.3.3", - "formidable": "1.2.1", - "methods": "1.1.2", - "mime": "1.6.0", - "qs": "6.5.2", - "readable-stream": "2.3.6" + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" }, "dependencies": { "debug": { @@ -787,7 +814,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { - "ms": "2.1.1" + "ms": "^2.1.1" } }, "ms": { @@ -802,8 +829,8 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "requires": { - "psl": "1.1.29", - "punycode": "1.4.1" + "psl": "^1.1.24", + "punycode": "^1.4.1" } }, "tunnel-agent": { @@ -811,7 +838,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -835,9 +862,9 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "which": { @@ -845,7 +872,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "ws": { @@ -853,8 +880,8 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", "requires": { - "async-limiter": "1.0.0", - "safe-buffer": "5.1.2" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" }, "dependencies": { "safe-buffer": { diff --git a/package.json b/package.json index 1436301..c59b0ea 100755 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "main": "main.js", "dependencies": { "async": "^2.6.1", + "axios": "^0.19.2", "discord.js": "^11.4.2", "ffmpeg-binaries": "^3.2.2", "fluent-ffmpeg": "^2.1.2", diff --git a/room-vid-export.js b/room-vid-export.js deleted file mode 100755 index 2854a5c..0000000 --- a/room-vid-export.js +++ /dev/null @@ -1,16 +0,0 @@ -const rooms = require('./conf/rooms.json'); -const util = require('./lib/util'); -const fs = require('fs'); - -populateDatabase(); - -async function populateDatabase() { - let database = "'ID','Dungeon','Room'\r\n"; - await util.asyncForEach(rooms, async (room, index) => { - let entry = `'${room.id}','${room.dungeonName||'?'}','${room.roomName||'?'}'\r\n`; - database += entry; - console.log('added entry', entry); - }); - - fs.writeFile('rooms-list.csv', database, 'utf8', () => {console.log('done')}); -} diff --git a/room-vid-import.js b/room-vid-import.js deleted file mode 100755 index 9008896..0000000 --- a/room-vid-import.js +++ /dev/null @@ -1,70 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const util = require('./lib/util'); -const ffmpeg = require('fluent-ffmpeg'); - -let roomVidPath = `/var/hypnoadmin/media/videos/ALttP/my-vids/room-vids`; - -const getAllFiles = dir => - fs.readdirSync(dir).reduce((files, file) => { - const name = path.join(dir, file); - const isDirectory = fs.statSync(name).isDirectory(); - return isDirectory ? [...files, ...getAllFiles(name)] : [...files, name]; - }, []); - -let roomVidFiles = getAllFiles(roomVidPath); - -populateDatabase(); - -async function populateDatabase() { - let database = []; - await util.asyncForEach(roomVidFiles, async (file, index) => { - // ignore anything that's not an mp4 - let shortPath = file.replace(roomVidPath, ''); - if (!/\.mp4$/.test(shortPath)) { - return; - } - - let entry = { - id: index+1, - shortPath: shortPath, - winPath: shortPath.replace(/\//g, '\\') - }; - - // chop up the short path and extract metadata - let matches = shortPath.match(/^\/([0-9]{2})-([a-z]+)\/([0-9]{2})-(.+)\.mp4/); - if (matches) { - entry.dungeonId = matches[1]; - entry.dungeonName = matches[2]; - entry.roomId = matches[3]; - entry.roomName = matches[4]; - } - - // @TODO support some other paths / structures - - entry.videoData = await getVideoMetadata(file); - database.push(entry); - console.log('added entry', entry); - }); - - fs.writeFile('conf/rooms.json', JSON.stringify(database), 'utf8', () => {console.log('done')}); -} - -function getVideoMetadata(videoPath) { - return new Promise((resolve, reject) => { - ffmpeg.ffprobe(videoPath, (err, metadata) => { - // find the video stream - let stream = metadata.streams.find(e => e.codec_type === "video"); - if (!stream) { - resolve(false); - } - - resolve({ - width: stream.width, - height: stream.height, - fps: parseInt(stream.r_frame_rate.replace('/1', '')), - length: stream.duration - }); - }); - }); -} \ No newline at end of file diff --git a/rooms-list.csv b/rooms-list.csv deleted file mode 100755 index a634fcc..0000000 --- a/rooms-list.csv +++ /dev/null @@ -1,818 +0,0 @@ -"ID","Dungeon","Room" -"0","escape","links-house-2911" -"1","escape","outside-links-house-723" -"2","escape","outside-castle-1628" -"3","escape","outside-castle-1631" -"4","escape","uncle-1342" -"5","escape","uncle-1348" -"6","escape","passage-exit-442" -"7","escape","courtyard-923" -"8","escape","castle-lobby-631" -"9","escape","castle-lobby-pumpless-636" -"10","escape","sw-room-439" -"11","escape","sw-room-pumpless-448" -"12","escape","west-guard-hallway1-603" -"13","escape","statue-hallway1-415" -"14","escape","1st-keyguard-leftslash-801" -"15","escape","first-keyguard1-3slash-825" -"16","escape","first-keyguard1-upspin-811" -"17","escape","b1-pit-lower-404" -"18","escape","b1-pit2-lower-945" -"19","escape","stealth-room-927" -"20","escape","stealth-room-929" -"21","escape","green-guard-bestrng-432" -"22","escape","green-guard-bestrng-rta-438" -"23","escape","blue-boomguard-739" -"24","escape","blue-boomguard-skip-627" -"25","escape","green-guard2-426" -"26","escape","stairs-to-b2-1-359" -"27","escape","b2-1-533" -"28","escape","bnc-1pot4slash-3227" -"29","escape","bnc-8slash-3120" -"30","escape","bnc-8slash-3130" -"31","escape","bnc-joestrat-3238" -"32","escape","bnc-joestrat-3244" -"33","escape","b2-2-530" -"34","escape","stairs-to-b2-2-651" -"35","escape","stairs-to-b2-2-652" -"36","escape","green-guard3-426" -"37","escape","stealth-room2-920" -"38","escape","b1-pit2-upper-301" -"39","escape","b1-pit1-upper-627" -"40","escape","b1-pit1-upper-pumpless-628" -"41","escape","1st-keyguard2-314" -"42","escape","statue-hallway2-709" -"43","escape","west-guard-hallway2-612" -"44","escape","sw-room2-445" -"45","escape","castle-lobby2-721" -"46","escape","throne-room-1632" -"47","escape","throne-room-1634" -"48","escape","sewer-passage-857" -"49","escape","sewer-passage-pumpless-903" -"50","escape","snake-room-700" -"51","escape","snake-room-perfect-rng-655" -"52","escape","sewer-key-chest-risky-1212" -"53","escape","sewer-key-chest-rta-1215" -"54","escape","sewer1-706" -"55","escape","sewer1-707" -"56","escape","sewer2-608" -"57","escape","keyrat-840" -"58","escape","rat-hallway-827" -"59","escape","behind-sanc-705" -"60","escape","behind-sanc-rta-719" -"61","escape","behind-sanc2-720" -"62","?","?" -"63","eastern","sanc-2946" -"64","eastern","sanc-heart-3303" -"65","eastern","sanc-heart-chestturn-3305" -"66","eastern","outside-sanc-807" -"67","eastern","graveyard-646" -"68","eastern","east-path-403" -"69","eastern","wooden-bridge-906" -"70","eastern","octofield-724" -"71","eastern","guard-bridge-311" -"72","eastern","east-fairy-cave-right-exit-326" -"73","eastern","outside-eastern-2540" -"74","eastern","entrance-504" -"75","eastern","three-popos-434" -"76","eastern","cannonballs-859" -"77","eastern","bigchest-upper-leftpot-736" -"78","eastern","westwing-upper-455" -"79","eastern","stalfos-spawn-617" -"80","eastern","compass-room-615" -"81","eastern","westwing-lower1-335" -"82","eastern","bigchest-lower1-arrows-805" -"83","eastern","bigchest-lower1-noarrows-704" -"84","eastern","east-wing-645" -"85","eastern","dark-af-boom-623" -"86","eastern","dark-af-sword-630" -"87","eastern","dark-potkey-diagboom-656" -"88","eastern","dark-potkey-walk-658" -"89","eastern","dark-af2-607" -"90","eastern","cannonballs-upper-851" -"91","eastern","bigkey-1105" -"92","eastern","westwing-lower2-756" -"93","eastern","bigchest-bow-1452" -"94","eastern","gwg-noslash-menu-913" -"95","eastern","afpots-802" -"96","eastern","eyegore-floor-switch-519" -"97","eastern","eyegore-floor-switch-pumpless-522" -"98","eastern","cannonball-switch-503" -"99","eastern","cannonball-switch-pumpless-507" -"100","eastern","zgr-601" -"101","eastern","double-red-eyegores-617" -"102","eastern","armos-topright-1321" -"103","desert","outside-eastern-1322" -"104","desert","saha-walkout-1951-449-8" -"105","desert","outside-eastern2-1301-99-0" -"106","desert","east-fairy-cave-253" -"107","desert","guard-bridge-601-35-0" -"108","desert","links-yard-354-32-0" -"109","desert","annoying-bushes-403" -"110","desert","west-of-swamp1-356" -"111","desert","south-of-grove1-right-exit-452-32-0" -"112","desert","grove-westside1-nocharge-255" -"113","desert","grove-westside1-swordcharge-308" -"114","desert","outside-library1-dashes-708" -"115","desert","outside-library1-spindash-626" -"116","desert","library-1038-127-0" -"117","desert","outside-library2-noss-751-99-0" -"118","desert","outside-library2-spindash-707" -"119","desert","grove-westside2-leftexit-233-36" -"120","desert","grove-westside2-rta-243-36" -"121","desert","south-of-grove2-fromleft-belowbush-458-32" -"122","desert","south-of-grove2-fromleft-bushdash-455-32" -"123","desert","south-of-grove2-fromright-bushdash-447-32" -"124","desert","west-of-swamp2-frombelow-350" -"125","desert","west-of-swamp2-frombushes-346" -"126","desert","west-of-swamp2-fromlowbushes-346" -"127","desert","west-of-swamp2-fromlowbushes-farleftexit-346" -"128","desert","annoying-bushes2-352-33" -"129","desert","links-yard-339-32" -"130","desert","links-yard-earlydash-336-32" -"131","desert","waterdash-menu-629-35-1" -"132","desert","waterdash-nomenu-524-37-0" -"133","desert","east-of-watergate-216-35" -"134","desert","watergate-552-37" -"135","desert","middle-aged-man-643-31" -"136","desert","outside-desert-2250-175" -"137","desert","desert1-risky-726-97" -"138","desert","desert1-rta-730-98" -"139","desert","north-hall1-leftpoke-510-21" -"140","desert","north-hall1-rtapoke-512-21" -"141","desert","nw-room1-258-19" -"142","desert","torchkey-rta-614" -"143","desert","torchkey-underleft-614" -"144","desert","nw-room2-235" -"145","desert","north-hall2-412-21" -"146","desert","ne-room1-351" -"147","desert","east-wing1-416-21" -"148","desert","compass-room1-519" -"149","desert","bigkey-chestturn-758-49" -"150","desert","bigkey-rta-goodrng-803" -"151","desert","compass-room2-405" -"152","desert","compass-room2-pumpless-407" -"153","desert","east-wing2-318" -"154","desert","east-wing2-pumpless-319" -"155","desert","ne-room2-418-20" -"156","desert","north-hall3-412-21" -"157","desert","nw-room3-346-18" -"158","desert","cop1-528" -"159","desert","bigchest-606-29-1" -"160","desert","cop2-355" -"161","desert","nw-room4-dashes-348" -"162","desert","nw-room4-walk-rta-349" -"163","desert","west-wing-451-21" -"164","desert","d1-exit-324" -"165","desert","outside-desert-noss-709-102" -"166","desert","outside-desert-spindash-732-102-3" -"167","desert","d2-entrance-528-96" -"168","desert","d2-entrance-pumpless-532-97" -"169","desert","tile-room1-458" -"170","desert","bridge-539-58" -"171","desert","popos-546" -"172","desert","beamos-hall-706-1" -"173","desert","beamos-hall-rta-720" -"174","desert","tile-room2-517-21" -"175","desert","torches-nomenu-1549-0-0" -"176","desert","torches-rta-1656-0-4" -"177","desert","lanmos-2cyc-1953" -"178","desert","lanmos-2cyc-2059" -"179","hera","outside-desert-cactusdash-1044-77-0" -"180","hera","outside-desert-geldmandash-1053-76-0" -"181","hera","outside-desert-rta-highdash-1109-76-0" -"182","hera","outside-desert-rta-lowdash-1116-76-0" -"183","hera","middle-aged-man-634-30-0" -"184","hera","watergate-458-34-0" -"185","hera","beach-445-35-0" -"186","hera","beach-rta-530-35-0" -"187","hera","fakeflips-832-36-0" -"188","hera","fakeflips-rta-808-35-0" -"189","hera","whirlpool-enter-336-36-0" -"190","hera","whirlpool-exit-806-72-0" -"191","hera","rupee-tree-picklearrow-808-35-0" -"192","hera","rupee-tree-rta-821-35-0" -"193","hera","old-man-cave-1026-134-0" -"194","hera","old-man-tunnel-2139-295-8" -"195","hera","death-mountain-lower-3039-246-009" -"196","hera","bunny-link-739" -"197","hera","death-mountain-upper-ledgehop-736-76-0" -"198","hera","death-mountain-upper-rta-748-76-0" -"199","hera","lobby1-503-101-0" -"200","hera","lobby1-pumpless-507-101-0" -"201","hera","basement-key-629-71-0" -"202","hera","lobby2-boom-859-107-007" -"203","hera","lobby2-boomdash-851-107-010" -"204","hera","lobby2-boomless-824" -"205","hera","tileroom-boomdash-4340-66-0" -"206","hera","tileroom-boomless-4326" -"207","hera","3mold-boom-menu-429-0-2" -"208","hera","3mold-boomless-538" -"209","hera","torches-812-31-008" -"210","hera","lobby3-540-107-0" -"211","hera","beetles-936-63-0" -"212","hera","bkdoor-342-0-0" -"213","hera","bkdoor-pumpless-345-0-0" -"214","hera","safety-switch-634" -"215","hera","safety-switch-pumpless-dash-639" -"216","hera","safety-switch-pumpless-walk-639" -"217","hera","bigchest-ebj-2143-95-17" -"218","hera","bigchest-waffle-rta-2324-95-20" -"219","hera","bigchest-waffle-sparkmanip-2301-95-18" -"220","hera","bumper-skip-729-66-0" -"221","hera","moldorm-2752-116-0" -"222","hera","moldorm-2858-116-0" -"223","atower","death-mountain-upper-943" -"224","atower","kak-tunnel-01-806" -"225","atower","kak-tunnel-02-607" -"226","atower","kak-tunnel-02-arrows-835" -"227","atower","kak-tunnel-02-rta-710" -"228","atower","first-rupee-tree-928" -"229","atower","first-rupee-tree-birddash-1029" -"230","atower","first-rupee-tree-rta-x4FA-exit-921" -"231","atower","lumberjacks-652" -"232","atower","lumberjacks-picklearrow-y078-enter-455" -"233","atower","lumberjacks-rta-y078-enter-701" -"234","atower","lost-woods-01-1709" -"235","atower","lost-woods-01-y078-enter-1713" -"236","atower","master-sword-3909" -"237","atower","lost-woods-02-2252" -"238","atower","lost-woods-02-rta-2243" -"239","atower","fortune-teller-hut-rta-619" -"240","atower","whirlpool-pond-348" -"241","atower","wsb-543" -"242","atower","outside-hyrule-castle-1000" -"243","atower","castle-lobby-abovetorch-531" -"244","atower","castle-lobby-rta-540" -"245","atower","sw-room-455-bad-recording" -"246","atower","sw-room-456" -"247","atower","ramparts-617" -"248","atower","entrance-334" -"249","atower","goldknights-pui-734" -"250","atower","prizepack-guards-703" -"251","atower","first-dark-room-605" -"252","atower","first-dark-room-rta-619" -"253","atower","despair-1617-44" -"254","atower","last-3f-dark-room-436" -"255","atower","first-4f-dark-room-625" -"256","atower","first-4f-dark-room-pumpless-628" -"257","atower","melancholy-rta-715" -"258","atower","archerkey-beams-keydash-534" -"259","atower","archerkey-beams-rta-558" -"260","atower","redspearguards-809" -"261","atower","alert-guards-arrowkill-516" -"262","atower","alert-guards-beamkill-528" -"263","atower","cop-menu-638" -"264","atower","neopolitan-room-325" -"265","atower","statue-room-646" -"266","atower","catwalk-boom-624" -"267","atower","catwalk-boomless-621-bad-recording" -"268","atower","7f-hallway-521" -"269","atower","agah-cutscene-2451" -"270","atower","agah-0bb-4451" -"271","pod","pyramid-1043" -"272","pod","dark-octo-319" -"273","pod","hammer-bridge-444" -"274","pod","dark-east-fairy-cave-250" -"275","pod","outside-4157" -"276","pod","entrance1-dash-554" -"277","pod","entrance1-walk-556" -"278","pod","west-bomb-pickup-336" -"279","pod","shooter-key-847" -"280","pod","entrance2-333" -"281","pod","bomb-pickup1-428" -"282","pod","junction1-ledgehop-524" -"283","pod","junction1-slashjelly-556" -"284","pod","turtle-key-619" -"285","pod","entrance3-333" -"286","pod","bomb-pickup2-412" -"287","pod","junction2-907" -"288","pod","junction2-badrng-917" -"289","pod","upper-turtle-key-715" -"290","pod","bigkey-leftside-754" -"291","pod","entrance4-333" -"292","pod","bomb-pickup3-412" -"293","pod","junction3-651" -"294","pod","beetle-room1-954" -"295","pod","beetle-room1-dash2chest-1002" -"296","pod","beetle-room1-rta-1012" -"297","pod","hammeryump-1bombpickup-1324" -"298","pod","hammeryump-2bombpickup-1348" -"299","pod","darkmaze-738" -"300","pod","entrance5-333" -"301","pod","bomb-pickup4-412" -"302","pod","junction4-651" -"303","pod","beetle-room2-dash-and-hop-644" -"304","pod","beetle-room2-rta-walk-702" -"305","pod","beetle-room2-walk-and-hop-657" -"306","pod","sexy-statue-1333" -"307","pod","ugly-statue-1406" -"308","pod","mimics-454" -"309","pod","eye-statue-dashes-2454" -"310","pod","eye-statue-walk-rta-2456" -"311","pod","darkpegs-607" -"312","pod","lonely-turtle-457" -"313","pod","turtle-party-701-cropped" -"314","pod","turtle-party-701" -"315","pod","turtle-party-809" -"316","pod","warp-tile-512" -"317","pod","turtle-hallway-dash-and-keydash-709" -"318","pod","turtle-hallway-rta-walk-and-slash-745" -"319","pod","turtle-hallway-walk-and-keydash-720" -"320","pod","helma-2739" -"321","pod","helma-2813" -"322","pod","helma-2830" -"323","pod","helma-2843" -"324","pod","helma-2927" -"325","thieves","outside-pod-2627" -"326","thieves","dark-east-fairy-cave-259" -"327","thieves","pegbridge-earlydash-639" -"328","thieves","pegbridge-safedash-646" -"329","thieves","bombshop-359" -"330","thieves","annoying-bushes-402" -"331","thieves","annoying-bushes-rightcancel-402" -"332","thieves","southeast-of-fluteboy-dash-334" -"333","thieves","southeast-of-fluteboy-walk-rta-328" -"334","thieves","south-of-fluteboy-458" -"335","thieves","south-of-fluteboy-walk-rta-508" -"336","thieves","fluteboy-rta-1503" -"337","thieves","grove-rta-1840" -"338","thieves","south-of-grove-445" -"339","thieves","grove-westside-236" -"340","thieves","usain-bolt-720" -"341","thieves","kak-village-centerdash-3335" -"342","thieves","kak-village-leftdash-3335" -"343","thieves","three-musketeers-3xdash-557" -"344","thieves","lost-woods-830" -"345","thieves","warp-rock-705" -"346","thieves","warp-rock-no-hammerdash-724" -"347","thieves","north-of-outcast-748" -"348","thieves","voo-943" -"349","thieves","sw-quad-badrng-745" -"350","thieves","sw-quad-goodrng-736" -"351","thieves","nw-quad-333" -"352","thieves","ne-quad-badrng-350" -"353","thieves","ne-quad-goodrng-337" -"354","thieves","se-quad1-551" -"355","thieves","bigkey-610" -"356","thieves","se-quad2-628" -"357","thieves","ne-quad2-733" -"358","thieves","stalfos-hallway-hammer-755" -"359","thieves","stalfos-hallway-pickup-754" -"360","thieves","snek-and-zazaks-335" -"361","thieves","conveyor-gibos-north-352" -"362","thieves","conveyor-gibos-north-353" -"363","thieves","hellway-429" -"364","thieves","spikeroom1-hammer-515" -"365","thieves","spikeroom1-mikestrat-502" -"366","thieves","attic-pot-switch1-badrng-828" -"367","thieves","attic-pot-switch1-goodrng-pickup-750" -"368","thieves","grasshopper-hall1-1-252" -"369","thieves","grasshopper-hall2-1-308" -"370","thieves","attic-window-slashgrass-556" -"371","thieves","grasshopper-hall2-2-240" -"372","thieves","grasshopper-hall1-2-307" -"373","thieves","attic-pot-switch2-306" -"374","thieves","spikeroom2-606" -"375","thieves","hellway2-322" -"376","thieves","zazaks-and-gibos-543" -"377","thieves","zazaks-and-gibos-545" -"378","thieves","conveyor-toilet-bomb-404" -"379","thieves","conveyor-toilet-nobomb-321" -"380","thieves","bigblock-837" -"381","thieves","lonely-zazak-315" -"382","thieves","prison-dashes-1053" -"383","thieves","prison-walk-1106" -"384","thieves","prison-walk-oneslash-1124" -"385","thieves","lonely-zazak2-252" -"386","thieves","conveyor-jellies1-328" -"387","thieves","bigchest-606" -"388","thieves","conveyor-jellies2-509" -"389","thieves","bigblock2-arrows-412" -"390","thieves","bigblock2-noarrows-345" -"391","thieves","conveyor-toilet2-dash-hammer-736" -"392","thieves","conveyor-toilet2-hammerdash-726" -"393","thieves","conveyor-toilet2-rta-751" -"394","thieves","stalfos-hallway2-324" -"395","thieves","blind-beams-2701" -"396","thieves","blind-beams-walkin-2707" -"397","skull","voo1-902" -"398","skull","voo1-rta-914" -"399","skull","300-hut-721" -"400","skull","300-hut-rta-720" -"401","skull","voo2-dash-628" -"402","skull","voo2-walk-630" -"403","skull","cursed-dwarf-justpressa-1210" -"404","skull","cursed-dwarf-rta-1224" -"405","skull","voo3-339" -"406","skull","hammerpegs1-820" -"407","skull","outside-smiths1-350" -"408","skull","smiths1-708" -"409","skull","outside-smiths2-237" -"410","skull","smiths2-910" -"411","skull","outside-smiths3-239" -"412","skull","hammerpegs2-342" -"413","skull","outside-smiths4-338" -"414","skull","smiths3-746" -"415","skull","outside-smiths5-236" -"416","skull","hammerpegs3-849" -"417","skull","voo4-fencedash-441" -"418","skull","c-shaped-house-918" -"419","skull","voo5-709" -"420","skull","moblins-badrng-524" -"421","skull","moblins-goodrng-518" -"422","skull","skeleton-forest1-1216" -"423","skull","mummy-statue-1220" -"424","skull","bigkey-badrng-659" -"425","skull","bigkey-leftside-620" -"426","skull","bigkey-rightside-635" -"427","skull","mumm-statue-exit-232" -"428","skull","skeleton-forest2-949" -"429","skull","bigchest-earlybj-1259" -"430","skull","bigchest-rta-bonk-1407" -"431","skull","bigchest-rta-bonkless-1406" -"432","skull","skeleton-forest3-933" -"433","skull","mummy-statue-passthru-427" -"434","skull","bumper-hallway-305" -"435","skull","potkey-654" -"436","skull","skeleton-forest4-738" -"437","skull","skeleton-forest4-rta-740" -"438","skull","firesnake-keydash-522" -"439","skull","potpit-left-442" -"440","skull","potpit-right-438" -"441","skull","mummy-hellway-744" -"442","skull","mummy-hellway-joestrat-812" -"443","skull","vineroom-badrng-415" -"444","skull","vineroom-goodrng-359" -"445","skull","mummy-key-629" -"446","skull","mummy-key-rta-633" -"447","skull","mothhole-top-422" -"448","skull","mothula-1118" -"449","skull","mothula-1122" -"450","ice","outside-skull-menu-352" -"451","ice","lost-woods-dash-758" -"452","ice","lost-woods-walk-806" -"453","ice","links-house-632" -"454","ice","castle-gate-menu-rta-qw-637" -"455","ice","castle-gate-menu-walk-qw-639" -"456","ice","castle-gate-walk-qw-534" -"457","ice","pyramid-659" -"458","ice","dark-octofield-236" -"459","ice","broken-bridge-738" -"460","ice","lonely-ropa-243" -"461","ice","ropa-lottery-910" -"462","ice","dark-cuckoos-leftgrab-737" -"463","ice","dark-cuckoos-rta-746" -"464","ice","quake-1925" -"465","ice","quake-earlythrow-1858" -"466","ice","whirlpool1-dashcancel-605" -"467","ice","whirlpool1-nocancel-603" -"468","ice","zoras-domain-dashout-5934" -"469","ice","zoras-domain-walkout-5933" -"470","ice","tiny-warp-dik-605" -"471","ice","ice-warp-833" -"472","ice","ice-island-358" -"473","ice","ice-entrance-438" -"474","ice","ice2-508" -"475","ice","floor-switch-910" -"476","ice","block-intersection1-358" -"477","ice","compass-room-144" -"478","ice","block-intersection2-456" -"479","ice","penguins1-spin-535" -"480","ice","penguins1-tmstrat-523" -"481","ice","block-intersection3-512" -"482","ice","bombable-floor-dboost-916" -"483","ice","bombable-floor-nodboost-944" -"484","ice","bombable-floor-rta-good-rng-957" -"485","ice","big-stalfos-819" -"486","ice","conveyor-hellway-709" -"487","ice","ipbj-1209" -"488","ice","floor-zols-300" -"489","ice","penguins2-804" -"490","ice","big-spike-405" -"491","ice","lonely-firebar-419" -"492","ice","lonely-firebar-dash-451" -"493","ice","double-freezor-503" -"494","ice","big-chest-401" -"495","ice","big-pit-351" -"496","ice","block-push-hammerpot-badlag-542" -"497","ice","block-push-potpickup-badlag-539" -"498","ice","statue-room-hammer-both-pots-1323" -"499","ice","statue-room-hammer-one-pot-1306" -"500","ice","statue-room-pickup-both-pots-1318" -"501","ice","statue-room-pickup-one-pot-1304" -"502","ice","kholdstare-1poke-1621" -"503","ice","kholdstare-2poke-1559" -"504","ice","kholdstare-2poke-1602" -"505","ice","kholdstare-6slash-1655" -"506","swamp","ice-island-343" -"507","swamp","lake-hylia-birddash-803" -"508","swamp","lake-hylia-walk-812" -"509","swamp","links-house-521" -"510","swamp","grassy-area-menu-437" -"511","swamp","warp-nokill-422" -"512","swamp","warp-octokill-437" -"513","swamp","postwarp-hammerdash-950" -"514","swamp","postwarp-walk-959" -"515","swamp","outside-swamp1-noqw-629" -"516","swamp","outside-swamp1-qw-617" -"517","swamp","outside-watergate-noqw-427" -"518","swamp","outside-watergate-qw-407" -"519","swamp","watergate-entrance-mirrordash-455" -"520","swamp","watergate-entrance-walk-500" -"521","swamp","afskip-715" -"522","swamp","afskip-bonk-736" -"523","swamp","afskip-rta-732" -"524","swamp","watergate-entrance2-317" -"525","swamp","outside-watergate2-closewarp-236" -"526","swamp","outside-watergate2-qw-413" -"527","swamp","outside-swamp2-closewarp-424" -"528","swamp","outside-swamp2-qw-352" -"529","swamp","dungeon-entrance-1017" -"530","swamp","potkey1-menu-1050" -"531","swamp","potkey1-nomenu-923" -"532","swamp","pool1-empty-627" -"533","swamp","potkey2-dash-336" -"534","swamp","potkey2-walk-339" -"535","swamp","pool1-empty2-dash-515" -"536","swamp","pool1-empty2-walk-514" -"537","swamp","waterlever1-1232" -"538","swamp","pool1-full-542" -"539","swamp","bigchest1-839" -"540","swamp","pool2-empty-710" -"541","swamp","potkey3-dash-336" -"542","swamp","potkey3-walk-339" -"543","swamp","pool2-empty2-554" -"544","swamp","bigchest2-759" -"545","swamp","waterlever2-1355" -"546","swamp","bigchest3-844" -"547","swamp","pool2-full1-hammerdash-920" -"548","swamp","pool2-full1-rta-939" -"549","swamp","jelly-dash-1015" -"550","swamp","sociable-firebar-1030" -"551","swamp","jellydash-northside-433" -"552","swamp","bigkey-719" -"553","swamp","jelly-dash2-928" -"554","swamp","pool2-full2-dboost-907" -"555","swamp","pool2-full2-hammerdash-925" -"556","swamp","pool2-full2-rta-936" -"557","swamp","bigchest4-2026" -"558","swamp","bigchest4-rta-2112" -"559","swamp","statue-room-arrows-1205" -"560","swamp","statue-room-no-arrows-1127" -"561","swamp","red-jelly-2slash-351" -"562","swamp","red-jelly-beam-340" -"563","swamp","red-jelly-dash-326" -"564","swamp","water-lever3-1146" -"565","swamp","smallhall-313" -"566","swamp","waterfall-room-509" -"567","swamp","restock-all-448" -"568","swamp","restock-arrows-only-422" -"569","swamp","restock-bomb-only-420" -"570","swamp","restock-skip-dash-330" -"571","swamp","restock-skip-walk-334" -"572","swamp","c-room-602" -"573","swamp","phelps-way-943" -"574","swamp","t-room-234" -"575","swamp","arrghus-frqk-1737" -"576","swamp","arrghus-frqk-1745" -"577","swamp","arrghus-frqk-1748" -"578","swamp","arrghus-noqk-1902" -"579","swamp","arrghus-noqk-1930" -"580","mire","outside-swamp-357" -"581","mire","outside-swamp-from-fr-341" -"582","mire","outside-swamp-from-fr-with-qw-348" -"583","mire","outside-swamp-from-mirror-qw-236" -"584","mire","outside-watergate-852" -"585","mire","outside-watergate-from-qw-836" -"586","mire","dm-both-swordclimbs-2145" -"587","mire","dm-hookspeed-noswordclimbs-2202" -"588","mire","dm-hybrid-2205" -"589","mire","dm-spindash-2123" -"590","mire","dm-spindash-2134" -"591","mire","dm-spindash-dmgcancel-2111" -"592","mire","dark-dm-534" -"593","mire","ether-dashoff-2305" -"594","mire","ether-quickhop-2243" -"595","mire","octoballoon-610" -"596","mire","icerod-entrance-931" -"597","mire","icerod1-334" -"598","mire","icerodchest-nomenu-659" -"599","mire","icerodchest-rta-menu-815" -"600","mire","icerod2-menu-350" -"601","mire","icerod2-rta-nomenu-233" -"602","mire","icerod-leaving-547" -"603","mire","icerod-leaving-rta-556" -"604","mire","mirewarp-menu-701" -"605","mire","mire-entrance-nomenu-2501" -"606","mire","mire01-821" -"607","mire","mire02-1031" -"608","mire","mainhub1-toproute-947" -"609","mire","poporoom1-337" -"610","mire","spikekey1-351" -"611","mire","poporoom2-337" -"612","mire","beatthefireball-938" -"613","mire","jellykey-449" -"614","mire","tileroom-321" -"615","mire","bombslugs-508" -"616","mire","torches1-752" -"617","mire","torches2-rta-2127" -"618","mire","torches2-toplighting-2121" -"619","mire","bighole-322" -"620","mire","bigkey-621" -"621","mire","warptile-230" -"622","mire","wizzroom-412" -"623","mire","bigspike-318" -"624","mire","lonelystalfos-337" -"625","mire","sparkgamble-bestboost-1106" -"626","mire","sparkgamble-damageless-1144" -"627","mire","sparkgamble-rta-menu-1236" -"628","mire","sparkgamble-snekblock-1205" -"629","mire","maproom-south-327" -"630","mire","maproom-south-rta-327" -"631","mire","bigchest-menu-1012" -"632","mire","bigchest-nomenu-852" -"633","mire","maproom-north-328" -"634","mire","spikeykey2-rta-walk-702" -"635","mire","spikeykey2-rta-walk-magicgrab-753" -"636","mire","spikeykey2-rta-walk-magicgrab-with-hook-752" -"637","mire","jadinledge-hookdash-333" -"638","mire","jadinledge-quickhop-328" -"639","mire","jadinledge-rta-2dash-332" -"640","mire","wizzpot-rta-hook-610" -"641","mire","wizzpot-topdash-558" -"642","mire","bridge-504" -"643","mire","caneblockswitch-old-928" -"644","mire","caneblockswitch-spooky-934" -"645","mire","bigblock-429" -"646","mire","caneswitch-spooky-1132" -"647","mire","caneswitch-spooky-roddash-bonk-1108" -"648","mire","bombwall-spooky-dashout-513" -"649","mire","bombwall-spooky-dashout-risky-var-443" -"650","mire","bombwall-spooky-walk-534" -"651","mire","badfarmroom-spooky-dash-above-612" -"652","mire","badfarmroom-spooky-dash-below-608" -"653","mire","badfarmroom-spooky-riskier-walk-619" -"654","mire","badfarmroom-spooky-rta-walk-624" -"655","mire","firesnek-skip-menu-956" -"656","mire","firesnek-skip-rta-nomenu-909" -"657","mire","firesnek-skip-rta-nomenu-915" -"658","mire","vitty-nomenu-1732" -"659","mire","vitty-rta-menu-1846" -"660","?","?" -"661","trock","outside-mire-335" -"662","trock","outside-desert-818" -"663","trock","wafflehouse-drivethru-1241" -"664","trock","wafflehouse-drivethru-nostairclimb-1243" -"665","trock","broken-bridge-1034" -"666","trock","broken-bridge-fromfacingup-1037" -"667","trock","paradox-lower-454" -"668","trock","paradox-upper-740" -"669","trock","run-killing-deadrocks-525" -"670","trock","hammerpegs-1251" -"671","trock","outside-trock-2057" -"672","trock","outside-trock-rta-1957" -"673","trock","dungeon-entrance-menu-933" -"674","trock","dungeon-entrance-no-menu-818" -"675","trock","largepit1-928" -"676","trock","torches-1428" -"677","trock","torches-rta-1432" -"678","trock","rollerroom-1038" -"679","trock","rollerroom-topdmg-1032" -"680","trock","torches-backtrack-346" -"681","trock","largepit2-1025" -"682","trock","pokey0-526" -"683","trock","pokey0-rta-551" -"684","trock","chomps-2blocks-805" -"685","trock","chomps-bbb-758" -"686","trock","chomps-blocknbeam-748" -"687","trock","tunnels-arrows-2040" -"688","trock","tunnels-no-arrows-1948" -"689","trock","lava-room1-739" -"690","trock","pokey1-bl-keydash-849" -"691","trock","bigkey-fromdash-1245" -"692","trock","bigkey-fromwalk-1241" -"693","trock","pokey1-backtrack-beamless-644" -"694","trock","pokey1-backtrack-beams-632" -"695","trock","pokey1-backtrack-canedash-624" -"696","trock","lava-room3-1247" -"697","trock","double-pokeys-429" -"698","trock","miniroller-2dash-339" -"699","trock","lavaroom4-619" -"700","trock","walldash-414" -"701","trock","crystalroller-beams-812" -"702","trock","darkroom-2428" -"703","trock","helmadash1-623" -"704","trock","laserskip-block-921" -"705","trock","laserskip-dash-823" -"706","trock","helmadash2-414" -"707","trock","helmadash2-rta-417" -"708","trock","canedash-725[30lf]" -"709","trock","canedash-725[31lf]" -"710","trock","canedash-magicless-814" -"711","trock","canedash-rta-walk-823" -"712","trock","restock-graball-1238" -"713","trock","restock-magicgrab-1232" -"714","trock","restock-skipall-1145" -"715","trock","trinexx-rta-3759" -"716","gtower","outside-trock-454" -"717","gtower","lynel-bridge-909" -"718","gtower","entrance-2239" -"719","gtower","entrance-nostairclimb-2251" -"720","gtower","foyer-624" -"721","gtower","torchkey-bonkandwalk-759" -"722","gtower","torchkey-hook-758" -"723","gtower","torchkey-nokey-606" -"724","gtower","conveyor-potkey-905" -"725","gtower","spikeskip-919" -"726","gtower","spikeskip-noskip-937" -"727","gtower","double-crystal-switch-719" -"728","gtower","double-crystal-switch-rta-739" -"729","gtower","double-crystal-switch-rta-740" -"730","gtower","spike-and-pegs-356" -"731","gtower","firesnake-room-1029" -"732","gtower","firesnake-room-bonk-1117" -"733","gtower","firesnake-room-framerule-1011" -"734","gtower","warp-tile1-157" -"735","gtower","warp-tile2-344" -"736","gtower","warp-tile2-justholddown-350" -"737","gtower","warp-tile3-430" -"738","gtower","warp-tileskip-816" -"739","gtower","warp-tileskip-with-menu-931" -"740","gtower","false-floor-no-menu-1017" -"741","gtower","false-floor-with-menu-1122" -"742","gtower","bombable-floor-717" -"743","gtower","icearmos-1529" -"744","gtower","icearmos-321-1548" -"745","gtower","icearmos-321-dboost-1546" -"746","gtower","bk-arrows-738" -"747","gtower","bk-no-arrows-606" -"748","gtower","foyer2-745" -"749","gtower","mj-room-1045-arrow-dash" -"750","gtower","mimics1-joestrat-647" -"751","gtower","mimics1-myramics-653" -"752","gtower","mimics2-blunt-553" -"753","gtower","mimics2-opt-519" -"754","gtower","east-spike-room-302" -"755","gtower","spiketrap-1341" -"756","gtower","spiketrap-abovepot-1406" -"757","gtower","gbz-513" -"758","gtower","gbz-walk-637" -"759","gtower","g1-838" -"760","gtower","g2-441" -"761","gtower","g3-644" -"762","gtower","g4-446" -"763","gtower","g5-459" -"764","gtower","bunnybeamhall-305" -"765","gtower","lanmo2-1141" -"766","gtower","restock-248" -"767","gtower","wizz1-849" -"768","gtower","guardbridge-529" -"769","gtower","wizz2-429" -"770","gtower","foosdabridge-653" -"771","gtower","foosdabridge-rightdash-703" -"772","gtower","torches1-1251-magic-noroddash" -"773","gtower","eyelasers-529" -"774","gtower","torches2-637" -"775","gtower","torches2-safewalk-647" -"776","gtower","helmakey-500-dmg" -"777","gtower","helmakey-507-dmgless" -"778","gtower","bombwall-521" -"779","gtower","bombwall-damageless-530" -"780","gtower","bombwall-rta-543" -"781","gtower","pegschestkey-843" -"782","gtower","pegschestkey-magicskip-454" -"783","gtower","pegschestkey-safe-634" -"784","gtower","mold2-hover-1232" -"785","gtower","mold2-hover-1301" -"786","gtower","mold2-hover-1337" -"787","gtower","mold2-kill-hook-1949" -"788","gtower","mold2-kill-hook-1958" -"789","gtower","helma-hallway-607" -"790","gtower","helma-hallway-safe-620" -"791","gtower","torch-hallway-635" -"792","gtower","agah2-4927" -"793","?","?" -"794","?","?" -"795","?","?" -"796","?","?" -"797","?","?" -"798","ganon","ganon-139.55-nfc" -"799","ganon","ganon-139.55" -"800","?","?" -"801","?","?" -"802","?","?" -"803","?","?" -"804","?","?" -"805","?","?" -"806","?","?" -"807","?","?" -"808","?","?" -"809","?","?" -"810","?","?" -"811","?","?" -"812","?","?" -"813","?","?" -"814","?","?" -"815","?","?" -"816","?","?" diff --git a/rooms-list.txt b/rooms-list.txt deleted file mode 100644 index 7e55cf5..0000000 --- a/rooms-list.txt +++ /dev/null @@ -1,818 +0,0 @@ -'ID','Dungeon','Room' -'0','?','links-house-2911' -'1','?','outside-links-house-723' -'2','?','outside-castle-1628' -'3','?','outside-castle-1631' -'4','?','uncle-1342' -'5','?','uncle-1348' -'6','?','passage-exit-442' -'7','?','courtyard-923' -'8','?','castle-lobby-631' -'9','?','castle-lobby-pumpless-636' -'10','?','sw-room-439' -'11','?','sw-room-pumpless-448' -'12','?','west-guard-hallway1-603' -'13','?','statue-hallway1-415' -'14','?','1st-keyguard-leftslash-801' -'15','?','first-keyguard1-3slash-825' -'16','?','first-keyguard1-upspin-811' -'17','?','b1-pit-lower-404' -'18','?','b1-pit2-lower-945' -'19','?','stealth-room-927' -'20','?','stealth-room-929' -'21','?','green-guard-bestrng-432' -'22','?','green-guard-bestrng-rta-438' -'23','?','blue-boomguard-739' -'24','?','blue-boomguard-skip-627' -'25','?','green-guard2-426' -'26','?','stairs-to-b2-1-359' -'27','?','b2-1-533' -'28','?','bnc-1pot4slash-3227' -'29','?','bnc-8slash-3120' -'30','?','bnc-8slash-3130' -'31','?','bnc-joestrat-3238' -'32','?','bnc-joestrat-3244' -'33','?','b2-2-530' -'34','?','stairs-to-b2-2-651' -'35','?','stairs-to-b2-2-652' -'36','?','green-guard3-426' -'37','?','stealth-room2-920' -'38','?','b1-pit2-upper-301' -'39','?','b1-pit1-upper-627' -'40','?','b1-pit1-upper-pumpless-628' -'41','?','1st-keyguard2-314' -'42','?','statue-hallway2-709' -'43','?','west-guard-hallway2-612' -'44','?','sw-room2-445' -'45','?','castle-lobby2-721' -'46','?','throne-room-1632' -'47','?','throne-room-1634' -'48','?','sewer-passage-857' -'49','?','sewer-passage-pumpless-903' -'50','?','snake-room-700' -'51','?','snake-room-perfect-rng-655' -'52','?','sewer-key-chest-risky-1212' -'53','?','sewer-key-chest-rta-1215' -'54','?','sewer1-706' -'55','?','sewer1-707' -'56','?','sewer2-608' -'57','?','keyrat-840' -'58','?','rat-hallway-827' -'59','?','behind-sanc-705' -'60','?','behind-sanc-rta-719' -'61','?','behind-sanc2-720' -'62','?','?' -'63','?','sanc-2946' -'64','?','sanc-heart-3303' -'65','?','sanc-heart-chestturn-3305' -'66','?','outside-sanc-807' -'67','?','graveyard-646' -'68','?','east-path-403' -'69','?','wooden-bridge-906' -'70','?','octofield-724' -'71','?','guard-bridge-311' -'72','?','east-fairy-cave-right-exit-326' -'73','?','outside-eastern-2540' -'74','?','entrance-504' -'75','?','three-popos-434' -'76','?','cannonballs-859' -'77','?','bigchest-upper-leftpot-736' -'78','?','westwing-upper-455' -'79','?','stalfos-spawn-617' -'80','?','compass-room-615' -'81','?','westwing-lower1-335' -'82','?','bigchest-lower1-arrows-805' -'83','?','bigchest-lower1-noarrows-704' -'84','?','east-wing-645' -'85','?','dark-af-boom-623' -'86','?','dark-af-sword-630' -'87','?','dark-potkey-diagboom-656' -'88','?','dark-potkey-walk-658' -'89','?','dark-af2-607' -'90','?','cannonballs-upper-851' -'91','?','bigkey-1105' -'92','?','westwing-lower2-756' -'93','?','bigchest-bow-1452' -'94','?','gwg-noslash-menu-913' -'95','?','afpots-802' -'96','?','eyegore-floor-switch-519' -'97','?','eyegore-floor-switch-pumpless-522' -'98','?','cannonball-switch-503' -'99','?','cannonball-switch-pumpless-507' -'100','?','zgr-601' -'101','?','double-red-eyegores-617' -'102','?','armos-topright-1321' -'103','?','outside-eastern-1322' -'104','?','saha-walkout-1951-449-8' -'105','?','outside-eastern2-1301-99-0' -'106','?','east-fairy-cave-253' -'107','?','guard-bridge-601-35-0' -'108','?','links-yard-354-32-0' -'109','?','annoying-bushes-403' -'110','?','west-of-swamp1-356' -'111','?','south-of-grove1-right-exit-452-32-0' -'112','?','grove-westside1-nocharge-255' -'113','?','grove-westside1-swordcharge-308' -'114','?','outside-library1-dashes-708' -'115','?','outside-library1-spindash-626' -'116','?','library-1038-127-0' -'117','?','outside-library2-noss-751-99-0' -'118','?','outside-library2-spindash-707' -'119','?','grove-westside2-leftexit-233-36' -'120','?','grove-westside2-rta-243-36' -'121','?','south-of-grove2-fromleft-belowbush-458-32' -'122','?','south-of-grove2-fromleft-bushdash-455-32' -'123','?','south-of-grove2-fromright-bushdash-447-32' -'124','?','west-of-swamp2-frombelow-350' -'125','?','west-of-swamp2-frombushes-346' -'126','?','west-of-swamp2-fromlowbushes-346' -'127','?','west-of-swamp2-fromlowbushes-farleftexit-346' -'128','?','annoying-bushes2-352-33' -'129','?','links-yard-339-32' -'130','?','links-yard-earlydash-336-32' -'131','?','waterdash-menu-629-35-1' -'132','?','waterdash-nomenu-524-37-0' -'133','?','east-of-watergate-216-35' -'134','?','watergate-552-37' -'135','?','middle-aged-man-643-31' -'136','?','outside-desert-2250-175' -'137','?','desert1-risky-726-97' -'138','?','desert1-rta-730-98' -'139','?','north-hall1-leftpoke-510-21' -'140','?','north-hall1-rtapoke-512-21' -'141','?','nw-room1-258-19' -'142','?','torchkey-rta-614' -'143','?','torchkey-underleft-614' -'144','?','nw-room2-235' -'145','?','north-hall2-412-21' -'146','?','ne-room1-351' -'147','?','east-wing1-416-21' -'148','?','compass-room1-519' -'149','?','bigkey-chestturn-758-49' -'150','?','bigkey-rta-goodrng-803' -'151','?','compass-room2-405' -'152','?','compass-room2-pumpless-407' -'153','?','east-wing2-318' -'154','?','east-wing2-pumpless-319' -'155','?','ne-room2-418-20' -'156','?','north-hall3-412-21' -'157','?','nw-room3-346-18' -'158','?','cop1-528' -'159','?','bigchest-606-29-1' -'160','?','cop2-355' -'161','?','nw-room4-dashes-348' -'162','?','nw-room4-walk-rta-349' -'163','?','west-wing-451-21' -'164','?','d1-exit-324' -'165','?','outside-desert-noss-709-102' -'166','?','outside-desert-spindash-732-102-3' -'167','?','d2-entrance-528-96' -'168','?','d2-entrance-pumpless-532-97' -'169','?','tile-room1-458' -'170','?','bridge-539-58' -'171','?','popos-546' -'172','?','beamos-hall-706-1' -'173','?','beamos-hall-rta-720' -'174','?','tile-room2-517-21' -'175','?','torches-nomenu-1549-0-0' -'176','?','torches-rta-1656-0-4' -'177','?','lanmos-2cyc-1953' -'178','?','lanmos-2cyc-2059' -'179','?','outside-desert-cactusdash-1044-77-0' -'180','?','outside-desert-geldmandash-1053-76-0' -'181','?','outside-desert-rta-highdash-1109-76-0' -'182','?','outside-desert-rta-lowdash-1116-76-0' -'183','?','middle-aged-man-634-30-0' -'184','?','watergate-458-34-0' -'185','?','beach-445-35-0' -'186','?','beach-rta-530-35-0' -'187','?','fakeflips-832-36-0' -'188','?','fakeflips-rta-808-35-0' -'189','?','whirlpool-enter-336-36-0' -'190','?','whirlpool-exit-806-72-0' -'191','?','rupee-tree-picklearrow-808-35-0' -'192','?','rupee-tree-rta-821-35-0' -'193','?','old-man-cave-1026-134-0' -'194','?','old-man-tunnel-2139-295-8' -'195','?','death-mountain-lower-3039-246-009' -'196','?','bunny-link-739' -'197','?','death-mountain-upper-ledgehop-736-76-0' -'198','?','death-mountain-upper-rta-748-76-0' -'199','?','lobby1-503-101-0' -'200','?','lobby1-pumpless-507-101-0' -'201','?','basement-key-629-71-0' -'202','?','lobby2-boom-859-107-007' -'203','?','lobby2-boomdash-851-107-010' -'204','?','lobby2-boomless-824' -'205','?','tileroom-boomdash-4340-66-0' -'206','?','tileroom-boomless-4326' -'207','?','3mold-boom-menu-429-0-2' -'208','?','3mold-boomless-538' -'209','?','torches-812-31-008' -'210','?','lobby3-540-107-0' -'211','?','beetles-936-63-0' -'212','?','bkdoor-342-0-0' -'213','?','bkdoor-pumpless-345-0-0' -'214','?','safety-switch-634' -'215','?','safety-switch-pumpless-dash-639' -'216','?','safety-switch-pumpless-walk-639' -'217','?','bigchest-ebj-2143-95-17' -'218','?','bigchest-waffle-rta-2324-95-20' -'219','?','bigchest-waffle-sparkmanip-2301-95-18' -'220','?','bumper-skip-729-66-0' -'221','?','moldorm-2752-116-0' -'222','?','moldorm-2858-116-0' -'223','?','death-mountain-upper-943' -'224','?','kak-tunnel-01-806' -'225','?','kak-tunnel-02-607' -'226','?','kak-tunnel-02-arrows-835' -'227','?','kak-tunnel-02-rta-710' -'228','?','first-rupee-tree-928' -'229','?','first-rupee-tree-birddash-1029' -'230','?','first-rupee-tree-rta-x4FA-exit-921' -'231','?','lumberjacks-652' -'232','?','lumberjacks-picklearrow-y078-enter-455' -'233','?','lumberjacks-rta-y078-enter-701' -'234','?','lost-woods-01-1709' -'235','?','lost-woods-01-y078-enter-1713' -'236','?','master-sword-3909' -'237','?','lost-woods-02-2252' -'238','?','lost-woods-02-rta-2243' -'239','?','fortune-teller-hut-rta-619' -'240','?','whirlpool-pond-348' -'241','?','wsb-543' -'242','?','outside-hyrule-castle-1000' -'243','?','castle-lobby-abovetorch-531' -'244','?','castle-lobby-rta-540' -'245','?','sw-room-455-bad-recording' -'246','?','sw-room-456' -'247','?','ramparts-617' -'248','?','entrance-334' -'249','?','goldknights-pui-734' -'250','?','prizepack-guards-703' -'251','?','first-dark-room-605' -'252','?','first-dark-room-rta-619' -'253','?','despair-1617-44' -'254','?','last-3f-dark-room-436' -'255','?','first-4f-dark-room-625' -'256','?','first-4f-dark-room-pumpless-628' -'257','?','melancholy-rta-715' -'258','?','archerkey-beams-keydash-534' -'259','?','archerkey-beams-rta-558' -'260','?','redspearguards-809' -'261','?','alert-guards-arrowkill-516' -'262','?','alert-guards-beamkill-528' -'263','?','cop-menu-638' -'264','?','neopolitan-room-325' -'265','?','statue-room-646' -'266','?','catwalk-boom-624' -'267','?','catwalk-boomless-621-bad-recording' -'268','?','7f-hallway-521' -'269','?','agah-cutscene-2451' -'270','?','agah-0bb-4451' -'271','?','pyramid-1043' -'272','?','dark-octo-319' -'273','?','hammer-bridge-444' -'274','?','dark-east-fairy-cave-250' -'275','?','outside-4157' -'276','?','entrance1-dash-554' -'277','?','entrance1-walk-556' -'278','?','west-bomb-pickup-336' -'279','?','shooter-key-847' -'280','?','entrance2-333' -'281','?','bomb-pickup1-428' -'282','?','junction1-ledgehop-524' -'283','?','junction1-slashjelly-556' -'284','?','turtle-key-619' -'285','?','entrance3-333' -'286','?','bomb-pickup2-412' -'287','?','junction2-907' -'288','?','junction2-badrng-917' -'289','?','upper-turtle-key-715' -'290','?','bigkey-leftside-754' -'291','?','entrance4-333' -'292','?','bomb-pickup3-412' -'293','?','junction3-651' -'294','?','beetle-room1-954' -'295','?','beetle-room1-dash2chest-1002' -'296','?','beetle-room1-rta-1012' -'297','?','hammeryump-1bombpickup-1324' -'298','?','hammeryump-2bombpickup-1348' -'299','?','darkmaze-738' -'300','?','entrance5-333' -'301','?','bomb-pickup4-412' -'302','?','junction4-651' -'303','?','beetle-room2-dash-and-hop-644' -'304','?','beetle-room2-rta-walk-702' -'305','?','beetle-room2-walk-and-hop-657' -'306','?','sexy-statue-1333' -'307','?','ugly-statue-1406' -'308','?','mimics-454' -'309','?','eye-statue-dashes-2454' -'310','?','eye-statue-walk-rta-2456' -'311','?','darkpegs-607' -'312','?','lonely-turtle-457' -'313','?','turtle-party-701-cropped' -'314','?','turtle-party-701' -'315','?','turtle-party-809' -'316','?','warp-tile-512' -'317','?','turtle-hallway-dash-and-keydash-709' -'318','?','turtle-hallway-rta-walk-and-slash-745' -'319','?','turtle-hallway-walk-and-keydash-720' -'320','?','helma-2739' -'321','?','helma-2813' -'322','?','helma-2830' -'323','?','helma-2843' -'324','?','helma-2927' -'325','?','outside-pod-2627' -'326','?','dark-east-fairy-cave-259' -'327','?','pegbridge-earlydash-639' -'328','?','pegbridge-safedash-646' -'329','?','bombshop-359' -'330','?','annoying-bushes-402' -'331','?','annoying-bushes-rightcancel-402' -'332','?','southeast-of-fluteboy-dash-334' -'333','?','southeast-of-fluteboy-walk-rta-328' -'334','?','south-of-fluteboy-458' -'335','?','south-of-fluteboy-walk-rta-508' -'336','?','fluteboy-rta-1503' -'337','?','grove-rta-1840' -'338','?','south-of-grove-445' -'339','?','grove-westside-236' -'340','?','usain-bolt-720' -'341','?','kak-village-centerdash-3335' -'342','?','kak-village-leftdash-3335' -'343','?','three-musketeers-3xdash-557' -'344','?','lost-woods-830' -'345','?','warp-rock-705' -'346','?','warp-rock-no-hammerdash-724' -'347','?','north-of-outcast-748' -'348','?','voo-943' -'349','?','sw-quad-badrng-745' -'350','?','sw-quad-goodrng-736' -'351','?','nw-quad-333' -'352','?','ne-quad-badrng-350' -'353','?','ne-quad-goodrng-337' -'354','?','se-quad1-551' -'355','?','bigkey-610' -'356','?','se-quad2-628' -'357','?','ne-quad2-733' -'358','?','stalfos-hallway-hammer-755' -'359','?','stalfos-hallway-pickup-754' -'360','?','snek-and-zazaks-335' -'361','?','conveyor-gibos-north-352' -'362','?','conveyor-gibos-north-353' -'363','?','hellway-429' -'364','?','spikeroom1-hammer-515' -'365','?','spikeroom1-mikestrat-502' -'366','?','attic-pot-switch1-badrng-828' -'367','?','attic-pot-switch1-goodrng-pickup-750' -'368','?','grasshopper-hall1-1-252' -'369','?','grasshopper-hall2-1-308' -'370','?','attic-window-slashgrass-556' -'371','?','grasshopper-hall2-2-240' -'372','?','grasshopper-hall1-2-307' -'373','?','attic-pot-switch2-306' -'374','?','spikeroom2-606' -'375','?','hellway2-322' -'376','?','zazaks-and-gibos-543' -'377','?','zazaks-and-gibos-545' -'378','?','conveyor-toilet-bomb-404' -'379','?','conveyor-toilet-nobomb-321' -'380','?','bigblock-837' -'381','?','lonely-zazak-315' -'382','?','prison-dashes-1053' -'383','?','prison-walk-1106' -'384','?','prison-walk-oneslash-1124' -'385','?','lonely-zazak2-252' -'386','?','conveyor-jellies1-328' -'387','?','bigchest-606' -'388','?','conveyor-jellies2-509' -'389','?','bigblock2-arrows-412' -'390','?','bigblock2-noarrows-345' -'391','?','conveyor-toilet2-dash-hammer-736' -'392','?','conveyor-toilet2-hammerdash-726' -'393','?','conveyor-toilet2-rta-751' -'394','?','stalfos-hallway2-324' -'395','?','blind-beams-2701' -'396','?','blind-beams-walkin-2707' -'397','?','voo1-902' -'398','?','voo1-rta-914' -'399','?','300-hut-721' -'400','?','300-hut-rta-720' -'401','?','voo2-dash-628' -'402','?','voo2-walk-630' -'403','?','cursed-dwarf-justpressa-1210' -'404','?','cursed-dwarf-rta-1224' -'405','?','voo3-339' -'406','?','hammerpegs1-820' -'407','?','outside-smiths1-350' -'408','?','smiths1-708' -'409','?','outside-smiths2-237' -'410','?','smiths2-910' -'411','?','outside-smiths3-239' -'412','?','hammerpegs2-342' -'413','?','outside-smiths4-338' -'414','?','smiths3-746' -'415','?','outside-smiths5-236' -'416','?','hammerpegs3-849' -'417','?','voo4-fencedash-441' -'418','?','c-shaped-house-918' -'419','?','voo5-709' -'420','?','moblins-badrng-524' -'421','?','moblins-goodrng-518' -'422','?','skeleton-forest1-1216' -'423','?','mummy-statue-1220' -'424','?','bigkey-badrng-659' -'425','?','bigkey-leftside-620' -'426','?','bigkey-rightside-635' -'427','?','mumm-statue-exit-232' -'428','?','skeleton-forest2-949' -'429','?','bigchest-earlybj-1259' -'430','?','bigchest-rta-bonk-1407' -'431','?','bigchest-rta-bonkless-1406' -'432','?','skeleton-forest3-933' -'433','?','mummy-statue-passthru-427' -'434','?','bumper-hallway-305' -'435','?','potkey-654' -'436','?','skeleton-forest4-738' -'437','?','skeleton-forest4-rta-740' -'438','?','firesnake-keydash-522' -'439','?','potpit-left-442' -'440','?','potpit-right-438' -'441','?','mummy-hellway-744' -'442','?','mummy-hellway-joestrat-812' -'443','?','vineroom-badrng-415' -'444','?','vineroom-goodrng-359' -'445','?','mummy-key-629' -'446','?','mummy-key-rta-633' -'447','?','mothhole-top-422' -'448','?','mothula-1118' -'449','?','mothula-1122' -'450','?','outside-skull-menu-352' -'451','?','lost-woods-dash-758' -'452','?','lost-woods-walk-806' -'453','?','links-house-632' -'454','?','castle-gate-menu-rta-qw-637' -'455','?','castle-gate-menu-walk-qw-639' -'456','?','castle-gate-walk-qw-534' -'457','?','pyramid-659' -'458','?','dark-octofield-236' -'459','?','broken-bridge-738' -'460','?','lonely-ropa-243' -'461','?','ropa-lottery-910' -'462','?','dark-cuckoos-leftgrab-737' -'463','?','dark-cuckoos-rta-746' -'464','?','quake-1925' -'465','?','quake-earlythrow-1858' -'466','?','whirlpool1-dashcancel-605' -'467','?','whirlpool1-nocancel-603' -'468','?','zoras-domain-dashout-5934' -'469','?','zoras-domain-walkout-5933' -'470','?','tiny-warp-dik-605' -'471','?','ice-warp-833' -'472','?','ice-island-358' -'473','?','ice-entrance-438' -'474','?','ice2-508' -'475','?','floor-switch-910' -'476','?','block-intersection1-358' -'477','?','compass-room-144' -'478','?','block-intersection2-456' -'479','?','penguins1-spin-535' -'480','?','penguins1-tmstrat-523' -'481','?','block-intersection3-512' -'482','?','bombable-floor-dboost-916' -'483','?','bombable-floor-nodboost-944' -'484','?','bombable-floor-rta-good-rng-957' -'485','?','big-stalfos-819' -'486','?','conveyor-hellway-709' -'487','?','ipbj-1209' -'488','?','floor-zols-300' -'489','?','penguins2-804' -'490','?','big-spike-405' -'491','?','lonely-firebar-419' -'492','?','lonely-firebar-dash-451' -'493','?','double-freezor-503' -'494','?','big-chest-401' -'495','?','big-pit-351' -'496','?','block-push-hammerpot-badlag-542' -'497','?','block-push-potpickup-badlag-539' -'498','?','statue-room-hammer-both-pots-1323' -'499','?','statue-room-hammer-one-pot-1306' -'500','?','statue-room-pickup-both-pots-1318' -'501','?','statue-room-pickup-one-pot-1304' -'502','?','kholdstare-1poke-1621' -'503','?','kholdstare-2poke-1559' -'504','?','kholdstare-2poke-1602' -'505','?','kholdstare-6slash-1655' -'506','?','ice-island-343' -'507','?','lake-hylia-birddash-803' -'508','?','lake-hylia-walk-812' -'509','?','links-house-521' -'510','?','grassy-area-menu-437' -'511','?','warp-nokill-422' -'512','?','warp-octokill-437' -'513','?','postwarp-hammerdash-950' -'514','?','postwarp-walk-959' -'515','?','outside-swamp1-noqw-629' -'516','?','outside-swamp1-qw-617' -'517','?','outside-watergate-noqw-427' -'518','?','outside-watergate-qw-407' -'519','?','watergate-entrance-mirrordash-455' -'520','?','watergate-entrance-walk-500' -'521','?','afskip-715' -'522','?','afskip-bonk-736' -'523','?','afskip-rta-732' -'524','?','watergate-entrance2-317' -'525','?','outside-watergate2-closewarp-236' -'526','?','outside-watergate2-qw-413' -'527','?','outside-swamp2-closewarp-424' -'528','?','outside-swamp2-qw-352' -'529','?','dungeon-entrance-1017' -'530','?','potkey1-menu-1050' -'531','?','potkey1-nomenu-923' -'532','?','pool1-empty-627' -'533','?','potkey2-dash-336' -'534','?','potkey2-walk-339' -'535','?','pool1-empty2-dash-515' -'536','?','pool1-empty2-walk-514' -'537','?','waterlever1-1232' -'538','?','pool1-full-542' -'539','?','bigchest1-839' -'540','?','pool2-empty-710' -'541','?','potkey3-dash-336' -'542','?','potkey3-walk-339' -'543','?','pool2-empty2-554' -'544','?','bigchest2-759' -'545','?','waterlever2-1355' -'546','?','bigchest3-844' -'547','?','pool2-full1-hammerdash-920' -'548','?','pool2-full1-rta-939' -'549','?','jelly-dash-1015' -'550','?','sociable-firebar-1030' -'551','?','jellydash-northside-433' -'552','?','bigkey-719' -'553','?','jelly-dash2-928' -'554','?','pool2-full2-dboost-907' -'555','?','pool2-full2-hammerdash-925' -'556','?','pool2-full2-rta-936' -'557','?','bigchest4-2026' -'558','?','bigchest4-rta-2112' -'559','?','statue-room-arrows-1205' -'560','?','statue-room-no-arrows-1127' -'561','?','red-jelly-2slash-351' -'562','?','red-jelly-beam-340' -'563','?','red-jelly-dash-326' -'564','?','water-lever3-1146' -'565','?','smallhall-313' -'566','?','waterfall-room-509' -'567','?','restock-all-448' -'568','?','restock-arrows-only-422' -'569','?','restock-bomb-only-420' -'570','?','restock-skip-dash-330' -'571','?','restock-skip-walk-334' -'572','?','c-room-602' -'573','?','phelps-way-943' -'574','?','t-room-234' -'575','?','arrghus-frqk-1737' -'576','?','arrghus-frqk-1745' -'577','?','arrghus-frqk-1748' -'578','?','arrghus-noqk-1902' -'579','?','arrghus-noqk-1930' -'580','?','outside-swamp-357' -'581','?','outside-swamp-from-fr-341' -'582','?','outside-swamp-from-fr-with-qw-348' -'583','?','outside-swamp-from-mirror-qw-236' -'584','?','outside-watergate-852' -'585','?','outside-watergate-from-qw-836' -'586','?','dm-both-swordclimbs-2145' -'587','?','dm-hookspeed-noswordclimbs-2202' -'588','?','dm-hybrid-2205' -'589','?','dm-spindash-2123' -'590','?','dm-spindash-2134' -'591','?','dm-spindash-dmgcancel-2111' -'592','?','dark-dm-534' -'593','?','ether-dashoff-2305' -'594','?','ether-quickhop-2243' -'595','?','octoballoon-610' -'596','?','icerod-entrance-931' -'597','?','icerod1-334' -'598','?','icerodchest-nomenu-659' -'599','?','icerodchest-rta-menu-815' -'600','?','icerod2-menu-350' -'601','?','icerod2-rta-nomenu-233' -'602','?','icerod-leaving-547' -'603','?','icerod-leaving-rta-556' -'604','?','mirewarp-menu-701' -'605','?','mire-entrance-nomenu-2501' -'606','?','mire01-821' -'607','?','mire02-1031' -'608','?','mainhub1-toproute-947' -'609','?','poporoom1-337' -'610','?','spikekey1-351' -'611','?','poporoom2-337' -'612','?','beatthefireball-938' -'613','?','jellykey-449' -'614','?','tileroom-321' -'615','?','bombslugs-508' -'616','?','torches1-752' -'617','?','torches2-rta-2127' -'618','?','torches2-toplighting-2121' -'619','?','bighole-322' -'620','?','bigkey-621' -'621','?','warptile-230' -'622','?','wizzroom-412' -'623','?','bigspike-318' -'624','?','lonelystalfos-337' -'625','?','sparkgamble-bestboost-1106' -'626','?','sparkgamble-damageless-1144' -'627','?','sparkgamble-rta-menu-1236' -'628','?','sparkgamble-snekblock-1205' -'629','?','maproom-south-327' -'630','?','maproom-south-rta-327' -'631','?','bigchest-menu-1012' -'632','?','bigchest-nomenu-852' -'633','?','maproom-north-328' -'634','?','spikeykey2-rta-walk-702' -'635','?','spikeykey2-rta-walk-magicgrab-753' -'636','?','spikeykey2-rta-walk-magicgrab-with-hook-752' -'637','?','jadinledge-hookdash-333' -'638','?','jadinledge-quickhop-328' -'639','?','jadinledge-rta-2dash-332' -'640','?','wizzpot-rta-hook-610' -'641','?','wizzpot-topdash-558' -'642','?','bridge-504' -'643','?','caneblockswitch-old-928' -'644','?','caneblockswitch-spooky-934' -'645','?','bigblock-429' -'646','?','caneswitch-spooky-1132' -'647','?','caneswitch-spooky-roddash-bonk-1108' -'648','?','bombwall-spooky-dashout-513' -'649','?','bombwall-spooky-dashout-risky-var-443' -'650','?','bombwall-spooky-walk-534' -'651','?','badfarmroom-spooky-dash-above-612' -'652','?','badfarmroom-spooky-dash-below-608' -'653','?','badfarmroom-spooky-riskier-walk-619' -'654','?','badfarmroom-spooky-rta-walk-624' -'655','?','firesnek-skip-menu-956' -'656','?','firesnek-skip-rta-nomenu-909' -'657','?','firesnek-skip-rta-nomenu-915' -'658','?','vitty-nomenu-1732' -'659','?','vitty-rta-menu-1846' -'660','?','?' -'661','?','outside-mire-335' -'662','?','outside-desert-818' -'663','?','wafflehouse-drivethru-1241' -'664','?','wafflehouse-drivethru-nostairclimb-1243' -'665','?','broken-bridge-1034' -'666','?','broken-bridge-fromfacingup-1037' -'667','?','paradox-lower-454' -'668','?','paradox-upper-740' -'669','?','run-killing-deadrocks-525' -'670','?','hammerpegs-1251' -'671','?','outside-trock-2057' -'672','?','outside-trock-rta-1957' -'673','?','dungeon-entrance-menu-933' -'674','?','dungeon-entrance-no-menu-818' -'675','?','largepit1-928' -'676','?','torches-1428' -'677','?','torches-rta-1432' -'678','?','rollerroom-1038' -'679','?','rollerroom-topdmg-1032' -'680','?','torches-backtrack-346' -'681','?','largepit2-1025' -'682','?','pokey0-526' -'683','?','pokey0-rta-551' -'684','?','chomps-2blocks-805' -'685','?','chomps-bbb-758' -'686','?','chomps-blocknbeam-748' -'687','?','tunnels-arrows-2040' -'688','?','tunnels-no-arrows-1948' -'689','?','lava-room1-739' -'690','?','pokey1-bl-keydash-849' -'691','?','bigkey-fromdash-1245' -'692','?','bigkey-fromwalk-1241' -'693','?','pokey1-backtrack-beamless-644' -'694','?','pokey1-backtrack-beams-632' -'695','?','pokey1-backtrack-canedash-624' -'696','?','lava-room3-1247' -'697','?','double-pokeys-429' -'698','?','miniroller-2dash-339' -'699','?','lavaroom4-619' -'700','?','walldash-414' -'701','?','crystalroller-beams-812' -'702','?','darkroom-2428' -'703','?','helmadash1-623' -'704','?','laserskip-block-921' -'705','?','laserskip-dash-823' -'706','?','helmadash2-414' -'707','?','helmadash2-rta-417' -'708','?','canedash-725[30lf]' -'709','?','canedash-725[31lf]' -'710','?','canedash-magicless-814' -'711','?','canedash-rta-walk-823' -'712','?','restock-graball-1238' -'713','?','restock-magicgrab-1232' -'714','?','restock-skipall-1145' -'715','?','trinexx-rta-3759' -'716','?','outside-trock-454' -'717','?','lynel-bridge-909' -'718','?','entrance-2239' -'719','?','entrance-nostairclimb-2251' -'720','?','foyer-624' -'721','?','torchkey-bonkandwalk-759' -'722','?','torchkey-hook-758' -'723','?','torchkey-nokey-606' -'724','?','conveyor-potkey-905' -'725','?','spikeskip-919' -'726','?','spikeskip-noskip-937' -'727','?','double-crystal-switch-719' -'728','?','double-crystal-switch-rta-739' -'729','?','double-crystal-switch-rta-740' -'730','?','spike-and-pegs-356' -'731','?','firesnake-room-1029' -'732','?','firesnake-room-bonk-1117' -'733','?','firesnake-room-framerule-1011' -'734','?','warp-tile1-157' -'735','?','warp-tile2-344' -'736','?','warp-tile2-justholddown-350' -'737','?','warp-tile3-430' -'738','?','warp-tileskip-816' -'739','?','warp-tileskip-with-menu-931' -'740','?','false-floor-no-menu-1017' -'741','?','false-floor-with-menu-1122' -'742','?','bombable-floor-717' -'743','?','icearmos-1529' -'744','?','icearmos-321-1548' -'745','?','icearmos-321-dboost-1546' -'746','?','bk-arrows-738' -'747','?','bk-no-arrows-606' -'748','?','foyer2-745' -'749','?','mj-room-1045-arrow-dash' -'750','?','mimics1-joestrat-647' -'751','?','mimics1-myramics-653' -'752','?','mimics2-blunt-553' -'753','?','mimics2-opt-519' -'754','?','east-spike-room-302' -'755','?','spiketrap-1341' -'756','?','spiketrap-abovepot-1406' -'757','?','gbz-513' -'758','?','gbz-walk-637' -'759','?','g1-838' -'760','?','g2-441' -'761','?','g3-644' -'762','?','g4-446' -'763','?','g5-459' -'764','?','bunnybeamhall-305' -'765','?','lanmo2-1141' -'766','?','restock-248' -'767','?','wizz1-849' -'768','?','guardbridge-529' -'769','?','wizz2-429' -'770','?','foosdabridge-653' -'771','?','foosdabridge-rightdash-703' -'772','?','torches1-1251-magic-noroddash' -'773','?','eyelasers-529' -'774','?','torches2-637' -'775','?','torches2-safewalk-647' -'776','?','helmakey-500-dmg' -'777','?','helmakey-507-dmgless' -'778','?','bombwall-521' -'779','?','bombwall-damageless-530' -'780','?','bombwall-rta-543' -'781','?','pegschestkey-843' -'782','?','pegschestkey-magicskip-454' -'783','?','pegschestkey-safe-634' -'784','?','mold2-hover-1232' -'785','?','mold2-hover-1301' -'786','?','mold2-hover-1337' -'787','?','mold2-kill-hook-1949' -'788','?','mold2-kill-hook-1958' -'789','?','helma-hallway-607' -'790','?','helma-hallway-safe-620' -'791','?','torch-hallway-635' -'792','?','agah2-4927' -'793','?','?' -'794','?','?' -'795','?','?' -'796','?','?' -'797','?','?' -'798','?','ganon-139.55-nfc' -'799','?','ganon-139.55' -'800','?','?' -'801','?','?' -'802','?','?' -'803','?','?' -'804','?','?' -'805','?','?' -'806','?','?' -'807','?','?' -'808','?','?' -'809','?','?' -'810','?','?' -'811','?','?' -'812','?','?' -'813','?','?' -'814','?','?' -'815','?','?' -'816','?','?' diff --git a/sfx/1v2.mp3 b/sfx/1v2.mp3 index be361d1..66202f4 100755 Binary files a/sfx/1v2.mp3 and b/sfx/1v2.mp3 differ diff --git a/sfx/2+2.mp3 b/sfx/2+2.mp3 old mode 100644 new mode 100755 index 20d532d..bb19a00 Binary files a/sfx/2+2.mp3 and b/sfx/2+2.mp3 differ diff --git a/sfx/20gp.mp3 b/sfx/20gp.mp3 index 5984074..a4d6cef 100755 Binary files a/sfx/20gp.mp3 and b/sfx/20gp.mp3 differ diff --git a/sfx/ahhh.mp3 b/sfx/ahhh.mp3 old mode 100644 new mode 100755 index 43f48c0..ca0c285 Binary files a/sfx/ahhh.mp3 and b/sfx/ahhh.mp3 differ diff --git a/sfx/airplane.mp3 b/sfx/airplane.mp3 index ee94336..472596c 100755 Binary files a/sfx/airplane.mp3 and b/sfx/airplane.mp3 differ diff --git a/sfx/albert.mp3 b/sfx/albert.mp3 new file mode 100755 index 0000000..931d387 Binary files /dev/null and b/sfx/albert.mp3 differ diff --git a/sfx/alert.mp3 b/sfx/alert.mp3 new file mode 100755 index 0000000..aa11b7f Binary files /dev/null and b/sfx/alert.mp3 differ diff --git a/sfx/andhot.mp3 b/sfx/andhot.mp3 index cba7ba1..f18f988 100755 Binary files a/sfx/andhot.mp3 and b/sfx/andhot.mp3 differ diff --git a/sfx/andysimpson.mp3 b/sfx/andysimpson.mp3 deleted file mode 100644 index 38a5d90..0000000 Binary files a/sfx/andysimpson.mp3 and /dev/null differ diff --git a/sfx/archery.mp3 b/sfx/archery.mp3 index 6dc370d..4832f3a 100755 Binary files a/sfx/archery.mp3 and b/sfx/archery.mp3 differ diff --git a/sfx/arise.mp3 b/sfx/arise.mp3 index 49f3698..6344170 100755 Binary files a/sfx/arise.mp3 and b/sfx/arise.mp3 differ diff --git a/sfx/aspen.mp3 b/sfx/aspen.mp3 old mode 100644 new mode 100755 index 3d935b0..b32fa3d Binary files a/sfx/aspen.mp3 and b/sfx/aspen.mp3 differ diff --git a/sfx/auw.mp3 b/sfx/auw.mp3 index 7c292aa..2243981 100755 Binary files a/sfx/auw.mp3 and b/sfx/auw.mp3 differ diff --git a/sfx/aww.mp3 b/sfx/aww.mp3 index 84c9f95..ce80397 100755 Binary files a/sfx/aww.mp3 and b/sfx/aww.mp3 differ diff --git a/sfx/bananas.mp3 b/sfx/bananas.mp3 index 7fe5736..3524251 100755 Binary files a/sfx/bananas.mp3 and b/sfx/bananas.mp3 differ diff --git a/sfx/bigshit.mp3 b/sfx/bigshit.mp3 new file mode 100755 index 0000000..4ba7932 Binary files /dev/null and b/sfx/bigshit.mp3 differ diff --git a/sfx/bjqueen.mp3 b/sfx/bjqueen.mp3 index bc438d6..54c000a 100755 Binary files a/sfx/bjqueen.mp3 and b/sfx/bjqueen.mp3 differ diff --git a/sfx/blazeit.mp3 b/sfx/blazeit.mp3 old mode 100644 new mode 100755 index fe3e7e4..9d61956 Binary files a/sfx/blazeit.mp3 and b/sfx/blazeit.mp3 differ diff --git a/sfx/bluntsmd.mp3 b/sfx/bluntsmd.mp3 new file mode 100755 index 0000000..c2387ca Binary files /dev/null and b/sfx/bluntsmd.mp3 differ diff --git a/sfx/bonk.mp3 b/sfx/bonk.mp3 index 7953739..2aaf797 100755 Binary files a/sfx/bonk.mp3 and b/sfx/bonk.mp3 differ diff --git a/sfx/booty.mp3 b/sfx/booty.mp3 index 8636465..858584e 100755 Binary files a/sfx/booty.mp3 and b/sfx/booty.mp3 differ diff --git a/sfx/bossmusic.mp3 b/sfx/bossmusic.mp3 index 441f22c..d1a0780 100755 Binary files a/sfx/bossmusic.mp3 and b/sfx/bossmusic.mp3 differ diff --git a/sfx/bustin.mp3 b/sfx/bustin.mp3 index 81c4111..ef1508e 100755 Binary files a/sfx/bustin.mp3 and b/sfx/bustin.mp3 differ diff --git a/sfx/butt.mp3 b/sfx/butt.mp3 old mode 100644 new mode 100755 index 3366bd7..ae3609a Binary files a/sfx/butt.mp3 and b/sfx/butt.mp3 differ diff --git a/sfx/butwait.mp3 b/sfx/butwait.mp3 deleted file mode 100644 index 1851dc4..0000000 Binary files a/sfx/butwait.mp3 and /dev/null differ diff --git a/sfx/bwaa.mp3 b/sfx/bwaa.mp3 old mode 100644 new mode 100755 index 9dc9c97..3986a3a Binary files a/sfx/bwaa.mp3 and b/sfx/bwaa.mp3 differ diff --git a/sfx/bye.mp3 b/sfx/bye.mp3 index 171847a..769b588 100755 Binary files a/sfx/bye.mp3 and b/sfx/bye.mp3 differ diff --git a/sfx/byeb.mp3 b/sfx/byeb.mp3 new file mode 100755 index 0000000..769b588 Binary files /dev/null and b/sfx/byeb.mp3 differ diff --git a/sfx/carlcandy.mp3 b/sfx/carlcandy.mp3 index 632948a..6c38819 100755 Binary files a/sfx/carlcandy.mp3 and b/sfx/carlcandy.mp3 differ diff --git a/sfx/cd.mp3 b/sfx/cd.mp3 index 0e8a607..e53c05a 100755 Binary files a/sfx/cd.mp3 and b/sfx/cd.mp3 differ diff --git a/sfx/chipotle.mp3 b/sfx/chipotle.mp3 old mode 100644 new mode 100755 index 7b4d4b7..5bc0190 Binary files a/sfx/chipotle.mp3 and b/sfx/chipotle.mp3 differ diff --git a/sfx/chomp.mp3 b/sfx/chomp.mp3 old mode 100644 new mode 100755 index ac2c2c0..a070e67 Binary files a/sfx/chomp.mp3 and b/sfx/chomp.mp3 differ diff --git a/sfx/choochoo.mp3 b/sfx/choochoo.mp3 index 8d40c72..c162ad5 100755 Binary files a/sfx/choochoo.mp3 and b/sfx/choochoo.mp3 differ diff --git a/sfx/chrislaugh.mp3 b/sfx/chrislaugh.mp3 old mode 100644 new mode 100755 index 5fb74a1..989fdc1 Binary files a/sfx/chrislaugh.mp3 and b/sfx/chrislaugh.mp3 differ diff --git a/sfx/clever.mp3 b/sfx/clever.mp3 new file mode 100755 index 0000000..9a15cf7 Binary files /dev/null and b/sfx/clever.mp3 differ diff --git a/sfx/coffee.mp3 b/sfx/coffee.mp3 index d2d4d44..6da6ab5 100755 Binary files a/sfx/coffee.mp3 and b/sfx/coffee.mp3 differ diff --git a/sfx/comewithme.mp3 b/sfx/comewithme.mp3 deleted file mode 100644 index 5612427..0000000 Binary files a/sfx/comewithme.mp3 and /dev/null differ diff --git a/sfx/cooler.mp3 b/sfx/cooler.mp3 deleted file mode 100755 index eaa216e..0000000 Binary files a/sfx/cooler.mp3 and /dev/null differ diff --git a/sfx/correct.mp3 b/sfx/correct.mp3 new file mode 100755 index 0000000..7b2905a Binary files /dev/null and b/sfx/correct.mp3 differ diff --git a/sfx/dbio.mp3 b/sfx/dbio.mp3 index b4796de..0740b47 100755 Binary files a/sfx/dbio.mp3 and b/sfx/dbio.mp3 differ diff --git a/sfx/dead.mp3 b/sfx/dead.mp3 new file mode 100755 index 0000000..6a09dfe Binary files /dev/null and b/sfx/dead.mp3 differ diff --git a/sfx/dealwithit.mp3 b/sfx/dealwithit.mp3 deleted file mode 100644 index 0509dcb..0000000 Binary files a/sfx/dealwithit.mp3 and /dev/null differ diff --git a/sfx/deebsfart.mp3 b/sfx/deebsfart.mp3 index 0d3d3d6..7fd3e66 100755 Binary files a/sfx/deebsfart.mp3 and b/sfx/deebsfart.mp3 differ diff --git a/sfx/deebslaugh.mp3 b/sfx/deebslaugh.mp3 index c8d2bd6..9f497de 100755 Binary files a/sfx/deebslaugh.mp3 and b/sfx/deebslaugh.mp3 differ diff --git a/sfx/diaper.mp3 b/sfx/diaper.mp3 index f65f3de..cb16ae7 100755 Binary files a/sfx/diaper.mp3 and b/sfx/diaper.mp3 differ diff --git a/sfx/dickhole.mp3 b/sfx/dickhole.mp3 deleted file mode 100644 index 760ebee..0000000 Binary files a/sfx/dickhole.mp3 and /dev/null differ diff --git a/sfx/digup.mp3 b/sfx/digup.mp3 new file mode 100755 index 0000000..7127624 Binary files /dev/null and b/sfx/digup.mp3 differ diff --git a/sfx/dinodna.mp3 b/sfx/dinodna.mp3 new file mode 100755 index 0000000..604404e Binary files /dev/null and b/sfx/dinodna.mp3 differ diff --git a/sfx/disagree.mp3 b/sfx/disagree.mp3 index 9dbd652..c95f7cd 100755 Binary files a/sfx/disagree.mp3 and b/sfx/disagree.mp3 differ diff --git a/sfx/dode.mp3 b/sfx/dode.mp3 old mode 100644 new mode 100755 index 3c05946..f699957 Binary files a/sfx/dode.mp3 and b/sfx/dode.mp3 differ diff --git a/sfx/dodson.mp3 b/sfx/dodson.mp3 new file mode 100755 index 0000000..943c629 Binary files /dev/null and b/sfx/dodson.mp3 differ diff --git a/sfx/dontmatter.mp3 b/sfx/dontmatter.mp3 index bd12146..bfd5cce 100755 Binary files a/sfx/dontmatter.mp3 and b/sfx/dontmatter.mp3 differ diff --git a/sfx/door.mp3 b/sfx/door.mp3 index 7531d9d..6c2d4bb 100755 Binary files a/sfx/door.mp3 and b/sfx/door.mp3 differ diff --git a/sfx/drinkfull.mp3 b/sfx/drinkfull.mp3 new file mode 100755 index 0000000..0bc2ebf Binary files /dev/null and b/sfx/drinkfull.mp3 differ diff --git a/sfx/duck.mp3 b/sfx/duck.mp3 index ce4118c..08296f7 100755 Binary files a/sfx/duck.mp3 and b/sfx/duck.mp3 differ diff --git a/sfx/duckscream.mp3 b/sfx/duckscream.mp3 new file mode 100755 index 0000000..db2faec Binary files /dev/null and b/sfx/duckscream.mp3 differ diff --git a/sfx/eheh.mp3 b/sfx/eheh.mp3 deleted file mode 100755 index cb0dc18..0000000 Binary files a/sfx/eheh.mp3 and /dev/null differ diff --git a/sfx/emetarage.mp3 b/sfx/emetarage.mp3 index 2f28cba..6eec12e 100755 Binary files a/sfx/emetarage.mp3 and b/sfx/emetarage.mp3 differ diff --git a/sfx/emetarage2.mp3 b/sfx/emetarage2.mp3 index a388a56..43be8bc 100755 Binary files a/sfx/emetarage2.mp3 and b/sfx/emetarage2.mp3 differ diff --git a/sfx/emetarage3.mp3 b/sfx/emetarage3.mp3 index 40b57a4..0c588bd 100755 Binary files a/sfx/emetarage3.mp3 and b/sfx/emetarage3.mp3 differ diff --git a/sfx/emmapos.mp3 b/sfx/emmapos.mp3 index af0bb54..92d12e3 100755 Binary files a/sfx/emmapos.mp3 and b/sfx/emmapos.mp3 differ diff --git a/sfx/english.mp3 b/sfx/english.mp3 index d835961..e6fd8f4 100755 Binary files a/sfx/english.mp3 and b/sfx/english.mp3 differ diff --git a/sfx/enjoy.mp3 b/sfx/enjoy.mp3 index ccbb15e..601bad6 100755 Binary files a/sfx/enjoy.mp3 and b/sfx/enjoy.mp3 differ diff --git a/sfx/esp.mp3 b/sfx/esp.mp3 index df559a3..676a52e 100755 Binary files a/sfx/esp.mp3 and b/sfx/esp.mp3 differ diff --git a/sfx/ez.mp3 b/sfx/ez.mp3 index 4424feb..1402185 100755 Binary files a/sfx/ez.mp3 and b/sfx/ez.mp3 differ diff --git a/sfx/f.mp3 b/sfx/f.mp3 old mode 100644 new mode 100755 index 987e8a3..b2dae29 Binary files a/sfx/f.mp3 and b/sfx/f.mp3 differ diff --git a/sfx/fakehands.mp3 b/sfx/fakehands.mp3 new file mode 100755 index 0000000..a4c35ad Binary files /dev/null and b/sfx/fakehands.mp3 differ diff --git a/sfx/fbrage.mp3 b/sfx/fbrage.mp3 index 8b1b326..95ca220 100755 Binary files a/sfx/fbrage.mp3 and b/sfx/fbrage.mp3 differ diff --git a/sfx/fdup.mp3 b/sfx/fdup.mp3 old mode 100644 new mode 100755 index 990a0ed..222c102 Binary files a/sfx/fdup.mp3 and b/sfx/fdup.mp3 differ diff --git a/sfx/fencedash.mp3 b/sfx/fencedash.mp3 old mode 100644 new mode 100755 index 0147c30..a4aca28 Binary files a/sfx/fencedash.mp3 and b/sfx/fencedash.mp3 differ diff --git a/sfx/ffob.mp3 b/sfx/ffob.mp3 deleted file mode 100755 index a076330..0000000 Binary files a/sfx/ffob.mp3 and /dev/null differ diff --git a/sfx/fine.mp3 b/sfx/fine.mp3 index a6bba7c..d6f0c77 100755 Binary files a/sfx/fine.mp3 and b/sfx/fine.mp3 differ diff --git a/sfx/fk.mp3 b/sfx/fk.mp3 old mode 100644 new mode 100755 index 74c63f5..45c9b00 Binary files a/sfx/fk.mp3 and b/sfx/fk.mp3 differ diff --git a/sfx/flippers.mp3 b/sfx/flippers.mp3 index 7ece72e..d97f192 100755 Binary files a/sfx/flippers.mp3 and b/sfx/flippers.mp3 differ diff --git a/sfx/fu.mp3 b/sfx/fu.mp3 index c541c3a..a020858 100755 Binary files a/sfx/fu.mp3 and b/sfx/fu.mp3 differ diff --git a/sfx/funnyhow.mp3 b/sfx/funnyhow.mp3 new file mode 100755 index 0000000..a207951 Binary files /dev/null and b/sfx/funnyhow.mp3 differ diff --git a/sfx/gameover.mp3 b/sfx/gameover.mp3 deleted file mode 100644 index c0629e7..0000000 Binary files a/sfx/gameover.mp3 and /dev/null differ diff --git a/sfx/gatekeepah.mp3 b/sfx/gatekeepah.mp3 old mode 100644 new mode 100755 index c6b65bb..0a3be25 Binary files a/sfx/gatekeepah.mp3 and b/sfx/gatekeepah.mp3 differ diff --git a/sfx/gcn.mp3 b/sfx/gcn.mp3 new file mode 100755 index 0000000..3d8e321 Binary files /dev/null and b/sfx/gcn.mp3 differ diff --git a/sfx/gg.mp3 b/sfx/gg.mp3 deleted file mode 100755 index e7bc104..0000000 Binary files a/sfx/gg.mp3 and /dev/null differ diff --git a/sfx/gordon.mp3 b/sfx/gordon.mp3 new file mode 100755 index 0000000..91f8879 Binary files /dev/null and b/sfx/gordon.mp3 differ diff --git a/sfx/gordon2.mp3 b/sfx/gordon2.mp3 new file mode 100755 index 0000000..a90cbbf Binary files /dev/null and b/sfx/gordon2.mp3 differ diff --git a/sfx/gordon3.mp3 b/sfx/gordon3.mp3 new file mode 100755 index 0000000..2d5a9ba Binary files /dev/null and b/sfx/gordon3.mp3 differ diff --git a/sfx/gordon4.mp3 b/sfx/gordon4.mp3 new file mode 100755 index 0000000..effc840 Binary files /dev/null and b/sfx/gordon4.mp3 differ diff --git a/sfx/gotalight.mp3 b/sfx/gotalight.mp3 new file mode 100755 index 0000000..8096b3e Binary files /dev/null and b/sfx/gotalight.mp3 differ diff --git a/sfx/gotchya.mp3 b/sfx/gotchya.mp3 deleted file mode 100644 index 75cf3be..0000000 Binary files a/sfx/gotchya.mp3 and /dev/null differ diff --git a/sfx/gottem.mp3 b/sfx/gottem.mp3 deleted file mode 100644 index c827bd3..0000000 Binary files a/sfx/gottem.mp3 and /dev/null differ diff --git a/sfx/groovy.mp3 b/sfx/groovy.mp3 index d0847d0..8b8bff6 100755 Binary files a/sfx/groovy.mp3 and b/sfx/groovy.mp3 differ diff --git a/sfx/gross.mp3 b/sfx/gross.mp3 index 1d9c021..c0f0e2d 100755 Binary files a/sfx/gross.mp3 and b/sfx/gross.mp3 differ diff --git a/sfx/gtt.mp3 b/sfx/gtt.mp3 deleted file mode 100755 index 90aaab1..0000000 Binary files a/sfx/gtt.mp3 and /dev/null differ diff --git a/sfx/gum.mp3 b/sfx/gum.mp3 new file mode 100755 index 0000000..c094d0e Binary files /dev/null and b/sfx/gum.mp3 differ diff --git a/sfx/gyst.mp3 b/sfx/gyst.mp3 index 072506c..581b821 100755 Binary files a/sfx/gyst.mp3 and b/sfx/gyst.mp3 differ diff --git a/sfx/hahaa.mp3 b/sfx/hahaa.mp3 index 73bfb6d..38ee20d 100755 Binary files a/sfx/hahaa.mp3 and b/sfx/hahaa.mp3 differ diff --git a/sfx/hamhelp.mp3 b/sfx/hamhelp.mp3 new file mode 100755 index 0000000..2c226ba Binary files /dev/null and b/sfx/hamhelp.mp3 differ diff --git a/sfx/hamlaugh.mp3 b/sfx/hamlaugh.mp3 index fd5ccc9..9b10750 100755 Binary files a/sfx/hamlaugh.mp3 and b/sfx/hamlaugh.mp3 differ diff --git a/sfx/hamlaugh2.mp3 b/sfx/hamlaugh2.mp3 index e79cae0..c369a8d 100755 Binary files a/sfx/hamlaugh2.mp3 and b/sfx/hamlaugh2.mp3 differ diff --git a/sfx/hammertime.mp3 b/sfx/hammertime.mp3 index a2455ef..4f03bb3 100755 Binary files a/sfx/hammertime.mp3 and b/sfx/hammertime.mp3 differ diff --git a/sfx/hamscream.mp3 b/sfx/hamscream.mp3 index 6e20a7f..6279f8f 100755 Binary files a/sfx/hamscream.mp3 and b/sfx/hamscream.mp3 differ diff --git a/sfx/hatethatman.mp3 b/sfx/hatethatman.mp3 new file mode 100755 index 0000000..32845b3 Binary files /dev/null and b/sfx/hatethatman.mp3 differ diff --git a/sfx/hellway.mp3 b/sfx/hellway.mp3 index e8b9f37..8c4e113 100755 Binary files a/sfx/hellway.mp3 and b/sfx/hellway.mp3 differ diff --git a/sfx/help.mp3 b/sfx/help.mp3 index 5471c13..314d796 100755 Binary files a/sfx/help.mp3 and b/sfx/help.mp3 differ diff --git a/sfx/herewego.mp3 b/sfx/herewego.mp3 old mode 100644 new mode 100755 index d5532c8..3b3ebbe Binary files a/sfx/herewego.mp3 and b/sfx/herewego.mp3 differ diff --git a/sfx/heyheyhey.mp3 b/sfx/heyheyhey.mp3 old mode 100644 new mode 100755 index cdacea7..bd7b294 Binary files a/sfx/heyheyhey.mp3 and b/sfx/heyheyhey.mp3 differ diff --git a/sfx/heymf.mp3 b/sfx/heymf.mp3 old mode 100644 new mode 100755 index c8bb499..8a9b8a5 Binary files a/sfx/heymf.mp3 and b/sfx/heymf.mp3 differ diff --git a/sfx/highscore.mp3 b/sfx/highscore.mp3 index 6592131..88d67ed 100755 Binary files a/sfx/highscore.mp3 and b/sfx/highscore.mp3 differ diff --git a/sfx/hightonight.mp3 b/sfx/hightonight.mp3 index 7b5eb9f..5cb70b5 100755 Binary files a/sfx/hightonight.mp3 and b/sfx/hightonight.mp3 differ diff --git a/sfx/how.mp3 b/sfx/how.mp3 old mode 100644 new mode 100755 index a78cca5..86672f8 Binary files a/sfx/how.mp3 and b/sfx/how.mp3 differ diff --git a/sfx/hrwah.mp3 b/sfx/hrwah.mp3 new file mode 100755 index 0000000..a1dd510 Binary files /dev/null and b/sfx/hrwah.mp3 differ diff --git a/sfx/hunt.mp3 b/sfx/hunt.mp3 new file mode 100755 index 0000000..0641d42 Binary files /dev/null and b/sfx/hunt.mp3 differ diff --git a/sfx/hype.mp3 b/sfx/hype.mp3 old mode 100644 new mode 100755 index c7c7f3a..32bee6a Binary files a/sfx/hype.mp3 and b/sfx/hype.mp3 differ diff --git a/sfx/idc.mp3 b/sfx/idc.mp3 index 7931264..175fd33 100755 Binary files a/sfx/idc.mp3 and b/sfx/idc.mp3 differ diff --git a/sfx/ideedit.mp3 b/sfx/ideedit.mp3 deleted file mode 100755 index f36dd21..0000000 Binary files a/sfx/ideedit.mp3 and /dev/null differ diff --git a/sfx/idgaf.mp3 b/sfx/idgaf.mp3 old mode 100644 new mode 100755 index c974f6a..06fb35e Binary files a/sfx/idgaf.mp3 and b/sfx/idgaf.mp3 differ diff --git a/sfx/imawot.mp3 b/sfx/imawot.mp3 old mode 100644 new mode 100755 index 343fb32..530dbb7 Binary files a/sfx/imawot.mp3 and b/sfx/imawot.mp3 differ diff --git a/sfx/interesting.mp3 b/sfx/interesting.mp3 index 6b2c4fc..3e18e45 100755 Binary files a/sfx/interesting.mp3 and b/sfx/interesting.mp3 differ diff --git a/sfx/itsgonnabemay.mp3 b/sfx/itsgonnabemay.mp3 deleted file mode 100644 index 643f18b..0000000 Binary files a/sfx/itsgonnabemay.mp3 and /dev/null differ diff --git a/sfx/jacked.mp3 b/sfx/jacked.mp3 new file mode 100755 index 0000000..bd769da Binary files /dev/null and b/sfx/jacked.mp3 differ diff --git a/sfx/jebaited.mp3 b/sfx/jebaited.mp3 index 91f88f9..51f88bd 100755 Binary files a/sfx/jebaited.mp3 and b/sfx/jebaited.mp3 differ diff --git a/sfx/joshbitch.mp3 b/sfx/joshbitch.mp3 new file mode 100755 index 0000000..f4c9f71 Binary files /dev/null and b/sfx/joshbitch.mp3 differ diff --git a/sfx/joshgoat.mp3 b/sfx/joshgoat.mp3 index c4eaa73..dcd96c0 100755 Binary files a/sfx/joshgoat.mp3 and b/sfx/joshgoat.mp3 differ diff --git a/sfx/joshlaugh.mp3 b/sfx/joshlaugh.mp3 old mode 100644 new mode 100755 index d844173..ef86c9b Binary files a/sfx/joshlaugh.mp3 and b/sfx/joshlaugh.mp3 differ diff --git a/sfx/joshlaugh2.mp3 b/sfx/joshlaugh2.mp3 index c7df319..389074c 100755 Binary files a/sfx/joshlaugh2.mp3 and b/sfx/joshlaugh2.mp3 differ diff --git a/sfx/joshlaugh3.mp3 b/sfx/joshlaugh3.mp3 index 94442c2..fc8d0da 100755 Binary files a/sfx/joshlaugh3.mp3 and b/sfx/joshlaugh3.mp3 differ diff --git a/sfx/joshscream.mp3 b/sfx/joshscream.mp3 index d332b0a..97fd0be 100755 Binary files a/sfx/joshscream.mp3 and b/sfx/joshscream.mp3 differ diff --git a/sfx/joshwhinny.mp3 b/sfx/joshwhinny.mp3 index 6f5918a..fffe488 100755 Binary files a/sfx/joshwhinny.mp3 and b/sfx/joshwhinny.mp3 differ diff --git a/sfx/joshx.mp3 b/sfx/joshx.mp3 index e9738eb..2380f57 100755 Binary files a/sfx/joshx.mp3 and b/sfx/joshx.mp3 differ diff --git a/sfx/knob.mp3 b/sfx/knob.mp3 index ab872fc..d4fb5f8 100755 Binary files a/sfx/knob.mp3 and b/sfx/knob.mp3 differ diff --git a/sfx/kudos.mp3 b/sfx/kudos.mp3 index 03f9892..361d132 100755 Binary files a/sfx/kudos.mp3 and b/sfx/kudos.mp3 differ diff --git a/sfx/lab.mp3 b/sfx/lab.mp3 index e31b3fc..0f4635f 100755 Binary files a/sfx/lab.mp3 and b/sfx/lab.mp3 differ diff --git a/sfx/lang.mp3 b/sfx/lang.mp3 index 8a5aa57..6a68f2d 100755 Binary files a/sfx/lang.mp3 and b/sfx/lang.mp3 differ diff --git a/sfx/lanmo.mp3 b/sfx/lanmo.mp3 index 068da91..8ec9e52 100755 Binary files a/sfx/lanmo.mp3 and b/sfx/lanmo.mp3 differ diff --git a/sfx/lanx.mp3 b/sfx/lanx.mp3 index 51b2016..1281192 100755 Binary files a/sfx/lanx.mp3 and b/sfx/lanx.mp3 differ diff --git a/sfx/lanx2.mp3 b/sfx/lanx2.mp3 new file mode 100755 index 0000000..841cb7a Binary files /dev/null and b/sfx/lanx2.mp3 differ diff --git a/sfx/laugh.mp3 b/sfx/laugh.mp3 index 4ee1ae3..19bac08 100755 Binary files a/sfx/laugh.mp3 and b/sfx/laugh.mp3 differ diff --git a/sfx/laugh2.mp3 b/sfx/laugh2.mp3 deleted file mode 100755 index 5e1c480..0000000 Binary files a/sfx/laugh2.mp3 and /dev/null differ diff --git a/sfx/learnding.mp3 b/sfx/learnding.mp3 index 4c05f28..5abf740 100755 Binary files a/sfx/learnding.mp3 and b/sfx/learnding.mp3 differ diff --git a/sfx/letsrock.mp3 b/sfx/letsrock.mp3 new file mode 100755 index 0000000..a92aea3 Binary files /dev/null and b/sfx/letsrock.mp3 differ diff --git a/sfx/like.mp3 b/sfx/like.mp3 deleted file mode 100755 index 80614ad..0000000 Binary files a/sfx/like.mp3 and /dev/null differ diff --git a/sfx/lisa.mp3 b/sfx/lisa.mp3 old mode 100644 new mode 100755 index ab2d7d0..68372f5 Binary files a/sfx/lisa.mp3 and b/sfx/lisa.mp3 differ diff --git a/sfx/lol.mp3 b/sfx/lol.mp3 old mode 100644 new mode 100755 index 458da16..177863e Binary files a/sfx/lol.mp3 and b/sfx/lol.mp3 differ diff --git a/sfx/lookatme.mp3 b/sfx/lookatme.mp3 old mode 100644 new mode 100755 index 61a3cc4..f0a5c29 Binary files a/sfx/lookatme.mp3 and b/sfx/lookatme.mp3 differ diff --git a/sfx/loz.mp3 b/sfx/loz.mp3 deleted file mode 100755 index f230f08..0000000 Binary files a/sfx/loz.mp3 and /dev/null differ diff --git a/sfx/mad.mp3 b/sfx/mad.mp3 index 033b5f4..5caf194 100755 Binary files a/sfx/mad.mp3 and b/sfx/mad.mp3 differ diff --git a/sfx/mapleham.mp3 b/sfx/mapleham.mp3 new file mode 100755 index 0000000..6b5eb30 Binary files /dev/null and b/sfx/mapleham.mp3 differ diff --git a/sfx/mash.mp3 b/sfx/mash.mp3 index 6f9ec69..2a1b7fb 100755 Binary files a/sfx/mash.mp3 and b/sfx/mash.mp3 differ diff --git a/sfx/massage.mp3 b/sfx/massage.mp3 index f63a581..2761ea2 100755 Binary files a/sfx/massage.mp3 and b/sfx/massage.mp3 differ diff --git a/sfx/mcgasm.mp3 b/sfx/mcgasm.mp3 index e8d790c..a67d926 100755 Binary files a/sfx/mcgasm.mp3 and b/sfx/mcgasm.mp3 differ diff --git a/sfx/meme.mp3 b/sfx/meme.mp3 index 5b58a56..919fd1c 100755 Binary files a/sfx/meme.mp3 and b/sfx/meme.mp3 differ diff --git a/sfx/mmmm.mp3 b/sfx/mmmm.mp3 index 30871a9..3a18a74 100755 Binary files a/sfx/mmmm.mp3 and b/sfx/mmmm.mp3 differ diff --git a/sfx/mothhole.mp3 b/sfx/mothhole.mp3 index 6945787..fd111fc 100755 Binary files a/sfx/mothhole.mp3 and b/sfx/mothhole.mp3 differ diff --git a/sfx/mouthfeel.mp3 b/sfx/mouthfeel.mp3 index f21ffaa..56fa7ba 100755 Binary files a/sfx/mouthfeel.mp3 and b/sfx/mouthfeel.mp3 differ diff --git a/sfx/mrjackpots.mp3 b/sfx/mrjackpots.mp3 new file mode 100755 index 0000000..2273bdc Binary files /dev/null and b/sfx/mrjackpots.mp3 differ diff --git a/sfx/muttfart.mp3 b/sfx/muttfart.mp3 old mode 100644 new mode 100755 index 072bc3f..7a79fc1 Binary files a/sfx/muttfart.mp3 and b/sfx/muttfart.mp3 differ diff --git a/sfx/muttfart2.mp3 b/sfx/muttfart2.mp3 index f0111b6..012b167 100755 Binary files a/sfx/muttfart2.mp3 and b/sfx/muttfart2.mp3 differ diff --git a/sfx/muttlaugh.mp3 b/sfx/muttlaugh.mp3 index b300eb0..ad54c85 100755 Binary files a/sfx/muttlaugh.mp3 and b/sfx/muttlaugh.mp3 differ diff --git a/sfx/muttscream.mp3 b/sfx/muttscream.mp3 old mode 100644 new mode 100755 index c42edb2..4b2cadb Binary files a/sfx/muttscream.mp3 and b/sfx/muttscream.mp3 differ diff --git a/sfx/muttwalksin.mp3 b/sfx/muttwalksin.mp3 index 2fd7615..9ca0c4b 100755 Binary files a/sfx/muttwalksin.mp3 and b/sfx/muttwalksin.mp3 differ diff --git a/sfx/myarms.mp3 b/sfx/myarms.mp3 new file mode 100755 index 0000000..a2ae5d9 Binary files /dev/null and b/sfx/myarms.mp3 differ diff --git a/sfx/mybody.mp3 b/sfx/mybody.mp3 old mode 100644 new mode 100755 index 9880276..e763c74 Binary files a/sfx/mybody.mp3 and b/sfx/mybody.mp3 differ diff --git a/sfx/myman.mp3 b/sfx/myman.mp3 index e58989e..34189b3 100755 Binary files a/sfx/myman.mp3 and b/sfx/myman.mp3 differ diff --git a/sfx/neat.mp3 b/sfx/neat.mp3 old mode 100644 new mode 100755 index 9d52241..0c1f656 Binary files a/sfx/neat.mp3 and b/sfx/neat.mp3 differ diff --git a/sfx/nerd.mp3 b/sfx/nerd.mp3 index 6c72e3e..df818e0 100755 Binary files a/sfx/nerd.mp3 and b/sfx/nerd.mp3 differ diff --git a/sfx/nevergiveup.mp3 b/sfx/nevergiveup.mp3 old mode 100644 new mode 100755 index 623b9d5..edab711 Binary files a/sfx/nevergiveup.mp3 and b/sfx/nevergiveup.mp3 differ diff --git a/sfx/newshoes.mp3 b/sfx/newshoes.mp3 new file mode 100755 index 0000000..ad81ad8 Binary files /dev/null and b/sfx/newshoes.mp3 differ diff --git a/sfx/nfc.mp3 b/sfx/nfc.mp3 index 4e37887..c92a798 100755 Binary files a/sfx/nfc.mp3 and b/sfx/nfc.mp3 differ diff --git a/sfx/obaeb.mp3 b/sfx/obaeb.mp3 index cc00c27..8708081 100755 Binary files a/sfx/obaeb.mp3 and b/sfx/obaeb.mp3 differ diff --git a/sfx/ohno.mp3 b/sfx/ohno.mp3 index aaa28ae..51d470c 100755 Binary files a/sfx/ohno.mp3 and b/sfx/ohno.mp3 differ diff --git a/sfx/okusa.mp3 b/sfx/okusa.mp3 index 3086761..461f890 100755 Binary files a/sfx/okusa.mp3 and b/sfx/okusa.mp3 differ diff --git a/sfx/oldman.mp3 b/sfx/oldman.mp3 index bec6e10..e162c1c 100755 Binary files a/sfx/oldman.mp3 and b/sfx/oldman.mp3 differ diff --git a/sfx/onejoint.mp3 b/sfx/onejoint.mp3 index 10f236f..892fe30 100755 Binary files a/sfx/onejoint.mp3 and b/sfx/onejoint.mp3 differ diff --git a/sfx/onfire.mp3 b/sfx/onfire.mp3 index 1a72ac8..fcf42b5 100755 Binary files a/sfx/onfire.mp3 and b/sfx/onfire.mp3 differ diff --git a/sfx/ow.mp3 b/sfx/ow.mp3 index 09fabf4..1957633 100755 Binary files a/sfx/ow.mp3 and b/sfx/ow.mp3 differ diff --git a/sfx/party.mp3 b/sfx/party.mp3 index c32f97c..2fdabd9 100755 Binary files a/sfx/party.mp3 and b/sfx/party.mp3 differ diff --git a/sfx/pixie.mp3 b/sfx/pixie.mp3 deleted file mode 100644 index a75a3b9..0000000 Binary files a/sfx/pixie.mp3 and /dev/null differ diff --git a/sfx/please.mp3 b/sfx/please.mp3 new file mode 100755 index 0000000..6ffc5a0 Binary files /dev/null and b/sfx/please.mp3 differ diff --git a/sfx/poopy.mp3 b/sfx/poopy.mp3 index b944a81..c30d120 100755 Binary files a/sfx/poopy.mp3 and b/sfx/poopy.mp3 differ diff --git a/sfx/popup.mp3 b/sfx/popup.mp3 index 76f6046..919b5e0 100755 Binary files a/sfx/popup.mp3 and b/sfx/popup.mp3 differ diff --git a/sfx/porkchop.mp3 b/sfx/porkchop.mp3 index a72d2a8..b6c51db 100755 Binary files a/sfx/porkchop.mp3 and b/sfx/porkchop.mp3 differ diff --git a/sfx/pour.mp3 b/sfx/pour.mp3 new file mode 100755 index 0000000..ff437f6 Binary files /dev/null and b/sfx/pour.mp3 differ diff --git a/sfx/pprage.mp3 b/sfx/pprage.mp3 old mode 100644 new mode 100755 index bc712b8..90cf828 Binary files a/sfx/pprage.mp3 and b/sfx/pprage.mp3 differ diff --git a/sfx/ppscream.mp3 b/sfx/ppscream.mp3 index 950c002..a669570 100755 Binary files a/sfx/ppscream.mp3 and b/sfx/ppscream.mp3 differ diff --git a/sfx/ppump.mp3 b/sfx/ppump.mp3 index 783ea0b..b857d81 100755 Binary files a/sfx/ppump.mp3 and b/sfx/ppump.mp3 differ diff --git a/sfx/present.mp3 b/sfx/present.mp3 index 66e1dbe..e7974d0 100755 Binary files a/sfx/present.mp3 and b/sfx/present.mp3 differ diff --git a/sfx/pushpush.mp3 b/sfx/pushpush.mp3 new file mode 100755 index 0000000..b99f3f1 Binary files /dev/null and b/sfx/pushpush.mp3 differ diff --git a/sfx/pyle.mp3 b/sfx/pyle.mp3 index cfd9760..969c4a5 100755 Binary files a/sfx/pyle.mp3 and b/sfx/pyle.mp3 differ diff --git a/sfx/qty.mp3 b/sfx/qty.mp3 new file mode 100755 index 0000000..cbd416b Binary files /dev/null and b/sfx/qty.mp3 differ diff --git a/sfx/raffle.mp3 b/sfx/raffle.mp3 old mode 100644 new mode 100755 index f3d96bd..06df48f Binary files a/sfx/raffle.mp3 and b/sfx/raffle.mp3 differ diff --git a/sfx/rake.mp3 b/sfx/rake.mp3 index a1c902f..243c036 100755 Binary files a/sfx/rake.mp3 and b/sfx/rake.mp3 differ diff --git a/sfx/rando.mp3 b/sfx/rando.mp3 index 4788dfc..761e8eb 100755 Binary files a/sfx/rando.mp3 and b/sfx/rando.mp3 differ diff --git a/sfx/rawr.mp3 b/sfx/rawr.mp3 index bf0882b..5ba83e9 100755 Binary files a/sfx/rawr.mp3 and b/sfx/rawr.mp3 differ diff --git a/sfx/respect.mp3 b/sfx/respect.mp3 old mode 100644 new mode 100755 index 73062cc..de82e98 Binary files a/sfx/respect.mp3 and b/sfx/respect.mp3 differ diff --git a/sfx/rip.mp3 b/sfx/rip.mp3 index a22d873..ca95e5e 100755 Binary files a/sfx/rip.mp3 and b/sfx/rip.mp3 differ diff --git a/sfx/robotears.mp3 b/sfx/robotears.mp3 index 9c7a7a3..817b733 100755 Binary files a/sfx/robotears.mp3 and b/sfx/robotears.mp3 differ diff --git a/sfx/rockin.mp3 b/sfx/rockin.mp3 index 4c6e7f9..0dc486c 100755 Binary files a/sfx/rockin.mp3 and b/sfx/rockin.mp3 differ diff --git a/sfx/rpgfarm.mp3 b/sfx/rpgfarm.mp3 old mode 100644 new mode 100755 index c08bf7d..27f7f94 Binary files a/sfx/rpgfarm.mp3 and b/sfx/rpgfarm.mp3 differ diff --git a/sfx/run.mp3 b/sfx/run.mp3 index 6158d86..91b6320 100755 Binary files a/sfx/run.mp3 and b/sfx/run.mp3 differ diff --git a/sfx/runsover.mp3 b/sfx/runsover.mp3 index f288c60..bdca58f 100755 Binary files a/sfx/runsover.mp3 and b/sfx/runsover.mp3 differ diff --git a/sfx/sdgtw.mp3 b/sfx/sdgtw.mp3 old mode 100644 new mode 100755 index a5ca8cb..518635f Binary files a/sfx/sdgtw.mp3 and b/sfx/sdgtw.mp3 differ diff --git a/sfx/seeitnow.mp3 b/sfx/seeitnow.mp3 index 4fea4be..0ea0619 100755 Binary files a/sfx/seeitnow.mp3 and b/sfx/seeitnow.mp3 differ diff --git a/sfx/sendit.mp3 b/sfx/sendit.mp3 index b4520af..156bb3e 100755 Binary files a/sfx/sendit.mp3 and b/sfx/sendit.mp3 differ diff --git a/sfx/sgqf.mp3 b/sfx/sgqf.mp3 new file mode 100755 index 0000000..96ff8c2 Binary files /dev/null and b/sfx/sgqf.mp3 differ diff --git a/sfx/shitey.mp3 b/sfx/shitey.mp3 deleted file mode 100755 index 663ed63..0000000 Binary files a/sfx/shitey.mp3 and /dev/null differ diff --git a/sfx/smd.mp3 b/sfx/smd.mp3 new file mode 100755 index 0000000..532e7b2 Binary files /dev/null and b/sfx/smd.mp3 differ diff --git a/sfx/sofast.mp3 b/sfx/sofast.mp3 index 07824f4..5c98570 100755 Binary files a/sfx/sofast.mp3 and b/sfx/sofast.mp3 differ diff --git a/sfx/sogood.mp3 b/sfx/sogood.mp3 index 0d2a380..d45e70e 100755 Binary files a/sfx/sogood.mp3 and b/sfx/sogood.mp3 differ diff --git a/sfx/spam.mp3 b/sfx/spam.mp3 index 3bc3b0c..7b20ab3 100755 Binary files a/sfx/spam.mp3 and b/sfx/spam.mp3 differ diff --git a/sfx/speednoises.mp3 b/sfx/speednoises.mp3 new file mode 100755 index 0000000..66922e1 Binary files /dev/null and b/sfx/speednoises.mp3 differ diff --git a/sfx/speedrunner.mp3 b/sfx/speedrunner.mp3 index 2c5318b..b22ac26 100755 Binary files a/sfx/speedrunner.mp3 and b/sfx/speedrunner.mp3 differ diff --git a/sfx/split.mp3 b/sfx/split.mp3 old mode 100644 new mode 100755 index 6cc3752..cbcb16d Binary files a/sfx/split.mp3 and b/sfx/split.mp3 differ diff --git a/sfx/stahp.mp3 b/sfx/stahp.mp3 index 68d4e5c..fcf2f0b 100755 Binary files a/sfx/stahp.mp3 and b/sfx/stahp.mp3 differ diff --git a/sfx/stank.mp3 b/sfx/stank.mp3 index 13c60db..22e7f31 100755 Binary files a/sfx/stank.mp3 and b/sfx/stank.mp3 differ diff --git a/sfx/stfu.mp3 b/sfx/stfu.mp3 index 7e33022..72e4ec1 100755 Binary files a/sfx/stfu.mp3 and b/sfx/stfu.mp3 differ diff --git a/sfx/stick.mp3 b/sfx/stick.mp3 index 309bd17..435d83f 100755 Binary files a/sfx/stick.mp3 and b/sfx/stick.mp3 differ diff --git a/sfx/store.mp3 b/sfx/store.mp3 index 8b7ac76..54a3dfd 100755 Binary files a/sfx/store.mp3 and b/sfx/store.mp3 differ diff --git a/sfx/suh.mp3 b/sfx/suh.mp3 old mode 100644 new mode 100755 index 07d0350..c2f1f9c Binary files a/sfx/suh.mp3 and b/sfx/suh.mp3 differ diff --git a/sfx/swag.mp3 b/sfx/swag.mp3 index 69734e0..62c9438 100755 Binary files a/sfx/swag.mp3 and b/sfx/swag.mp3 differ diff --git a/sfx/tasty.mp3 b/sfx/tasty.mp3 index abd3741..c5974ec 100755 Binary files a/sfx/tasty.mp3 and b/sfx/tasty.mp3 differ diff --git a/sfx/tbhamfact.mp3 b/sfx/tbhamfact.mp3 old mode 100644 new mode 100755 index 92ca614..6b7f039 Binary files a/sfx/tbhamfact.mp3 and b/sfx/tbhamfact.mp3 differ diff --git a/sfx/thatthing.mp3 b/sfx/thatthing.mp3 new file mode 100755 index 0000000..2638142 Binary files /dev/null and b/sfx/thatthing.mp3 differ diff --git a/sfx/theline.mp3 b/sfx/theline.mp3 old mode 100644 new mode 100755 index d078901..875859c Binary files a/sfx/theline.mp3 and b/sfx/theline.mp3 differ diff --git a/sfx/threat.mp3 b/sfx/threat.mp3 index 3f949e8..c6014be 100755 Binary files a/sfx/threat.mp3 and b/sfx/threat.mp3 differ diff --git a/sfx/timmon.mp3 b/sfx/timmon.mp3 old mode 100644 new mode 100755 index 8bde202..1aa9f27 Binary files a/sfx/timmon.mp3 and b/sfx/timmon.mp3 differ diff --git a/sfx/tmm.mp3 b/sfx/tmm.mp3 old mode 100644 new mode 100755 index f9d2a03..3e03261 Binary files a/sfx/tmm.mp3 and b/sfx/tmm.mp3 differ diff --git a/sfx/tonight.mp3 b/sfx/tonight.mp3 index f2f7d0e..abaeac4 100755 Binary files a/sfx/tonight.mp3 and b/sfx/tonight.mp3 differ diff --git a/sfx/toofat.mp3 b/sfx/toofat.mp3 index 7a2ae7c..4e13c96 100755 Binary files a/sfx/toofat.mp3 and b/sfx/toofat.mp3 differ diff --git a/sfx/tootski.mp3 b/sfx/tootski.mp3 index f808776..4ec169b 100755 Binary files a/sfx/tootski.mp3 and b/sfx/tootski.mp3 differ diff --git a/sfx/tour.mp3 b/sfx/tour.mp3 new file mode 100755 index 0000000..f52c897 Binary files /dev/null and b/sfx/tour.mp3 differ diff --git a/sfx/trash.mp3 b/sfx/trash.mp3 new file mode 100755 index 0000000..3e35648 Binary files /dev/null and b/sfx/trash.mp3 differ diff --git a/sfx/trex.mp3 b/sfx/trex.mp3 new file mode 100755 index 0000000..c6103e0 Binary files /dev/null and b/sfx/trex.mp3 differ diff --git a/sfx/trinexx.mp3 b/sfx/trinexx.mp3 index b685baf..1e02093 100755 Binary files a/sfx/trinexx.mp3 and b/sfx/trinexx.mp3 differ diff --git a/sfx/triple.mp3 b/sfx/triple.mp3 old mode 100644 new mode 100755 index aa6c3f5..a7a916a Binary files a/sfx/triple.mp3 and b/sfx/triple.mp3 differ diff --git a/sfx/urf.mp3 b/sfx/urf.mp3 old mode 100644 new mode 100755 index 3128b44..a3efb35 Binary files a/sfx/urf.mp3 and b/sfx/urf.mp3 differ diff --git a/sfx/vitty.mp3 b/sfx/vitty.mp3 index 0bb29ec..e0cd120 100755 Binary files a/sfx/vitty.mp3 and b/sfx/vitty.mp3 differ diff --git a/sfx/wahwah.mp3 b/sfx/wahwah.mp3 old mode 100644 new mode 100755 index 89bb3bf..8523fd4 Binary files a/sfx/wahwah.mp3 and b/sfx/wahwah.mp3 differ diff --git a/sfx/wait.mp3 b/sfx/wait.mp3 index 2963dc9..70f51df 100755 Binary files a/sfx/wait.mp3 and b/sfx/wait.mp3 differ diff --git a/sfx/wanker.mp3 b/sfx/wanker.mp3 new file mode 100755 index 0000000..751614e Binary files /dev/null and b/sfx/wanker.mp3 differ diff --git a/sfx/waow.mp3 b/sfx/waow.mp3 index 4549dd6..9455212 100755 Binary files a/sfx/waow.mp3 and b/sfx/waow.mp3 differ diff --git a/sfx/watchyourback.mp3 b/sfx/watchyourback.mp3 index d015276..c6f79ec 100755 Binary files a/sfx/watchyourback.mp3 and b/sfx/watchyourback.mp3 differ diff --git a/sfx/wdied.mp3 b/sfx/wdied.mp3 old mode 100644 new mode 100755 index 6b43458..8d39884 Binary files a/sfx/wdied.mp3 and b/sfx/wdied.mp3 differ diff --git a/sfx/whathaveidone.mp3 b/sfx/whathaveidone.mp3 new file mode 100755 index 0000000..fde27b5 Binary files /dev/null and b/sfx/whathaveidone.mp3 differ diff --git a/sfx/why.mp3 b/sfx/why.mp3 index ca5545f..7061aa9 100755 Binary files a/sfx/why.mp3 and b/sfx/why.mp3 differ diff --git a/sfx/wiki.mp3 b/sfx/wiki.mp3 index b987d55..ab07fb5 100755 Binary files a/sfx/wiki.mp3 and b/sfx/wiki.mp3 differ diff --git a/sfx/wobbuffet.mp3 b/sfx/wobbuffet.mp3 index 81b8e60..1213c86 100755 Binary files a/sfx/wobbuffet.mp3 and b/sfx/wobbuffet.mp3 differ diff --git a/sfx/wow.mp3 b/sfx/wow.mp3 index 17b60cd..1168fb1 100755 Binary files a/sfx/wow.mp3 and b/sfx/wow.mp3 differ diff --git a/sfx/wtf.mp3 b/sfx/wtf.mp3 old mode 100644 new mode 100755 index e083869..097b0b6 Binary files a/sfx/wtf.mp3 and b/sfx/wtf.mp3 differ diff --git a/sfx/xelboss.mp3 b/sfx/xelboss.mp3 index bacd8b7..ed58fd3 100755 Binary files a/sfx/xelboss.mp3 and b/sfx/xelboss.mp3 differ diff --git a/sfx/xelkiss.mp3 b/sfx/xelkiss.mp3 index 7299263..83a9747 100755 Binary files a/sfx/xelkiss.mp3 and b/sfx/xelkiss.mp3 differ diff --git a/sfx/yippee.mp3 b/sfx/yippee.mp3 index 4dba89f..2d52026 100755 Binary files a/sfx/yippee.mp3 and b/sfx/yippee.mp3 differ diff --git a/sfx/yoshi.mp3 b/sfx/yoshi.mp3 index 74d357a..3cb2ed8 100755 Binary files a/sfx/yoshi.mp3 and b/sfx/yoshi.mp3 differ diff --git a/sfx/youguys.mp3 b/sfx/youguys.mp3 index 47972e1..2f5e773 100755 Binary files a/sfx/youguys.mp3 and b/sfx/youguys.mp3 differ diff --git a/spotify-auth-url.js b/spotify-auth-url.js deleted file mode 100755 index 021d642..0000000 --- a/spotify-auth-url.js +++ /dev/null @@ -1,19 +0,0 @@ -var SpotifyWebApi = require('spotify-web-api-node'); -let config = require('./config.json'); - -var scopes = ['streaming', 'app-remote-control', 'user-read-currently-playing', 'user-read-playback-state', 'user-modify-playback-state', 'user-read-recently-played', 'playlist-read-collaborative', 'playlist-modify-private', 'playlist-modify-public', 'playlist-read-private'], - redirectUri = 'http://forevergrind.fm/spotify', - clientId = config.spotify.clientId, - state = 'some-state-of-my-choice'; - -// Setting credentials can be done in the wrapper's constructor, or using the API object's setters. -var spotifyApi = new SpotifyWebApi({ - redirectUri: redirectUri, - clientId: clientId -}); - -// Create the authorization URL -var authorizeURL = spotifyApi.createAuthorizeURL(scopes, state); - -// https://accounts.spotify.com:443/authorize?client_id=5fe01282e44241328a84e7c5cc169165&response_type=code&redirect_uri=https://example.com/callback&scope=user-read-private%20user-read-email&state=some-state-of-my-choice -console.log(authorizeURL); \ No newline at end of file diff --git a/vid-id-list b/vid-id-list deleted file mode 100755 index d4ba6ef..0000000 --- a/vid-id-list +++ /dev/null @@ -1,68 +0,0 @@ -Request videos using $vr where video-id is one of the following: - -e.g. $vr st-seg-gtower - -Optimal TTAS Segments ---------------------- -ot-seg-escape -ot-seg-eastern -ot-seg-desert -ot-seg-hera -ot-seg-atower -ot-seg-pod -ot-seg-thieves -ot-seg-skull -ot-seg-ice -ot-seg-swamp -ot-seg-mire -ot-seg-trock -ot-seg-gtower -ot-seg-ganon - -Safe/RTA Theory TAS Segments ----------------------------- -st-seg-escape -st-seg-eastern -st-seg-desert -st-seg-hera -st-seg-atower -st-seg-pod -st-seg-thieves -st-seg-skull -st-seg-ice -st-seg-swamp -st-seg-mire -st-seg-trock -st-seg-gtower - -NMG Golds ---------- -nmg-gold-escape -nmg-gold-eastern -nmg-gold-desert -nmg-gold-hera -nmg-gold-atower -nmg-gold-pod -nmg-gold-thieves -nmg-gold-skull -nmg-gold-ice -nmg-gold-swamp -nmg-gold-mire -nmg-gold-trock -nmg-gold-gtower -nmg-gold-ganon - - -Personal Bests --------------- -pb-100-ahp -pb-ab -pb-ad -pb-any-nmg -pb-any-no-eg -pb-master-sword -pb-ms -pb-ms-no-eg -pb-rbo -pb-100-nmg -pb-dg \ No newline at end of file