├── .gitattributes ├── .gitignore ├── LICENSE ├── README.md ├── ep 3 - music bot for v12 ├── config.json ├── index.js ├── package-lock.json └── package.json ├── ep 4 - ticket bot ├── config.json ├── data │ ├── enmap.sqlite │ ├── enmap.sqlite-shm │ └── enmap.sqlite-wal ├── index.js ├── package-lock.json └── package.json ├── ep 5 - economy bot ├── config.json ├── data │ ├── enmap.sqlite │ ├── enmap.sqlite-shm │ └── enmap.sqlite-wal ├── index.js ├── package-lock.json └── package.json ├── ep 6 - slash commands ├── config.json ├── index.js ├── package-lock.json └── package.json └── ep 7 - lavalink music bot ├── bot ├── commands │ ├── command.js.example │ ├── np.js │ ├── play.js │ ├── queue.js │ ├── search.js │ └── skip.js ├── config.json ├── events │ ├── message.js │ └── ready.js ├── index.js ├── package-lock.json ├── package.json ├── structures │ └── Queue.js └── utils.js └── server ├── Lavalink.jar ├── application.yml └── start.sh /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 ItzDerock 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ⚠ Discordjs v13 has been officially released, leaving this series out of date. 2 | # If you want to use any of these bots, run `npm i discord.js@12` to install discord.js v12. 3 | 4 | # Discord.js Tutorial Series 5 | Too lazy to watch a video? 6 | Come here to do a quick copy + paste 7 | shh I won't tell anyone :p 8 | https://youtube.com/itzderock 9 | -------------------------------------------------------------------------------- /ep 3 - music bot for v12/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "token": "your bot token here", 3 | "prefix": "!" 4 | } -------------------------------------------------------------------------------- /ep 3 - music bot for v12/index.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const client = new Discord.Client(); 3 | const {prefix, token} = require("./config.json") 4 | 5 | var queue = new Map(); 6 | 7 | const ytdl = require('ytdl-core'); 8 | 9 | client.on('ready', () => console.log("ready")); 10 | 11 | client.on('message', async (message) => { 12 | if(message.author.bot) return; 13 | if(message.content.indexOf(prefix) !== 0) return; 14 | 15 | const args = message.content.slice(prefix.length).trim().split(/ +/g); 16 | const command = args.shift().toLowerCase(); 17 | 18 | if(command == "play") { 19 | if(!args[0]) return; 20 | let url = args.join(" "); 21 | if(!url.match(/(youtube.com|youtu.be)\/(watch)?(\?v=)?(\S+)?/)) return message.channel.send("Please provide a valid Youtube link!"); 22 | 23 | let serverQueue = queue.get(message.guild.id); 24 | let vc = message.member.voice; 25 | 26 | if(!vc) return message.channel.send("You are not in a voice channel!"); 27 | 28 | if(!vc.channel.permissionsFor(client.user).has('CONNECT') || !vc.channel.permissionsFor(client.user).has('SPEAK')) return message.channel.send("I do not have permission!"); 29 | 30 | let songinfo = await ytdl.getInfo(url); 31 | let song = { 32 | title: songinfo.title, 33 | url: songinfo.video_url 34 | } 35 | 36 | if(!serverQueue) { 37 | let queueConst = { 38 | textChannel: message.channel, 39 | voiceChannel: vc.channel, 40 | connection: null, 41 | songs: [], 42 | volume: 5, 43 | playing: true 44 | }; 45 | 46 | queue.set(message.guild.id, queueConst); 47 | queueConst.songs.push(song); 48 | 49 | try { 50 | let connection = await vc.channel.join(); 51 | queueConst.connection = connection 52 | playSong(message.guild, queueConst.songs[0]) 53 | } catch (error) { 54 | console.log(error); 55 | queue.delete(message.guild.id); 56 | return message.channel.send("There was an error playing the song! Error: " + error); 57 | } 58 | } else { 59 | serverQueue.songs.push(song); 60 | return message.channel.send(`${song.title} has been added to the queue!`) 61 | } 62 | } 63 | }) 64 | 65 | /** 66 | * 67 | * @param {Discord.Guild} guild 68 | * @param {Object} song 69 | */ 70 | async function playSong(guild, song) { 71 | let serverQueue = queue.get(guild.id); 72 | 73 | if(!song){ 74 | serverQueue.voiceChannel.leave(); 75 | queue.delete(guild.id); 76 | return; 77 | } 78 | 79 | const dispatcher = serverQueue.connection.play(ytdl(song.url)).on('end', () => { 80 | serverQueue.songs.shift(); 81 | playSong(guild, serverQueue.songs[0]); 82 | }) 83 | .on('error', () => { 84 | console.log(error) 85 | }) 86 | 87 | dispatcher.setVolumeLogarithmic(serverQueue.volume / 5); 88 | } 89 | 90 | client.login(token) -------------------------------------------------------------------------------- /ep 3 - music bot for v12/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "musicbot", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@discordjs/collection": { 8 | "version": "0.1.5", 9 | "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.5.tgz", 10 | "integrity": "sha512-CU1q0UXQUpFNzNB7gufgoisDHP7n+T3tkqTsp3MNUkVJ5+hS3BCvME8uCXAUFlz+6T2FbTCu75A+yQ7HMKqRKw==" 11 | }, 12 | "@discordjs/form-data": { 13 | "version": "3.0.1", 14 | "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", 15 | "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", 16 | "requires": { 17 | "asynckit": "^0.4.0", 18 | "combined-stream": "^1.0.8", 19 | "mime-types": "^2.1.12" 20 | } 21 | }, 22 | "@types/node": { 23 | "version": "10.17.26", 24 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.26.tgz", 25 | "integrity": "sha512-myMwkO2Cr82kirHY8uknNRHEVtn0wV3DTQfkrjx17jmkstDRZ24gNUdl8AHXVyVclTYI/bNjgTPTAWvWLqXqkw==" 26 | }, 27 | "abort-controller": { 28 | "version": "3.0.0", 29 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 30 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 31 | "requires": { 32 | "event-target-shim": "^5.0.0" 33 | } 34 | }, 35 | "agent-base": { 36 | "version": "6.0.1", 37 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.1.tgz", 38 | "integrity": "sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg==", 39 | "requires": { 40 | "debug": "4" 41 | } 42 | }, 43 | "asynckit": { 44 | "version": "0.4.0", 45 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 46 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 47 | }, 48 | "bindings": { 49 | "version": "1.2.1", 50 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", 51 | "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=" 52 | }, 53 | "buffer-from": { 54 | "version": "1.1.1", 55 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 56 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 57 | }, 58 | "caseless": { 59 | "version": "0.12.0", 60 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 61 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 62 | }, 63 | "combined-stream": { 64 | "version": "1.0.8", 65 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 66 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 67 | "requires": { 68 | "delayed-stream": "~1.0.0" 69 | } 70 | }, 71 | "commander": { 72 | "version": "2.20.3", 73 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 74 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" 75 | }, 76 | "concat-stream": { 77 | "version": "1.6.2", 78 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 79 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 80 | "requires": { 81 | "buffer-from": "^1.0.0", 82 | "inherits": "^2.0.3", 83 | "readable-stream": "^2.2.2", 84 | "typedarray": "^0.0.6" 85 | } 86 | }, 87 | "core-util-is": { 88 | "version": "1.0.2", 89 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 90 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 91 | }, 92 | "debug": { 93 | "version": "4.1.1", 94 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 95 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 96 | "requires": { 97 | "ms": "^2.1.1" 98 | } 99 | }, 100 | "delayed-stream": { 101 | "version": "1.0.0", 102 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 103 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 104 | }, 105 | "discord.js": { 106 | "version": "12.2.0", 107 | "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.2.0.tgz", 108 | "integrity": "sha512-Ueb/0SOsxXyqwvwFYFe0msMrGqH1OMqpp2Dpbplnlr4MzcRrFWwsBM9gKNZXPVBHWUKiQkwU8AihXBXIvTTSvg==", 109 | "requires": { 110 | "@discordjs/collection": "^0.1.5", 111 | "@discordjs/form-data": "^3.0.1", 112 | "abort-controller": "^3.0.0", 113 | "node-fetch": "^2.6.0", 114 | "prism-media": "^1.2.0", 115 | "setimmediate": "^1.0.5", 116 | "tweetnacl": "^1.0.3", 117 | "ws": "^7.2.1" 118 | } 119 | }, 120 | "env-paths": { 121 | "version": "2.2.0", 122 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", 123 | "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==" 124 | }, 125 | "event-target-shim": { 126 | "version": "5.0.1", 127 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 128 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 129 | }, 130 | "ffmpeg-static": { 131 | "version": "4.2.5", 132 | "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-4.2.5.tgz", 133 | "integrity": "sha512-4JykaxRgU5z/GfL0YLkBetJyXgaQXh67etMJlJMMTTcoA33voU6y/KFMg/RUehBj3DGDIs9HYhf7tozwabibaQ==", 134 | "requires": { 135 | "env-paths": "^2.2.0", 136 | "http-basic": "github:derhuerst/http-basic#8.2.0", 137 | "https-proxy-agent": "^5.0.0", 138 | "progress": "^2.0.3" 139 | } 140 | }, 141 | "html-entities": { 142 | "version": "1.3.1", 143 | "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", 144 | "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==" 145 | }, 146 | "http-basic": { 147 | "version": "github:derhuerst/http-basic#0abee462a1e04a1cdada369b1a4d5b2d4698e3bc", 148 | "from": "github:derhuerst/http-basic#8.2.0", 149 | "requires": { 150 | "caseless": "^0.12.0", 151 | "concat-stream": "^1.6.2", 152 | "http-response-object": "^3.0.1", 153 | "parse-cache-control": "^1.0.1" 154 | } 155 | }, 156 | "http-response-object": { 157 | "version": "3.0.2", 158 | "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", 159 | "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", 160 | "requires": { 161 | "@types/node": "^10.0.3" 162 | } 163 | }, 164 | "https-proxy-agent": { 165 | "version": "5.0.0", 166 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 167 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 168 | "requires": { 169 | "agent-base": "6", 170 | "debug": "4" 171 | } 172 | }, 173 | "inherits": { 174 | "version": "2.0.4", 175 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 176 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 177 | }, 178 | "isarray": { 179 | "version": "1.0.0", 180 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 181 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 182 | }, 183 | "m3u8stream": { 184 | "version": "0.7.1", 185 | "resolved": "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.7.1.tgz", 186 | "integrity": "sha512-z6ldnAdhbuWOL6LmMkwptSZGzj+qbRytMKLTbNicwF/bJMjf9U9lqD57RNQUFecvWadEkzy6PDjcNJFFgi19uQ==", 187 | "requires": { 188 | "miniget": "^1.6.1", 189 | "sax": "^1.2.4" 190 | } 191 | }, 192 | "mime-db": { 193 | "version": "1.44.0", 194 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 195 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 196 | }, 197 | "mime-types": { 198 | "version": "2.1.27", 199 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 200 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 201 | "requires": { 202 | "mime-db": "1.44.0" 203 | } 204 | }, 205 | "miniget": { 206 | "version": "1.7.2", 207 | "resolved": "https://registry.npmjs.org/miniget/-/miniget-1.7.2.tgz", 208 | "integrity": "sha512-USPNNK2bnHLOplX8BZVMehUkyQizS/DFpBdoH0TS+fM+hQoLNg9tWg4MeY9wE8gfY0pbzmx5UBEODujt3Lz8AA==" 209 | }, 210 | "ms": { 211 | "version": "2.1.2", 212 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 213 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 214 | }, 215 | "nan": { 216 | "version": "2.14.1", 217 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", 218 | "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" 219 | }, 220 | "node-fetch": { 221 | "version": "2.6.1", 222 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 223 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 224 | }, 225 | "node-opus": { 226 | "version": "0.3.3", 227 | "resolved": "https://registry.npmjs.org/node-opus/-/node-opus-0.3.3.tgz", 228 | "integrity": "sha512-ZQniA8iJ6y/qOTmW6eyzM9m8odt4CIGV0NM9/U03/pYLhGyxy18QXO25WfrWd8XsUYx57tnxll2xxj54CN08uQ==", 229 | "requires": { 230 | "bindings": "~1.2.1", 231 | "commander": "^2.9.0", 232 | "nan": "^2.14.0", 233 | "ogg-packet": "^1.0.0" 234 | } 235 | }, 236 | "ogg-packet": { 237 | "version": "1.0.1", 238 | "resolved": "https://registry.npmjs.org/ogg-packet/-/ogg-packet-1.0.1.tgz", 239 | "integrity": "sha512-dW1ok3BMnMikyXGDIgVEckWnlViW8JLWQV4qj9aN/rNRVqHlDYSlcIEtSIMH7tpuUOiIxAhY3+OxNdIOm6s17A==", 240 | "optional": true, 241 | "requires": { 242 | "ref-struct": "*" 243 | } 244 | }, 245 | "parse-cache-control": { 246 | "version": "1.0.1", 247 | "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", 248 | "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=" 249 | }, 250 | "prism-media": { 251 | "version": "1.2.2", 252 | "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.2.tgz", 253 | "integrity": "sha512-I+nkWY212lJ500jLe4tN9tWO7nRiBAVdMv76P9kffZjYhw20raMlW1HSSvS+MLXC9MmbNZCazMrAr+5jEEgTuw==" 254 | }, 255 | "process-nextick-args": { 256 | "version": "2.0.1", 257 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 258 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 259 | }, 260 | "progress": { 261 | "version": "2.0.3", 262 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 263 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" 264 | }, 265 | "readable-stream": { 266 | "version": "2.3.7", 267 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 268 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 269 | "requires": { 270 | "core-util-is": "~1.0.0", 271 | "inherits": "~2.0.3", 272 | "isarray": "~1.0.0", 273 | "process-nextick-args": "~2.0.0", 274 | "safe-buffer": "~5.1.1", 275 | "string_decoder": "~1.1.1", 276 | "util-deprecate": "~1.0.1" 277 | } 278 | }, 279 | "ref": { 280 | "version": "1.3.5", 281 | "resolved": "https://registry.npmjs.org/ref/-/ref-1.3.5.tgz", 282 | "integrity": "sha512-2cBCniTtxcGUjDpvFfVpw323a83/0RLSGJJY5l5lcomZWhYpU2cuLdsvYqMixvsdLJ9+sTdzEkju8J8ZHDM2nA==", 283 | "optional": true, 284 | "requires": { 285 | "bindings": "1", 286 | "debug": "2", 287 | "nan": "2" 288 | }, 289 | "dependencies": { 290 | "debug": { 291 | "version": "2.6.9", 292 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 293 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 294 | "optional": true, 295 | "requires": { 296 | "ms": "2.0.0" 297 | } 298 | }, 299 | "ms": { 300 | "version": "2.0.0", 301 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 302 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 303 | "optional": true 304 | } 305 | } 306 | }, 307 | "ref-struct": { 308 | "version": "1.1.0", 309 | "resolved": "https://registry.npmjs.org/ref-struct/-/ref-struct-1.1.0.tgz", 310 | "integrity": "sha1-XV7mWtQc78Olxf60BYcmHkee3BM=", 311 | "optional": true, 312 | "requires": { 313 | "debug": "2", 314 | "ref": "1" 315 | }, 316 | "dependencies": { 317 | "debug": { 318 | "version": "2.6.9", 319 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 320 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 321 | "optional": true, 322 | "requires": { 323 | "ms": "2.0.0" 324 | } 325 | }, 326 | "ms": { 327 | "version": "2.0.0", 328 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 329 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 330 | "optional": true 331 | } 332 | } 333 | }, 334 | "safe-buffer": { 335 | "version": "5.1.2", 336 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 337 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 338 | }, 339 | "sax": { 340 | "version": "1.2.4", 341 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 342 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 343 | }, 344 | "setimmediate": { 345 | "version": "1.0.5", 346 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 347 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 348 | }, 349 | "string_decoder": { 350 | "version": "1.1.1", 351 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 352 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 353 | "requires": { 354 | "safe-buffer": "~5.1.0" 355 | } 356 | }, 357 | "tweetnacl": { 358 | "version": "1.0.3", 359 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", 360 | "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" 361 | }, 362 | "typedarray": { 363 | "version": "0.0.6", 364 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 365 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 366 | }, 367 | "util-deprecate": { 368 | "version": "1.0.2", 369 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 370 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 371 | }, 372 | "ws": { 373 | "version": "7.4.6", 374 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", 375 | "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" 376 | }, 377 | "ytdl-core": { 378 | "version": "2.1.7", 379 | "resolved": "https://registry.npmjs.org/ytdl-core/-/ytdl-core-2.1.7.tgz", 380 | "integrity": "sha512-ithllxxlt4zmJVTnYtT8/31QLv5MGlK3fSk29lx2S4eKc1BGh+ELKQEAkRJqWIf2P8TYBYrKwijx11xND4JcXw==", 381 | "requires": { 382 | "html-entities": "^1.3.1", 383 | "m3u8stream": "^0.7.1", 384 | "miniget": "^1.7.2", 385 | "sax": "^1.1.3" 386 | } 387 | } 388 | } 389 | } 390 | -------------------------------------------------------------------------------- /ep 3 - music bot for v12/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "musicbot", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "discord.js": "^12.2.0", 13 | "ffmpeg-static": "^4.2.5", 14 | "node-opus": "^0.3.3", 15 | "ytdl-core": "^2.1.7" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /ep 4 - ticket bot/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "token": "BOT TOKEN HERE", 3 | "prefix": "-" 4 | } -------------------------------------------------------------------------------- /ep 4 - ticket bot/data/enmap.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ItzDerock/discord.js-v12-tutorial-series/8359b0c3e4535aa31cd8aaac61471a5e8064e874/ep 4 - ticket bot/data/enmap.sqlite -------------------------------------------------------------------------------- /ep 4 - ticket bot/data/enmap.sqlite-shm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ItzDerock/discord.js-v12-tutorial-series/8359b0c3e4535aa31cd8aaac61471a5e8064e874/ep 4 - ticket bot/data/enmap.sqlite-shm -------------------------------------------------------------------------------- /ep 4 - ticket bot/data/enmap.sqlite-wal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ItzDerock/discord.js-v12-tutorial-series/8359b0c3e4535aa31cd8aaac61471a5e8064e874/ep 4 - ticket bot/data/enmap.sqlite-wal -------------------------------------------------------------------------------- /ep 4 - ticket bot/index.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const client = new Discord.Client({partials: ["MESSAGE", "USER", "REACTION"]}); 3 | const enmap = require('enmap'); 4 | const {token, prefix} = require('./config.json'); 5 | 6 | const settings = new enmap({ 7 | name: "settings", 8 | autoFetch: true, 9 | cloneLevel: "deep", 10 | fetchAll: true 11 | }); 12 | 13 | client.on('ready', () => { 14 | console.log('ready') 15 | }); 16 | 17 | client.on('message', async message => { 18 | if(message.author.bot) return; 19 | if(message.content.indexOf(prefix) !== 0) return; 20 | 21 | const args = message.content.slice(prefix.length).trim().split(/ +/g); 22 | const command = args.shift().toLowerCase(); 23 | 24 | if(command == "ticket-setup") { 25 | // ticket-setup #channel 26 | 27 | let channel = message.mentions.channels.first(); 28 | if(!channel) return message.reply("Usage: `!ticket-setup #channel`"); 29 | 30 | let sent = await channel.send(new Discord.MessageEmbed() 31 | .setTitle("Ticket System") 32 | .setDescription("React to open a ticket!") 33 | .setFooter("Ticket System") 34 | .setColor("00ff00") 35 | ); 36 | 37 | sent.react('🎫'); 38 | settings.set(`${message.guild.id}-ticket`, sent.id); 39 | 40 | message.channel.send("Ticket System Setup Done!") 41 | } 42 | 43 | if(command == "close") { 44 | if(!message.channel.name.includes("ticket-")) return message.channel.send("You cannot use that here!") 45 | message.channel.delete(); 46 | } 47 | }); 48 | 49 | client.on('messageReactionAdd', async (reaction, user) => { 50 | if(user.partial) await user.fetch(); 51 | if(reaction.partial) await reaction.fetch(); 52 | if(reaction.message.partial) await reaction.message.fetch(); 53 | 54 | if(user.bot) return; 55 | 56 | let ticketid = await settings.get(`${reaction.message.guild.id}-ticket`); 57 | 58 | if(!ticketid) return; 59 | 60 | if(reaction.message.id == ticketid && reaction.emoji.name == '🎫') { 61 | reaction.users.remove(user); 62 | 63 | reaction.message.guild.channels.create(`ticket-${user.username}`, { 64 | permissionOverwrites: [ 65 | { 66 | id: user.id, 67 | allow: ["SEND_MESSAGES", "VIEW_CHANNEL"] 68 | }, 69 | { 70 | id: reaction.message.guild.roles.everyone, 71 | deny: ["VIEW_CHANNEL"] 72 | } 73 | ], 74 | type: 'text' 75 | }).then(async channel => { 76 | channel.send(`<@${user.id}>`, new Discord.MessageEmbed().setTitle("Welcome to your ticket!").setDescription("We will be with you shortly").setColor("00ff00")) 77 | }) 78 | } 79 | }); 80 | 81 | client.login(token); 82 | -------------------------------------------------------------------------------- /ep 4 - ticket bot/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ticketbot", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@discordjs/collection": { 8 | "version": "0.1.5", 9 | "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.5.tgz", 10 | "integrity": "sha512-CU1q0UXQUpFNzNB7gufgoisDHP7n+T3tkqTsp3MNUkVJ5+hS3BCvME8uCXAUFlz+6T2FbTCu75A+yQ7HMKqRKw==" 11 | }, 12 | "@discordjs/form-data": { 13 | "version": "3.0.1", 14 | "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", 15 | "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", 16 | "requires": { 17 | "asynckit": "^0.4.0", 18 | "combined-stream": "^1.0.8", 19 | "mime-types": "^2.1.12" 20 | } 21 | }, 22 | "abort-controller": { 23 | "version": "3.0.0", 24 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 25 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 26 | "requires": { 27 | "event-target-shim": "^5.0.0" 28 | } 29 | }, 30 | "ansi-regex": { 31 | "version": "2.1.1", 32 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 33 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 34 | }, 35 | "aproba": { 36 | "version": "1.2.0", 37 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 38 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" 39 | }, 40 | "are-we-there-yet": { 41 | "version": "1.1.5", 42 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 43 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 44 | "requires": { 45 | "delegates": "^1.0.0", 46 | "readable-stream": "^2.0.6" 47 | } 48 | }, 49 | "asynckit": { 50 | "version": "0.4.0", 51 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 52 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 53 | }, 54 | "base64-js": { 55 | "version": "1.3.1", 56 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", 57 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" 58 | }, 59 | "better-sqlite3": { 60 | "version": "7.1.0", 61 | "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.1.0.tgz", 62 | "integrity": "sha512-FV/snQ8F/kyqhdxsevzbojVtMowDWOfe1A5N3lYu1KJwoho2t7JgITmdlSc7DkOh3Zq65I+ZyeNWXQrkLEDFTg==", 63 | "requires": { 64 | "bindings": "^1.5.0", 65 | "prebuild-install": "^5.3.3", 66 | "tar": "4.4.10" 67 | } 68 | }, 69 | "bindings": { 70 | "version": "1.5.0", 71 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 72 | "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 73 | "requires": { 74 | "file-uri-to-path": "1.0.0" 75 | } 76 | }, 77 | "bl": { 78 | "version": "4.0.3", 79 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", 80 | "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", 81 | "requires": { 82 | "buffer": "^5.5.0", 83 | "inherits": "^2.0.4", 84 | "readable-stream": "^3.4.0" 85 | }, 86 | "dependencies": { 87 | "readable-stream": { 88 | "version": "3.6.0", 89 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 90 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 91 | "requires": { 92 | "inherits": "^2.0.3", 93 | "string_decoder": "^1.1.1", 94 | "util-deprecate": "^1.0.1" 95 | } 96 | } 97 | } 98 | }, 99 | "buffer": { 100 | "version": "5.6.0", 101 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", 102 | "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", 103 | "requires": { 104 | "base64-js": "^1.0.2", 105 | "ieee754": "^1.1.4" 106 | } 107 | }, 108 | "chownr": { 109 | "version": "1.1.4", 110 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 111 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" 112 | }, 113 | "code-point-at": { 114 | "version": "1.1.0", 115 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 116 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 117 | }, 118 | "combined-stream": { 119 | "version": "1.0.8", 120 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 121 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 122 | "requires": { 123 | "delayed-stream": "~1.0.0" 124 | } 125 | }, 126 | "console-control-strings": { 127 | "version": "1.1.0", 128 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 129 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" 130 | }, 131 | "core-util-is": { 132 | "version": "1.0.2", 133 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 134 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 135 | }, 136 | "decompress-response": { 137 | "version": "4.2.1", 138 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", 139 | "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", 140 | "requires": { 141 | "mimic-response": "^2.0.0" 142 | } 143 | }, 144 | "deep-extend": { 145 | "version": "0.6.0", 146 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 147 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 148 | }, 149 | "delayed-stream": { 150 | "version": "1.0.0", 151 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 152 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 153 | }, 154 | "delegates": { 155 | "version": "1.0.0", 156 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 157 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 158 | }, 159 | "detect-libc": { 160 | "version": "1.0.3", 161 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 162 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" 163 | }, 164 | "discord.js": { 165 | "version": "12.2.0", 166 | "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.2.0.tgz", 167 | "integrity": "sha512-Ueb/0SOsxXyqwvwFYFe0msMrGqH1OMqpp2Dpbplnlr4MzcRrFWwsBM9gKNZXPVBHWUKiQkwU8AihXBXIvTTSvg==", 168 | "requires": { 169 | "@discordjs/collection": "^0.1.5", 170 | "@discordjs/form-data": "^3.0.1", 171 | "abort-controller": "^3.0.0", 172 | "node-fetch": "^2.6.0", 173 | "prism-media": "^1.2.0", 174 | "setimmediate": "^1.0.5", 175 | "tweetnacl": "^1.0.3", 176 | "ws": "^7.2.1" 177 | } 178 | }, 179 | "end-of-stream": { 180 | "version": "1.4.4", 181 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 182 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 183 | "requires": { 184 | "once": "^1.4.0" 185 | } 186 | }, 187 | "enmap": { 188 | "version": "5.3.2", 189 | "resolved": "https://registry.npmjs.org/enmap/-/enmap-5.3.2.tgz", 190 | "integrity": "sha512-xTS2T2ye+U3g9yE7V9qzZ670U6bSYf6loIdHY8z2dLemN6NhnlUb7+j+Rh1W5hydi0Z2VfyJ7k5srw2VBpw7/A==", 191 | "requires": { 192 | "lodash": "^4.17.15", 193 | "on-change": "^2.0.1" 194 | } 195 | }, 196 | "event-target-shim": { 197 | "version": "5.0.1", 198 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 199 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 200 | }, 201 | "expand-template": { 202 | "version": "2.0.3", 203 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 204 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" 205 | }, 206 | "file-uri-to-path": { 207 | "version": "1.0.0", 208 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 209 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" 210 | }, 211 | "fs-constants": { 212 | "version": "1.0.0", 213 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 214 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 215 | }, 216 | "fs-minipass": { 217 | "version": "1.2.7", 218 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", 219 | "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", 220 | "requires": { 221 | "minipass": "^2.6.0" 222 | } 223 | }, 224 | "gauge": { 225 | "version": "2.7.4", 226 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 227 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 228 | "requires": { 229 | "aproba": "^1.0.3", 230 | "console-control-strings": "^1.0.0", 231 | "has-unicode": "^2.0.0", 232 | "object-assign": "^4.1.0", 233 | "signal-exit": "^3.0.0", 234 | "string-width": "^1.0.1", 235 | "strip-ansi": "^3.0.1", 236 | "wide-align": "^1.1.0" 237 | } 238 | }, 239 | "github-from-package": { 240 | "version": "0.0.0", 241 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 242 | "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" 243 | }, 244 | "has-unicode": { 245 | "version": "2.0.1", 246 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 247 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" 248 | }, 249 | "ieee754": { 250 | "version": "1.1.13", 251 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 252 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" 253 | }, 254 | "inherits": { 255 | "version": "2.0.4", 256 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 257 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 258 | }, 259 | "ini": { 260 | "version": "1.3.8", 261 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 262 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 263 | }, 264 | "is-fullwidth-code-point": { 265 | "version": "1.0.0", 266 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 267 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 268 | "requires": { 269 | "number-is-nan": "^1.0.0" 270 | } 271 | }, 272 | "isarray": { 273 | "version": "1.0.0", 274 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 275 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 276 | }, 277 | "lodash": { 278 | "version": "4.17.21", 279 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 280 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 281 | }, 282 | "mime-db": { 283 | "version": "1.44.0", 284 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 285 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 286 | }, 287 | "mime-types": { 288 | "version": "2.1.27", 289 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 290 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 291 | "requires": { 292 | "mime-db": "1.44.0" 293 | } 294 | }, 295 | "mimic-response": { 296 | "version": "2.1.0", 297 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", 298 | "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" 299 | }, 300 | "minimist": { 301 | "version": "1.2.5", 302 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 303 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 304 | }, 305 | "minipass": { 306 | "version": "2.9.0", 307 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", 308 | "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", 309 | "requires": { 310 | "safe-buffer": "^5.1.2", 311 | "yallist": "^3.0.0" 312 | } 313 | }, 314 | "minizlib": { 315 | "version": "1.3.3", 316 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", 317 | "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", 318 | "requires": { 319 | "minipass": "^2.9.0" 320 | } 321 | }, 322 | "mkdirp": { 323 | "version": "0.5.5", 324 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 325 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 326 | "requires": { 327 | "minimist": "^1.2.5" 328 | } 329 | }, 330 | "mkdirp-classic": { 331 | "version": "0.5.3", 332 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 333 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" 334 | }, 335 | "napi-build-utils": { 336 | "version": "1.0.2", 337 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", 338 | "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" 339 | }, 340 | "node-abi": { 341 | "version": "2.18.0", 342 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.18.0.tgz", 343 | "integrity": "sha512-yi05ZoiuNNEbyT/xXfSySZE+yVnQW6fxPZuFbLyS1s6b5Kw3HzV2PHOM4XR+nsjzkHxByK+2Wg+yCQbe35l8dw==", 344 | "requires": { 345 | "semver": "^5.4.1" 346 | } 347 | }, 348 | "node-fetch": { 349 | "version": "2.6.1", 350 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 351 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 352 | }, 353 | "noop-logger": { 354 | "version": "0.1.1", 355 | "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", 356 | "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" 357 | }, 358 | "npmlog": { 359 | "version": "4.1.2", 360 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 361 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 362 | "requires": { 363 | "are-we-there-yet": "~1.1.2", 364 | "console-control-strings": "~1.1.0", 365 | "gauge": "~2.7.3", 366 | "set-blocking": "~2.0.0" 367 | } 368 | }, 369 | "number-is-nan": { 370 | "version": "1.0.1", 371 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 372 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 373 | }, 374 | "object-assign": { 375 | "version": "4.1.1", 376 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 377 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 378 | }, 379 | "on-change": { 380 | "version": "2.0.1", 381 | "resolved": "https://registry.npmjs.org/on-change/-/on-change-2.0.1.tgz", 382 | "integrity": "sha512-M/XA/VXeR3ElAlyYBv2Bow0BtNt6qKI8mNmBI+cw+wyjatoZ3tJQPq6RNYWCaV81uKKbm3svROi6TDS3TtWVzQ==" 383 | }, 384 | "once": { 385 | "version": "1.4.0", 386 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 387 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 388 | "requires": { 389 | "wrappy": "1" 390 | } 391 | }, 392 | "prebuild-install": { 393 | "version": "5.3.5", 394 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.5.tgz", 395 | "integrity": "sha512-YmMO7dph9CYKi5IR/BzjOJlRzpxGGVo1EsLSUZ0mt/Mq0HWZIHOKHHcHdT69yG54C9m6i45GpItwRHpk0Py7Uw==", 396 | "requires": { 397 | "detect-libc": "^1.0.3", 398 | "expand-template": "^2.0.3", 399 | "github-from-package": "0.0.0", 400 | "minimist": "^1.2.3", 401 | "mkdirp": "^0.5.1", 402 | "napi-build-utils": "^1.0.1", 403 | "node-abi": "^2.7.0", 404 | "noop-logger": "^0.1.1", 405 | "npmlog": "^4.0.1", 406 | "pump": "^3.0.0", 407 | "rc": "^1.2.7", 408 | "simple-get": "^3.0.3", 409 | "tar-fs": "^2.0.0", 410 | "tunnel-agent": "^0.6.0", 411 | "which-pm-runs": "^1.0.0" 412 | } 413 | }, 414 | "prism-media": { 415 | "version": "1.2.2", 416 | "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.2.tgz", 417 | "integrity": "sha512-I+nkWY212lJ500jLe4tN9tWO7nRiBAVdMv76P9kffZjYhw20raMlW1HSSvS+MLXC9MmbNZCazMrAr+5jEEgTuw==" 418 | }, 419 | "process-nextick-args": { 420 | "version": "2.0.1", 421 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 422 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 423 | }, 424 | "pump": { 425 | "version": "3.0.0", 426 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 427 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 428 | "requires": { 429 | "end-of-stream": "^1.1.0", 430 | "once": "^1.3.1" 431 | } 432 | }, 433 | "rc": { 434 | "version": "1.2.8", 435 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 436 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 437 | "requires": { 438 | "deep-extend": "^0.6.0", 439 | "ini": "~1.3.0", 440 | "minimist": "^1.2.0", 441 | "strip-json-comments": "~2.0.1" 442 | } 443 | }, 444 | "readable-stream": { 445 | "version": "2.3.7", 446 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 447 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 448 | "requires": { 449 | "core-util-is": "~1.0.0", 450 | "inherits": "~2.0.3", 451 | "isarray": "~1.0.0", 452 | "process-nextick-args": "~2.0.0", 453 | "safe-buffer": "~5.1.1", 454 | "string_decoder": "~1.1.1", 455 | "util-deprecate": "~1.0.1" 456 | } 457 | }, 458 | "safe-buffer": { 459 | "version": "5.1.2", 460 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 461 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 462 | }, 463 | "semver": { 464 | "version": "5.7.1", 465 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 466 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 467 | }, 468 | "set-blocking": { 469 | "version": "2.0.0", 470 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 471 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 472 | }, 473 | "setimmediate": { 474 | "version": "1.0.5", 475 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 476 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 477 | }, 478 | "signal-exit": { 479 | "version": "3.0.3", 480 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 481 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 482 | }, 483 | "simple-concat": { 484 | "version": "1.0.0", 485 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", 486 | "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" 487 | }, 488 | "simple-get": { 489 | "version": "3.1.0", 490 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", 491 | "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", 492 | "requires": { 493 | "decompress-response": "^4.2.0", 494 | "once": "^1.3.1", 495 | "simple-concat": "^1.0.0" 496 | } 497 | }, 498 | "string-width": { 499 | "version": "1.0.2", 500 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 501 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 502 | "requires": { 503 | "code-point-at": "^1.0.0", 504 | "is-fullwidth-code-point": "^1.0.0", 505 | "strip-ansi": "^3.0.0" 506 | } 507 | }, 508 | "string_decoder": { 509 | "version": "1.1.1", 510 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 511 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 512 | "requires": { 513 | "safe-buffer": "~5.1.0" 514 | } 515 | }, 516 | "strip-ansi": { 517 | "version": "3.0.1", 518 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 519 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 520 | "requires": { 521 | "ansi-regex": "^2.0.0" 522 | } 523 | }, 524 | "strip-json-comments": { 525 | "version": "2.0.1", 526 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 527 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 528 | }, 529 | "tar": { 530 | "version": "4.4.10", 531 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz", 532 | "integrity": "sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==", 533 | "requires": { 534 | "chownr": "^1.1.1", 535 | "fs-minipass": "^1.2.5", 536 | "minipass": "^2.3.5", 537 | "minizlib": "^1.2.1", 538 | "mkdirp": "^0.5.0", 539 | "safe-buffer": "^5.1.2", 540 | "yallist": "^3.0.3" 541 | } 542 | }, 543 | "tar-fs": { 544 | "version": "2.1.0", 545 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", 546 | "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==", 547 | "requires": { 548 | "chownr": "^1.1.1", 549 | "mkdirp-classic": "^0.5.2", 550 | "pump": "^3.0.0", 551 | "tar-stream": "^2.0.0" 552 | } 553 | }, 554 | "tar-stream": { 555 | "version": "2.1.3", 556 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.3.tgz", 557 | "integrity": "sha512-Z9yri56Dih8IaK8gncVPx4Wqt86NDmQTSh49XLZgjWpGZL9GK9HKParS2scqHCC4w6X9Gh2jwaU45V47XTKwVA==", 558 | "requires": { 559 | "bl": "^4.0.1", 560 | "end-of-stream": "^1.4.1", 561 | "fs-constants": "^1.0.0", 562 | "inherits": "^2.0.3", 563 | "readable-stream": "^3.1.1" 564 | }, 565 | "dependencies": { 566 | "readable-stream": { 567 | "version": "3.6.0", 568 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 569 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 570 | "requires": { 571 | "inherits": "^2.0.3", 572 | "string_decoder": "^1.1.1", 573 | "util-deprecate": "^1.0.1" 574 | } 575 | } 576 | } 577 | }, 578 | "tunnel-agent": { 579 | "version": "0.6.0", 580 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 581 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 582 | "requires": { 583 | "safe-buffer": "^5.0.1" 584 | } 585 | }, 586 | "tweetnacl": { 587 | "version": "1.0.3", 588 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", 589 | "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" 590 | }, 591 | "util-deprecate": { 592 | "version": "1.0.2", 593 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 594 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 595 | }, 596 | "which-pm-runs": { 597 | "version": "1.0.0", 598 | "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", 599 | "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" 600 | }, 601 | "wide-align": { 602 | "version": "1.1.3", 603 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 604 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 605 | "requires": { 606 | "string-width": "^1.0.2 || 2" 607 | } 608 | }, 609 | "wrappy": { 610 | "version": "1.0.2", 611 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 612 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 613 | }, 614 | "ws": { 615 | "version": "7.4.6", 616 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", 617 | "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" 618 | }, 619 | "yallist": { 620 | "version": "3.1.1", 621 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 622 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 623 | } 624 | } 625 | } 626 | -------------------------------------------------------------------------------- /ep 4 - ticket bot/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ticketbot", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "scripts": { 6 | "test": "echo \"Error: no test specified\" && exit 1" 7 | }, 8 | "author": "", 9 | "license": "ISC", 10 | "dependencies": { 11 | "better-sqlite3": "^7.1.0", 12 | "discord.js": "^12.2.0", 13 | "enmap": "^5.3.2" 14 | }, 15 | "devDependencies": {}, 16 | "description": "" 17 | } 18 | -------------------------------------------------------------------------------- /ep 5 - economy bot/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "token": "YOUR TOKEN HERE", 3 | "prefix": "-" 4 | } -------------------------------------------------------------------------------- /ep 5 - economy bot/data/enmap.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ItzDerock/discord.js-v12-tutorial-series/8359b0c3e4535aa31cd8aaac61471a5e8064e874/ep 5 - economy bot/data/enmap.sqlite -------------------------------------------------------------------------------- /ep 5 - economy bot/data/enmap.sqlite-shm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ItzDerock/discord.js-v12-tutorial-series/8359b0c3e4535aa31cd8aaac61471a5e8064e874/ep 5 - economy bot/data/enmap.sqlite-shm -------------------------------------------------------------------------------- /ep 5 - economy bot/data/enmap.sqlite-wal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ItzDerock/discord.js-v12-tutorial-series/8359b0c3e4535aa31cd8aaac61471a5e8064e874/ep 5 - economy bot/data/enmap.sqlite-wal -------------------------------------------------------------------------------- /ep 5 - economy bot/index.js: -------------------------------------------------------------------------------- 1 | const Discord = require("discord.js"); 2 | const enmap = require("enmap"); 3 | const config = require("./config.json"); 4 | const ms = require("ms") 5 | 6 | const client = new Discord.Client(); 7 | const eco = new enmap({ 8 | name: "economy", 9 | cloneLevel: "deep", 10 | fetchAll: false, 11 | autoFetch: true 12 | }); 13 | 14 | const cooldowns = new enmap({ 15 | name: "cooldowns", 16 | cloneLevel: "deep", 17 | fetchAll: false, 18 | autoFetch: true 19 | }); 20 | 21 | client.on("ready", () => { 22 | console.log("Ready") 23 | }); 24 | 25 | client.on('message', async message => { 26 | if(!message.content.startsWith(config.prefix)) return; 27 | if(message.author.bot) return; 28 | if(!message.guild) return; 29 | 30 | const args = message.content.slice(config.prefix.length).trim().split(/ +/g); 31 | const command = args.shift().toLowerCase(); 32 | 33 | if(command == "daily") { 34 | const cooldowndata = await cooldowns.get(`${message.author.id}-${message.guild.id}-daily`); 35 | if(parseInt(cooldowndata) > Date.now()) return message.reply(`Please wait ${ms(parseInt(cooldowndata) - Date.now(), {long: true})}`) 36 | 37 | await eco.ensure(`${message.author.id}-${message.guild.id}`, 0); 38 | const currentBalance = await eco.get(`${message.author.id}-${message.guild.id}`); 39 | eco.set(`${message.author.id}-${message.guild.id}`, currentBalance + 5); 40 | 41 | message.channel.send(new Discord.MessageEmbed() 42 | .setTitle("💵 Daily Reward!") 43 | .setDescription(`You have claimed your daily reward! Your new balance is now ${currentBalance + 5}!`).setColor("00ff00") 44 | ) 45 | 46 | cooldowns.set(`${message.author.id}-${message.guild.id}-daily`, Date.now() + ms("1d")) 47 | } 48 | 49 | if(command == "bal") { 50 | await eco.ensure(`${message.author.id}-${message.guild.id}`, 0); 51 | const currentBalance = await eco.get(`${message.author.id}-${message.guild.id}`); 52 | 53 | message.channel.send(new Discord.MessageEmbed() 54 | .setTitle("💵 Your Balance!") 55 | .setDescription(`Your current balance is \`${currentBalance}\``).setColor("00ff00") 56 | ) 57 | } 58 | }); 59 | 60 | client.login(config.token) -------------------------------------------------------------------------------- /ep 5 - economy bot/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ecobot", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@discordjs/collection": { 8 | "version": "0.1.6", 9 | "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", 10 | "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" 11 | }, 12 | "@discordjs/form-data": { 13 | "version": "3.0.1", 14 | "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", 15 | "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", 16 | "requires": { 17 | "asynckit": "^0.4.0", 18 | "combined-stream": "^1.0.8", 19 | "mime-types": "^2.1.12" 20 | } 21 | }, 22 | "abort-controller": { 23 | "version": "3.0.0", 24 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 25 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 26 | "requires": { 27 | "event-target-shim": "^5.0.0" 28 | } 29 | }, 30 | "ansi-regex": { 31 | "version": "2.1.1", 32 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 33 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 34 | }, 35 | "aproba": { 36 | "version": "1.2.0", 37 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 38 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" 39 | }, 40 | "are-we-there-yet": { 41 | "version": "1.1.5", 42 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 43 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 44 | "requires": { 45 | "delegates": "^1.0.0", 46 | "readable-stream": "^2.0.6" 47 | } 48 | }, 49 | "asynckit": { 50 | "version": "0.4.0", 51 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 52 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 53 | }, 54 | "base64-js": { 55 | "version": "1.3.1", 56 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", 57 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" 58 | }, 59 | "better-sqlite3": { 60 | "version": "7.1.0", 61 | "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.1.0.tgz", 62 | "integrity": "sha512-FV/snQ8F/kyqhdxsevzbojVtMowDWOfe1A5N3lYu1KJwoho2t7JgITmdlSc7DkOh3Zq65I+ZyeNWXQrkLEDFTg==", 63 | "requires": { 64 | "bindings": "^1.5.0", 65 | "prebuild-install": "^5.3.3", 66 | "tar": "4.4.10" 67 | } 68 | }, 69 | "bindings": { 70 | "version": "1.5.0", 71 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 72 | "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 73 | "requires": { 74 | "file-uri-to-path": "1.0.0" 75 | } 76 | }, 77 | "bl": { 78 | "version": "4.0.3", 79 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", 80 | "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", 81 | "requires": { 82 | "buffer": "^5.5.0", 83 | "inherits": "^2.0.4", 84 | "readable-stream": "^3.4.0" 85 | }, 86 | "dependencies": { 87 | "readable-stream": { 88 | "version": "3.6.0", 89 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 90 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 91 | "requires": { 92 | "inherits": "^2.0.3", 93 | "string_decoder": "^1.1.1", 94 | "util-deprecate": "^1.0.1" 95 | } 96 | } 97 | } 98 | }, 99 | "buffer": { 100 | "version": "5.6.0", 101 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", 102 | "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", 103 | "requires": { 104 | "base64-js": "^1.0.2", 105 | "ieee754": "^1.1.4" 106 | } 107 | }, 108 | "chownr": { 109 | "version": "1.1.4", 110 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 111 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" 112 | }, 113 | "code-point-at": { 114 | "version": "1.1.0", 115 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 116 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 117 | }, 118 | "combined-stream": { 119 | "version": "1.0.8", 120 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 121 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 122 | "requires": { 123 | "delayed-stream": "~1.0.0" 124 | } 125 | }, 126 | "console-control-strings": { 127 | "version": "1.1.0", 128 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 129 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" 130 | }, 131 | "core-util-is": { 132 | "version": "1.0.2", 133 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 134 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 135 | }, 136 | "decompress-response": { 137 | "version": "4.2.1", 138 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", 139 | "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", 140 | "requires": { 141 | "mimic-response": "^2.0.0" 142 | } 143 | }, 144 | "deep-extend": { 145 | "version": "0.6.0", 146 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 147 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 148 | }, 149 | "delayed-stream": { 150 | "version": "1.0.0", 151 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 152 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 153 | }, 154 | "delegates": { 155 | "version": "1.0.0", 156 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 157 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 158 | }, 159 | "detect-libc": { 160 | "version": "1.0.3", 161 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 162 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" 163 | }, 164 | "discord.js": { 165 | "version": "12.3.1", 166 | "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.3.1.tgz", 167 | "integrity": "sha512-mSFyV/mbvzH12UXdS4zadmeUf8IMQOo/YdunubG1wWt1xjWvtaJz/s9CGsFD2B5pTw1W/LXxxUbrQjIZ/xlUdw==", 168 | "requires": { 169 | "@discordjs/collection": "^0.1.6", 170 | "@discordjs/form-data": "^3.0.1", 171 | "abort-controller": "^3.0.0", 172 | "node-fetch": "^2.6.0", 173 | "prism-media": "^1.2.2", 174 | "setimmediate": "^1.0.5", 175 | "tweetnacl": "^1.0.3", 176 | "ws": "^7.3.1" 177 | } 178 | }, 179 | "end-of-stream": { 180 | "version": "1.4.4", 181 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 182 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 183 | "requires": { 184 | "once": "^1.4.0" 185 | } 186 | }, 187 | "enmap": { 188 | "version": "5.6.1", 189 | "resolved": "https://registry.npmjs.org/enmap/-/enmap-5.6.1.tgz", 190 | "integrity": "sha512-JVlG/j9w/7TPVxaFH6Lm/BTPBxhEK5ALe+8iLOjcMRdAWiQ+7AG4J3Q15Uc3SDqIJt+tH+WhvtQ7+pv+KzgSeA==", 191 | "requires": { 192 | "lodash": "^4.17.19", 193 | "on-change": "^2.0.1" 194 | } 195 | }, 196 | "event-target-shim": { 197 | "version": "5.0.1", 198 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 199 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 200 | }, 201 | "expand-template": { 202 | "version": "2.0.3", 203 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 204 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" 205 | }, 206 | "file-uri-to-path": { 207 | "version": "1.0.0", 208 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 209 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" 210 | }, 211 | "fs-constants": { 212 | "version": "1.0.0", 213 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 214 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 215 | }, 216 | "fs-minipass": { 217 | "version": "1.2.7", 218 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", 219 | "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", 220 | "requires": { 221 | "minipass": "^2.6.0" 222 | } 223 | }, 224 | "gauge": { 225 | "version": "2.7.4", 226 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 227 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 228 | "requires": { 229 | "aproba": "^1.0.3", 230 | "console-control-strings": "^1.0.0", 231 | "has-unicode": "^2.0.0", 232 | "object-assign": "^4.1.0", 233 | "signal-exit": "^3.0.0", 234 | "string-width": "^1.0.1", 235 | "strip-ansi": "^3.0.1", 236 | "wide-align": "^1.1.0" 237 | } 238 | }, 239 | "github-from-package": { 240 | "version": "0.0.0", 241 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 242 | "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" 243 | }, 244 | "has-unicode": { 245 | "version": "2.0.1", 246 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 247 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" 248 | }, 249 | "ieee754": { 250 | "version": "1.1.13", 251 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 252 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" 253 | }, 254 | "inherits": { 255 | "version": "2.0.4", 256 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 257 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 258 | }, 259 | "ini": { 260 | "version": "1.3.8", 261 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 262 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 263 | }, 264 | "is-fullwidth-code-point": { 265 | "version": "1.0.0", 266 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 267 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 268 | "requires": { 269 | "number-is-nan": "^1.0.0" 270 | } 271 | }, 272 | "isarray": { 273 | "version": "1.0.0", 274 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 275 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 276 | }, 277 | "lodash": { 278 | "version": "4.17.21", 279 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 280 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 281 | }, 282 | "mime-db": { 283 | "version": "1.44.0", 284 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 285 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 286 | }, 287 | "mime-types": { 288 | "version": "2.1.27", 289 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 290 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 291 | "requires": { 292 | "mime-db": "1.44.0" 293 | } 294 | }, 295 | "mimic-response": { 296 | "version": "2.1.0", 297 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", 298 | "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" 299 | }, 300 | "minimist": { 301 | "version": "1.2.5", 302 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 303 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 304 | }, 305 | "minipass": { 306 | "version": "2.9.0", 307 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", 308 | "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", 309 | "requires": { 310 | "safe-buffer": "^5.1.2", 311 | "yallist": "^3.0.0" 312 | } 313 | }, 314 | "minizlib": { 315 | "version": "1.3.3", 316 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", 317 | "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", 318 | "requires": { 319 | "minipass": "^2.9.0" 320 | } 321 | }, 322 | "mkdirp": { 323 | "version": "0.5.5", 324 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 325 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 326 | "requires": { 327 | "minimist": "^1.2.5" 328 | } 329 | }, 330 | "mkdirp-classic": { 331 | "version": "0.5.3", 332 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 333 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" 334 | }, 335 | "ms": { 336 | "version": "2.1.2", 337 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 338 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 339 | }, 340 | "napi-build-utils": { 341 | "version": "1.0.2", 342 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", 343 | "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" 344 | }, 345 | "node-abi": { 346 | "version": "2.18.0", 347 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.18.0.tgz", 348 | "integrity": "sha512-yi05ZoiuNNEbyT/xXfSySZE+yVnQW6fxPZuFbLyS1s6b5Kw3HzV2PHOM4XR+nsjzkHxByK+2Wg+yCQbe35l8dw==", 349 | "requires": { 350 | "semver": "^5.4.1" 351 | } 352 | }, 353 | "node-fetch": { 354 | "version": "2.6.1", 355 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 356 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 357 | }, 358 | "noop-logger": { 359 | "version": "0.1.1", 360 | "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", 361 | "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" 362 | }, 363 | "npmlog": { 364 | "version": "4.1.2", 365 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 366 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 367 | "requires": { 368 | "are-we-there-yet": "~1.1.2", 369 | "console-control-strings": "~1.1.0", 370 | "gauge": "~2.7.3", 371 | "set-blocking": "~2.0.0" 372 | } 373 | }, 374 | "number-is-nan": { 375 | "version": "1.0.1", 376 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 377 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 378 | }, 379 | "object-assign": { 380 | "version": "4.1.1", 381 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 382 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 383 | }, 384 | "on-change": { 385 | "version": "2.1.2", 386 | "resolved": "https://registry.npmjs.org/on-change/-/on-change-2.1.2.tgz", 387 | "integrity": "sha512-NrqTIHeY9EjxaQ7urD/bPQNK0QCoQIwBfApgscsXtOWeZlNgr9JHhEe9HfWSVmPei8RWqxlevMejmQaIIhlfOw==" 388 | }, 389 | "once": { 390 | "version": "1.4.0", 391 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 392 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 393 | "requires": { 394 | "wrappy": "1" 395 | } 396 | }, 397 | "prebuild-install": { 398 | "version": "5.3.5", 399 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.5.tgz", 400 | "integrity": "sha512-YmMO7dph9CYKi5IR/BzjOJlRzpxGGVo1EsLSUZ0mt/Mq0HWZIHOKHHcHdT69yG54C9m6i45GpItwRHpk0Py7Uw==", 401 | "requires": { 402 | "detect-libc": "^1.0.3", 403 | "expand-template": "^2.0.3", 404 | "github-from-package": "0.0.0", 405 | "minimist": "^1.2.3", 406 | "mkdirp": "^0.5.1", 407 | "napi-build-utils": "^1.0.1", 408 | "node-abi": "^2.7.0", 409 | "noop-logger": "^0.1.1", 410 | "npmlog": "^4.0.1", 411 | "pump": "^3.0.0", 412 | "rc": "^1.2.7", 413 | "simple-get": "^3.0.3", 414 | "tar-fs": "^2.0.0", 415 | "tunnel-agent": "^0.6.0", 416 | "which-pm-runs": "^1.0.0" 417 | } 418 | }, 419 | "prism-media": { 420 | "version": "1.2.2", 421 | "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.2.tgz", 422 | "integrity": "sha512-I+nkWY212lJ500jLe4tN9tWO7nRiBAVdMv76P9kffZjYhw20raMlW1HSSvS+MLXC9MmbNZCazMrAr+5jEEgTuw==" 423 | }, 424 | "process-nextick-args": { 425 | "version": "2.0.1", 426 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 427 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 428 | }, 429 | "pump": { 430 | "version": "3.0.0", 431 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 432 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 433 | "requires": { 434 | "end-of-stream": "^1.1.0", 435 | "once": "^1.3.1" 436 | } 437 | }, 438 | "rc": { 439 | "version": "1.2.8", 440 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 441 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 442 | "requires": { 443 | "deep-extend": "^0.6.0", 444 | "ini": "~1.3.0", 445 | "minimist": "^1.2.0", 446 | "strip-json-comments": "~2.0.1" 447 | } 448 | }, 449 | "readable-stream": { 450 | "version": "2.3.7", 451 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 452 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 453 | "requires": { 454 | "core-util-is": "~1.0.0", 455 | "inherits": "~2.0.3", 456 | "isarray": "~1.0.0", 457 | "process-nextick-args": "~2.0.0", 458 | "safe-buffer": "~5.1.1", 459 | "string_decoder": "~1.1.1", 460 | "util-deprecate": "~1.0.1" 461 | } 462 | }, 463 | "safe-buffer": { 464 | "version": "5.1.2", 465 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 466 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 467 | }, 468 | "semver": { 469 | "version": "5.7.1", 470 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 471 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 472 | }, 473 | "set-blocking": { 474 | "version": "2.0.0", 475 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 476 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 477 | }, 478 | "setimmediate": { 479 | "version": "1.0.5", 480 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 481 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 482 | }, 483 | "signal-exit": { 484 | "version": "3.0.3", 485 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 486 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 487 | }, 488 | "simple-concat": { 489 | "version": "1.0.1", 490 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 491 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" 492 | }, 493 | "simple-get": { 494 | "version": "3.1.0", 495 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", 496 | "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", 497 | "requires": { 498 | "decompress-response": "^4.2.0", 499 | "once": "^1.3.1", 500 | "simple-concat": "^1.0.0" 501 | } 502 | }, 503 | "string-width": { 504 | "version": "1.0.2", 505 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 506 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 507 | "requires": { 508 | "code-point-at": "^1.0.0", 509 | "is-fullwidth-code-point": "^1.0.0", 510 | "strip-ansi": "^3.0.0" 511 | } 512 | }, 513 | "string_decoder": { 514 | "version": "1.1.1", 515 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 516 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 517 | "requires": { 518 | "safe-buffer": "~5.1.0" 519 | } 520 | }, 521 | "strip-ansi": { 522 | "version": "3.0.1", 523 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 524 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 525 | "requires": { 526 | "ansi-regex": "^2.0.0" 527 | } 528 | }, 529 | "strip-json-comments": { 530 | "version": "2.0.1", 531 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 532 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 533 | }, 534 | "tar": { 535 | "version": "4.4.10", 536 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz", 537 | "integrity": "sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==", 538 | "requires": { 539 | "chownr": "^1.1.1", 540 | "fs-minipass": "^1.2.5", 541 | "minipass": "^2.3.5", 542 | "minizlib": "^1.2.1", 543 | "mkdirp": "^0.5.0", 544 | "safe-buffer": "^5.1.2", 545 | "yallist": "^3.0.3" 546 | } 547 | }, 548 | "tar-fs": { 549 | "version": "2.1.0", 550 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", 551 | "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==", 552 | "requires": { 553 | "chownr": "^1.1.1", 554 | "mkdirp-classic": "^0.5.2", 555 | "pump": "^3.0.0", 556 | "tar-stream": "^2.0.0" 557 | } 558 | }, 559 | "tar-stream": { 560 | "version": "2.1.3", 561 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.3.tgz", 562 | "integrity": "sha512-Z9yri56Dih8IaK8gncVPx4Wqt86NDmQTSh49XLZgjWpGZL9GK9HKParS2scqHCC4w6X9Gh2jwaU45V47XTKwVA==", 563 | "requires": { 564 | "bl": "^4.0.1", 565 | "end-of-stream": "^1.4.1", 566 | "fs-constants": "^1.0.0", 567 | "inherits": "^2.0.3", 568 | "readable-stream": "^3.1.1" 569 | }, 570 | "dependencies": { 571 | "readable-stream": { 572 | "version": "3.6.0", 573 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 574 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 575 | "requires": { 576 | "inherits": "^2.0.3", 577 | "string_decoder": "^1.1.1", 578 | "util-deprecate": "^1.0.1" 579 | } 580 | } 581 | } 582 | }, 583 | "tunnel-agent": { 584 | "version": "0.6.0", 585 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 586 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 587 | "requires": { 588 | "safe-buffer": "^5.0.1" 589 | } 590 | }, 591 | "tweetnacl": { 592 | "version": "1.0.3", 593 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", 594 | "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" 595 | }, 596 | "util-deprecate": { 597 | "version": "1.0.2", 598 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 599 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 600 | }, 601 | "which-pm-runs": { 602 | "version": "1.0.0", 603 | "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", 604 | "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" 605 | }, 606 | "wide-align": { 607 | "version": "1.1.3", 608 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 609 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 610 | "requires": { 611 | "string-width": "^1.0.2 || 2" 612 | } 613 | }, 614 | "wrappy": { 615 | "version": "1.0.2", 616 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 617 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 618 | }, 619 | "ws": { 620 | "version": "7.4.6", 621 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", 622 | "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" 623 | }, 624 | "yallist": { 625 | "version": "3.1.1", 626 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 627 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 628 | } 629 | } 630 | } 631 | -------------------------------------------------------------------------------- /ep 5 - economy bot/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ecobot", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "better-sqlite3": "^7.1.0", 13 | "discord.js": "^12.3.1", 14 | "enmap": "^5.6.1", 15 | "ms": "^2.1.2" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /ep 6 - slash commands/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "token": "your bot token" 3 | } -------------------------------------------------------------------------------- /ep 6 - slash commands/index.js: -------------------------------------------------------------------------------- 1 | const discord = require('discord.js'); 2 | const client = new discord.Client(); 3 | 4 | client.on('ready', () => { 5 | console.log('ready'); 6 | 7 | client.api.applications(client.user.id).guilds('699722023508770836').commands.post({ 8 | data: { 9 | name: "hello", 10 | description: "Replies with Hello World!" 11 | } 12 | }); 13 | 14 | client.api.applications(client.user.id).guilds('699722023508770836').commands.post({ 15 | data: { 16 | name: "echo", 17 | description: "Echos your text as an embed!", 18 | 19 | options: [ 20 | { 21 | name: "content", 22 | description: "Content of the embed", 23 | type: 3, 24 | required: true 25 | } 26 | ] 27 | } 28 | }); 29 | 30 | client.ws.on('INTERACTION_CREATE', async interaction => { 31 | const command = interaction.data.name.toLowerCase(); 32 | const args = interaction.data.options; 33 | 34 | if(command == 'hello') { 35 | client.api.interactions(interaction.id, interaction.token).callback.post({ 36 | data: { 37 | type: 4, 38 | data: { 39 | content: "Hello World!" 40 | } 41 | } 42 | }); 43 | } 44 | 45 | if(command == "echo") { 46 | const description = args.find(arg => arg.name.toLowerCase() == "content").value; 47 | const embed = new discord.MessageEmbed() 48 | .setTitle("Echo!") 49 | .setDescription(description) 50 | .setAuthor(interaction.member.user.username); 51 | 52 | client.api.interactions(interaction.id, interaction.token).callback.post({ 53 | data: { 54 | type: 4, 55 | data: await createAPIMessage(interaction, embed) 56 | } 57 | }); 58 | } 59 | }); 60 | }); 61 | 62 | async function createAPIMessage(interaction, content) { 63 | const apiMessage = await discord.APIMessage.create(client.channels.resolve(interaction.channel_id), content) 64 | .resolveData() 65 | .resolveFiles(); 66 | 67 | return { ...apiMessage.data, files: apiMessage.files }; 68 | } 69 | 70 | client.login(require('./config.json').token); -------------------------------------------------------------------------------- /ep 6 - slash commands/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "asdf", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "asdf", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "discord.js": "^12.5.1" 13 | } 14 | }, 15 | "node_modules/@discordjs/collection": { 16 | "version": "0.1.6", 17 | "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", 18 | "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" 19 | }, 20 | "node_modules/@discordjs/form-data": { 21 | "version": "3.0.1", 22 | "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", 23 | "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", 24 | "dependencies": { 25 | "asynckit": "^0.4.0", 26 | "combined-stream": "^1.0.8", 27 | "mime-types": "^2.1.12" 28 | }, 29 | "engines": { 30 | "node": ">= 6" 31 | } 32 | }, 33 | "node_modules/abort-controller": { 34 | "version": "3.0.0", 35 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 36 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 37 | "dependencies": { 38 | "event-target-shim": "^5.0.0" 39 | }, 40 | "engines": { 41 | "node": ">=6.5" 42 | } 43 | }, 44 | "node_modules/asynckit": { 45 | "version": "0.4.0", 46 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 47 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 48 | }, 49 | "node_modules/combined-stream": { 50 | "version": "1.0.8", 51 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 52 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 53 | "dependencies": { 54 | "delayed-stream": "~1.0.0" 55 | }, 56 | "engines": { 57 | "node": ">= 0.8" 58 | } 59 | }, 60 | "node_modules/delayed-stream": { 61 | "version": "1.0.0", 62 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 63 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 64 | "engines": { 65 | "node": ">=0.4.0" 66 | } 67 | }, 68 | "node_modules/discord.js": { 69 | "version": "12.5.1", 70 | "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.1.tgz", 71 | "integrity": "sha512-VwZkVaUAIOB9mKdca0I5MefPMTQJTNg0qdgi1huF3iwsFwJ0L5s/Y69AQe+iPmjuV6j9rtKoG0Ta0n9vgEIL6w==", 72 | "dependencies": { 73 | "@discordjs/collection": "^0.1.6", 74 | "@discordjs/form-data": "^3.0.1", 75 | "abort-controller": "^3.0.0", 76 | "node-fetch": "^2.6.1", 77 | "prism-media": "^1.2.2", 78 | "setimmediate": "^1.0.5", 79 | "tweetnacl": "^1.0.3", 80 | "ws": "^7.3.1" 81 | }, 82 | "engines": { 83 | "node": ">=12.0.0" 84 | } 85 | }, 86 | "node_modules/event-target-shim": { 87 | "version": "5.0.1", 88 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 89 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", 90 | "engines": { 91 | "node": ">=6" 92 | } 93 | }, 94 | "node_modules/mime-db": { 95 | "version": "1.44.0", 96 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 97 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", 98 | "engines": { 99 | "node": ">= 0.6" 100 | } 101 | }, 102 | "node_modules/mime-types": { 103 | "version": "2.1.27", 104 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 105 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 106 | "dependencies": { 107 | "mime-db": "1.44.0" 108 | }, 109 | "engines": { 110 | "node": ">= 0.6" 111 | } 112 | }, 113 | "node_modules/node-fetch": { 114 | "version": "2.6.1", 115 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 116 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", 117 | "engines": { 118 | "node": "4.x || >=6.0.0" 119 | } 120 | }, 121 | "node_modules/prism-media": { 122 | "version": "1.2.3", 123 | "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.3.tgz", 124 | "integrity": "sha512-fSrR66n0l6roW9Rx4rSLMyTPTjRTiXy5RVqDOurACQ6si1rKHHKDU5gwBJoCsIV0R3o9gi+K50akl/qyw1C74A==", 125 | "peerDependencies": { 126 | "@discordjs/opus": "^0.3.3", 127 | "ffmpeg-static": "^4.2.7 || ^3.0.0 || ^2.4.0", 128 | "node-opus": "^0.3.3", 129 | "opusscript": "^0.0.7" 130 | }, 131 | "peerDependenciesMeta": { 132 | "@discordjs/opus": { 133 | "optional": true 134 | }, 135 | "ffmpeg-static": { 136 | "optional": true 137 | }, 138 | "node-opus": { 139 | "optional": true 140 | }, 141 | "opusscript": { 142 | "optional": true 143 | } 144 | } 145 | }, 146 | "node_modules/setimmediate": { 147 | "version": "1.0.5", 148 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 149 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 150 | }, 151 | "node_modules/tweetnacl": { 152 | "version": "1.0.3", 153 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", 154 | "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" 155 | }, 156 | "node_modules/ws": { 157 | "version": "7.4.1", 158 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz", 159 | "integrity": "sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ==", 160 | "engines": { 161 | "node": ">=8.3.0" 162 | }, 163 | "peerDependencies": { 164 | "bufferutil": "^4.0.1", 165 | "utf-8-validate": "^5.0.2" 166 | }, 167 | "peerDependenciesMeta": { 168 | "bufferutil": { 169 | "optional": true 170 | }, 171 | "utf-8-validate": { 172 | "optional": true 173 | } 174 | } 175 | } 176 | }, 177 | "dependencies": { 178 | "@discordjs/collection": { 179 | "version": "0.1.6", 180 | "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", 181 | "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" 182 | }, 183 | "@discordjs/form-data": { 184 | "version": "3.0.1", 185 | "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", 186 | "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", 187 | "requires": { 188 | "asynckit": "^0.4.0", 189 | "combined-stream": "^1.0.8", 190 | "mime-types": "^2.1.12" 191 | } 192 | }, 193 | "abort-controller": { 194 | "version": "3.0.0", 195 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 196 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 197 | "requires": { 198 | "event-target-shim": "^5.0.0" 199 | } 200 | }, 201 | "asynckit": { 202 | "version": "0.4.0", 203 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 204 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 205 | }, 206 | "combined-stream": { 207 | "version": "1.0.8", 208 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 209 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 210 | "requires": { 211 | "delayed-stream": "~1.0.0" 212 | } 213 | }, 214 | "delayed-stream": { 215 | "version": "1.0.0", 216 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 217 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 218 | }, 219 | "discord.js": { 220 | "version": "12.5.1", 221 | "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.1.tgz", 222 | "integrity": "sha512-VwZkVaUAIOB9mKdca0I5MefPMTQJTNg0qdgi1huF3iwsFwJ0L5s/Y69AQe+iPmjuV6j9rtKoG0Ta0n9vgEIL6w==", 223 | "requires": { 224 | "@discordjs/collection": "^0.1.6", 225 | "@discordjs/form-data": "^3.0.1", 226 | "abort-controller": "^3.0.0", 227 | "node-fetch": "^2.6.1", 228 | "prism-media": "^1.2.2", 229 | "setimmediate": "^1.0.5", 230 | "tweetnacl": "^1.0.3", 231 | "ws": "^7.3.1" 232 | } 233 | }, 234 | "event-target-shim": { 235 | "version": "5.0.1", 236 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 237 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 238 | }, 239 | "mime-db": { 240 | "version": "1.44.0", 241 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 242 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 243 | }, 244 | "mime-types": { 245 | "version": "2.1.27", 246 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 247 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 248 | "requires": { 249 | "mime-db": "1.44.0" 250 | } 251 | }, 252 | "node-fetch": { 253 | "version": "2.6.1", 254 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 255 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 256 | }, 257 | "prism-media": { 258 | "version": "1.2.3", 259 | "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.3.tgz", 260 | "integrity": "sha512-fSrR66n0l6roW9Rx4rSLMyTPTjRTiXy5RVqDOurACQ6si1rKHHKDU5gwBJoCsIV0R3o9gi+K50akl/qyw1C74A==", 261 | "requires": {} 262 | }, 263 | "setimmediate": { 264 | "version": "1.0.5", 265 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 266 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 267 | }, 268 | "tweetnacl": { 269 | "version": "1.0.3", 270 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", 271 | "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" 272 | }, 273 | "ws": { 274 | "version": "7.4.1", 275 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz", 276 | "integrity": "sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ==", 277 | "requires": {} 278 | } 279 | } 280 | } 281 | -------------------------------------------------------------------------------- /ep 6 - slash commands/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "asdf", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "discord.js": "^12.5.1" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /ep 7 - lavalink music bot/bot/commands/command.js.example: -------------------------------------------------------------------------------- 1 | const discord = require('discord.js'); 2 | 3 | module.exports = { 4 | /** 5 | * 6 | * @param {string[]} args 7 | * @param {discord.Message} message 8 | */ 9 | run: (args, message) => { 10 | 11 | }, 12 | 13 | command: 'yourcommandhere' 14 | } -------------------------------------------------------------------------------- /ep 7 - lavalink music bot/bot/commands/np.js: -------------------------------------------------------------------------------- 1 | const discord = require('discord.js'); 2 | const { queues } = require('..'); 3 | const { msToHMS } = require('../utils'); 4 | 5 | module.exports = { 6 | /** 7 | * 8 | * @param {string[]} args 9 | * @param {discord.Message} message 10 | */ 11 | run: async (args, message) => { 12 | if(!queues[message.guild.id]) return message.channel.send('Nothing is playing'); 13 | 14 | const song = queues[message.guild.id].currentlyPlaying; 15 | 16 | message.channel.send( 17 | new discord.MessageEmbed() 18 | .setTitle("🎶 Currently playing: " + song.info.title) 19 | .addFields([ 20 | { inline: true, name: "Author", value: song.info.author }, 21 | { inline: true, name: "Length", value: msToHMS(song.info.length) }, 22 | { inline: true, name: "Link", value: song.info.uri } 23 | ]) 24 | .setColor("00ff00") 25 | ); 26 | }, 27 | 28 | command: 'np' 29 | } -------------------------------------------------------------------------------- /ep 7 - lavalink music bot/bot/commands/play.js: -------------------------------------------------------------------------------- 1 | const discord = require('discord.js'); 2 | const { queues } = require('..'); 3 | const Queue = require('../structures/Queue'); 4 | const { msToHMS } = require('../utils'); 5 | 6 | module.exports = { 7 | /** 8 | * 9 | * @param {string[]} args 10 | * @param {discord.Message} message 11 | */ 12 | run: async (args, message) => { 13 | if(!args[0]) return message.channel.send("Usage: `play `"); 14 | if(!message.member.voice.channel.id) return message.channel.send(`You must be in a voice channel!`); 15 | 16 | if(!queues[message.guild.id]) 17 | queues[message.guild.id] = new Queue(message.guild.id, message.member.voice.channel.id, message.channel); 18 | 19 | const [ song ] = await queues[message.guild.id].search(args.join(' ')); 20 | if(!song) return message.channel.send(`Unknown song.`); 21 | 22 | const isAdded = await queues[message.guild.id].play(song); 23 | 24 | if(isAdded) { 25 | message.channel.send( 26 | new discord.MessageEmbed() 27 | .setTitle("🎶 Added to queue: " + song.info.title) 28 | .addFields([ 29 | { inline: true, name: "Author", value: song.info.author }, 30 | { inline: true, name: "Length", value: msToHMS(song.info.length) }, 31 | { inline: true, name: "Link", value: song.info.uri } 32 | ]) 33 | .setColor("00ff00") 34 | ) 35 | } 36 | }, 37 | 38 | command: 'play' 39 | } -------------------------------------------------------------------------------- /ep 7 - lavalink music bot/bot/commands/queue.js: -------------------------------------------------------------------------------- 1 | const discord = require('discord.js'); 2 | const { queues } = require('..'); 3 | const { msToHMS } = require('../utils'); 4 | 5 | module.exports = { 6 | /** 7 | * 8 | * @param {string[]} args 9 | * @param {discord.Message} message 10 | */ 11 | run: async (args, message) => { 12 | if(!queues[message.guild.id]) return message.channel.send('Nothing is playing'); 13 | 14 | const next = queues[message.guild.id].queue; 15 | 16 | const text = next.map((song, index) => `${++index}) ${song.info.title} - ${song.info.author} - ${msToHMS(song.info.length)}`); 17 | 18 | message.channel.send( 19 | new discord.MessageEmbed() 20 | .setTitle("📜 Queue") 21 | .setDescription(`\`\`\`\n${text ?? "Nothing in queue"}\n\`\`\``) 22 | .setColor("00ff00") 23 | ); 24 | }, 25 | 26 | command: 'queue' 27 | } -------------------------------------------------------------------------------- /ep 7 - lavalink music bot/bot/commands/search.js: -------------------------------------------------------------------------------- 1 | const discord = require('discord.js'); 2 | const { queues } = require('..'); 3 | const Queue = require('../structures/Queue'); 4 | const { msToHMS } = require('../utils'); 5 | 6 | module.exports = { 7 | /** 8 | * 9 | * @param {string[]} args 10 | * @param {discord.Message} message 11 | */ 12 | run: async (args, message) => { 13 | if(!args[0]) return message.channel.send(`Please provide a search term.`); 14 | if(!message.member.voice.channel.id) return message.channel.send('You must be in a vc.'); 15 | 16 | if(!queues[message.guild.id]) 17 | queues[message.guild.id] = new Queue(message.guild.id, message.member.voice.channel.id, message.channel); 18 | 19 | const allSongs = await queues[message.guild.id].search(args.join(' ')); 20 | if(!allSongs || allSongs.length == 0) return message.channel.send(`Unknown song.`); 21 | 22 | const songs = allSongs.slice(0, 5); 23 | 24 | const options = songs.map((song, index) => `${++index}) ${song.info.title} - ${song.info.author} - ${msToHMS(song.info.length)}`); 25 | 26 | const msg = await message.channel.send( 27 | new discord.MessageEmbed() 28 | .setTitle("🔎 Search Results") 29 | .setDescription(`\`\`\`\n${options.join('\n')}\n\`\`\``) 30 | .setColor("00ff00") 31 | ); 32 | 33 | const chosenSong = (await msg.channel.awaitMessages(msg => msg.author === message.author && ['1','2','3','4','5', 'cancel'].includes(msg.content), { max: 1 })).first().content; 34 | if(chosenSong === "cancel") return message.channel.send('Canceled'); 35 | 36 | const song = songs[parseInt(chosenSong) - 1]; 37 | 38 | const isAdded = await queues[message.guild.id].play(song); 39 | 40 | if(isAdded) { 41 | message.channel.send( 42 | new discord.MessageEmbed() 43 | .setTitle("🎶 Added to queue: " + song.info.title) 44 | .addFields([ 45 | { inline: true, name: "Author", value: song.info.author }, 46 | { inline: true, name: "Length", value: msToHMS(song.info.length) }, 47 | { inline: true, name: "Link", value: song.info.uri } 48 | ]) 49 | .setColor("00ff00") 50 | ) 51 | } 52 | }, 53 | 54 | command: 'search' 55 | } -------------------------------------------------------------------------------- /ep 7 - lavalink music bot/bot/commands/skip.js: -------------------------------------------------------------------------------- 1 | const discord = require('discord.js'); 2 | const { queues } = require('..'); 3 | 4 | module.exports = { 5 | /** 6 | * 7 | * @param {string[]} args 8 | * @param {discord.Message} message 9 | */ 10 | run: async (args, message) => { 11 | if(!message.member.voice.channel.id) return message.channel.send("You must be in a voice channel!"); 12 | if(!queues[message.guild.id]) return message.channel.send('Nothing is playing!'); 13 | 14 | queues[message.guild.id]._playNext(); 15 | }, 16 | 17 | command: 'skip' 18 | } -------------------------------------------------------------------------------- /ep 7 - lavalink music bot/bot/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "token": "token", 3 | "prefix": "-", 4 | 5 | "nodes": [ 6 | { 7 | "id": "1", 8 | "host": "localhost", 9 | "port": "2333", 10 | "password": "verysecurepassword" 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /ep 7 - lavalink music bot/bot/events/message.js: -------------------------------------------------------------------------------- 1 | const { commands } = require(".."); 2 | const config = require('../config.json') 3 | const discord = require('discord.js'); 4 | 5 | module.exports = { 6 | 7 | /** 8 | * 9 | * @param {discord.Message} message 10 | */ 11 | run: message => { 12 | if(!message.guild) return; 13 | if(message.author.bot) return; 14 | 15 | if(!message.content.startsWith(config.prefix)) return; 16 | 17 | const args = message.content.slice(config.prefix.length).trim().split(/ +/g); 18 | const command = args.shift().toLowerCase(); 19 | 20 | const loadedCommand = commands.get(command); 21 | if(!loadedCommand) return; 22 | 23 | loadedCommand(args, message); 24 | }, 25 | 26 | eventName: 'message' 27 | } -------------------------------------------------------------------------------- /ep 7 - lavalink music bot/bot/events/ready.js: -------------------------------------------------------------------------------- 1 | const { lavacordManager } = require(".."); 2 | const config = require('../config.json') 3 | 4 | module.exports = { 5 | run: () => { 6 | console.log('Ready, connecting to lavalink.'); 7 | 8 | lavacordManager.connect().then(success => { 9 | console.log(`Connected to ${success.filter(ws => ws != null).length} lavalink node(s) out of ${config.nodes.length} total node(s).`); 10 | }).catch(err => { 11 | console.error(`Error connecting to lavalink.`, err); 12 | process.exit(1); 13 | }); 14 | }, 15 | 16 | eventName: 'ready' 17 | } -------------------------------------------------------------------------------- /ep 7 - lavalink music bot/bot/index.js: -------------------------------------------------------------------------------- 1 | const discord = require('discord.js'); 2 | const config = require('./config.json'); 3 | const lavalink = require('@lavacord/discord.js'); 4 | const fs = require('fs').promises; 5 | 6 | const client = new discord.Client(); 7 | const lavacordManager = new lavalink.Manager(client, config.nodes); 8 | 9 | const commands = new discord.Collection(); 10 | 11 | lavacordManager.on('error', (err, node) => { 12 | console.error(`An error occurred on node ${node.id}.`, err) 13 | }); 14 | 15 | fs.readdir('./events') 16 | .then(files => { 17 | for(const file of files.filter(file => file.endsWith('.js'))) { 18 | const loaded = require('./events/' + file); 19 | 20 | if(!loaded.eventName || !loaded.run) 21 | return console.error(`Missing params from ${file}`); 22 | 23 | client.on(loaded.eventName, loaded.run); 24 | console.log(`Loaded command ${loaded.eventName}`); 25 | } 26 | }); 27 | 28 | fs.readdir('./commands') 29 | .then(files => { 30 | for(const file of files.filter(file => file.endsWith('.js'))) { 31 | const loaded = require('./commands/' + file); 32 | 33 | if(!loaded.command || !loaded.run) 34 | return console.error(`Missing params from ${file}`); 35 | 36 | commands.set(loaded.command, loaded.run); 37 | console.log(`Loaded command ${loaded.command}`); 38 | } 39 | }); 40 | 41 | client.login(config.token); 42 | 43 | module.exports = { 44 | client, 45 | lavacordManager, 46 | commands, 47 | 48 | /** @type {Object.} */ 49 | queues: {} 50 | } -------------------------------------------------------------------------------- /ep 7 - lavalink music bot/bot/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bot", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@discordjs/collection": { 8 | "version": "0.1.6", 9 | "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", 10 | "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" 11 | }, 12 | "@discordjs/form-data": { 13 | "version": "3.0.1", 14 | "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", 15 | "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", 16 | "requires": { 17 | "asynckit": "^0.4.0", 18 | "combined-stream": "^1.0.8", 19 | "mime-types": "^2.1.12" 20 | } 21 | }, 22 | "@lavacord/discord.js": { 23 | "version": "0.0.7", 24 | "resolved": "https://registry.npmjs.org/@lavacord/discord.js/-/discord.js-0.0.7.tgz", 25 | "integrity": "sha512-EJ3Jz7Eeepbb+fTirLmVGRshtACuzkhDFccR+6hrTRAmEV9P3dFsfbCtsZfLhRa2j2geJ73VqpjfiJmml0AMuQ==", 26 | "requires": { 27 | "lavacord": "1.1.9" 28 | } 29 | }, 30 | "abort-controller": { 31 | "version": "3.0.0", 32 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 33 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 34 | "requires": { 35 | "event-target-shim": "^5.0.0" 36 | } 37 | }, 38 | "asynckit": { 39 | "version": "0.4.0", 40 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 41 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 42 | }, 43 | "axios": { 44 | "version": "0.21.1", 45 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", 46 | "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", 47 | "requires": { 48 | "follow-redirects": "^1.10.0" 49 | } 50 | }, 51 | "combined-stream": { 52 | "version": "1.0.8", 53 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 54 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 55 | "requires": { 56 | "delayed-stream": "~1.0.0" 57 | } 58 | }, 59 | "delayed-stream": { 60 | "version": "1.0.0", 61 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 62 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 63 | }, 64 | "discord.js": { 65 | "version": "12.5.1", 66 | "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.1.tgz", 67 | "integrity": "sha512-VwZkVaUAIOB9mKdca0I5MefPMTQJTNg0qdgi1huF3iwsFwJ0L5s/Y69AQe+iPmjuV6j9rtKoG0Ta0n9vgEIL6w==", 68 | "requires": { 69 | "@discordjs/collection": "^0.1.6", 70 | "@discordjs/form-data": "^3.0.1", 71 | "abort-controller": "^3.0.0", 72 | "node-fetch": "^2.6.1", 73 | "prism-media": "^1.2.2", 74 | "setimmediate": "^1.0.5", 75 | "tweetnacl": "^1.0.3", 76 | "ws": "^7.3.1" 77 | } 78 | }, 79 | "event-target-shim": { 80 | "version": "5.0.1", 81 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 82 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 83 | }, 84 | "follow-redirects": { 85 | "version": "1.13.3", 86 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", 87 | "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==" 88 | }, 89 | "lavacord": { 90 | "version": "1.1.9", 91 | "resolved": "https://registry.npmjs.org/lavacord/-/lavacord-1.1.9.tgz", 92 | "integrity": "sha512-haZghbblO1w3Hodc9q63ZWgV5zA/jB6xFKS17fImK5aIdn0PkKuZ6AsJBxMFpR275v8GNYOxg6cTQBYBQ+batQ==", 93 | "requires": { 94 | "node-fetch": "^2.6.0", 95 | "ws": "^7.3.0" 96 | } 97 | }, 98 | "mime-db": { 99 | "version": "1.46.0", 100 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", 101 | "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==" 102 | }, 103 | "mime-types": { 104 | "version": "2.1.29", 105 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", 106 | "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", 107 | "requires": { 108 | "mime-db": "1.46.0" 109 | } 110 | }, 111 | "node-fetch": { 112 | "version": "2.6.1", 113 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 114 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 115 | }, 116 | "prism-media": { 117 | "version": "1.2.9", 118 | "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.9.tgz", 119 | "integrity": "sha512-UHCYuqHipbTR1ZsXr5eg4JUmHER8Ss4YEb9Azn+9zzJ7/jlTtD1h0lc4g6tNx3eMlB8Mp6bfll0LPMAV4R6r3Q==" 120 | }, 121 | "setimmediate": { 122 | "version": "1.0.5", 123 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 124 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 125 | }, 126 | "tweetnacl": { 127 | "version": "1.0.3", 128 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", 129 | "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" 130 | }, 131 | "ws": { 132 | "version": "7.4.6", 133 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", 134 | "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" 135 | } 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /ep 7 - lavalink music bot/bot/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bot", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "@lavacord/discord.js": "0.0.7", 14 | "axios": "^0.21.1", 15 | "discord.js": "^12.5.1" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /ep 7 - lavalink music bot/bot/structures/Queue.js: -------------------------------------------------------------------------------- 1 | const { TextChannel, MessageEmbed, UserFlags } = require("discord.js"); 2 | const { lavacordManager } = require(".."); 3 | const axios = require('axios').default; 4 | const { msToHMS } = require('../utils') 5 | 6 | const urlRegex = new RegExp(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,4}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/g); 7 | 8 | module.exports = class Queue { 9 | /** 10 | * 11 | * @param {String} guildID 12 | * @param {String} channelID 13 | * @param {TextChannel} textChannel 14 | */ 15 | constructor(guildID, channelID, textChannel) { 16 | this.guildID = guildID; 17 | this.channelID = channelID; 18 | this.textChannel = textChannel; 19 | 20 | this.queue = []; 21 | this.player = null; 22 | this.currentlyPlaying = null; 23 | } 24 | 25 | async search(searchTerm) { 26 | const node = lavacordManager.idealNodes[0]; 27 | 28 | const params = new URLSearchParams(); 29 | params.append('identifier', urlRegex.test(searchTerm) ? searchTerm : `ytsearch:${searchTerm}`); 30 | 31 | const data = await axios(`http://${node.host}:${node.port}/loadtracks?${params}`, { 32 | headers: { 33 | Authorization: node.password 34 | } 35 | }); 36 | 37 | return data.data.tracks ?? []; 38 | } 39 | 40 | async play(track) { 41 | this.queue.push(track); 42 | 43 | if(!this.currentlyPlaying) { 44 | this._playNext(); 45 | return false; 46 | } else { 47 | return true; 48 | } 49 | } 50 | 51 | async _playNext() { 52 | const nextSong = this.queue.shift(); 53 | this.currentlyPlaying = nextSong; 54 | 55 | if(!nextSong) { 56 | this.player = null; 57 | this.currentlyPlaying = null; 58 | 59 | await lavacordManager.leave(this.guildID); 60 | this.textChannel.send('Finished playing.'); 61 | return; 62 | } 63 | 64 | this.textChannel.send( 65 | new MessageEmbed() 66 | .setTitle("🎶 Now Playing: " + nextSong.info.title) 67 | .addFields([ 68 | { inline: true, name: "Author", value: nextSong.info.author }, 69 | { inline: true, name: "Length", value: msToHMS(nextSong.info.length) }, 70 | { inline: true, name: "Link", value: nextSong.info.uri } 71 | ]) 72 | .setColor("00ff00") 73 | ); 74 | 75 | if(!this.player) { 76 | this.player = await lavacordManager.join({ 77 | guild: this.guildID, 78 | channel: this.channelID, 79 | node: lavacordManager.idealNodes[0].id 80 | }); 81 | 82 | this.player.on('end', data => { 83 | if(data.reason === "REPLACED" || data.reason === "STOPPED") return; 84 | 85 | this._playNext(); 86 | }); 87 | } 88 | 89 | await this.player.play(nextSong.track); 90 | } 91 | } -------------------------------------------------------------------------------- /ep 7 - lavalink music bot/bot/utils.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | msToHMS: (duration) => { 3 | var seconds = parseInt((duration / 1000) % 60) 4 | var minutes = parseInt((duration / (1000 * 60)) % 60) 5 | var hours = parseInt((duration / (1000 * 60 * 60))); 6 | 7 | hours = (hours < 10) ? '0' + hours : hours; 8 | minutes = (minutes < 10) ? '0' + minutes : minutes; 9 | seconds = (seconds < 10) ? '0' + seconds : seconds; 10 | 11 | return hours + ':' + minutes + ':' + seconds; 12 | } 13 | } -------------------------------------------------------------------------------- /ep 7 - lavalink music bot/server/Lavalink.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ItzDerock/discord.js-v12-tutorial-series/8359b0c3e4535aa31cd8aaac61471a5e8064e874/ep 7 - lavalink music bot/server/Lavalink.jar -------------------------------------------------------------------------------- /ep 7 - lavalink music bot/server/application.yml: -------------------------------------------------------------------------------- 1 | server: # REST and WS server 2 | port: 2333 3 | address: 0.0.0.0 4 | lavalink: 5 | server: 6 | password: "verysecurepassword" 7 | sources: 8 | youtube: true 9 | bandcamp: true 10 | soundcloud: true 11 | twitch: true 12 | vimeo: true 13 | http: true 14 | local: false 15 | bufferDurationMs: 400 16 | youtubePlaylistLoadLimit: 6 # Number of pages at 100 each 17 | playerUpdateInterval: 5 # How frequently to send player updates to clients, in seconds 18 | youtubeSearchEnabled: true 19 | soundcloudSearchEnabled: true 20 | gc-warnings: true 21 | #ratelimit: 22 | #ipBlocks: ["1.0.0.0/8", "..."] # list of ip blocks 23 | #excludedIps: ["...", "..."] # ips which should be explicit excluded from usage by lavalink 24 | #strategy: "RotateOnBan" # RotateOnBan | LoadBalance | NanoSwitch | RotatingNanoSwitch 25 | #searchTriggersFail: true # Whether a search 429 should trigger marking the ip as failing 26 | #retryLimit: -1 # -1 = use default lavaplayer value | 0 = infinity | >0 = retry will happen this numbers times 27 | 28 | metrics: 29 | prometheus: 30 | enabled: false 31 | endpoint: /metrics 32 | 33 | sentry: 34 | dsn: "" 35 | environment: "" 36 | # tags: 37 | # some_key: some_value 38 | # another_key: another_value 39 | 40 | logging: 41 | file: 42 | max-history: 30 43 | max-size: 1GB 44 | path: ./logs/ 45 | 46 | level: 47 | root: INFO 48 | lavalink: INFO -------------------------------------------------------------------------------- /ep 7 - lavalink music bot/server/start.sh: -------------------------------------------------------------------------------- 1 | "C:\Program Files\Java\jdk-11.0.10\bin\java" -jar Lavalink.jar --------------------------------------------------------------------------------