├── .env-sample ├── .gitignore ├── LICENSE ├── README.md ├── commands.js ├── commands ├── choochoo.js ├── gif.js └── randomwalk.js ├── digits.txt ├── index.js ├── package-lock.json └── package.json /.env-sample: -------------------------------------------------------------------------------- 1 | SERVERID=123456789 2 | CHANNELID=123456789 3 | TOKEN=123456789 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | .DS_Store -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Daniel Shiffman 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 | # Choo Choo Discord Bot! 2 | 3 | [Discord Bot Tutorial](https://www.youtube.com/playlist?list=PLRqwX-V7Uu6avBYxeBSwF48YhAnSn_sA4) 4 | 5 | 🚂🌈💖🤖 All aboard! [Coding Train Tutorial Videos](https://www.youtube.com/playlist?list=PLRqwX-V7Uu6avBYxeBSwF48YhAnSn_sA4) 🚂🌈💖🤖 6 | 7 | ## Steps to create new bot 8 | 9 | 1. Create node project and install discord.js module. 10 | 11 | ``` 12 | $ npm init 13 | $ npm install discord.js 14 | ``` 15 | 16 | 2. [Create an application](https://discord.com/developers/applications/) - optionally set name, description, avatar. 17 | 18 | 3. Select Bot from left navigation and "Add Bot" - set name and icon. 19 | 20 | 4. Add bot to the A2Z server with the url: `https://discord.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&scope=bot` 21 | 22 | 5. Write the code! 23 | 24 | Login to bot account: 25 | ```javascript 26 | const Discord = require('discord.js'); 27 | const client = new Discord.Client(); 28 | client.login('YOUR BOT TOKEN'); 29 | ``` 30 | 31 | Callback for when the bot is connected and ready: 32 | ```javascript 33 | client.once('ready', () => { 34 | console.log('Ready!'); 35 | }); 36 | ``` 37 | 38 | Callback for when a message is posted: 39 | ```javascript 40 | client.on('message', gotMessage); 41 | 42 | function gotMessage(msg) { 43 | console.log(msg.content); 44 | } 45 | ``` 46 | 47 | 9. Run the bot! 48 | 49 | ``` 50 | $ node index.js 51 | ``` 52 | 53 | ## Limit to one server and one channel 54 | 55 | 1. Enable developer mode in Discord (Settings->Appearance->Enable Developer Mode). 56 | 2. Copy server ID. 57 | 3. Copy channel ID. 58 | 59 | ```javascript 60 | const serverID = 'SERVER ID'; 61 | const channelID = 'CHANNEL ID'; 62 | 63 | client.on('message', gotMessage); 64 | 65 | function gotMessage(msg) { 66 | // Only for this server and this channel 67 | if (msg.guild.id === serverID && msg.channel.id === channelID) { 68 | // Reply to the message ping! 69 | if (msg.content === 'ping') { 70 | msg.channel.send('pong'); 71 | } 72 | } 73 | } 74 | ``` 75 | 76 | ## Store token and other secrets in .env file. 77 | 78 | 1. Install [dotenv package](https://www.npmjs.com/package/dotenv). 79 | ``` 80 | $ npm install dotenv 81 | ``` 82 | 83 | 2. Create `.env` file: 84 | 85 | ``` 86 | SERVERID=123456789 87 | CHANNELID=123456789 88 | TOKEN=123456789 89 | ``` 90 | 91 | 3. Load environment variables using `dotenv` and `.env`: 92 | 93 | ```javascript 94 | require('dotenv').config(); 95 | const serverID = process.env.SERVERID; 96 | const channelID = process.env.CHANNELID; 97 | const TOKEN = process.env.TOKEN; 98 | ``` 99 | -------------------------------------------------------------------------------- /commands.js: -------------------------------------------------------------------------------- 1 | // Command Handler 2 | // Discord Bots 3 | // The Coding Train / Daniel Shiffman 4 | // https://thecodingtrain.com/learning/bots/discord/06-command-handler.html 5 | // https://youtu.be/B60Q74FHFBQ 6 | 7 | const gif = require("./commands/gif.js"); 8 | const choochoo = require("./commands/choochoo.js"); 9 | const randomwalk = require("./commands/randomwalk.js"); 10 | 11 | const commands = { choochoo, gif, randomwalk }; 12 | 13 | module.exports = async function (msg) { 14 | if (msg.channel.id == "715786219770085396") { 15 | let tokens = msg.content.split(" "); 16 | let command = tokens.shift(); 17 | if (command.charAt(0) === "!") { 18 | command = command.substring(1); 19 | commands[command](msg, tokens); 20 | } 21 | } 22 | }; 23 | -------------------------------------------------------------------------------- /commands/choochoo.js: -------------------------------------------------------------------------------- 1 | // Command Handler 2 | // Discord Bots 3 | // The Coding Train / Daniel Shiffman 4 | // https://thecodingtrain.com/learning/bots/discord/06-command-handler.html 5 | // https://youtu.be/B60Q74FHFBQ 6 | 7 | const replies = ["🚂🌈💖", "Choo choo!", "Ding! 🛎", "Never forget this dot!"]; 8 | 9 | module.exports = function (msg, args) { 10 | const index = Math.floor(Math.random() * replies.length); 11 | msg.channel.send(replies[index]); 12 | }; 13 | -------------------------------------------------------------------------------- /commands/gif.js: -------------------------------------------------------------------------------- 1 | // Command Handler 2 | // Discord Bots 3 | // The Coding Train / Daniel Shiffman 4 | // https://thecodingtrain.com/learning/bots/discord/06-command-handler.html 5 | // https://youtu.be/B60Q74FHFBQ 6 | 7 | const fetch = require("node-fetch"); 8 | 9 | module.exports = async function (msg, args) { 10 | let keywords = "coding train"; 11 | if (args.length > 0) { 12 | keywords = args.join(" "); 13 | } 14 | let url = `https://api.tenor.com/v1/search?q=${keywords}&key=${process.env.TENORKEY}&contentfilter=high`; 15 | let response = await fetch(url); 16 | let json = await response.json(); 17 | const index = Math.floor(Math.random() * json.results.length); 18 | msg.channel.send(json.results[index].url); 19 | msg.channel.send("GIF from Tenor: " + keywords); 20 | }; 21 | -------------------------------------------------------------------------------- /commands/randomwalk.js: -------------------------------------------------------------------------------- 1 | const { createCanvas } = require("canvas"); 2 | const Discord = require("discord.js"); 3 | // const p5 = require("p5"); 4 | const fs = require("fs"); 5 | 6 | // Loading sequence of random numbers 7 | const rawDigits = fs.readFileSync("./digits.txt", "utf-8"); 8 | const digits = rawDigits.split(/[\s\n]+/g); 9 | const randomS = digits.filter((elt, index) => index % 11 !== 0); 10 | const randoms = randomS.map((elt) => parseInt(elt)); 11 | 12 | module.exports = function (msg, args) { 13 | console.log("generating..."); 14 | let startingIndex = Math.floor(Math.random() * randoms.length); 15 | // TODO: check that argument is valid number between 0 and 199999 16 | if (args.length > 0) { 17 | startingIndex = parseInt(args[0]); 18 | } 19 | const buffer = generateImage(startingIndex); 20 | const attachment = new Discord.MessageAttachment(buffer, "randomwalk.png"); 21 | msg.channel.send( 22 | `Here is your random walk starting at ${startingIndex}!`, 23 | attachment 24 | ); 25 | }; 26 | 27 | function generateImage(offset) { 28 | const width = 4880; 29 | const height = 1500; 30 | const canvas = createCanvas(width, height); 31 | const ctx = canvas.getContext("2d"); 32 | 33 | // Make my own random walk design 34 | // anyhting can go here 35 | ctx.fillStyle = "white"; 36 | ctx.fillRect(0, 0, width, height); 37 | 38 | let x = width / 2; 39 | let y = height / 2; 40 | const stepSize = 4; 41 | // randomSeed(parseInt(number.value())); 42 | for (let i = 0; i < randoms.length; i++) { 43 | ctx.fillStyle = "black"; 44 | ctx.fillRect(x, y, stepSize, stepSize); 45 | const index = (i + offset) % randoms.length; 46 | const r = randoms[index] % 4; 47 | switch (r) { 48 | case 0: 49 | x = x + stepSize; 50 | break; 51 | case 1: 52 | x = x - stepSize; 53 | break; 54 | case 2: 55 | y = y + stepSize; 56 | break; 57 | case 3: 58 | y = y - stepSize; 59 | break; 60 | } 61 | } 62 | const buffer = canvas.toBuffer("image/png"); 63 | return buffer; 64 | // fs.writeFileSync("test.png", buffer); 65 | } 66 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | // Command Handler 2 | // Discord Bots 3 | // The Coding Train / Daniel Shiffman 4 | // https://thecodingtrain.com/learning/bots/discord/06-command-handler.html 5 | // https://youtu.be/B60Q74FHFBQ 6 | 7 | console.log("Beep beep! 🤖"); 8 | 9 | require("dotenv").config(); 10 | 11 | const Discord = require("discord.js"); 12 | const client = new Discord.Client(); 13 | client.login(process.env.BOTTOKEN); 14 | 15 | client.on("ready", readyDiscord); 16 | 17 | function readyDiscord() { 18 | console.log("💖"); 19 | } 20 | 21 | const commandHandler = require("./commands"); 22 | 23 | client.on("message", commandHandler); 24 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "discord-bot-a2z", 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 | "abbrev": { 23 | "version": "1.1.1", 24 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 25 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 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 | "ansi-regex": { 36 | "version": "2.1.1", 37 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 38 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 39 | }, 40 | "aproba": { 41 | "version": "1.2.0", 42 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 43 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" 44 | }, 45 | "are-we-there-yet": { 46 | "version": "1.1.5", 47 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 48 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 49 | "requires": { 50 | "delegates": "^1.0.0", 51 | "readable-stream": "^2.0.6" 52 | } 53 | }, 54 | "asynckit": { 55 | "version": "0.4.0", 56 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 57 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 58 | }, 59 | "balanced-match": { 60 | "version": "1.0.0", 61 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 62 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 63 | }, 64 | "brace-expansion": { 65 | "version": "1.1.11", 66 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 67 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 68 | "requires": { 69 | "balanced-match": "^1.0.0", 70 | "concat-map": "0.0.1" 71 | } 72 | }, 73 | "canvas": { 74 | "version": "2.6.1", 75 | "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.6.1.tgz", 76 | "integrity": "sha512-S98rKsPcuhfTcYbtF53UIJhcbgIAK533d1kJKMwsMwAIFgfd58MOyxRud3kktlzWiEkFliaJtvyZCBtud/XVEA==", 77 | "requires": { 78 | "nan": "^2.14.0", 79 | "node-pre-gyp": "^0.11.0", 80 | "simple-get": "^3.0.3" 81 | } 82 | }, 83 | "chownr": { 84 | "version": "1.1.4", 85 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 86 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" 87 | }, 88 | "code-point-at": { 89 | "version": "1.1.0", 90 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 91 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 92 | }, 93 | "combined-stream": { 94 | "version": "1.0.8", 95 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 96 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 97 | "requires": { 98 | "delayed-stream": "~1.0.0" 99 | } 100 | }, 101 | "concat-map": { 102 | "version": "0.0.1", 103 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 104 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 105 | }, 106 | "console-control-strings": { 107 | "version": "1.1.0", 108 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 109 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" 110 | }, 111 | "core-util-is": { 112 | "version": "1.0.2", 113 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 114 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 115 | }, 116 | "debug": { 117 | "version": "3.2.7", 118 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 119 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 120 | "requires": { 121 | "ms": "^2.1.1" 122 | } 123 | }, 124 | "decompress-response": { 125 | "version": "4.2.1", 126 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", 127 | "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", 128 | "requires": { 129 | "mimic-response": "^2.0.0" 130 | } 131 | }, 132 | "deep-extend": { 133 | "version": "0.6.0", 134 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 135 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 136 | }, 137 | "delayed-stream": { 138 | "version": "1.0.0", 139 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 140 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 141 | }, 142 | "delegates": { 143 | "version": "1.0.0", 144 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 145 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 146 | }, 147 | "detect-libc": { 148 | "version": "1.0.3", 149 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 150 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" 151 | }, 152 | "discord.js": { 153 | "version": "12.3.1", 154 | "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.3.1.tgz", 155 | "integrity": "sha512-mSFyV/mbvzH12UXdS4zadmeUf8IMQOo/YdunubG1wWt1xjWvtaJz/s9CGsFD2B5pTw1W/LXxxUbrQjIZ/xlUdw==", 156 | "requires": { 157 | "@discordjs/collection": "^0.1.6", 158 | "@discordjs/form-data": "^3.0.1", 159 | "abort-controller": "^3.0.0", 160 | "node-fetch": "^2.6.0", 161 | "prism-media": "^1.2.2", 162 | "setimmediate": "^1.0.5", 163 | "tweetnacl": "^1.0.3", 164 | "ws": "^7.3.1" 165 | } 166 | }, 167 | "dotenv": { 168 | "version": "8.2.0", 169 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", 170 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" 171 | }, 172 | "event-target-shim": { 173 | "version": "5.0.1", 174 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 175 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 176 | }, 177 | "fs-minipass": { 178 | "version": "1.2.7", 179 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", 180 | "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", 181 | "requires": { 182 | "minipass": "^2.6.0" 183 | } 184 | }, 185 | "fs.realpath": { 186 | "version": "1.0.0", 187 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 188 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 189 | }, 190 | "gauge": { 191 | "version": "2.7.4", 192 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 193 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 194 | "requires": { 195 | "aproba": "^1.0.3", 196 | "console-control-strings": "^1.0.0", 197 | "has-unicode": "^2.0.0", 198 | "object-assign": "^4.1.0", 199 | "signal-exit": "^3.0.0", 200 | "string-width": "^1.0.1", 201 | "strip-ansi": "^3.0.1", 202 | "wide-align": "^1.1.0" 203 | } 204 | }, 205 | "glob": { 206 | "version": "7.1.6", 207 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 208 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 209 | "requires": { 210 | "fs.realpath": "^1.0.0", 211 | "inflight": "^1.0.4", 212 | "inherits": "2", 213 | "minimatch": "^3.0.4", 214 | "once": "^1.3.0", 215 | "path-is-absolute": "^1.0.0" 216 | } 217 | }, 218 | "has-unicode": { 219 | "version": "2.0.1", 220 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 221 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" 222 | }, 223 | "iconv-lite": { 224 | "version": "0.4.24", 225 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 226 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 227 | "requires": { 228 | "safer-buffer": ">= 2.1.2 < 3" 229 | } 230 | }, 231 | "ignore-walk": { 232 | "version": "3.0.3", 233 | "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", 234 | "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", 235 | "requires": { 236 | "minimatch": "^3.0.4" 237 | } 238 | }, 239 | "inflight": { 240 | "version": "1.0.6", 241 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 242 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 243 | "requires": { 244 | "once": "^1.3.0", 245 | "wrappy": "1" 246 | } 247 | }, 248 | "inherits": { 249 | "version": "2.0.4", 250 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 251 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 252 | }, 253 | "ini": { 254 | "version": "1.3.8", 255 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 256 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 257 | }, 258 | "is-fullwidth-code-point": { 259 | "version": "1.0.0", 260 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 261 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 262 | "requires": { 263 | "number-is-nan": "^1.0.0" 264 | } 265 | }, 266 | "isarray": { 267 | "version": "1.0.0", 268 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 269 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 270 | }, 271 | "mime-db": { 272 | "version": "1.44.0", 273 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 274 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 275 | }, 276 | "mime-types": { 277 | "version": "2.1.27", 278 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 279 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 280 | "requires": { 281 | "mime-db": "1.44.0" 282 | } 283 | }, 284 | "mimic-response": { 285 | "version": "2.1.0", 286 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", 287 | "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" 288 | }, 289 | "minimatch": { 290 | "version": "3.0.4", 291 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 292 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 293 | "requires": { 294 | "brace-expansion": "^1.1.7" 295 | } 296 | }, 297 | "minimist": { 298 | "version": "1.2.5", 299 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 300 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 301 | }, 302 | "minipass": { 303 | "version": "2.9.0", 304 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", 305 | "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", 306 | "requires": { 307 | "safe-buffer": "^5.1.2", 308 | "yallist": "^3.0.0" 309 | } 310 | }, 311 | "minizlib": { 312 | "version": "1.3.3", 313 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", 314 | "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", 315 | "requires": { 316 | "minipass": "^2.9.0" 317 | } 318 | }, 319 | "mkdirp": { 320 | "version": "0.5.5", 321 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 322 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 323 | "requires": { 324 | "minimist": "^1.2.5" 325 | } 326 | }, 327 | "ms": { 328 | "version": "2.1.3", 329 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 330 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 331 | }, 332 | "nan": { 333 | "version": "2.14.2", 334 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", 335 | "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" 336 | }, 337 | "needle": { 338 | "version": "2.6.0", 339 | "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", 340 | "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", 341 | "requires": { 342 | "debug": "^3.2.6", 343 | "iconv-lite": "^0.4.4", 344 | "sax": "^1.2.4" 345 | } 346 | }, 347 | "node-fetch": { 348 | "version": "2.6.1", 349 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 350 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 351 | }, 352 | "node-pre-gyp": { 353 | "version": "0.11.0", 354 | "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", 355 | "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", 356 | "requires": { 357 | "detect-libc": "^1.0.2", 358 | "mkdirp": "^0.5.1", 359 | "needle": "^2.2.1", 360 | "nopt": "^4.0.1", 361 | "npm-packlist": "^1.1.6", 362 | "npmlog": "^4.0.2", 363 | "rc": "^1.2.7", 364 | "rimraf": "^2.6.1", 365 | "semver": "^5.3.0", 366 | "tar": "^4" 367 | } 368 | }, 369 | "nopt": { 370 | "version": "4.0.3", 371 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", 372 | "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", 373 | "requires": { 374 | "abbrev": "1", 375 | "osenv": "^0.1.4" 376 | } 377 | }, 378 | "npm-bundled": { 379 | "version": "1.1.1", 380 | "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", 381 | "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", 382 | "requires": { 383 | "npm-normalize-package-bin": "^1.0.1" 384 | } 385 | }, 386 | "npm-normalize-package-bin": { 387 | "version": "1.0.1", 388 | "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", 389 | "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" 390 | }, 391 | "npm-packlist": { 392 | "version": "1.4.8", 393 | "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", 394 | "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", 395 | "requires": { 396 | "ignore-walk": "^3.0.1", 397 | "npm-bundled": "^1.0.1", 398 | "npm-normalize-package-bin": "^1.0.1" 399 | } 400 | }, 401 | "npmlog": { 402 | "version": "4.1.2", 403 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 404 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 405 | "requires": { 406 | "are-we-there-yet": "~1.1.2", 407 | "console-control-strings": "~1.1.0", 408 | "gauge": "~2.7.3", 409 | "set-blocking": "~2.0.0" 410 | } 411 | }, 412 | "number-is-nan": { 413 | "version": "1.0.1", 414 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 415 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 416 | }, 417 | "object-assign": { 418 | "version": "4.1.1", 419 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 420 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 421 | }, 422 | "once": { 423 | "version": "1.4.0", 424 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 425 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 426 | "requires": { 427 | "wrappy": "1" 428 | } 429 | }, 430 | "os-homedir": { 431 | "version": "1.0.2", 432 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 433 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" 434 | }, 435 | "os-tmpdir": { 436 | "version": "1.0.2", 437 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 438 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 439 | }, 440 | "osenv": { 441 | "version": "0.1.5", 442 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", 443 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", 444 | "requires": { 445 | "os-homedir": "^1.0.0", 446 | "os-tmpdir": "^1.0.0" 447 | } 448 | }, 449 | "p5": { 450 | "version": "1.2.0", 451 | "resolved": "https://registry.npmjs.org/p5/-/p5-1.2.0.tgz", 452 | "integrity": "sha512-om9CSZXjw+BdC/u474nUtrVXAqeSRHNBDteDpIhQqgypziE+hh9BUc/YNl3RT5rX3kNtQlLes2S2sRqFU+S+JA==" 453 | }, 454 | "path-is-absolute": { 455 | "version": "1.0.1", 456 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 457 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 458 | }, 459 | "prism-media": { 460 | "version": "1.2.2", 461 | "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.2.tgz", 462 | "integrity": "sha512-I+nkWY212lJ500jLe4tN9tWO7nRiBAVdMv76P9kffZjYhw20raMlW1HSSvS+MLXC9MmbNZCazMrAr+5jEEgTuw==" 463 | }, 464 | "process-nextick-args": { 465 | "version": "2.0.1", 466 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 467 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 468 | }, 469 | "rc": { 470 | "version": "1.2.8", 471 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 472 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 473 | "requires": { 474 | "deep-extend": "^0.6.0", 475 | "ini": "~1.3.0", 476 | "minimist": "^1.2.0", 477 | "strip-json-comments": "~2.0.1" 478 | } 479 | }, 480 | "readable-stream": { 481 | "version": "2.3.7", 482 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 483 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 484 | "requires": { 485 | "core-util-is": "~1.0.0", 486 | "inherits": "~2.0.3", 487 | "isarray": "~1.0.0", 488 | "process-nextick-args": "~2.0.0", 489 | "safe-buffer": "~5.1.1", 490 | "string_decoder": "~1.1.1", 491 | "util-deprecate": "~1.0.1" 492 | } 493 | }, 494 | "rimraf": { 495 | "version": "2.7.1", 496 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 497 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 498 | "requires": { 499 | "glob": "^7.1.3" 500 | } 501 | }, 502 | "safe-buffer": { 503 | "version": "5.1.2", 504 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 505 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 506 | }, 507 | "safer-buffer": { 508 | "version": "2.1.2", 509 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 510 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 511 | }, 512 | "sax": { 513 | "version": "1.2.4", 514 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 515 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 516 | }, 517 | "semver": { 518 | "version": "5.7.1", 519 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 520 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 521 | }, 522 | "set-blocking": { 523 | "version": "2.0.0", 524 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 525 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 526 | }, 527 | "setimmediate": { 528 | "version": "1.0.5", 529 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 530 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 531 | }, 532 | "signal-exit": { 533 | "version": "3.0.3", 534 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 535 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 536 | }, 537 | "simple-concat": { 538 | "version": "1.0.1", 539 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 540 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" 541 | }, 542 | "simple-get": { 543 | "version": "3.1.0", 544 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", 545 | "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", 546 | "requires": { 547 | "decompress-response": "^4.2.0", 548 | "once": "^1.3.1", 549 | "simple-concat": "^1.0.0" 550 | } 551 | }, 552 | "string-width": { 553 | "version": "1.0.2", 554 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 555 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 556 | "requires": { 557 | "code-point-at": "^1.0.0", 558 | "is-fullwidth-code-point": "^1.0.0", 559 | "strip-ansi": "^3.0.0" 560 | } 561 | }, 562 | "string_decoder": { 563 | "version": "1.1.1", 564 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 565 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 566 | "requires": { 567 | "safe-buffer": "~5.1.0" 568 | } 569 | }, 570 | "strip-ansi": { 571 | "version": "3.0.1", 572 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 573 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 574 | "requires": { 575 | "ansi-regex": "^2.0.0" 576 | } 577 | }, 578 | "strip-json-comments": { 579 | "version": "2.0.1", 580 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 581 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 582 | }, 583 | "tar": { 584 | "version": "4.4.13", 585 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", 586 | "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", 587 | "requires": { 588 | "chownr": "^1.1.1", 589 | "fs-minipass": "^1.2.5", 590 | "minipass": "^2.8.6", 591 | "minizlib": "^1.2.1", 592 | "mkdirp": "^0.5.0", 593 | "safe-buffer": "^5.1.2", 594 | "yallist": "^3.0.3" 595 | } 596 | }, 597 | "tweetnacl": { 598 | "version": "1.0.3", 599 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", 600 | "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" 601 | }, 602 | "util-deprecate": { 603 | "version": "1.0.2", 604 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 605 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 606 | }, 607 | "wide-align": { 608 | "version": "1.1.3", 609 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 610 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 611 | "requires": { 612 | "string-width": "^1.0.2 || 2" 613 | } 614 | }, 615 | "wrappy": { 616 | "version": "1.0.2", 617 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 618 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 619 | }, 620 | "ws": { 621 | "version": "7.3.1", 622 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", 623 | "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" 624 | }, 625 | "yallist": { 626 | "version": "3.1.1", 627 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 628 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 629 | } 630 | } 631 | } 632 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "discord-bot-a2z", 3 | "version": "1.0.0", 4 | "description": "A discord bot example for A2Z", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.js", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/shiffman/Discord-Bot-A2Z.git" 13 | }, 14 | "author": "", 15 | "license": "ISC", 16 | "bugs": { 17 | "url": "https://github.com/shiffman/Discord-Bot-A2Z/issues" 18 | }, 19 | "homepage": "https://github.com/shiffman/Discord-Bot-A2Z#readme", 20 | "dependencies": { 21 | "canvas": "^2.6.1", 22 | "discord.js": "^12.3.1", 23 | "dotenv": "^8.2.0", 24 | "node-fetch": "^2.6.1", 25 | "p5": "^1.2.0" 26 | } 27 | } 28 | --------------------------------------------------------------------------------