├── .codeclimate.yml ├── .eslintrc.yaml ├── .gitignore ├── .nvmrc ├── .travis.yml ├── LICENSE ├── README.md ├── TheAwesomeBot.js ├── commands ├── eval │ ├── eval.js │ └── gentoken.js ├── help │ ├── help.js │ └── topics │ │ ├── cpp.txt │ │ ├── css.txt │ │ ├── dotnet.txt │ │ ├── dsa.txt │ │ ├── go.txt │ │ ├── interviews.txt │ │ ├── java.txt │ │ ├── javascript.txt │ │ ├── ml.txt │ │ ├── php.txt │ │ ├── podcasts.txt │ │ ├── python.txt │ │ ├── react.txt │ │ └── ruby.txt ├── info │ └── info.js ├── pbf │ └── pbf.js ├── pro │ ├── pro.js │ ├── proTerms.js │ └── proTerms.txt ├── quickref │ ├── quickref.js │ └── references │ │ ├── codeblock.txt │ │ ├── dotnet.txt │ │ ├── hotkeys.txt │ │ ├── linux.txt │ │ ├── nohello.txt │ │ ├── printf.txt │ │ ├── regex.txt │ │ ├── sqljoin.txt │ │ ├── style.txt │ │ └── subnet.txt ├── server │ └── server.js ├── stream │ └── stream.js ├── uptime │ └── uptime.js ├── vote │ └── vote.js ├── weather │ └── weather.js └── xkcd │ └── xkcd.js ├── lib └── utils.js ├── package-lock.json ├── package.json ├── settings.json ├── start.js ├── test └── test.js └── tokens.json.example /.codeclimate.yml: -------------------------------------------------------------------------------- 1 | --- 2 | engines: 3 | eslint: 4 | enabled: true 5 | channel: "eslint-3" 6 | fixme: 7 | enabled: true 8 | ratings: 9 | paths: 10 | - "**.js" 11 | -------------------------------------------------------------------------------- /.eslintrc.yaml: -------------------------------------------------------------------------------- 1 | env: 2 | node: true 3 | rules: 4 | no-console: off 5 | max-len: [error, 120] 6 | prefer-template: off 7 | no-constant-condition: [error, {checkLoops: false}] 8 | no-unused-vars: [error, {argsIgnorePattern: '^(err$|_)'}] 9 | no-param-reassign: [error, {props: false}] 10 | import/no-unresolved: [error, {ignore: ['tokens.json']}] 11 | extends: airbnb 12 | installedESLint: true 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /npm-debug.log 3 | 4 | *.swp 5 | *.swo 6 | .vscode 7 | 8 | *.DS_Store 9 | 10 | # ignore tokens file 11 | /tokens.json 12 | 13 | # tern server 14 | .tern-port 15 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | node 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | sudo: false 3 | dist: trusty 4 | script: 5 | - npm test 6 | - npm run lint . 7 | env: 8 | global: 9 | secure: SpEGhkGHrgZX5zB8o1926TeQDgO1t9npUm3cmTGGhV1GKpz9mt0WRqmIReOLVSG9j0UxF8RfqCHfVulGMg7C2YfOi7KecOF58IVWnajyh+zdhuf1dOEhb9Bl6YWWSzMJUUTVVNmeAf9AkhpcseKBsZLMlJeeK5eWgBkPqsiPvq1xT/8Y+QQ/pDZvmTPqUOB7OAghLZJGC1UuSy7R6uwk77JlbknSuJdb9lM2z4jIDxRrWjiUoaKUDFCJnER23whxvQOp4kp74YlmRC6oT2gQkez6mNlVvJkKDU7FM3QAanKlMjbx12k4++HpdiPfm8RLXUXVHC5CsD3TvhuCXtbsS2j8gpLI34NSC4AC5u/Xp9RgfSE96I0zY2upURFavZIDsTSCsu6XCvRjS0ltsZbVdVj8/WQxLW1YvfpgMQ5+NREBwLQpB/dil2lpoRyz5rSPYc6ta6nq9bNonpeHU7UaQnXIrKoKPdJOxJ+59sxjTwoNbjiS2uJmRfYSo6BCQrYHdx5p5eA92hBqjicjHEM9Px5+X4piRbCULnczV0HsPFATaCrzfW7YcxDgUIXhmm4lagPhaYo5LPT2PLwZ+pTL2en8h9Gbd31e2AyJfHT6WnTzxfk1PGnQPT2GBfhiDV05by8OaFToYPXIJWu6E4EiQc0HuEp4avSsZLYvvlf4Me4= 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 All contributors of AwesomeBot 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 | # AwesomeBot [![Build Status](https://travis-ci.org/progdisc/AwesomeBot.svg?branch=master)](https://travis-ci.org/progdisc/AwesomeBot) [![Code Climate](https://codeclimate.com/github/progdisc/AwesomeBot/badges/gpa.svg)](https://codeclimate.com/github/progdisc/AwesomeBot) [![david-dm](https://david-dm.org/progdisc/AwesomeBot.svg)](https://david-dm.org/progdisc/AwesomeBot) 2 | 3 | ## How to run it 4 | First, make sure you have the latest version of [Node.js](https://nodejs.org/) and [npm](https://github.com/npm/npm). 5 | We recommend using [nvm](https://github.com/creationix/nvm) to manage these, and there's a `.nvmrc` file in this project, so just run this and you're all set: 6 | ```sh 7 | nvm use 8 | ``` 9 | 10 | Now you need to install the dependencies: 11 | ```sh 12 | npm install 13 | ``` 14 | 15 | Then, in order to log your bot into Discord, set [your bot token](https://discordapp.com/developers/applications/me): 16 | ```sh 17 | export DISCORD_TOKEN= 18 | # you could, instead, fill it in the ./settings.json file 19 | ``` 20 | 21 | And finally, start your bot with: 22 | ```sh 23 | npm start 24 | ``` 25 | 26 | Before pushing any changes or submitting PRs, don't forget to run eslint, or our CI may reject your request: 27 | ```sh 28 | npm run lint -- . 29 | ``` 30 | -------------------------------------------------------------------------------- /TheAwesomeBot.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable class-methods-use-this */ 2 | const path = require('path'); 3 | const Discord = require('discord.js'); 4 | 5 | const Settings = require(path.join(__dirname, 'settings.json')); // eslint-disable-line import/no-dynamic-require 6 | let Tokens; 7 | try { 8 | // eslint-disable-next-line global-require, import/no-dynamic-require 9 | Tokens = require(path.join(__dirname, 'tokens.json')); 10 | } catch (e) { 11 | Tokens = {}; 12 | } 13 | 14 | class TheAwesomeBot { 15 | constructor(token, discordOpt) { 16 | this.bootTime = new Date(); 17 | this.token = token; 18 | this.client = new Discord.Client(discordOpt || { autoReconnect: true }); 19 | this.settings = Settings; 20 | this.settings.tokens = Tokens; // insert tokens into our settings obj 21 | this.commands = {}; 22 | this.usageList = ''; 23 | 24 | // store the RE as they're expensive to create 25 | this.cmd_re = new RegExp(`^${this.settings.bot_cmd}\\s+([^\\s]+)\\s*([^]*)\\s*`, 'i'); 26 | 27 | // flags if connected and client is ready 28 | this.isReady = false; 29 | } 30 | 31 | onMessage() { 32 | return (message) => { 33 | // don't respond to own messages 34 | if (this.client.user.username === message.author.username) { 35 | return; 36 | } 37 | 38 | // check if message is a command 39 | const cmdMatch = message.cleanContent.match(this.cmd_re); 40 | 41 | // not a known command 42 | if (!cmdMatch || Object.keys(this.commands).indexOf(cmdMatch[1]) === -1) { 43 | if (message.content.match(new RegExp(`^${this.settings.bot_cmd}[\\s]*( .*)?$`, 'i'))) { 44 | let helpText = 'maybe try these valid commands? *kthnxbye!*\n\n```'; 45 | helpText += this.usageList; 46 | helpText += '```'; 47 | message.channel.sendMessage(helpText); 48 | } 49 | return; 50 | } 51 | 52 | // process commands 53 | const cmd = cmdMatch[1]; 54 | const cmdArgs = cmdMatch[2].trim(); 55 | 56 | let showUsage; 57 | 58 | try { 59 | showUsage = this.commands[cmd].run(this, message, cmdArgs); 60 | } catch (err) { 61 | message.channel.sendMessage('There was an error running the command:\n' + 62 | '```\n' + err.toString() + '\n```'); 63 | console.error(err); 64 | console.error(err.stack); 65 | } 66 | 67 | if (showUsage === true) { 68 | let usage = this.commands[cmd].usage; 69 | if (typeof usage !== 'string') { 70 | usage = usage.join('\n'); 71 | } 72 | message.channel.sendMessage('```\n' + usage + '\n```'); 73 | } 74 | }; 75 | } 76 | 77 | onReady() { 78 | return (() => { 79 | console.log('\nConnected to discord server!'); 80 | console.log('Running initializations...'); 81 | Object.keys(this.commands).filter(cmd => 82 | typeof this.commands[cmd].init === 'function') 83 | .forEach(cmd => this.commands[cmd].init(this)); 84 | this.isReady = true; 85 | }); 86 | } 87 | 88 | serverNewMember() { 89 | return ((server, user) => this.client.sendMessage(user, this.usageList)); 90 | } 91 | 92 | onDisconnected() { 93 | return () => 94 | console.warn('Bot has been disconnected from server...'); 95 | } 96 | 97 | onError() { 98 | return ((err) => { 99 | console.error('error: ', err); 100 | console.error(err.trace); 101 | }); 102 | } 103 | 104 | loadCommands(cmdList) { 105 | this.usageList = ''; 106 | cmdList.forEach((cmd) => { 107 | const fullpath = path.join(__dirname, 'commands', cmd, `${cmd}.js`); 108 | const script = require(fullpath); // eslint-disable-line global-require, import/no-dynamic-require 109 | this.commands[cmd] = script; 110 | 111 | const usageObj = script.usage; 112 | if (usageObj) { 113 | const usageStrs = []; 114 | if (Array.isArray(usageObj)) { 115 | usageObj.forEach(u => usageStrs.push(u)); 116 | } else { 117 | usageStrs.push(usageObj.toString()); 118 | } 119 | 120 | this.usageList += usageStrs.reduce((list, str) => list + `\n- ${this.settings.bot_cmd} ${str}`, ''); 121 | } 122 | }); 123 | } 124 | 125 | init() { 126 | // load commands 127 | console.log('Loading commands...'); 128 | this.loadCommands(this.settings.commands); 129 | 130 | // setup events 131 | console.log('Setting up event bindings...'); 132 | this.client 133 | .on('ready', this.onReady()) 134 | .on('serverNewMember', this.serverNewMember()) 135 | .on('message', this.onMessage()) 136 | .on('error', this.onError()); 137 | 138 | console.log('Connecting...'); 139 | // return the promise from "login()" 140 | return this.client.login(this.token); 141 | } 142 | 143 | deinit() { 144 | // disconnect gracefully 145 | this.isReady = false; 146 | // return the promise from "destroy()" 147 | return this.client.destroy(); 148 | } 149 | 150 | isAdminOrMod(member) { 151 | const immuneRoles = new Set(this.settings.voting.immuneRoles); 152 | const userRoles = new Set(member.roles.array().map(r => r.name)); 153 | const setIntersection = [...userRoles].filter(r => immuneRoles.has(r)); 154 | return setIntersection.length > 0; 155 | } 156 | } 157 | 158 | module.exports = TheAwesomeBot; 159 | 160 | -------------------------------------------------------------------------------- /commands/eval/eval.js: -------------------------------------------------------------------------------- 1 | const XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; 2 | const ReplitClient = require('replit-client'); 3 | const gentoken = require('./gentoken'); 4 | 5 | global.XMLHttpRequest = XMLHttpRequest; 6 | 7 | // list of langs: 8 | // https://github.com/replit/ReplitClient.js#replitclienthostname-port-language-token 9 | const availableLanguages = [ 10 | 'c', 11 | 'cpp', 12 | 'cpp11', 13 | 'csharp', 14 | 'fsharp', 15 | 'go', 16 | 'java', 17 | 'lua', 18 | 'nodejs', 19 | 'php', 20 | 'python', 21 | 'python3', 22 | 'ruby', 23 | 'rust', 24 | 'swift', 25 | ]; 26 | 27 | // map usual lang names to replit names 28 | const langAliases = { 29 | 'c#': 'csharp', 30 | 'c++': 'cpp', 31 | 'c++11': 'cpp11', 32 | 'f#': 'fsharp', 33 | js: 'nodejs', 34 | javascript: 'nodejs', 35 | py2: 'python', 36 | py: 'python3', 37 | py3: 'python3', 38 | rb: 'ruby', 39 | }; 40 | 41 | const validateLang = (lang) => { 42 | if (typeof lang !== 'string') { 43 | return false; 44 | } 45 | 46 | const l = langAliases[lang.toLowerCase()] || lang.toLowerCase(); 47 | 48 | if (availableLanguages.includes(l)) { 49 | return l; 50 | } 51 | return false; 52 | }; 53 | 54 | module.exports = { 55 | usage: [ 56 | 'eval - run code in repl.it', 57 | 'eval - show available languages', 58 | ], 59 | 60 | run: (bot, message, cmdArgs) => { 61 | if (!cmdArgs) { 62 | const langList = availableLanguages.reduce((prev, x) => { 63 | let langEntry = `${prev}${prev ? '\n' : ''}- ${x}`; 64 | const aliases = Object.keys(langAliases) 65 | .filter(alias => langAliases[alias] === x) 66 | .join(', '); 67 | if (aliases) { 68 | langEntry += ` (${aliases})`; 69 | } 70 | return langEntry; 71 | }, ''); 72 | message.reply(`available languages:\n\`\`\`\n${langList}\n\`\`\`\n`); 73 | return; 74 | } 75 | 76 | // parsing the messages against regex to obtain the lang and code 77 | let rxLangs = Object.keys(langAliases) 78 | .map((v) => { 79 | if (v === 'c++') { 80 | return 'c\\+\\+'; 81 | } else if (v === 'c++11') { 82 | return 'c\\+\\+11'; 83 | } 84 | return v; 85 | }); 86 | rxLangs.push(...availableLanguages); 87 | rxLangs = rxLangs.sort((a, b) => b.length - a.length).join('|'); 88 | const rx = new RegExp('^(`{0,3})(' + rxLangs + ')\\s*((.|\\s)+)(\\1)$', 'gi'); 89 | const argsArr = rx.exec(cmdArgs); 90 | let lang = argsArr[2].toLowerCase(); 91 | const code = (new RegExp('^(`{0,3})((' + rxLangs + '|.{0})\\s)?\\s*((.|\\s)+)(\\1)$', 'gi')).exec(argsArr[3])[4]; 92 | lang = validateLang(lang); 93 | if (!lang) { 94 | message.reply('Sorry, I don\'t know that language!'); 95 | return; 96 | } 97 | 98 | const apiToken = bot.settings.tokens.replit || process.env.REPLIT_TOKEN; 99 | const repl = new ReplitClient( 100 | 'api.repl.it', 101 | 80, 102 | lang, gentoken(apiToken)); 103 | 104 | message.channel.sendMessage('⏲ evaluating...') 105 | .then((evalMsg) => { 106 | let newContent = ''; 107 | repl.evaluateOnce( 108 | code, { 109 | stdout: (output) => { 110 | newContent += `Code output:\n\`\`\`\n${output}\n\`\`\`\n`; 111 | }, 112 | }).then( 113 | (result) => { 114 | if (result.error) { 115 | newContent += `Error:\n\`\`\`${result.error}\`\`\`\n`; 116 | } else { 117 | newContent += `Result:\n\`\`\`${result.data}\`\`\`\n`; 118 | } 119 | evalMsg.edit(newContent); 120 | }, 121 | (error) => { 122 | newContent += `Error connecting to repl.it!\`\`\`${error}\`\`\`\n`; 123 | evalMsg.edit(newContent); 124 | console.error(error); 125 | }); 126 | }) 127 | .catch(console.error); 128 | }, 129 | }; 130 | 131 | -------------------------------------------------------------------------------- /commands/eval/gentoken.js: -------------------------------------------------------------------------------- 1 | const crypto = require('crypto'); 2 | 3 | module.exports = (replitApiKey) => { 4 | const hmac = crypto.createHmac('sha256', replitApiKey); 5 | 6 | const timeCreated = Date.now(); 7 | hmac.update(timeCreated.toString()); 8 | const msgMac = hmac.digest('base64'); 9 | 10 | return { 11 | time_created: timeCreated, 12 | msg_mac: msgMac, 13 | }; 14 | }; 15 | -------------------------------------------------------------------------------- /commands/help/help.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | 4 | const getFileList = (dirName) => { 5 | const fileList = fs.readdirSync(dirName); 6 | return fileList || []; 7 | }; 8 | 9 | const loadHelpText = (filename) => { 10 | const content = fs.readFileSync(filename, 'utf8'); 11 | return content || ''; 12 | }; 13 | 14 | // basic help commands 15 | const knownTopics = {}; 16 | 17 | module.exports = { 18 | usage: [ 19 | 'help - links to the new resource list at https://github.com/progdisc/resources', 20 | ], 21 | 22 | run: (bot, message) => { 23 | let r = 'This command is deprecated.\n'; 24 | r += 'See https://github.com/progdisc/resources for our new and improved resource list.'; 25 | message.channel.sendMessage(r); 26 | }, 27 | 28 | init: () => { 29 | console.log('Loading help topics...'); 30 | getFileList(path.join(__dirname, 'topics')).forEach((fn) => { 31 | knownTopics[path.basename(fn, '.txt')] = loadHelpText(path.join(__dirname, 'topics', fn)); 32 | }); 33 | }, 34 | }; 35 | 36 | -------------------------------------------------------------------------------- /commands/help/topics/cpp.txt: -------------------------------------------------------------------------------- 1 | See these links/courses for learning C++: 2 | 3 | Reference 4 | 5 | 6 | The Definitive C++ Book Guide and List 7 | 8 | 9 | C++ FAQ 10 | 11 | -------------------------------------------------------------------------------- /commands/help/topics/css.txt: -------------------------------------------------------------------------------- 1 | See these links for learning CSS: 2 | 3 | Tutorials/Documentation (In-depth) 4 | 5 | 6 | A Free Visual Guide to CSS: 7 | 8 | 9 | Free Course: Learn the basics of HTML and CSS 10 | 11 | 12 | Tutorials/Documentation (Good for Quick Reference) 13 | 14 | 15 | Tutorial: Simple introduction to CSS 16 | 17 | -------------------------------------------------------------------------------- /commands/help/topics/dotnet.txt: -------------------------------------------------------------------------------- 1 | See these links/courses for learning .NET/C#: 2 | 3 | Free Course: Fundamentals for Absolute Beginners 4 | 5 | 6 | Video Series: Getting Started with Visual Studio & C# .NET with Nerdgasm 7 | 8 | 9 | Book: C# in Depth, Third Edition by Jon Skeet (http://meta.stackexchange.com/q/9134) 10 | 11 | 12 | Paid Course Library: Fundamentals, ASP.NET MVC, LINQ, Entity Framework and more 13 | 14 | -------------------------------------------------------------------------------- /commands/help/topics/dsa.txt: -------------------------------------------------------------------------------- 1 | Use these resources to learn Data Structures and Algorithms: 2 | 3 | Free Course - Sedgewick's Coursera Part 1 4 | 5 | 6 | Free Course - Sedgewick's Coursera Part 2 7 | 8 | 9 | Paid Book - Sedgewick's Algorithms in Java 10 | 11 | 12 | Paid Book - CLRS/Introduction to Algorithms 13 | -------------------------------------------------------------------------------- /commands/help/topics/go.txt: -------------------------------------------------------------------------------- 1 | See these resources and links for learning Go: 2 | 3 | Documentation: 4 | 5 | 6 | Official Tour: 7 | 8 | 9 | Introductory Video: 10 | 11 | 12 | Godoc 13 | 14 | 15 | Effective Go <- READ THIS 16 | 17 | 18 | Sentdex - Introductory Go Videos 19 | -------------------------------------------------------------------------------- /commands/help/topics/interviews.txt: -------------------------------------------------------------------------------- 1 | Use these resources to prepare for interviews: 2 | 3 | Paid Book - Cracking the Coding Interview, 6th Edition 4 | 5 | 6 | Paid Book - Programming Interviews Exposed 7 | 8 | 9 | Paid Book - Elements of Programming Interviews !WARNING COMES IN SEVERAL LANGUAGES! 10 | 11 | -------------------------------------------------------------------------------- /commands/help/topics/java.txt: -------------------------------------------------------------------------------- 1 | See these links/courses for learning Java: 2 | 3 | Documentation (Java 8) 4 | 5 | 6 | Official Oracle tutorials 7 | 8 | 9 | Free Course: Object-Oriented programming with Java, part I & II (University of Helsinki) 10 | http://mooc.fi/courses/2013/programming-part-1/ 11 | 12 | Free materials: MIT 6.005: Software Construction (Warning: Needs some programming expirience) 13 | https://ocw.mit.edu/ans7870/6/6.005/s16/ 14 | -------------------------------------------------------------------------------- /commands/help/topics/javascript.txt: -------------------------------------------------------------------------------- 1 | See these links/courses for learning JavaScript: 2 | 3 | Tutorials/Documentation 4 | 5 | 6 | Free to Read Online: A Modern Introduction to Programming 7 | 8 | 9 | Free to Read Online: Exploring ES6 10 | 11 | 12 | Free to Read Online: Exploring ES2016-ES2017 13 | 14 | 15 | Free Course: Fundamental Programming Concepts 16 | 17 | 18 | Free Course Library: Learn to Code and Help Nonprofits 19 | 20 | 21 | Free Course: Basic JavaScript (~3 weeks) 22 | 23 | 24 | Talk: Four Layers of JavaScript OOP (1:09:02) 25 | 26 | 27 | Talk: How Node.js' Event Loop Works (26:52) 28 | 29 | 30 | Paid Course Library: In-depth Fundamentals, Node, React, jQuery and more 31 | 32 | 33 | Free to Read Online Series: You Don't Know JS (Core Mechanisms, Advanced) 34 | 35 | -------------------------------------------------------------------------------- /commands/help/topics/ml.txt: -------------------------------------------------------------------------------- 1 | See these resources for tackling Machine Learning: 2 | 3 | Free Course - Andrew Ng's Course 4 | 5 | 6 | Free Course - Columbia's Artifical Intelligence Course 7 | 8 | 9 | Free Course - fast.ai's introductory course for ML 10 | 11 | 12 | Free Book - Introduction to Statistical Learning 13 | 14 | 15 | Free Book - Deep Learning Book 16 | 17 | 18 | Free Book - Neural Networks and Deep Learning 19 | 20 | 21 | YouTube - Sentdex 22 | 23 | 24 | YouTube - MIT OCW Artificial Intelligence 25 | 26 | 27 | -------------------------------------------------------------------------------- /commands/help/topics/php.txt: -------------------------------------------------------------------------------- 1 | See these links/courses for learning PHP: 2 | 3 | PHP Official Documentation (select a language on the page) 4 | 5 | 6 | Learn PHP the right way (online free book) 7 | 8 | 9 | PHP 5 Tutorials 10 | 11 | 12 | A simple tutorial (good introduction) 13 | 14 | 15 | Free Course: Fundamental Programming Concepts 16 | 17 | 18 | Codeschool's PHP courses 19 | 20 | 21 | Beginner PHP at Treehouse 22 | 23 | 24 | Intermediate PHP at Treehouse 25 | 26 | 27 | PHP 5: Interactive tutorial 28 | 29 | 30 | 31 | See these resources for learning what's new in PHP 7: 32 | 33 | PHP 7: Up and running 34 | 35 | 36 | PHP 7: Interactive tutorial 37 | 38 | -------------------------------------------------------------------------------- /commands/help/topics/podcasts.txt: -------------------------------------------------------------------------------- 1 | Here are some technology podcasts: 2 | 3 | *Coder Radio* by Jupiter Broadcasting 4 | 5 | 6 | *Talk Python to Me* by Michael Kennedy 7 | 8 | 9 | *Simple Programmer* by John Sonmez 10 | 11 | 12 | *Import This* by Kenneth Reitz 13 | 14 | 15 | *whiletruefm* by kennethlove, lethargilistic, samwho, and DiLemmA 16 | 17 | -------------------------------------------------------------------------------- /commands/help/topics/python.txt: -------------------------------------------------------------------------------- 1 | See these links/courses for learning Python: 2 | 3 | Documentation 4 | 5 | 6 | Free to Read Online: A Byte of Python 7 | 8 | 9 | Free to Read Online: Introduction to Programming for Beginners 10 | 11 | 12 | Free to Read Online: Language Basics and Task Automation 13 | 14 | 15 | Paid Book (Free to Read Previous Versions): Tango With Django 16 | 17 | 18 | Free Course: Introduction to Computing using Python 19 | 20 | 21 | Paid Course Library: In-depth Fundamentals, Flask, Django and more 22 | 23 | 24 | Free Course: Problem Solving with Algorithms and Data Structures using Python 25 | 26 | -------------------------------------------------------------------------------- /commands/help/topics/react.txt: -------------------------------------------------------------------------------- 1 | See these links for learning ReactJS/Flux/Redux: 2 | 3 | Hello World in React 4 | 5 | 6 | Free Course: Get Quickly in Pace with React.js Development 7 | 8 | 9 | Free Course: Essential Concepts 10 | 11 | 12 | Free Course: Continuation: Lifecycle Methods, Stateless Components and more 13 | 14 | 15 | Awesome react 16 | 17 | 18 | Redux doc's 19 | 20 | 21 | Dan Abramov's free course for redux 22 | 23 | 24 | React-redux-links 25 | 26 | -------------------------------------------------------------------------------- /commands/help/topics/ruby.txt: -------------------------------------------------------------------------------- 1 | See these links/courses for learning Ruby: 2 | 3 | Official Ruby Core 2.4.1 Documentation 4 | 5 | 6 | Quickstart Guide: Ruby In Twenty Minutes 7 | 8 | 9 | Cheatsheet/Reference: 10 | 11 | 12 | Learn to Program with Ruby 13 | 14 | 15 | Free (Language Transition): Ruby From Other Languages 16 | 17 | 18 | Free (Exercise Focused): Learn Ruby the Hard Way 19 | 20 | 21 | Free (Exercise Focused): Codecademy Ruby 22 | 23 | 24 | Free (Ruby on Rails 5) : Ruby on Rails Tutorial 25 | 26 | 27 | Free (Ruby on Rails): Learn Ruby on Rails from Scratch 28 | 29 | 30 | Paid (Course Library): TeamTreehouse: Learn Ruby 31 | 32 | -------------------------------------------------------------------------------- /commands/info/info.js: -------------------------------------------------------------------------------- 1 | const request = require('request'); 2 | const exec = require('child_process').exec; 3 | const discord = require('discord.js'); 4 | 5 | const time = require('../../lib/utils.js').time; 6 | 7 | const githubCommits = 'https://api.github.com/repos/$repo/commits'; 8 | const githubContributors = 'https://api.github.com/repos/$repo/contributors'; 9 | const githubRepo = 'https://github.com/$repo'; 10 | const commitTemplate = '$username - $message'; 11 | const markdownLink = '[$text]($link)'; 12 | const description = 'Message cmd for available commands.'; 13 | let config; 14 | const lastCommit = {}; 15 | const currentCommit = {}; 16 | let contributorsMessage = ''; 17 | const githubHeaders = { 18 | 'User-Agent': 'TheAwesomeBot', 19 | 'Accept': 'application/vnd.github.v3+json', // eslint-disable-line quote-props 20 | }; 21 | 22 | function getLastCommit() { 23 | request({ 24 | url: githubCommits.replace('$repo', config.repo), 25 | headers: githubHeaders, 26 | }, (err, response, body) => { 27 | if (err || response.statusCode !== 200) { 28 | lastCommit.link = 'https://github.com/404'; 29 | lastCommit.message = 'Couldn\'t retrieve commit data.'; 30 | return; 31 | } 32 | const commitData = JSON.parse(body); 33 | // TODO (sam): Instead of depending on nullness of the variable, 34 | // act according to github api docs 35 | if (commitData[0] == null) { 36 | lastCommit.message = 'Couldn\'t retrieve commit data.'; 37 | return; 38 | } 39 | const commitMessage = commitData[0].commit.message.replace('\n\n', ' ') 40 | .replace('\n', ' '); 41 | lastCommit.link = commitData[0].html_url; 42 | lastCommit.username = commitData[0].author ? commitData[0].author.login : 'unkown'; 43 | lastCommit.message = commitTemplate.replace('$username', lastCommit.username) 44 | .replace('$message', commitMessage); 45 | }); 46 | } 47 | 48 | function getCurrentCommit() { 49 | exec('git show --oneline -s', (err, stdout) => { 50 | const gitOutput = stdout.replace('\n\n', '').replace('\n', ''); 51 | currentCommit.shortSHA = gitOutput.split(' ')[0]; 52 | 53 | request({ 54 | url: githubCommits.replace('$repo', config.repo) + '/' + currentCommit.shortSHA, 55 | headers: githubHeaders, 56 | }, (error, response, body) => { 57 | if (error || response.statusCode !== 200) { 58 | currentCommit.link = 'https://github.com/404'; 59 | return; 60 | } 61 | currentCommit.link = JSON.parse(body).html_url; 62 | currentCommit.username = JSON.parse(body).author ? JSON.parse(body).author.login : 'unkown'; 63 | currentCommit.message = commitTemplate.replace('$username', currentCommit.username) 64 | .replace('$message', gitOutput.split(' ').slice(1).join(' ')); 65 | }); 66 | }); 67 | } 68 | 69 | function getContributors() { 70 | request({ 71 | url: githubContributors.replace('$repo', config.repo), 72 | headers: githubHeaders, 73 | }, (error, response, body) => { 74 | let jsonData = JSON.parse(body); 75 | if (Array.isArray(jsonData) && jsonData.length >= 10) { 76 | jsonData = jsonData.slice(0, 10); 77 | contributorsMessage = jsonData.slice(0, 10).reduce((acc, cv) => 78 | acc + markdownLink.replace('$text', cv.login).replace('$link', cv.html_url) + '\n' 79 | , ''); 80 | } else { 81 | contributorsMessage = 'There was an error trying to get the contributors list :('; 82 | } 83 | }); 84 | } 85 | 86 | function infoInit(bot) { 87 | config = bot.settings.info; 88 | // get current checked out commit from git 89 | getCurrentCommit(); 90 | // get latest commit in git repo 91 | getLastCommit(); 92 | getContributors(); 93 | } 94 | 95 | function infoRun(bot, message, cmdArgs) { 96 | if (cmdArgs) { 97 | if (cmdArgs === 'contributors') { 98 | const contributorsEmbed = new discord.RichEmbed(); 99 | contributorsEmbed.setColor('#4286f4') 100 | .setTitle('Top 10 contributors of AwesomeBot:') 101 | .setDescription(contributorsMessage); 102 | message.channel.sendEmbed(contributorsEmbed); 103 | } 104 | } else { 105 | const embed = new discord.RichEmbed(); 106 | embed.setColor('#4286f4') 107 | .setAuthor('TheAwesomeBot', bot.client.user.avatarURL, githubRepo.replace('$repo', config.repo)) 108 | .setFooter(description.replace('cmd', bot.settings.bot_cmd)) 109 | .addField('Uptime', time.timeElapsed(bot.bootTime, new Date())) 110 | .addField('Latest Commit', markdownLink.replace('$text', lastCommit.message).replace('$link', lastCommit.link)) 111 | .setDescription('An open source bot made with :heart:'); 112 | // let the users know if bot is working on a rolled back commit 113 | if (currentCommit !== lastCommit) { 114 | embed.addField('Current Commit', markdownLink.replace('$text', currentCommit.message) 115 | .replace('$link', currentCommit.link)); 116 | } 117 | message.channel.sendEmbed(embed); 118 | } 119 | } 120 | 121 | module.exports = { 122 | usage: [ 123 | 'info - displays information about bot', 124 | 'info contributors - displays contributors', 125 | ], 126 | init: infoInit, 127 | run: infoRun, 128 | }; 129 | -------------------------------------------------------------------------------- /commands/pbf/pbf.js: -------------------------------------------------------------------------------- 1 | const request = require('request'); 2 | const cheerio = require('cheerio'); 3 | 4 | function parsePbfLink(pbfLink, message) { 5 | request(pbfLink, (error, response, body) => { 6 | if (!error && response.statusCode === 200) { 7 | // we have successfully got a response 8 | const htmlBody = cheerio.load(body); 9 | 10 | if (htmlBody('#topimg')) { 11 | const img = htmlBody('#topimg'); 12 | message.channel.sendMessage('```diff\n' + 13 | `Title: ${img.attr('alt')}\n` + 14 | '```\n' + 15 | `http://pbfcomics.com${img.attr('src')}`); 16 | } else { 17 | message.channel.sendMessage(`I'm sorry ${message.author}, i couldn't find a PBF Comic.`); 18 | } 19 | } 20 | }); 21 | } 22 | 23 | module.exports = { 24 | usage: 'pbf - finds a pbf comic with relevant keywords. Random keyword selects random comic.', 25 | run: (bot, message, cmdArgs) => { 26 | let pbfLink = false; 27 | 28 | if (cmdArgs === 'random') { 29 | pbfLink = 'http://pbfcomics.com/random'; 30 | parsePbfLink(pbfLink, message); 31 | } else { 32 | const options = { 33 | url: `https://duckduckgo.com/html/?q=${cmdArgs}%20pbfcomics`, 34 | headers: { 35 | 'accept-language': 'en-US,en;q=0.8', 36 | 'upgrade-insecure-requests': 1, 37 | 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' + 38 | 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36', 39 | }, 40 | }; 41 | request(options, (err, res, bod) => { 42 | const pbfBody = cheerio.load(bod); 43 | try { 44 | pbfBody('.result__a').each((i, link) => { 45 | const href = link.attribs.href; 46 | if (href.search(/^https?:\/\/(www\.)?pbfcomics\.com\/\d+\//) !== -1 && pbfLink === false) { 47 | pbfLink = href; 48 | } 49 | }); 50 | } catch (e) { 51 | message.channel.sendMessage('There was a problem with DuckDuckGo query.'); 52 | } 53 | // we are done with finding a link 54 | if (!pbfLink) { 55 | // link is either empty (this should NOT happen) or we don't have a link 56 | message.channel.sendMessage(`I'm sorry ${message.author}, i couldn't find a PBF Comic.`); 57 | } else { 58 | parsePbfLink(pbfLink, message); 59 | } 60 | }); 61 | } 62 | return false; 63 | }, 64 | 65 | }; 66 | -------------------------------------------------------------------------------- /commands/pro/pro.js: -------------------------------------------------------------------------------- 1 | function fixEscapes(str) { 2 | return str.replace(/[^a-z0-9|]/ig, '\\$&'); 3 | } 4 | 5 | let proLangRe; 6 | let pros; 7 | const proHelpText = {}; 8 | 9 | function updateProsMatcher() { 10 | /* eslint global-require: off */ 11 | delete require.cache[require.resolve('./proTerms.js')]; 12 | pros = {}; 13 | 14 | const terms = require('./proTerms.js') 15 | .filter(termList => termList[0].length > 0) 16 | .map((termList) => { 17 | const termPros = new Set(); 18 | termPros.original = termList[0]; 19 | 20 | termList.forEach((term) => { 21 | pros[term.toLowerCase()] = termPros; 22 | }); 23 | 24 | return fixEscapes(termList.join('|')); 25 | }); 26 | 27 | proLangRe = new RegExp(`(?:^|\\W)(${terms.join('|')})(?:$|\\W)`, 'gi'); 28 | } 29 | 30 | 31 | function getProsOnline(guild) { 32 | return new Set(guild.members 33 | .filter(m => m.roles.find('name', 'Helpers') && ['online', 'idle'].includes(m.presence.status)) 34 | .map(p => p.user.username)); 35 | } 36 | 37 | 38 | function loadAndMatchPros(bot) { 39 | updateProsMatcher(); 40 | const helpChannel = bot.client.channels.find('name', 'help-directory'); 41 | 42 | return helpChannel.fetchMessages({ limit: 100 }) 43 | .then((messages) => { 44 | messages.forEach((messageObj) => { 45 | proHelpText[messageObj.author.id] = messageObj.content; 46 | proLangRe.lastIndex = 0; 47 | while (true) { 48 | const match = proLangRe.exec(messageObj.content); 49 | if (!match) { 50 | break; 51 | } 52 | pros[match[1].toLowerCase()].add(messageObj.author.username); 53 | } 54 | }); 55 | }); 56 | } 57 | 58 | 59 | function getPros(bot, lang) { 60 | if (!pros[lang]) { 61 | return null; 62 | } 63 | const langPros = Array.from(pros[lang]); 64 | const guild = bot.client.guilds.first(); 65 | const online = getProsOnline(guild); 66 | return langPros.filter(user => online.has(user)).join('\n'); 67 | } 68 | 69 | module.exports = { 70 | usage: [ 71 | 'pro - list of people who knows about ', 72 | 'pro - get help directory entry for specific pro', 73 | 'pro reset - reload all the pro data (mod only)', 74 | ], 75 | 76 | run(bot, message, cmdArgs) { 77 | if (!cmdArgs) { 78 | return true; 79 | } 80 | 81 | if (message.mentions.users.size > 0) { 82 | const memberId = message.mentions.users.first().id; 83 | if (memberId in proHelpText) { 84 | let response = `**Help Directory entry for user ${message.mentions.users.first().username}:**\n`; 85 | response += proHelpText[memberId]; 86 | message.channel.sendMessage(response); 87 | } else { 88 | message.channel.sendMessage(`Could not find user ${message.mentions.users.first().username} in directory`); 89 | } 90 | return false; 91 | } 92 | 93 | let lang = cmdArgs.toLowerCase().trim(); 94 | 95 | if (lang === 'reset' && bot.isAdminOrMod(message.member)) { 96 | loadAndMatchPros(bot).then(() => { 97 | message.channel.sendMessage('Pros list refreshed.'); 98 | return false; 99 | }) 100 | .catch((err) => { 101 | console.error(err); 102 | console.error(err.stack); 103 | }); 104 | return false; 105 | } 106 | 107 | proLangRe.lastIndex = 0; 108 | const match = proLangRe.exec(lang); 109 | lang = ((match && match[1]) || lang).toLowerCase(); 110 | 111 | const foundPros = getPros(bot, lang); 112 | message.channel.sendMessage(foundPros ? 113 | `Here are some pros online that can help with **${pros[lang].original}**: \n${foundPros}` : 114 | `No pros found for ${cmdArgs} :(`); 115 | return false; 116 | }, 117 | 118 | init(bot) { 119 | console.log('Loading pros...'); 120 | loadAndMatchPros(bot) 121 | .then(() => { 122 | console.log('Done reading in pros from #helpdirectory!'); 123 | }) 124 | .catch((err) => { 125 | console.error(err); 126 | console.error(err.stack); 127 | }); 128 | }, 129 | }; 130 | 131 | -------------------------------------------------------------------------------- /commands/pro/proTerms.js: -------------------------------------------------------------------------------- 1 | const proTerms = require('fs') 2 | .readFileSync(`${__dirname}/proTerms.txt`, 'utf8') 3 | .split('\n') 4 | .map(str => str.split('|')); 5 | 6 | module.exports = proTerms; 7 | -------------------------------------------------------------------------------- /commands/pro/proTerms.txt: -------------------------------------------------------------------------------- 1 | .NET|ASP.NET 2 | Ada 3 | Angular|Angular2 4 | AngularJS|Angular1 5 | Apache 6 | AppleScript 7 | Assembly|ASM|x86 8 | ATS 9 | AutoHotkey|AHK 10 | Bash 11 | Boo 12 | Bison 13 | C 14 | C-- 15 | C# 16 | C++ 17 | Caml 18 | Clojure 19 | Coq 20 | CoffeeScript 21 | CSS 22 | D|Dlang 23 | Dart 24 | Delphi 25 | Elm 26 | Eiffel 27 | Erlang 28 | Elixir 29 | F# 30 | Flex 31 | Groovy 32 | GLSL 33 | Go|Golang 34 | Haskell 35 | Haxe 36 | HLSL 37 | HTML 38 | Java 39 | JavaScript|JS 40 | Julia 41 | Kotlin 42 | LaTex 43 | Lua 44 | LOLCODE 45 | Lisp 46 | ML|SML 47 | Matlab 48 | Mongo 49 | Nim|Nimrod|Nimlang 50 | Ngnix 51 | OCaml 52 | Objective-C 53 | Oracle SQL 54 | Pascal 55 | Powershell 56 | Perl 57 | PHP 58 | Python 59 | R 60 | Redis 61 | Ruby 62 | Rust 63 | SmallTalk 64 | Squirrel 65 | Scheme 66 | Swift 67 | SQL 68 | Splunk 69 | TypeScript 70 | TeX 71 | VisualBasic 72 | Whitespace 73 | Wolfram 74 | -------------------------------------------------------------------------------- /commands/quickref/quickref.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | 4 | const getFileList = (dirName) => { 5 | const fileList = fs.readdirSync(dirName); 6 | return fileList || []; 7 | }; 8 | 9 | const loadReferences = (filename) => { 10 | const content = fs.readFileSync(filename, 'utf8'); 11 | return content || ''; 12 | }; 13 | 14 | const references = {}; 15 | 16 | module.exports = { 17 | usage: [ 18 | 'quickref - displays quick reference for ', 19 | 'quickref - list known references', 20 | ], 21 | run: (bot, message, cmdArgs) => { 22 | if (cmdArgs) { 23 | const response = references[cmdArgs.toLowerCase()]; 24 | 25 | if (response) { 26 | message.channel.sendMessage( 27 | `${response}`); 28 | } else { 29 | message.channel.sendMessage('I don\'t have any references for that. If you have a suggestion, let us know!'); 30 | } 31 | } else { 32 | let r = '\nreferences I have ready to go:'; 33 | r += '\n```'; 34 | r += Object.keys(references).map(t => `\n - ${t}`).join(''); 35 | r += '\n```'; 36 | message.channel.sendMessage(r); 37 | } 38 | }, 39 | init: () => { 40 | console.log('Loading quickrefs...'); 41 | getFileList(path.join(__dirname, 'references')).forEach((fn) => { 42 | references[path.basename(fn, '.txt')] = loadReferences(path.join(__dirname, 'references', fn)); 43 | }); 44 | }, 45 | }; 46 | -------------------------------------------------------------------------------- /commands/quickref/references/codeblock.txt: -------------------------------------------------------------------------------- 1 | Use codeblocks for formatting code (line breaks matter!): 2 | \```language_name 3 | # code here 4 | \``` 5 | 6 | For example: 7 | \```python 8 | if True: 9 | print("Hi!") 10 | \``` 11 | prints: 12 | ```python 13 | if True: 14 | print("Hi!") 15 | ``` 16 | You can find the available language names here: 17 | -------------------------------------------------------------------------------- /commands/quickref/references/dotnet.txt: -------------------------------------------------------------------------------- 1 | http://www.hanselman.com/blog/content/binary/Windows-Live-Writer/ASP.NET-5-is-dead---Introducing-ASP.NE.0_E068/image_60140ec0-ce46-4dbf-a14f-4210eab7f42c.png -------------------------------------------------------------------------------- /commands/quickref/references/hotkeys.txt: -------------------------------------------------------------------------------- 1 | ``` 2 | CTRL - K Quick Switcher 3 | CTRL - ALT - UP ARROW Server Up 4 | CTRL - ALT - DOWN ARROW Server Down 5 | ALT - UP ARROW Channel Up 6 | ALT - DOWN ARROW Channel Down 7 | ALT - SHIFT - UP ARROW Unread channel up 8 | ALT - SHIFT - DOWN ARROW Unread channel down 9 | CTRL - SHIFT - ALT - UP ARROW Unread mention up 10 | CTRL - SHIFT - ALT - DOWN ARROW Unread mention down 11 | ESC Mark channel as read 12 | SHIFT - ESC Mark server as read 13 | CTRL- ALT - A Return to active audio channel 14 | CTRL - B Return to last text channel 15 | SHIFT - PGUP Jump to oldest unread message 16 | ``` 17 | -------------------------------------------------------------------------------- /commands/quickref/references/linux.txt: -------------------------------------------------------------------------------- 1 | https://files.fosswire.com/2007/08/fwunixrefshot.png -------------------------------------------------------------------------------- /commands/quickref/references/nohello.txt: -------------------------------------------------------------------------------- 1 | __**Please Don't Say Just Hello In Chat**__ 2 | ``` 3 | 2016-07-19 12:32:12 you: Hi 4 | 2016-07-19 12:32:15 co-worker: Hello. 5 | ## CO-WORKER WAITS WHILE YOU PHRASE YOUR QUESTION 6 | 2016-07-19 12:34:01 you: I'm working on [something] and I'm trying to do [etc...] 7 | 2016-07-19 12:35:21 co-worker: Oh, that's [answer...] 8 | ``` 9 | It's as if you called someone on the phone and said "Hi!" and then put them on hold! 10 | 11 | Please do this instead: 12 | ``` 13 | 2016-07-19 12:32:12 you: Hi -- I'm working on [something] and I'm trying to do [etc...] 14 | 2016-07-19 12:33:32 co-worker: [answers question] 15 | ``` 16 | *You can learn more at http://nohello.com/* 17 | -------------------------------------------------------------------------------- /commands/quickref/references/printf.txt: -------------------------------------------------------------------------------- 1 | https://codywu2010.files.wordpress.com/2014/10/printf_format.png -------------------------------------------------------------------------------- /commands/quickref/references/regex.txt: -------------------------------------------------------------------------------- 1 | http://www.computerhope.com/jargon/r/regular-expression.gif -------------------------------------------------------------------------------- /commands/quickref/references/sqljoin.txt: -------------------------------------------------------------------------------- 1 | http://www.ilearnttoday.com/wp-content/uploads/2016/07/Visual_SQL_JOINS_orig.jpg -------------------------------------------------------------------------------- /commands/quickref/references/style.txt: -------------------------------------------------------------------------------- 1 | Here is a link to Discord's text styles: 2 | 3 | https://support.discordapp.com/hc/en-us/articles/210298617-Markdown-Text-101-Chat-Formatting-Bold-Italic-Underline- 4 | -------------------------------------------------------------------------------- /commands/quickref/references/subnet.txt: -------------------------------------------------------------------------------- 1 | ``` 2 | Addresses Hosts Netmask Amount of a Class C 3 | /30 4 2 255.255.255.252 1/64 4 | /29 8 6 255.255.255.248 1/32 5 | /28 16 14 255.255.255.240 1/16 6 | /27 32 30 255.255.255.224 1/8 7 | /26 64 62 255.255.255.192 1/4 8 | /25 128 126 255.255.255.128 1/2 9 | /24 256 254 255.255.255.0 1 10 | /23 512 510 255.255.254.0 2 11 | /22 1024 1022 255.255.252.0 4 12 | /21 2048 2046 255.255.248.0 8 13 | /20 4096 4094 255.255.240.0 16 14 | /19 8192 8190 255.255.224.0 32 15 | /18 16384 16382 255.255.192.0 64 16 | /17 32768 32766 255.255.128.0 128 17 | /16 65536 65534 255.255.0.0 256 18 | ``` 19 | -------------------------------------------------------------------------------- /commands/server/server.js: -------------------------------------------------------------------------------- 1 | const discord = require('discord.js'); 2 | 3 | module.exports = { 4 | usage: 'server - prints info about the server', 5 | run: (bot, message) => { 6 | const embed = new discord.RichEmbed(); 7 | embed.setTitle('Server Owner') 8 | .setColor('#ff7260') 9 | .setAuthor(message.guild.name, message.guild.iconURL) 10 | .setDescription(message.guild.owner.user.username) 11 | .addField('Members', message.guild.members.size, true) 12 | .addField('Created', message.guild.createdAt.toString(), true) 13 | .addField('Emojis', 14 | message.guild.emojis.size > 0 ? message.guild.emojis.map(d => d.toString()).join(' ') : 'None'); 15 | message.channel.sendEmbed(embed); 16 | }, 17 | }; 18 | -------------------------------------------------------------------------------- /commands/stream/stream.js: -------------------------------------------------------------------------------- 1 | /* 2 | This module is meant to handle the command '!bot streams #channel' 3 | 4 | Notes: 5 | - streamCommands is an array with the valid stream commands for the keys in channels.js: 6 | e.g ['!bot streams python', '!bot streams php'...] 7 | e.g ['!bot streams remove [channel] [user]'] 8 | 9 | How it works: 10 | - streams is an object with the following schema: 11 | 12 | streams: { 13 | [channel] : { 14 | [user]: link , 15 | [user]: link , 16 | . 17 | . 18 | . 19 | } 20 | } 21 | - streams is an in-memory-object of sorts to keep track of streams. 22 | */ 23 | 24 | // in memory object containing join.me stream 25 | const streams = {}; 26 | 27 | function putStreamInObject(topic, user, link, description) { 28 | if (!streams[topic]) { 29 | streams[topic] = {}; 30 | } 31 | 32 | streams[topic][user] = { link, description, channel: '' }; 33 | 34 | // console.log(`Put in Object: Key: ${topic}, User Key: ${user}`); 35 | } 36 | 37 | function createChannel(title, bot, message, topic, user) { 38 | return message.guild.createChannel(title, 'text').then((channel) => { 39 | streams[topic][user].channel = channel; 40 | return channel; 41 | }); 42 | } 43 | 44 | function setTopicToLink(channel, link, bot, topic, user) { 45 | return channel.setTopic(link).then(() => { 46 | streams[topic][user].channel = channel; 47 | return channel; 48 | }); 49 | } 50 | 51 | 52 | function deleteStreamInObject(topic, user) { 53 | if (Object.keys(streams[topic]).length === 1) { 54 | delete streams[topic]; 55 | } else { 56 | delete streams[topic][user]; 57 | } 58 | } 59 | 60 | 61 | const commands = { 62 | create: function handleCreateStream(bot, message, args) { 63 | let [, topic, link, user] = args.split(' '); // eslint-disable-line prefer-const 64 | 65 | if (!topic || !link) { 66 | return message.channel.sendMessage('err, please provide topic and link!'); 67 | } 68 | 69 | if (link.indexOf('http://') === -1 && link.indexOf('https://') === -1) { 70 | return message.channel.sendMessage('a valid link must be supplied (starting with http/https)!'); 71 | } 72 | 73 | user = message.mentions.users.first(); 74 | if (user) { 75 | // Creating a channel for someone else 76 | // The keys in the topics object are username mention id 77 | } else { 78 | // Creating a channel for you 79 | // The keys in the topics object are username mention id 80 | user = message.author; 81 | } 82 | const channelFormat = `stream_${user.username}_${topic}`; 83 | 84 | const defaultDescription = 85 | `${user} is streaming about ${topic}`; 86 | 87 | putStreamInObject(topic, user.id, link, defaultDescription); 88 | 89 | const existingChannel = bot.client.channels.get('name', channelFormat); 90 | 91 | if (existingChannel) { 92 | streams[topic][user.id].channel = existingChannel; 93 | streams[topic][user.id].link = link; 94 | 95 | existingChannel.setTopic(link).catch(err => 96 | existingChannel.sendMessage('There was an error setting the existings channel topic!')); 97 | 98 | return message.channel.sendMessage('Channel already exists.. Updated stream link!'); 99 | } 100 | return createChannel(channelFormat, bot, message, topic, user.id) 101 | .then(createdChannel => setTopicToLink(createdChannel, link, bot, topic, user.id)) 102 | .then(channelWithTopic => message.channel.sendMessage(`Created ${channelWithTopic}!`)) 103 | .catch(err => message.channel.sendMessage(`Sorry, could not create channel (${err})`)); 104 | }, 105 | 106 | remove: function handleRemoveStream(bot, message) { 107 | const user = message.mentions.users.first(); 108 | 109 | const topics = Object.keys(streams); 110 | const id = user ? user.id : message.author.id; 111 | 112 | if (!bot.isAdminOrMod(message.member) && id !== message.author.id) { 113 | message.channel.sendMessage('Only admins or mods can remove others\' streams.'); 114 | return; 115 | } 116 | 117 | topics.forEach((topic) => { 118 | if (streams[topic][id]) { 119 | const channelToDelete = streams[topic][id].channel; 120 | 121 | deleteStreamInObject(topic, id); 122 | 123 | channelToDelete.delete().catch(err => 124 | message.channel.sendMessage('Sorry, could not delete channel')); 125 | 126 | message.channel.sendMessage( 127 | `Removed ${user || message.author} from active streamers list and deleted #${channelToDelete.name}`); 128 | } else { 129 | // user has no stream in this topic 130 | // return message.channel.sendMessage(`Could not find ${user}`); 131 | } 132 | }); 133 | }, 134 | 135 | list: function listStreams(bot, message) { 136 | let buildMessage = 'Available streams: \n'; 137 | 138 | const topics = Object.keys(streams); 139 | 140 | if (topics.length === 0) { 141 | return message.channel.sendMessage('No streams! :frowning:'); 142 | } 143 | 144 | topics.forEach((topic) => { 145 | buildMessage += `**\n${topic}**\n`; 146 | Object.keys(streams[topic]).forEach((stream, index) => { 147 | const link = streams[topic][stream].link; 148 | const description = streams[topic][stream].description; 149 | 150 | buildMessage += ` ${index + 1}. ${link} - ${description}\n`; 151 | }); 152 | }); 153 | 154 | return message.channel.sendMessage(buildMessage); 155 | }, 156 | 157 | removeall: function removeAllStreams(bot, message) { 158 | if (message && !bot.isAdminOrMod(message.member)) { 159 | message.channel.sendMessage('Only Admins or Mods can delete all stream channels'); 160 | return; 161 | } 162 | 163 | console.log('Removing all stream channels..'); 164 | bot.client.guilds.first().channels.filter(channel => 165 | channel && channel.name !== undefined && channel.name.startsWith('stream')) 166 | .forEach(channel => channel.delete()); 167 | 168 | Object.keys(streams).forEach(topic => delete streams[topic]); 169 | }, 170 | }; 171 | 172 | module.exports = { 173 | usage: [ 174 | 'stream create [@user] - creates stream about [by @user]', 175 | 'stream list - displays streamings about ', 176 | 'stream remove <@user> - removes a streaming by <@user>', 177 | 'stream removeall - removes every streaming (Mods only)', 178 | ], 179 | 180 | run: (bot, message, cmdArgs) => { 181 | const cmdFn = commands[cmdArgs.split(' ')[0]]; 182 | if (!cmdFn) return true; 183 | cmdFn(bot, message, cmdArgs); 184 | return false; 185 | }, 186 | 187 | init: (bot) => { 188 | commands.removeall(bot); 189 | }, 190 | }; 191 | 192 | -------------------------------------------------------------------------------- /commands/uptime/uptime.js: -------------------------------------------------------------------------------- 1 | const time = require('../../lib/utils.js').time; 2 | 3 | module.exports = { 4 | usage: 'uptime - prints my uptime', 5 | run: (bot, message) => { 6 | message.channel.sendMessage( 7 | `Uptime: ${time.timeElapsed(bot.bootTime, new Date())}`); 8 | }, 9 | }; 10 | -------------------------------------------------------------------------------- /commands/vote/vote.js: -------------------------------------------------------------------------------- 1 | function handleKick(bot, member, _guild) { 2 | member.kick().catch((err) => { 3 | if (err) console.log(err); 4 | }); 5 | } 6 | 7 | function handleMute(bot, member, _guild) { 8 | member.setMute(true).catch((err) => { 9 | if (err) console.log(err); 10 | }); 11 | } 12 | 13 | const voteTypes = { 14 | kick: handleKick, 15 | mute: handleMute, 16 | }; 17 | 18 | /* 19 | * currentVotes: dictionary of votes 20 | * { 21 | * : { 22 | * : { 23 | * username: , 24 | * votes: [, 26 | * } 27 | * } 28 | * } 29 | */ 30 | const currentVotes = {}; 31 | Object.keys(voteTypes).forEach((k) => { 32 | currentVotes[k] = {}; 33 | }); 34 | 35 | function setIntersection(setA, setB) { 36 | return new Set([...setA].filter(x => setB.has(x))); 37 | } 38 | 39 | function processVote(type, bot, message, guild, member) { 40 | let voting = currentVotes[type][member.user.username]; 41 | 42 | if (!voting) { 43 | // sets a timeout for this voting 44 | const timeoutClj = () => { 45 | message.channel.sendMessage(`Vote to ${type} ${member} has timed out. Phew!`); 46 | delete currentVotes[type][member.user.username]; 47 | }; 48 | const timeoutObj = setTimeout(timeoutClj, bot.settings.voting.timeout_in_minutes * 1000 * 60); 49 | 50 | voting = { 51 | username: member.user.username, 52 | votes: [], 53 | timeout: timeoutObj, 54 | }; 55 | currentVotes[type][member.user.username] = voting; 56 | } 57 | 58 | // ignore votes by the same user 59 | if (voting.votes.indexOf(message.author.username) >= 0) { 60 | return; 61 | } 62 | voting.votes.push(message.author.username); 63 | if (voting.votes.length >= bot.settings.voting.voteThreshold) { 64 | clearTimeout(voting.timeout); 65 | message.channel.sendMessage(`Sorry, ${member}, but their wish is my command!`); 66 | voteTypes[type](bot, member, guild); 67 | delete currentVotes[type][member.user.username]; 68 | } else { 69 | let msg = `[${voting.votes.length}/${bot.settings.voting.voteThreshold}]`; 70 | msg += ` votes to ${type} ${member}!`; 71 | message.channel.sendMessage(msg); 72 | } 73 | } 74 | 75 | module.exports = { 76 | usage: `vote <${Object.keys(voteTypes).join('|')}> <@user> - start a vote against <@user>`, 77 | 78 | run: (bot, message, cmdArgs) => { 79 | // command validation 80 | const voteRe = new RegExp(`^(${Object.keys(voteTypes).join('|')})`, 'i'); 81 | const reMatch = cmdArgs.match(voteRe); 82 | if (!reMatch) return true; 83 | 84 | const guild = message.channel.guild; 85 | const voteType = reMatch[1]; 86 | 87 | const user = message.mentions.users.first(); 88 | if (!user) { 89 | message.channel.sendMessage('You need to specify a valid member!'); 90 | return false; 91 | } 92 | const member = guild.members.get(user.id); 93 | 94 | // user validation 95 | // warning: assume bot is in one guild only 96 | if (user === message.author) { 97 | message.channel.sendMessage('You can\'t start a vote against yourself, silly.'); 98 | return false; 99 | } else if (user === bot.client.user) { 100 | message.channel.sendMessage(`I'm sorry ${message.author}, I'm afraid I can't let you do that.,`); 101 | return false; 102 | } 103 | 104 | // roles validation 105 | const userRoles = new Set(member.roles.array().map(r => r.name)); 106 | if (setIntersection(userRoles, new Set(bot.settings.voting.immuneRoles)).size > 0) { 107 | message.channel.sendMessage('try.is(\'nice\') === true'); 108 | return false; 109 | } 110 | 111 | processVote(voteType, bot, message, guild, member); 112 | return false; 113 | }, 114 | }; 115 | 116 | -------------------------------------------------------------------------------- /commands/weather/weather.js: -------------------------------------------------------------------------------- 1 | const request = require('request-promise'); 2 | const discord = require('discord.js'); 3 | 4 | let weatherConfig; 5 | let tokens; 6 | const geocodeEndpoint = 'https://maps.googleapis.com/maps/api/geocode/json?key=gkey&address=input'; 7 | const darkskyEndpoint = 'https://api.darksky.net/forecast/key/lat,lng'; 8 | 9 | function fahrenheitToCelcius(degree) { 10 | return (((degree - 32) * 5) / 9).toFixed(0); 11 | } 12 | 13 | function getGeocodeData(address) { 14 | let requestURL = geocodeEndpoint 15 | .replace('gkey', tokens.google_geocode) 16 | .replace('input', address); 17 | requestURL = encodeURI(requestURL); 18 | 19 | return request(requestURL).then((body) => { 20 | const geocodeData = JSON.parse(body); 21 | 22 | if (geocodeData.status !== 'OK') { 23 | // eslint-disable-next-line no-throw-literal 24 | throw 'I\'m sorry, the address couldn\'t be detected.'; 25 | } 26 | 27 | const result = { 28 | address: geocodeData.results[0].formatted_address, 29 | coordinate: geocodeData.results[0].geometry.location, 30 | }; 31 | 32 | return result; 33 | }); 34 | } 35 | 36 | function getWeatherData(location) { 37 | const requestURL = darkskyEndpoint 38 | .replace('key', tokens.darksky) 39 | .replace('lat', location.coordinate.lat) 40 | .replace('lng', location.coordinate.lng); 41 | 42 | return request(requestURL).then((body) => { 43 | const weatherData = JSON.parse(body); 44 | 45 | const offset = weatherData.offset; 46 | const utcTime = weatherData.currently.time; 47 | // datetime is weird in javascript, please do change this part if you can 48 | const localTime = new Date(utcTime * 1000); 49 | localTime.setHours(localTime.getHours() + offset); 50 | let dateString; 51 | // toGMTString prints out timezone of host so we slice it off 52 | if (offset > 0) { 53 | dateString = localTime.toUTCString() + ' +' + offset; 54 | } else { 55 | dateString = localTime.toUTCString() + ' ' + offset; 56 | } 57 | 58 | const temperatureF = weatherData.currently.temperature.toFixed(0); 59 | const temperatureC = fahrenheitToCelcius(temperatureF); 60 | const summary = weatherData.currently.summary; 61 | const humidity = (weatherData.currently.humidity * 100).toFixed(0); 62 | // convert speed to freedom units 63 | const windSpeed = (weatherData.currently.windSpeed * 1.61).toFixed(0); 64 | const pressure = weatherData.currently.pressure.toFixed(0); 65 | const icon = weatherData.currently.icon; 66 | const timezone = weatherData.timezone; 67 | 68 | const result = { 69 | location: location.address, 70 | // A temporary fix until the eventual refactor. 71 | address: location.address, 72 | offset, 73 | localTime, 74 | dateString, 75 | temperatureC, 76 | temperatureF, 77 | summary, 78 | humidity, 79 | windSpeed, 80 | pressure, 81 | icon, 82 | timezone, 83 | }; 84 | 85 | return result; 86 | }); 87 | } 88 | 89 | function generateEmbed(data, verbose) { 90 | const embed = new discord.RichEmbed(); 91 | 92 | if (verbose) { 93 | embed.setColor('#4286f4') 94 | .setFooter(`Local Time: ${data.dateString}`) 95 | .setTitle(`Weather in ${data.location}`) 96 | .addField('Summary', data.summary) 97 | .addField('Temperature °C', `${data.temperatureC} °C`, true) 98 | .addField('Temperature °F', `${data.temperatureF} °F`, true) 99 | .addField('Timezone', data.timezone, true) 100 | .addField('Humidity', `${data.humidity}%`, true) 101 | .addField('Wind Speed', `${data.windSpeed} km/h`, true) 102 | .addField('Air Pressure', `${data.pressure} mbar`, true) 103 | .setDescription(weatherConfig.icons[data.icon]); 104 | } else { 105 | embed.setColor('#4286f4') 106 | .setFooter(`Local Time: ${data.dateString}`) 107 | .setTitle(`Weather in ${data.address}`) 108 | .addField('Summary', data.summary) 109 | .addField('Temperature', `${data.temperatureC} °C / ${data.temperatureF} °F`, true) 110 | .addField('Humidity', `${data.humidity}%`, true) 111 | .setDescription(weatherConfig.icons[data.icon]); 112 | } 113 | 114 | return embed; 115 | } 116 | 117 | module.exports = { 118 | usage: [ 119 | 'weather
- brings current weather info for given address', 120 | 'weather -v
- brings additional weather info for given address', 121 | ], 122 | run: (bot, message, cmdArgs) => { 123 | if (!cmdArgs) return true; 124 | 125 | let args = cmdArgs.split(' '); 126 | const verbose = args[0] === '-v'; 127 | args = verbose ? args.slice(1) : args; 128 | 129 | getGeocodeData(args).then(getWeatherData) 130 | .then(data => generateEmbed(data, verbose)) 131 | .then(embed => message.channel.sendEmbed(embed)) 132 | .catch(err => message.channel.sendMessage(err.toString())); 133 | return false; 134 | }, 135 | init: (bot) => { 136 | weatherConfig = bot.settings.weather; 137 | tokens = bot.settings.tokens; 138 | }, 139 | }; 140 | -------------------------------------------------------------------------------- /commands/xkcd/xkcd.js: -------------------------------------------------------------------------------- 1 | const request = require('request-promise'); 2 | const cheerio = require('cheerio'); 3 | 4 | const ddgHeaders = { 5 | 'accept-language': 'en-US,en;q=0.8', 6 | 'upgrade-insecure-requests': 1, 7 | 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' + 8 | 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36', 9 | }; 10 | 11 | const ddgUrlTemplate = 'https://duckduckgo.com/html/?q=$q xkcd'; 12 | 13 | function parseXkcdDataFromXkcdUrl(xkcdUrl) { 14 | return request(xkcdUrl).then((xkcdBody) => { 15 | const xkcdData = JSON.parse(xkcdBody); 16 | 17 | if (xkcdData) { 18 | return '```diff\n' + 19 | `Title: ${xkcdData.safe_title}\n` + 20 | `Alt Text: ${xkcdData.alt}\n` + 21 | '```\n' + 22 | `${xkcdData.img}`; 23 | } 24 | // eslint-disable-next-line no-throw-literal 25 | throw 'I\'m sorry, there was a problem retrieving a XKCD.'; 26 | }); 27 | } 28 | 29 | function parseXkcdUrlFromDuckDuckGo(ddgBody) { 30 | const ddgParsed = cheerio.load(ddgBody); 31 | let xkcdUrl = false; 32 | 33 | try { 34 | ddgParsed('.result__a').each((i, link) => { 35 | const href = link.attribs.href; 36 | 37 | if (href.search(/^https?:\/\/(www\.)?xkcd\.com\/\d+/) !== -1 && xkcdUrl === false) { 38 | xkcdUrl = href + 'info.0.json'; 39 | } 40 | }); 41 | } catch (err) { 42 | // eslint-disable-next-line no-throw-literal 43 | throw 'There was a problem with DuckDuckGo query.'; 44 | } 45 | 46 | if (!xkcdUrl) { 47 | // eslint-disable-next-line no-throw-literal 48 | throw 'I\'m sorry, I couldn\'t find a xkcd.'; 49 | } else { 50 | return xkcdUrl; 51 | } 52 | } 53 | 54 | function findXkcdFromKeywords(keywords) { 55 | const ddgUrl = ddgUrlTemplate.replace('$q', encodeURI(keywords)); 56 | 57 | return request({ 58 | url: ddgUrl, 59 | headers: ddgHeaders, 60 | }).then(parseXkcdUrlFromDuckDuckGo) 61 | .then(parseXkcdDataFromXkcdUrl); 62 | } 63 | 64 | module.exports = { 65 | usage: 'xkcd - finds a xkcd comic with relevant keywords', 66 | run: (bot, message, cmdArgs) => { 67 | if (!cmdArgs) { 68 | return true; 69 | } 70 | 71 | findXkcdFromKeywords(cmdArgs).then((data) => { 72 | message.channel.sendMessage(data); 73 | }) 74 | .catch((err) => { 75 | message.channel.sendMessage(err); 76 | }); 77 | 78 | return false; 79 | }, 80 | }; 81 | -------------------------------------------------------------------------------- /lib/utils.js: -------------------------------------------------------------------------------- 1 | const time = { 2 | MAGNITUDES: [ 3 | [1000 * 60 * 60, 'hours'], 4 | [1000 * 60, 'minutes'], 5 | [1000, 'seconds'], 6 | [1, 'milliseconds'], 7 | ], 8 | 9 | timeElapsed(before, after) { 10 | let diff = Math.abs(after - before); 11 | return this.MAGNITUDES.reduce((out, m) => { 12 | const current = Math.floor(diff / m[0]); 13 | diff %= m[0]; 14 | if (out.length || current) { 15 | out.push(`${current} ${m[1]}`); 16 | } 17 | return out; 18 | }, []).join(', '); 19 | }, 20 | }; 21 | 22 | module.exports = { 23 | time, 24 | }; 25 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "TheAwesomeBot", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "acorn": { 8 | "version": "5.1.1", 9 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", 10 | "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", 11 | "dev": true 12 | }, 13 | "acorn-jsx": { 14 | "version": "3.0.1", 15 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", 16 | "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", 17 | "dev": true, 18 | "requires": { 19 | "acorn": "3.3.0" 20 | }, 21 | "dependencies": { 22 | "acorn": { 23 | "version": "3.3.0", 24 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", 25 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", 26 | "dev": true 27 | } 28 | } 29 | }, 30 | "ajv": { 31 | "version": "4.11.8", 32 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", 33 | "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", 34 | "requires": { 35 | "co": "4.6.0", 36 | "json-stable-stringify": "1.0.1" 37 | } 38 | }, 39 | "ajv-keywords": { 40 | "version": "1.5.1", 41 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", 42 | "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", 43 | "dev": true 44 | }, 45 | "ansi-escape": { 46 | "version": "1.1.0", 47 | "resolved": "https://registry.npmjs.org/ansi-escape/-/ansi-escape-1.1.0.tgz", 48 | "integrity": "sha1-ithZ6Epp4P+Rd5aUeTqS5OjAXpk=", 49 | "dev": true 50 | }, 51 | "ansi-escapes": { 52 | "version": "1.4.0", 53 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", 54 | "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", 55 | "dev": true 56 | }, 57 | "ansi-regex": { 58 | "version": "2.1.1", 59 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 60 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 61 | "dev": true 62 | }, 63 | "ansi-styles": { 64 | "version": "2.2.1", 65 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 66 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 67 | "dev": true 68 | }, 69 | "argparse": { 70 | "version": "1.0.9", 71 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", 72 | "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", 73 | "dev": true, 74 | "requires": { 75 | "sprintf-js": "1.0.3" 76 | } 77 | }, 78 | "aria-query": { 79 | "version": "0.3.0", 80 | "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-0.3.0.tgz", 81 | "integrity": "sha1-y4qZhOKGJxHIPICt5bj1yg3itGc=", 82 | "dev": true, 83 | "requires": { 84 | "ast-types-flow": "0.0.7" 85 | } 86 | }, 87 | "array-union": { 88 | "version": "1.0.2", 89 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 90 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 91 | "dev": true, 92 | "requires": { 93 | "array-uniq": "1.0.3" 94 | } 95 | }, 96 | "array-uniq": { 97 | "version": "1.0.3", 98 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 99 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 100 | "dev": true 101 | }, 102 | "array.prototype.find": { 103 | "version": "2.0.4", 104 | "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.0.4.tgz", 105 | "integrity": "sha1-VWpcU2LAhkgyPdrrnenRS8GGTJA=", 106 | "dev": true, 107 | "requires": { 108 | "define-properties": "1.1.2", 109 | "es-abstract": "1.8.1" 110 | } 111 | }, 112 | "arrify": { 113 | "version": "1.0.1", 114 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 115 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 116 | "dev": true 117 | }, 118 | "asn1": { 119 | "version": "0.2.3", 120 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 121 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" 122 | }, 123 | "assert-plus": { 124 | "version": "0.2.0", 125 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", 126 | "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" 127 | }, 128 | "ast-types-flow": { 129 | "version": "0.0.7", 130 | "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", 131 | "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", 132 | "dev": true 133 | }, 134 | "asynckit": { 135 | "version": "0.4.0", 136 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 137 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 138 | }, 139 | "aws-sign2": { 140 | "version": "0.6.0", 141 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", 142 | "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" 143 | }, 144 | "aws4": { 145 | "version": "1.6.0", 146 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", 147 | "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" 148 | }, 149 | "babel-code-frame": { 150 | "version": "6.26.0", 151 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 152 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 153 | "dev": true, 154 | "requires": { 155 | "chalk": "1.1.3", 156 | "esutils": "2.0.2", 157 | "js-tokens": "3.0.2" 158 | } 159 | }, 160 | "balanced-match": { 161 | "version": "1.0.0", 162 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 163 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 164 | "dev": true 165 | }, 166 | "bcrypt-pbkdf": { 167 | "version": "1.0.1", 168 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 169 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", 170 | "optional": true, 171 | "requires": { 172 | "tweetnacl": "0.14.5" 173 | } 174 | }, 175 | "bluebird": { 176 | "version": "2.11.0", 177 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", 178 | "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" 179 | }, 180 | "boolbase": { 181 | "version": "1.0.0", 182 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 183 | "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" 184 | }, 185 | "boom": { 186 | "version": "2.10.1", 187 | "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", 188 | "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", 189 | "requires": { 190 | "hoek": "2.16.3" 191 | } 192 | }, 193 | "brace-expansion": { 194 | "version": "1.1.8", 195 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 196 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 197 | "dev": true, 198 | "requires": { 199 | "balanced-match": "1.0.0", 200 | "concat-map": "0.0.1" 201 | } 202 | }, 203 | "builtin-modules": { 204 | "version": "1.1.1", 205 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 206 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 207 | "dev": true 208 | }, 209 | "caller-path": { 210 | "version": "0.1.0", 211 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 212 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 213 | "dev": true, 214 | "requires": { 215 | "callsites": "0.2.0" 216 | } 217 | }, 218 | "callsites": { 219 | "version": "0.2.0", 220 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 221 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", 222 | "dev": true 223 | }, 224 | "caseless": { 225 | "version": "0.12.0", 226 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 227 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 228 | }, 229 | "chalk": { 230 | "version": "1.1.3", 231 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 232 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 233 | "dev": true, 234 | "requires": { 235 | "ansi-styles": "2.2.1", 236 | "escape-string-regexp": "1.0.5", 237 | "has-ansi": "2.0.0", 238 | "strip-ansi": "3.0.1", 239 | "supports-color": "2.0.0" 240 | } 241 | }, 242 | "cheerio": { 243 | "version": "0.22.0", 244 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", 245 | "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", 246 | "requires": { 247 | "css-select": "1.2.0", 248 | "dom-serializer": "0.1.0", 249 | "entities": "1.1.1", 250 | "htmlparser2": "3.9.2", 251 | "lodash.assignin": "4.2.0", 252 | "lodash.bind": "4.2.1", 253 | "lodash.defaults": "4.2.0", 254 | "lodash.filter": "4.6.0", 255 | "lodash.flatten": "4.4.0", 256 | "lodash.foreach": "4.5.0", 257 | "lodash.map": "4.6.0", 258 | "lodash.merge": "4.6.0", 259 | "lodash.pick": "4.4.0", 260 | "lodash.reduce": "4.6.0", 261 | "lodash.reject": "4.6.0", 262 | "lodash.some": "4.6.0" 263 | } 264 | }, 265 | "circular-json": { 266 | "version": "0.3.3", 267 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 268 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", 269 | "dev": true 270 | }, 271 | "cli-cursor": { 272 | "version": "1.0.2", 273 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", 274 | "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", 275 | "dev": true, 276 | "requires": { 277 | "restore-cursor": "1.0.1" 278 | } 279 | }, 280 | "cli-width": { 281 | "version": "2.2.0", 282 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 283 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 284 | "dev": true 285 | }, 286 | "co": { 287 | "version": "4.6.0", 288 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 289 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 290 | }, 291 | "code-point-at": { 292 | "version": "1.1.0", 293 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 294 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", 295 | "dev": true 296 | }, 297 | "combined-stream": { 298 | "version": "1.0.5", 299 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", 300 | "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", 301 | "requires": { 302 | "delayed-stream": "1.0.0" 303 | } 304 | }, 305 | "commander": { 306 | "version": "2.11.0", 307 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 308 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", 309 | "dev": true 310 | }, 311 | "concat-map": { 312 | "version": "0.0.1", 313 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 314 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 315 | "dev": true 316 | }, 317 | "concat-stream": { 318 | "version": "1.6.0", 319 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", 320 | "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", 321 | "dev": true, 322 | "requires": { 323 | "inherits": "2.0.3", 324 | "readable-stream": "2.3.3", 325 | "typedarray": "0.0.6" 326 | } 327 | }, 328 | "contains-path": { 329 | "version": "0.1.0", 330 | "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", 331 | "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", 332 | "dev": true 333 | }, 334 | "core-util-is": { 335 | "version": "1.0.2", 336 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 337 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 338 | }, 339 | "cryptiles": { 340 | "version": "2.0.5", 341 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", 342 | "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", 343 | "requires": { 344 | "boom": "2.10.1" 345 | } 346 | }, 347 | "css-select": { 348 | "version": "1.2.0", 349 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", 350 | "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", 351 | "requires": { 352 | "boolbase": "1.0.0", 353 | "css-what": "2.1.0", 354 | "domutils": "1.5.1", 355 | "nth-check": "1.0.1" 356 | } 357 | }, 358 | "css-what": { 359 | "version": "2.1.0", 360 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", 361 | "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=" 362 | }, 363 | "d": { 364 | "version": "1.0.0", 365 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", 366 | "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", 367 | "dev": true, 368 | "requires": { 369 | "es5-ext": "0.10.30" 370 | } 371 | }, 372 | "damerau-levenshtein": { 373 | "version": "1.0.4", 374 | "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", 375 | "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=", 376 | "dev": true 377 | }, 378 | "dashdash": { 379 | "version": "1.14.1", 380 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 381 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 382 | "requires": { 383 | "assert-plus": "1.0.0" 384 | }, 385 | "dependencies": { 386 | "assert-plus": { 387 | "version": "1.0.0", 388 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 389 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 390 | } 391 | } 392 | }, 393 | "debug": { 394 | "version": "2.6.8", 395 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", 396 | "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", 397 | "dev": true, 398 | "requires": { 399 | "ms": "2.0.0" 400 | } 401 | }, 402 | "deep-equal": { 403 | "version": "1.0.1", 404 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 405 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", 406 | "dev": true 407 | }, 408 | "deep-is": { 409 | "version": "0.1.3", 410 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 411 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 412 | "dev": true 413 | }, 414 | "define-properties": { 415 | "version": "1.1.2", 416 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", 417 | "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", 418 | "dev": true, 419 | "requires": { 420 | "foreach": "2.0.5", 421 | "object-keys": "1.0.11" 422 | } 423 | }, 424 | "defined": { 425 | "version": "1.0.0", 426 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 427 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 428 | "dev": true 429 | }, 430 | "del": { 431 | "version": "2.2.2", 432 | "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", 433 | "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", 434 | "dev": true, 435 | "requires": { 436 | "globby": "5.0.0", 437 | "is-path-cwd": "1.0.0", 438 | "is-path-in-cwd": "1.0.0", 439 | "object-assign": "4.1.1", 440 | "pify": "2.3.0", 441 | "pinkie-promise": "2.0.1", 442 | "rimraf": "2.6.1" 443 | } 444 | }, 445 | "delayed-stream": { 446 | "version": "1.0.0", 447 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 448 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 449 | }, 450 | "discord.js": { 451 | "version": "11.1.0", 452 | "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-11.1.0.tgz", 453 | "integrity": "sha1-U1HVnjeY9TbeGXXpLK5NEa89kmY=", 454 | "requires": { 455 | "long": "3.2.0", 456 | "prism-media": "0.0.1", 457 | "snekfetch": "3.2.9", 458 | "tweetnacl": "0.14.5", 459 | "ws": "2.3.1" 460 | } 461 | }, 462 | "doctrine": { 463 | "version": "2.0.0", 464 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", 465 | "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", 466 | "dev": true, 467 | "requires": { 468 | "esutils": "2.0.2", 469 | "isarray": "1.0.0" 470 | } 471 | }, 472 | "dom-serializer": { 473 | "version": "0.1.0", 474 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", 475 | "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", 476 | "requires": { 477 | "domelementtype": "1.1.3", 478 | "entities": "1.1.1" 479 | }, 480 | "dependencies": { 481 | "domelementtype": { 482 | "version": "1.1.3", 483 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", 484 | "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" 485 | } 486 | } 487 | }, 488 | "domelementtype": { 489 | "version": "1.3.0", 490 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", 491 | "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" 492 | }, 493 | "domhandler": { 494 | "version": "2.4.1", 495 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", 496 | "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", 497 | "requires": { 498 | "domelementtype": "1.3.0" 499 | } 500 | }, 501 | "domutils": { 502 | "version": "1.5.1", 503 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", 504 | "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", 505 | "requires": { 506 | "dom-serializer": "0.1.0", 507 | "domelementtype": "1.3.0" 508 | } 509 | }, 510 | "ecc-jsbn": { 511 | "version": "0.1.1", 512 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 513 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 514 | "optional": true, 515 | "requires": { 516 | "jsbn": "0.1.1" 517 | } 518 | }, 519 | "emoji-regex": { 520 | "version": "6.5.1", 521 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", 522 | "integrity": "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==", 523 | "dev": true 524 | }, 525 | "entities": { 526 | "version": "1.1.1", 527 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", 528 | "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" 529 | }, 530 | "error-ex": { 531 | "version": "1.3.1", 532 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", 533 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", 534 | "dev": true, 535 | "requires": { 536 | "is-arrayish": "0.2.1" 537 | } 538 | }, 539 | "es-abstract": { 540 | "version": "1.8.1", 541 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.8.1.tgz", 542 | "integrity": "sha512-G6pkMLdmxF3dh4hbuYuQiku29rRqo9p5+iRf7mZTEELT/xZ/D9Vzg04ddlvzJuJuCmZp1WBbfbVLZEeygYNkpw==", 543 | "dev": true, 544 | "requires": { 545 | "es-to-primitive": "1.1.1", 546 | "function-bind": "1.1.1", 547 | "has": "1.0.1", 548 | "is-callable": "1.1.3", 549 | "is-regex": "1.0.4" 550 | } 551 | }, 552 | "es-to-primitive": { 553 | "version": "1.1.1", 554 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", 555 | "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", 556 | "dev": true, 557 | "requires": { 558 | "is-callable": "1.1.3", 559 | "is-date-object": "1.0.1", 560 | "is-symbol": "1.0.1" 561 | } 562 | }, 563 | "es5-ext": { 564 | "version": "0.10.30", 565 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", 566 | "integrity": "sha1-cUGhaDZpfbq/qq7uQUlc4p9SyTk=", 567 | "dev": true, 568 | "requires": { 569 | "es6-iterator": "2.0.1", 570 | "es6-symbol": "3.1.1" 571 | } 572 | }, 573 | "es6-iterator": { 574 | "version": "2.0.1", 575 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", 576 | "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", 577 | "dev": true, 578 | "requires": { 579 | "d": "1.0.0", 580 | "es5-ext": "0.10.30", 581 | "es6-symbol": "3.1.1" 582 | } 583 | }, 584 | "es6-map": { 585 | "version": "0.1.5", 586 | "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", 587 | "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", 588 | "dev": true, 589 | "requires": { 590 | "d": "1.0.0", 591 | "es5-ext": "0.10.30", 592 | "es6-iterator": "2.0.1", 593 | "es6-set": "0.1.5", 594 | "es6-symbol": "3.1.1", 595 | "event-emitter": "0.3.5" 596 | } 597 | }, 598 | "es6-set": { 599 | "version": "0.1.5", 600 | "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", 601 | "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", 602 | "dev": true, 603 | "requires": { 604 | "d": "1.0.0", 605 | "es5-ext": "0.10.30", 606 | "es6-iterator": "2.0.1", 607 | "es6-symbol": "3.1.1", 608 | "event-emitter": "0.3.5" 609 | } 610 | }, 611 | "es6-symbol": { 612 | "version": "3.1.1", 613 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", 614 | "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", 615 | "dev": true, 616 | "requires": { 617 | "d": "1.0.0", 618 | "es5-ext": "0.10.30" 619 | } 620 | }, 621 | "es6-weak-map": { 622 | "version": "2.0.2", 623 | "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", 624 | "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", 625 | "dev": true, 626 | "requires": { 627 | "d": "1.0.0", 628 | "es5-ext": "0.10.30", 629 | "es6-iterator": "2.0.1", 630 | "es6-symbol": "3.1.1" 631 | } 632 | }, 633 | "escape-string-regexp": { 634 | "version": "1.0.5", 635 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 636 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 637 | "dev": true 638 | }, 639 | "escope": { 640 | "version": "3.6.0", 641 | "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", 642 | "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", 643 | "dev": true, 644 | "requires": { 645 | "es6-map": "0.1.5", 646 | "es6-weak-map": "2.0.2", 647 | "esrecurse": "4.2.0", 648 | "estraverse": "4.2.0" 649 | } 650 | }, 651 | "eslint": { 652 | "version": "3.19.0", 653 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", 654 | "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", 655 | "dev": true, 656 | "requires": { 657 | "babel-code-frame": "6.26.0", 658 | "chalk": "1.1.3", 659 | "concat-stream": "1.6.0", 660 | "debug": "2.6.8", 661 | "doctrine": "2.0.0", 662 | "escope": "3.6.0", 663 | "espree": "3.5.0", 664 | "esquery": "1.0.0", 665 | "estraverse": "4.2.0", 666 | "esutils": "2.0.2", 667 | "file-entry-cache": "2.0.0", 668 | "glob": "7.1.2", 669 | "globals": "9.18.0", 670 | "ignore": "3.3.5", 671 | "imurmurhash": "0.1.4", 672 | "inquirer": "0.12.0", 673 | "is-my-json-valid": "2.16.1", 674 | "is-resolvable": "1.0.0", 675 | "js-yaml": "3.9.1", 676 | "json-stable-stringify": "1.0.1", 677 | "levn": "0.3.0", 678 | "lodash": "4.17.4", 679 | "mkdirp": "0.5.1", 680 | "natural-compare": "1.4.0", 681 | "optionator": "0.8.2", 682 | "path-is-inside": "1.0.2", 683 | "pluralize": "1.2.1", 684 | "progress": "1.1.8", 685 | "require-uncached": "1.0.3", 686 | "shelljs": "0.7.8", 687 | "strip-bom": "3.0.0", 688 | "strip-json-comments": "2.0.1", 689 | "table": "3.8.3", 690 | "text-table": "0.2.0", 691 | "user-home": "2.0.0" 692 | } 693 | }, 694 | "eslint-config-airbnb": { 695 | "version": "14.1.0", 696 | "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-14.1.0.tgz", 697 | "integrity": "sha1-NV0pAEC7+OAL+LSxn0twy+fCMX8=", 698 | "dev": true, 699 | "requires": { 700 | "eslint-config-airbnb-base": "11.3.2" 701 | } 702 | }, 703 | "eslint-config-airbnb-base": { 704 | "version": "11.3.2", 705 | "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-11.3.2.tgz", 706 | "integrity": "sha512-/fhjt/VqzBA2SRsx7ErDtv6Ayf+XLw9LIOqmpBuHFCVwyJo2EtzGWMB9fYRFBoWWQLxmNmCpenNiH0RxyeS41w==", 707 | "dev": true, 708 | "requires": { 709 | "eslint-restricted-globals": "0.1.1" 710 | } 711 | }, 712 | "eslint-import-resolver-node": { 713 | "version": "0.3.1", 714 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz", 715 | "integrity": "sha512-yUtXS15gIcij68NmXmP9Ni77AQuCN0itXbCc/jWd8C6/yKZaSNXicpC8cgvjnxVdmfsosIXrjpzFq7GcDryb6A==", 716 | "dev": true, 717 | "requires": { 718 | "debug": "2.6.8", 719 | "resolve": "1.4.0" 720 | } 721 | }, 722 | "eslint-module-utils": { 723 | "version": "2.1.1", 724 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", 725 | "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", 726 | "dev": true, 727 | "requires": { 728 | "debug": "2.6.8", 729 | "pkg-dir": "1.0.0" 730 | } 731 | }, 732 | "eslint-plugin-import": { 733 | "version": "2.7.0", 734 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.7.0.tgz", 735 | "integrity": "sha512-HGYmpU9f/zJaQiKNQOVfHUh2oLWW3STBrCgH0sHTX1xtsxYlH1zjLh8FlQGEIdZSdTbUMaV36WaZ6ImXkenGxQ==", 736 | "dev": true, 737 | "requires": { 738 | "builtin-modules": "1.1.1", 739 | "contains-path": "0.1.0", 740 | "debug": "2.6.8", 741 | "doctrine": "1.5.0", 742 | "eslint-import-resolver-node": "0.3.1", 743 | "eslint-module-utils": "2.1.1", 744 | "has": "1.0.1", 745 | "lodash.cond": "4.5.2", 746 | "minimatch": "3.0.4", 747 | "read-pkg-up": "2.0.0" 748 | }, 749 | "dependencies": { 750 | "doctrine": { 751 | "version": "1.5.0", 752 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 753 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 754 | "dev": true, 755 | "requires": { 756 | "esutils": "2.0.2", 757 | "isarray": "1.0.0" 758 | } 759 | } 760 | } 761 | }, 762 | "eslint-plugin-jsx-a11y": { 763 | "version": "4.0.0", 764 | "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-4.0.0.tgz", 765 | "integrity": "sha1-d5uw/nsI2lZKQiYkkR3hAGHgSO4=", 766 | "dev": true, 767 | "requires": { 768 | "aria-query": "0.3.0", 769 | "ast-types-flow": "0.0.7", 770 | "damerau-levenshtein": "1.0.4", 771 | "emoji-regex": "6.5.1", 772 | "jsx-ast-utils": "1.4.1", 773 | "object-assign": "4.1.1" 774 | } 775 | }, 776 | "eslint-plugin-react": { 777 | "version": "6.10.3", 778 | "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz", 779 | "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=", 780 | "dev": true, 781 | "requires": { 782 | "array.prototype.find": "2.0.4", 783 | "doctrine": "1.5.0", 784 | "has": "1.0.1", 785 | "jsx-ast-utils": "1.4.1", 786 | "object.assign": "4.0.4" 787 | }, 788 | "dependencies": { 789 | "doctrine": { 790 | "version": "1.5.0", 791 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 792 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 793 | "dev": true, 794 | "requires": { 795 | "esutils": "2.0.2", 796 | "isarray": "1.0.0" 797 | } 798 | } 799 | } 800 | }, 801 | "eslint-restricted-globals": { 802 | "version": "0.1.1", 803 | "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", 804 | "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", 805 | "dev": true 806 | }, 807 | "espree": { 808 | "version": "3.5.0", 809 | "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.0.tgz", 810 | "integrity": "sha1-mDWGJb3QVYYeon4oZ+pyn69GPY0=", 811 | "dev": true, 812 | "requires": { 813 | "acorn": "5.1.1", 814 | "acorn-jsx": "3.0.1" 815 | } 816 | }, 817 | "esprima": { 818 | "version": "4.0.0", 819 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", 820 | "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", 821 | "dev": true 822 | }, 823 | "esquery": { 824 | "version": "1.0.0", 825 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", 826 | "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", 827 | "dev": true, 828 | "requires": { 829 | "estraverse": "4.2.0" 830 | } 831 | }, 832 | "esrecurse": { 833 | "version": "4.2.0", 834 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", 835 | "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", 836 | "dev": true, 837 | "requires": { 838 | "estraverse": "4.2.0", 839 | "object-assign": "4.1.1" 840 | } 841 | }, 842 | "estraverse": { 843 | "version": "4.2.0", 844 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 845 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 846 | "dev": true 847 | }, 848 | "esutils": { 849 | "version": "2.0.2", 850 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 851 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 852 | "dev": true 853 | }, 854 | "event-emitter": { 855 | "version": "0.3.5", 856 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", 857 | "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", 858 | "dev": true, 859 | "requires": { 860 | "d": "1.0.0", 861 | "es5-ext": "0.10.30" 862 | } 863 | }, 864 | "exit-hook": { 865 | "version": "1.1.1", 866 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", 867 | "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", 868 | "dev": true 869 | }, 870 | "extend": { 871 | "version": "3.0.1", 872 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", 873 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" 874 | }, 875 | "extsprintf": { 876 | "version": "1.3.0", 877 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 878 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 879 | }, 880 | "fast-levenshtein": { 881 | "version": "2.0.6", 882 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 883 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 884 | "dev": true 885 | }, 886 | "figures": { 887 | "version": "1.7.0", 888 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 889 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", 890 | "dev": true, 891 | "requires": { 892 | "escape-string-regexp": "1.0.5", 893 | "object-assign": "4.1.1" 894 | } 895 | }, 896 | "file-entry-cache": { 897 | "version": "2.0.0", 898 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 899 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 900 | "dev": true, 901 | "requires": { 902 | "flat-cache": "1.2.2", 903 | "object-assign": "4.1.1" 904 | } 905 | }, 906 | "find-up": { 907 | "version": "1.1.2", 908 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 909 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 910 | "dev": true, 911 | "requires": { 912 | "path-exists": "2.1.0", 913 | "pinkie-promise": "2.0.1" 914 | } 915 | }, 916 | "flat-cache": { 917 | "version": "1.2.2", 918 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", 919 | "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", 920 | "dev": true, 921 | "requires": { 922 | "circular-json": "0.3.3", 923 | "del": "2.2.2", 924 | "graceful-fs": "4.1.11", 925 | "write": "0.2.1" 926 | } 927 | }, 928 | "for-each": { 929 | "version": "0.3.2", 930 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.2.tgz", 931 | "integrity": "sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ=", 932 | "dev": true, 933 | "requires": { 934 | "is-function": "1.0.1" 935 | } 936 | }, 937 | "foreach": { 938 | "version": "2.0.5", 939 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", 940 | "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", 941 | "dev": true 942 | }, 943 | "forever-agent": { 944 | "version": "0.6.1", 945 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 946 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 947 | }, 948 | "form-data": { 949 | "version": "2.1.4", 950 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", 951 | "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", 952 | "requires": { 953 | "asynckit": "0.4.0", 954 | "combined-stream": "1.0.5", 955 | "mime-types": "2.1.16" 956 | } 957 | }, 958 | "fs.realpath": { 959 | "version": "1.0.0", 960 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 961 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 962 | "dev": true 963 | }, 964 | "function-bind": { 965 | "version": "1.1.1", 966 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 967 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 968 | "dev": true 969 | }, 970 | "generate-function": { 971 | "version": "2.0.0", 972 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", 973 | "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", 974 | "dev": true 975 | }, 976 | "generate-object-property": { 977 | "version": "1.2.0", 978 | "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", 979 | "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", 980 | "dev": true, 981 | "requires": { 982 | "is-property": "1.0.2" 983 | } 984 | }, 985 | "getpass": { 986 | "version": "0.1.7", 987 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 988 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 989 | "requires": { 990 | "assert-plus": "1.0.0" 991 | }, 992 | "dependencies": { 993 | "assert-plus": { 994 | "version": "1.0.0", 995 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 996 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 997 | } 998 | } 999 | }, 1000 | "glob": { 1001 | "version": "7.1.2", 1002 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 1003 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 1004 | "dev": true, 1005 | "requires": { 1006 | "fs.realpath": "1.0.0", 1007 | "inflight": "1.0.6", 1008 | "inherits": "2.0.3", 1009 | "minimatch": "3.0.4", 1010 | "once": "1.4.0", 1011 | "path-is-absolute": "1.0.1" 1012 | } 1013 | }, 1014 | "globals": { 1015 | "version": "9.18.0", 1016 | "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", 1017 | "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", 1018 | "dev": true 1019 | }, 1020 | "globby": { 1021 | "version": "5.0.0", 1022 | "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", 1023 | "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", 1024 | "dev": true, 1025 | "requires": { 1026 | "array-union": "1.0.2", 1027 | "arrify": "1.0.1", 1028 | "glob": "7.1.2", 1029 | "object-assign": "4.1.1", 1030 | "pify": "2.3.0", 1031 | "pinkie-promise": "2.0.1" 1032 | } 1033 | }, 1034 | "graceful-fs": { 1035 | "version": "4.1.11", 1036 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 1037 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 1038 | "dev": true 1039 | }, 1040 | "har-schema": { 1041 | "version": "1.0.5", 1042 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", 1043 | "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" 1044 | }, 1045 | "har-validator": { 1046 | "version": "4.2.1", 1047 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", 1048 | "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", 1049 | "requires": { 1050 | "ajv": "4.11.8", 1051 | "har-schema": "1.0.5" 1052 | } 1053 | }, 1054 | "has": { 1055 | "version": "1.0.1", 1056 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", 1057 | "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", 1058 | "dev": true, 1059 | "requires": { 1060 | "function-bind": "1.1.1" 1061 | } 1062 | }, 1063 | "has-ansi": { 1064 | "version": "2.0.0", 1065 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1066 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1067 | "dev": true, 1068 | "requires": { 1069 | "ansi-regex": "2.1.1" 1070 | } 1071 | }, 1072 | "hawk": { 1073 | "version": "3.1.3", 1074 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", 1075 | "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", 1076 | "requires": { 1077 | "boom": "2.10.1", 1078 | "cryptiles": "2.0.5", 1079 | "hoek": "2.16.3", 1080 | "sntp": "1.0.9" 1081 | } 1082 | }, 1083 | "hoek": { 1084 | "version": "2.16.3", 1085 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", 1086 | "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" 1087 | }, 1088 | "hosted-git-info": { 1089 | "version": "2.5.0", 1090 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", 1091 | "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", 1092 | "dev": true 1093 | }, 1094 | "htmlparser2": { 1095 | "version": "3.9.2", 1096 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", 1097 | "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", 1098 | "requires": { 1099 | "domelementtype": "1.3.0", 1100 | "domhandler": "2.4.1", 1101 | "domutils": "1.5.1", 1102 | "entities": "1.1.1", 1103 | "inherits": "2.0.3", 1104 | "readable-stream": "2.3.3" 1105 | } 1106 | }, 1107 | "http-signature": { 1108 | "version": "1.1.1", 1109 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", 1110 | "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", 1111 | "requires": { 1112 | "assert-plus": "0.2.0", 1113 | "jsprim": "1.4.1", 1114 | "sshpk": "1.13.1" 1115 | } 1116 | }, 1117 | "ignore": { 1118 | "version": "3.3.5", 1119 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", 1120 | "integrity": "sha512-JLH93mL8amZQhh/p6mfQgVBH3M6epNq3DfsXsTSuSrInVjwyYlFE1nv2AgfRCC8PoOhM0jwQ5v8s9LgbK7yGDw==", 1121 | "dev": true 1122 | }, 1123 | "imurmurhash": { 1124 | "version": "0.1.4", 1125 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1126 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1127 | "dev": true 1128 | }, 1129 | "inflight": { 1130 | "version": "1.0.6", 1131 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1132 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1133 | "dev": true, 1134 | "requires": { 1135 | "once": "1.4.0", 1136 | "wrappy": "1.0.2" 1137 | } 1138 | }, 1139 | "inherits": { 1140 | "version": "2.0.3", 1141 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1142 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1143 | }, 1144 | "inquirer": { 1145 | "version": "0.12.0", 1146 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", 1147 | "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", 1148 | "dev": true, 1149 | "requires": { 1150 | "ansi-escapes": "1.4.0", 1151 | "ansi-regex": "2.1.1", 1152 | "chalk": "1.1.3", 1153 | "cli-cursor": "1.0.2", 1154 | "cli-width": "2.2.0", 1155 | "figures": "1.7.0", 1156 | "lodash": "4.17.4", 1157 | "readline2": "1.0.1", 1158 | "run-async": "0.1.0", 1159 | "rx-lite": "3.1.2", 1160 | "string-width": "1.0.2", 1161 | "strip-ansi": "3.0.1", 1162 | "through": "2.3.8" 1163 | } 1164 | }, 1165 | "interpret": { 1166 | "version": "1.0.3", 1167 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", 1168 | "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", 1169 | "dev": true 1170 | }, 1171 | "is-arrayish": { 1172 | "version": "0.2.1", 1173 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1174 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 1175 | "dev": true 1176 | }, 1177 | "is-builtin-module": { 1178 | "version": "1.0.0", 1179 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 1180 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", 1181 | "dev": true, 1182 | "requires": { 1183 | "builtin-modules": "1.1.1" 1184 | } 1185 | }, 1186 | "is-callable": { 1187 | "version": "1.1.3", 1188 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", 1189 | "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", 1190 | "dev": true 1191 | }, 1192 | "is-date-object": { 1193 | "version": "1.0.1", 1194 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 1195 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 1196 | "dev": true 1197 | }, 1198 | "is-finite": { 1199 | "version": "1.0.2", 1200 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 1201 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 1202 | "dev": true, 1203 | "requires": { 1204 | "number-is-nan": "1.0.1" 1205 | } 1206 | }, 1207 | "is-fullwidth-code-point": { 1208 | "version": "1.0.0", 1209 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1210 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1211 | "dev": true, 1212 | "requires": { 1213 | "number-is-nan": "1.0.1" 1214 | } 1215 | }, 1216 | "is-function": { 1217 | "version": "1.0.1", 1218 | "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", 1219 | "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=", 1220 | "dev": true 1221 | }, 1222 | "is-my-json-valid": { 1223 | "version": "2.16.1", 1224 | "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", 1225 | "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", 1226 | "dev": true, 1227 | "requires": { 1228 | "generate-function": "2.0.0", 1229 | "generate-object-property": "1.2.0", 1230 | "jsonpointer": "4.0.1", 1231 | "xtend": "4.0.1" 1232 | } 1233 | }, 1234 | "is-path-cwd": { 1235 | "version": "1.0.0", 1236 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", 1237 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", 1238 | "dev": true 1239 | }, 1240 | "is-path-in-cwd": { 1241 | "version": "1.0.0", 1242 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", 1243 | "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", 1244 | "dev": true, 1245 | "requires": { 1246 | "is-path-inside": "1.0.0" 1247 | } 1248 | }, 1249 | "is-path-inside": { 1250 | "version": "1.0.0", 1251 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", 1252 | "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", 1253 | "dev": true, 1254 | "requires": { 1255 | "path-is-inside": "1.0.2" 1256 | } 1257 | }, 1258 | "is-property": { 1259 | "version": "1.0.2", 1260 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", 1261 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", 1262 | "dev": true 1263 | }, 1264 | "is-regex": { 1265 | "version": "1.0.4", 1266 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 1267 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 1268 | "dev": true, 1269 | "requires": { 1270 | "has": "1.0.1" 1271 | } 1272 | }, 1273 | "is-resolvable": { 1274 | "version": "1.0.0", 1275 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", 1276 | "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", 1277 | "dev": true, 1278 | "requires": { 1279 | "tryit": "1.0.3" 1280 | } 1281 | }, 1282 | "is-symbol": { 1283 | "version": "1.0.1", 1284 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", 1285 | "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", 1286 | "dev": true 1287 | }, 1288 | "is-typedarray": { 1289 | "version": "1.0.0", 1290 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1291 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 1292 | }, 1293 | "isarray": { 1294 | "version": "1.0.0", 1295 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1296 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1297 | }, 1298 | "isstream": { 1299 | "version": "0.1.2", 1300 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1301 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 1302 | }, 1303 | "js-tokens": { 1304 | "version": "3.0.2", 1305 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 1306 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 1307 | "dev": true 1308 | }, 1309 | "js-yaml": { 1310 | "version": "3.9.1", 1311 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.1.tgz", 1312 | "integrity": "sha512-CbcG379L1e+mWBnLvHWWeLs8GyV/EMw862uLI3c+GxVyDHWZcjZinwuBd3iW2pgxgIlksW/1vNJa4to+RvDOww==", 1313 | "dev": true, 1314 | "requires": { 1315 | "argparse": "1.0.9", 1316 | "esprima": "4.0.0" 1317 | } 1318 | }, 1319 | "jsbn": { 1320 | "version": "0.1.1", 1321 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1322 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 1323 | "optional": true 1324 | }, 1325 | "json-schema": { 1326 | "version": "0.2.3", 1327 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1328 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 1329 | }, 1330 | "json-stable-stringify": { 1331 | "version": "1.0.1", 1332 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 1333 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 1334 | "requires": { 1335 | "jsonify": "0.0.0" 1336 | } 1337 | }, 1338 | "json-stringify-safe": { 1339 | "version": "5.0.1", 1340 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1341 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 1342 | }, 1343 | "jsonify": { 1344 | "version": "0.0.0", 1345 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 1346 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" 1347 | }, 1348 | "jsonpointer": { 1349 | "version": "4.0.1", 1350 | "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", 1351 | "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", 1352 | "dev": true 1353 | }, 1354 | "jsprim": { 1355 | "version": "1.4.1", 1356 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1357 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1358 | "requires": { 1359 | "assert-plus": "1.0.0", 1360 | "extsprintf": "1.3.0", 1361 | "json-schema": "0.2.3", 1362 | "verror": "1.10.0" 1363 | }, 1364 | "dependencies": { 1365 | "assert-plus": { 1366 | "version": "1.0.0", 1367 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 1368 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 1369 | } 1370 | } 1371 | }, 1372 | "jsx-ast-utils": { 1373 | "version": "1.4.1", 1374 | "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", 1375 | "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", 1376 | "dev": true 1377 | }, 1378 | "levn": { 1379 | "version": "0.3.0", 1380 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1381 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1382 | "dev": true, 1383 | "requires": { 1384 | "prelude-ls": "1.1.2", 1385 | "type-check": "0.3.2" 1386 | } 1387 | }, 1388 | "load-json-file": { 1389 | "version": "2.0.0", 1390 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", 1391 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", 1392 | "dev": true, 1393 | "requires": { 1394 | "graceful-fs": "4.1.11", 1395 | "parse-json": "2.2.0", 1396 | "pify": "2.3.0", 1397 | "strip-bom": "3.0.0" 1398 | } 1399 | }, 1400 | "locate-path": { 1401 | "version": "2.0.0", 1402 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 1403 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 1404 | "dev": true, 1405 | "requires": { 1406 | "p-locate": "2.0.0", 1407 | "path-exists": "3.0.0" 1408 | }, 1409 | "dependencies": { 1410 | "path-exists": { 1411 | "version": "3.0.0", 1412 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1413 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1414 | "dev": true 1415 | } 1416 | } 1417 | }, 1418 | "lodash": { 1419 | "version": "4.17.4", 1420 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 1421 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" 1422 | }, 1423 | "lodash.assignin": { 1424 | "version": "4.2.0", 1425 | "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", 1426 | "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" 1427 | }, 1428 | "lodash.bind": { 1429 | "version": "4.2.1", 1430 | "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", 1431 | "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" 1432 | }, 1433 | "lodash.cond": { 1434 | "version": "4.5.2", 1435 | "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", 1436 | "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", 1437 | "dev": true 1438 | }, 1439 | "lodash.defaults": { 1440 | "version": "4.2.0", 1441 | "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", 1442 | "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" 1443 | }, 1444 | "lodash.filter": { 1445 | "version": "4.6.0", 1446 | "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", 1447 | "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" 1448 | }, 1449 | "lodash.flatten": { 1450 | "version": "4.4.0", 1451 | "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", 1452 | "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" 1453 | }, 1454 | "lodash.foreach": { 1455 | "version": "4.5.0", 1456 | "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", 1457 | "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" 1458 | }, 1459 | "lodash.map": { 1460 | "version": "4.6.0", 1461 | "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", 1462 | "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" 1463 | }, 1464 | "lodash.merge": { 1465 | "version": "4.6.0", 1466 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", 1467 | "integrity": "sha1-aYhLoUSsM/5plzemCG3v+t0PicU=" 1468 | }, 1469 | "lodash.pick": { 1470 | "version": "4.4.0", 1471 | "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", 1472 | "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" 1473 | }, 1474 | "lodash.reduce": { 1475 | "version": "4.6.0", 1476 | "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", 1477 | "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" 1478 | }, 1479 | "lodash.reject": { 1480 | "version": "4.6.0", 1481 | "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", 1482 | "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" 1483 | }, 1484 | "lodash.some": { 1485 | "version": "4.6.0", 1486 | "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", 1487 | "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" 1488 | }, 1489 | "long": { 1490 | "version": "3.2.0", 1491 | "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", 1492 | "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" 1493 | }, 1494 | "mime-db": { 1495 | "version": "1.29.0", 1496 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", 1497 | "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=" 1498 | }, 1499 | "mime-types": { 1500 | "version": "2.1.16", 1501 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", 1502 | "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=", 1503 | "requires": { 1504 | "mime-db": "1.29.0" 1505 | } 1506 | }, 1507 | "minimatch": { 1508 | "version": "3.0.4", 1509 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1510 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1511 | "dev": true, 1512 | "requires": { 1513 | "brace-expansion": "1.1.8" 1514 | } 1515 | }, 1516 | "minimist": { 1517 | "version": "0.0.8", 1518 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1519 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1520 | "dev": true 1521 | }, 1522 | "mkdirp": { 1523 | "version": "0.5.1", 1524 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1525 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1526 | "dev": true, 1527 | "requires": { 1528 | "minimist": "0.0.8" 1529 | } 1530 | }, 1531 | "ms": { 1532 | "version": "2.0.0", 1533 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1534 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1535 | "dev": true 1536 | }, 1537 | "mute-stream": { 1538 | "version": "0.0.5", 1539 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", 1540 | "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", 1541 | "dev": true 1542 | }, 1543 | "natural-compare": { 1544 | "version": "1.4.0", 1545 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1546 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1547 | "dev": true 1548 | }, 1549 | "normalize-package-data": { 1550 | "version": "2.4.0", 1551 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", 1552 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", 1553 | "dev": true, 1554 | "requires": { 1555 | "hosted-git-info": "2.5.0", 1556 | "is-builtin-module": "1.0.0", 1557 | "semver": "5.4.1", 1558 | "validate-npm-package-license": "3.0.1" 1559 | } 1560 | }, 1561 | "nth-check": { 1562 | "version": "1.0.1", 1563 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", 1564 | "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", 1565 | "requires": { 1566 | "boolbase": "1.0.0" 1567 | } 1568 | }, 1569 | "number-is-nan": { 1570 | "version": "1.0.1", 1571 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1572 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 1573 | "dev": true 1574 | }, 1575 | "oauth-sign": { 1576 | "version": "0.8.2", 1577 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 1578 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" 1579 | }, 1580 | "object-assign": { 1581 | "version": "4.1.1", 1582 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1583 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1584 | "dev": true 1585 | }, 1586 | "object-inspect": { 1587 | "version": "1.3.0", 1588 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.3.0.tgz", 1589 | "integrity": "sha512-OHHnLgLNXpM++GnJRyyhbr2bwl3pPVm4YvaraHrRvDt/N3r+s/gDVHciA7EJBTkijKXj61ssgSAikq1fb0IBRg==", 1590 | "dev": true 1591 | }, 1592 | "object-keys": { 1593 | "version": "1.0.11", 1594 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", 1595 | "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", 1596 | "dev": true 1597 | }, 1598 | "object.assign": { 1599 | "version": "4.0.4", 1600 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", 1601 | "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", 1602 | "dev": true, 1603 | "requires": { 1604 | "define-properties": "1.1.2", 1605 | "function-bind": "1.1.1", 1606 | "object-keys": "1.0.11" 1607 | } 1608 | }, 1609 | "once": { 1610 | "version": "1.4.0", 1611 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1612 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1613 | "dev": true, 1614 | "requires": { 1615 | "wrappy": "1.0.2" 1616 | } 1617 | }, 1618 | "onetime": { 1619 | "version": "1.1.0", 1620 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", 1621 | "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", 1622 | "dev": true 1623 | }, 1624 | "optionator": { 1625 | "version": "0.8.2", 1626 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 1627 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1628 | "dev": true, 1629 | "requires": { 1630 | "deep-is": "0.1.3", 1631 | "fast-levenshtein": "2.0.6", 1632 | "levn": "0.3.0", 1633 | "prelude-ls": "1.1.2", 1634 | "type-check": "0.3.2", 1635 | "wordwrap": "1.0.0" 1636 | } 1637 | }, 1638 | "os-homedir": { 1639 | "version": "1.0.2", 1640 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1641 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 1642 | "dev": true 1643 | }, 1644 | "p-limit": { 1645 | "version": "1.1.0", 1646 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", 1647 | "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", 1648 | "dev": true 1649 | }, 1650 | "p-locate": { 1651 | "version": "2.0.0", 1652 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1653 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1654 | "dev": true, 1655 | "requires": { 1656 | "p-limit": "1.1.0" 1657 | } 1658 | }, 1659 | "parse-json": { 1660 | "version": "2.2.0", 1661 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1662 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1663 | "dev": true, 1664 | "requires": { 1665 | "error-ex": "1.3.1" 1666 | } 1667 | }, 1668 | "parse-ms": { 1669 | "version": "1.0.1", 1670 | "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", 1671 | "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", 1672 | "dev": true 1673 | }, 1674 | "path-exists": { 1675 | "version": "2.1.0", 1676 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 1677 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 1678 | "dev": true, 1679 | "requires": { 1680 | "pinkie-promise": "2.0.1" 1681 | } 1682 | }, 1683 | "path-is-absolute": { 1684 | "version": "1.0.1", 1685 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1686 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1687 | "dev": true 1688 | }, 1689 | "path-is-inside": { 1690 | "version": "1.0.2", 1691 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1692 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1693 | "dev": true 1694 | }, 1695 | "path-parse": { 1696 | "version": "1.0.5", 1697 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 1698 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 1699 | "dev": true 1700 | }, 1701 | "path-type": { 1702 | "version": "2.0.0", 1703 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", 1704 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", 1705 | "dev": true, 1706 | "requires": { 1707 | "pify": "2.3.0" 1708 | } 1709 | }, 1710 | "performance-now": { 1711 | "version": "0.2.0", 1712 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", 1713 | "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" 1714 | }, 1715 | "pify": { 1716 | "version": "2.3.0", 1717 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1718 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1719 | "dev": true 1720 | }, 1721 | "pinkie": { 1722 | "version": "2.0.4", 1723 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1724 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 1725 | "dev": true 1726 | }, 1727 | "pinkie-promise": { 1728 | "version": "2.0.1", 1729 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1730 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1731 | "dev": true, 1732 | "requires": { 1733 | "pinkie": "2.0.4" 1734 | } 1735 | }, 1736 | "pkg-dir": { 1737 | "version": "1.0.0", 1738 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", 1739 | "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", 1740 | "dev": true, 1741 | "requires": { 1742 | "find-up": "1.1.2" 1743 | } 1744 | }, 1745 | "plur": { 1746 | "version": "1.0.0", 1747 | "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", 1748 | "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", 1749 | "dev": true 1750 | }, 1751 | "pluralize": { 1752 | "version": "1.2.1", 1753 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", 1754 | "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", 1755 | "dev": true 1756 | }, 1757 | "prelude-ls": { 1758 | "version": "1.1.2", 1759 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1760 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1761 | "dev": true 1762 | }, 1763 | "pretty-ms": { 1764 | "version": "2.1.0", 1765 | "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", 1766 | "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", 1767 | "dev": true, 1768 | "requires": { 1769 | "is-finite": "1.0.2", 1770 | "parse-ms": "1.0.1", 1771 | "plur": "1.0.0" 1772 | } 1773 | }, 1774 | "prism-media": { 1775 | "version": "0.0.1", 1776 | "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-0.0.1.tgz", 1777 | "integrity": "sha1-o0JcnKvVDRxsAuVDlBoRiVZnvRA=" 1778 | }, 1779 | "process-nextick-args": { 1780 | "version": "1.0.7", 1781 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 1782 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" 1783 | }, 1784 | "progress": { 1785 | "version": "1.1.8", 1786 | "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", 1787 | "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", 1788 | "dev": true 1789 | }, 1790 | "punycode": { 1791 | "version": "1.4.1", 1792 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1793 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 1794 | }, 1795 | "qs": { 1796 | "version": "6.4.0", 1797 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", 1798 | "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" 1799 | }, 1800 | "re-emitter": { 1801 | "version": "1.1.3", 1802 | "resolved": "https://registry.npmjs.org/re-emitter/-/re-emitter-1.1.3.tgz", 1803 | "integrity": "sha1-+p4xn/3u6zWycpbvDz03TawvUqc=", 1804 | "dev": true 1805 | }, 1806 | "read-pkg": { 1807 | "version": "2.0.0", 1808 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", 1809 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", 1810 | "dev": true, 1811 | "requires": { 1812 | "load-json-file": "2.0.0", 1813 | "normalize-package-data": "2.4.0", 1814 | "path-type": "2.0.0" 1815 | } 1816 | }, 1817 | "read-pkg-up": { 1818 | "version": "2.0.0", 1819 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", 1820 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", 1821 | "dev": true, 1822 | "requires": { 1823 | "find-up": "2.1.0", 1824 | "read-pkg": "2.0.0" 1825 | }, 1826 | "dependencies": { 1827 | "find-up": { 1828 | "version": "2.1.0", 1829 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 1830 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 1831 | "dev": true, 1832 | "requires": { 1833 | "locate-path": "2.0.0" 1834 | } 1835 | } 1836 | } 1837 | }, 1838 | "readable-stream": { 1839 | "version": "2.3.3", 1840 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 1841 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 1842 | "requires": { 1843 | "core-util-is": "1.0.2", 1844 | "inherits": "2.0.3", 1845 | "isarray": "1.0.0", 1846 | "process-nextick-args": "1.0.7", 1847 | "safe-buffer": "5.1.1", 1848 | "string_decoder": "1.0.3", 1849 | "util-deprecate": "1.0.2" 1850 | } 1851 | }, 1852 | "readline2": { 1853 | "version": "1.0.1", 1854 | "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", 1855 | "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", 1856 | "dev": true, 1857 | "requires": { 1858 | "code-point-at": "1.1.0", 1859 | "is-fullwidth-code-point": "1.0.0", 1860 | "mute-stream": "0.0.5" 1861 | } 1862 | }, 1863 | "rechoir": { 1864 | "version": "0.6.2", 1865 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 1866 | "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", 1867 | "dev": true, 1868 | "requires": { 1869 | "resolve": "1.4.0" 1870 | } 1871 | }, 1872 | "replit-client": { 1873 | "version": "0.19.0", 1874 | "resolved": "https://registry.npmjs.org/replit-client/-/replit-client-0.19.0.tgz", 1875 | "integrity": "sha1-g47xZuEQxocGX6M/yUA5AffNdkg=", 1876 | "requires": { 1877 | "bluebird": "2.11.0" 1878 | } 1879 | }, 1880 | "request": { 1881 | "version": "2.81.0", 1882 | "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", 1883 | "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", 1884 | "requires": { 1885 | "aws-sign2": "0.6.0", 1886 | "aws4": "1.6.0", 1887 | "caseless": "0.12.0", 1888 | "combined-stream": "1.0.5", 1889 | "extend": "3.0.1", 1890 | "forever-agent": "0.6.1", 1891 | "form-data": "2.1.4", 1892 | "har-validator": "4.2.1", 1893 | "hawk": "3.1.3", 1894 | "http-signature": "1.1.1", 1895 | "is-typedarray": "1.0.0", 1896 | "isstream": "0.1.2", 1897 | "json-stringify-safe": "5.0.1", 1898 | "mime-types": "2.1.16", 1899 | "oauth-sign": "0.8.2", 1900 | "performance-now": "0.2.0", 1901 | "qs": "6.4.0", 1902 | "safe-buffer": "5.1.1", 1903 | "stringstream": "0.0.5", 1904 | "tough-cookie": "2.3.2", 1905 | "tunnel-agent": "0.6.0", 1906 | "uuid": "3.1.0" 1907 | } 1908 | }, 1909 | "request-promise": { 1910 | "version": "4.2.1", 1911 | "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.1.tgz", 1912 | "integrity": "sha1-fuxWyJMXqCLL/qmbA5zlQ8LhX2c=", 1913 | "requires": { 1914 | "bluebird": "3.5.0", 1915 | "request-promise-core": "1.1.1", 1916 | "stealthy-require": "1.1.1", 1917 | "tough-cookie": "2.3.2" 1918 | }, 1919 | "dependencies": { 1920 | "bluebird": { 1921 | "version": "3.5.0", 1922 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", 1923 | "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" 1924 | } 1925 | } 1926 | }, 1927 | "request-promise-core": { 1928 | "version": "1.1.1", 1929 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", 1930 | "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", 1931 | "requires": { 1932 | "lodash": "4.17.4" 1933 | } 1934 | }, 1935 | "require-uncached": { 1936 | "version": "1.0.3", 1937 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 1938 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 1939 | "dev": true, 1940 | "requires": { 1941 | "caller-path": "0.1.0", 1942 | "resolve-from": "1.0.1" 1943 | } 1944 | }, 1945 | "resolve": { 1946 | "version": "1.4.0", 1947 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", 1948 | "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", 1949 | "dev": true, 1950 | "requires": { 1951 | "path-parse": "1.0.5" 1952 | } 1953 | }, 1954 | "resolve-from": { 1955 | "version": "1.0.1", 1956 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 1957 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 1958 | "dev": true 1959 | }, 1960 | "restore-cursor": { 1961 | "version": "1.0.1", 1962 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", 1963 | "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", 1964 | "dev": true, 1965 | "requires": { 1966 | "exit-hook": "1.1.1", 1967 | "onetime": "1.1.0" 1968 | } 1969 | }, 1970 | "resumer": { 1971 | "version": "0.0.0", 1972 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 1973 | "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", 1974 | "dev": true, 1975 | "requires": { 1976 | "through": "2.3.8" 1977 | } 1978 | }, 1979 | "rimraf": { 1980 | "version": "2.6.1", 1981 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", 1982 | "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", 1983 | "dev": true, 1984 | "requires": { 1985 | "glob": "7.1.2" 1986 | } 1987 | }, 1988 | "run-async": { 1989 | "version": "0.1.0", 1990 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", 1991 | "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", 1992 | "dev": true, 1993 | "requires": { 1994 | "once": "1.4.0" 1995 | } 1996 | }, 1997 | "rx-lite": { 1998 | "version": "3.1.2", 1999 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", 2000 | "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", 2001 | "dev": true 2002 | }, 2003 | "safe-buffer": { 2004 | "version": "5.1.1", 2005 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 2006 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 2007 | }, 2008 | "semver": { 2009 | "version": "5.4.1", 2010 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", 2011 | "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", 2012 | "dev": true 2013 | }, 2014 | "shelljs": { 2015 | "version": "0.7.8", 2016 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", 2017 | "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", 2018 | "dev": true, 2019 | "requires": { 2020 | "glob": "7.1.2", 2021 | "interpret": "1.0.3", 2022 | "rechoir": "0.6.2" 2023 | } 2024 | }, 2025 | "slice-ansi": { 2026 | "version": "0.0.4", 2027 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", 2028 | "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", 2029 | "dev": true 2030 | }, 2031 | "snekfetch": { 2032 | "version": "3.2.9", 2033 | "resolved": "https://registry.npmjs.org/snekfetch/-/snekfetch-3.2.9.tgz", 2034 | "integrity": "sha512-0ZYxGRMtgBska6uQ616F0jcPYad/sLe+uBJJ2vewD62ftEFnh6rY5mza05KoUS5UWcclMuiUfAZSf10ZYnkOZA==" 2035 | }, 2036 | "sntp": { 2037 | "version": "1.0.9", 2038 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", 2039 | "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", 2040 | "requires": { 2041 | "hoek": "2.16.3" 2042 | } 2043 | }, 2044 | "spdx-correct": { 2045 | "version": "1.0.2", 2046 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", 2047 | "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", 2048 | "dev": true, 2049 | "requires": { 2050 | "spdx-license-ids": "1.2.2" 2051 | } 2052 | }, 2053 | "spdx-expression-parse": { 2054 | "version": "1.0.4", 2055 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", 2056 | "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", 2057 | "dev": true 2058 | }, 2059 | "spdx-license-ids": { 2060 | "version": "1.2.2", 2061 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", 2062 | "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", 2063 | "dev": true 2064 | }, 2065 | "split": { 2066 | "version": "1.0.1", 2067 | "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", 2068 | "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", 2069 | "dev": true, 2070 | "requires": { 2071 | "through": "2.3.8" 2072 | } 2073 | }, 2074 | "sprintf-js": { 2075 | "version": "1.0.3", 2076 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2077 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2078 | "dev": true 2079 | }, 2080 | "sshpk": { 2081 | "version": "1.13.1", 2082 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", 2083 | "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", 2084 | "requires": { 2085 | "asn1": "0.2.3", 2086 | "assert-plus": "1.0.0", 2087 | "bcrypt-pbkdf": "1.0.1", 2088 | "dashdash": "1.14.1", 2089 | "ecc-jsbn": "0.1.1", 2090 | "getpass": "0.1.7", 2091 | "jsbn": "0.1.1", 2092 | "tweetnacl": "0.14.5" 2093 | }, 2094 | "dependencies": { 2095 | "assert-plus": { 2096 | "version": "1.0.0", 2097 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 2098 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 2099 | } 2100 | } 2101 | }, 2102 | "stealthy-require": { 2103 | "version": "1.1.1", 2104 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", 2105 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" 2106 | }, 2107 | "string_decoder": { 2108 | "version": "1.0.3", 2109 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 2110 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 2111 | "requires": { 2112 | "safe-buffer": "5.1.1" 2113 | } 2114 | }, 2115 | "string-width": { 2116 | "version": "1.0.2", 2117 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 2118 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 2119 | "dev": true, 2120 | "requires": { 2121 | "code-point-at": "1.1.0", 2122 | "is-fullwidth-code-point": "1.0.0", 2123 | "strip-ansi": "3.0.1" 2124 | } 2125 | }, 2126 | "string.prototype.trim": { 2127 | "version": "1.1.2", 2128 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", 2129 | "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", 2130 | "dev": true, 2131 | "requires": { 2132 | "define-properties": "1.1.2", 2133 | "es-abstract": "1.8.1", 2134 | "function-bind": "1.1.1" 2135 | } 2136 | }, 2137 | "stringstream": { 2138 | "version": "0.0.5", 2139 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", 2140 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" 2141 | }, 2142 | "strip-ansi": { 2143 | "version": "3.0.1", 2144 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2145 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2146 | "dev": true, 2147 | "requires": { 2148 | "ansi-regex": "2.1.1" 2149 | } 2150 | }, 2151 | "strip-bom": { 2152 | "version": "3.0.0", 2153 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 2154 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 2155 | "dev": true 2156 | }, 2157 | "strip-json-comments": { 2158 | "version": "2.0.1", 2159 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2160 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 2161 | "dev": true 2162 | }, 2163 | "supports-color": { 2164 | "version": "2.0.0", 2165 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 2166 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 2167 | "dev": true 2168 | }, 2169 | "table": { 2170 | "version": "3.8.3", 2171 | "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", 2172 | "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", 2173 | "dev": true, 2174 | "requires": { 2175 | "ajv": "4.11.8", 2176 | "ajv-keywords": "1.5.1", 2177 | "chalk": "1.1.3", 2178 | "lodash": "4.17.4", 2179 | "slice-ansi": "0.0.4", 2180 | "string-width": "2.1.1" 2181 | }, 2182 | "dependencies": { 2183 | "ansi-regex": { 2184 | "version": "3.0.0", 2185 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 2186 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 2187 | "dev": true 2188 | }, 2189 | "is-fullwidth-code-point": { 2190 | "version": "2.0.0", 2191 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 2192 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 2193 | "dev": true 2194 | }, 2195 | "string-width": { 2196 | "version": "2.1.1", 2197 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 2198 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 2199 | "dev": true, 2200 | "requires": { 2201 | "is-fullwidth-code-point": "2.0.0", 2202 | "strip-ansi": "4.0.0" 2203 | } 2204 | }, 2205 | "strip-ansi": { 2206 | "version": "4.0.0", 2207 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 2208 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 2209 | "dev": true, 2210 | "requires": { 2211 | "ansi-regex": "3.0.0" 2212 | } 2213 | } 2214 | } 2215 | }, 2216 | "tap-out": { 2217 | "version": "1.4.2", 2218 | "resolved": "https://registry.npmjs.org/tap-out/-/tap-out-1.4.2.tgz", 2219 | "integrity": "sha1-yQfsG/lAURHQiCY+kvVgi4jLs3o=", 2220 | "dev": true, 2221 | "requires": { 2222 | "re-emitter": "1.1.3", 2223 | "readable-stream": "2.3.3", 2224 | "split": "1.0.1", 2225 | "trim": "0.0.1" 2226 | } 2227 | }, 2228 | "tap-summary": { 2229 | "version": "3.0.2", 2230 | "resolved": "https://registry.npmjs.org/tap-summary/-/tap-summary-3.0.2.tgz", 2231 | "integrity": "sha1-Zp06OFRik/6snS1fwcRfbkqBHJk=", 2232 | "dev": true, 2233 | "requires": { 2234 | "ansi-escape": "1.1.0", 2235 | "commander": "2.11.0", 2236 | "figures": "1.7.0", 2237 | "pretty-ms": "2.1.0", 2238 | "tap-out": "1.4.2" 2239 | } 2240 | }, 2241 | "tape": { 2242 | "version": "4.8.0", 2243 | "resolved": "https://registry.npmjs.org/tape/-/tape-4.8.0.tgz", 2244 | "integrity": "sha512-TWILfEnvO7I8mFe35d98F6T5fbLaEtbFTG/lxWvid8qDfFTxt19EBijWmB4j3+Hoh5TfHE2faWs73ua+EphuBA==", 2245 | "dev": true, 2246 | "requires": { 2247 | "deep-equal": "1.0.1", 2248 | "defined": "1.0.0", 2249 | "for-each": "0.3.2", 2250 | "function-bind": "1.1.1", 2251 | "glob": "7.1.2", 2252 | "has": "1.0.1", 2253 | "inherits": "2.0.3", 2254 | "minimist": "1.2.0", 2255 | "object-inspect": "1.3.0", 2256 | "resolve": "1.4.0", 2257 | "resumer": "0.0.0", 2258 | "string.prototype.trim": "1.1.2", 2259 | "through": "2.3.8" 2260 | }, 2261 | "dependencies": { 2262 | "minimist": { 2263 | "version": "1.2.0", 2264 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 2265 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 2266 | "dev": true 2267 | } 2268 | } 2269 | }, 2270 | "text-table": { 2271 | "version": "0.2.0", 2272 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2273 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 2274 | "dev": true 2275 | }, 2276 | "through": { 2277 | "version": "2.3.8", 2278 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2279 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 2280 | "dev": true 2281 | }, 2282 | "tough-cookie": { 2283 | "version": "2.3.2", 2284 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", 2285 | "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", 2286 | "requires": { 2287 | "punycode": "1.4.1" 2288 | } 2289 | }, 2290 | "trim": { 2291 | "version": "0.0.1", 2292 | "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", 2293 | "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", 2294 | "dev": true 2295 | }, 2296 | "tryit": { 2297 | "version": "1.0.3", 2298 | "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", 2299 | "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", 2300 | "dev": true 2301 | }, 2302 | "tunnel-agent": { 2303 | "version": "0.6.0", 2304 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2305 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 2306 | "requires": { 2307 | "safe-buffer": "5.1.1" 2308 | } 2309 | }, 2310 | "tweetnacl": { 2311 | "version": "0.14.5", 2312 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 2313 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 2314 | }, 2315 | "type-check": { 2316 | "version": "0.3.2", 2317 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 2318 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 2319 | "dev": true, 2320 | "requires": { 2321 | "prelude-ls": "1.1.2" 2322 | } 2323 | }, 2324 | "typedarray": { 2325 | "version": "0.0.6", 2326 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 2327 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 2328 | "dev": true 2329 | }, 2330 | "ultron": { 2331 | "version": "1.1.0", 2332 | "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.0.tgz", 2333 | "integrity": "sha1-sHoualQagV/Go0zNRTO67DB8qGQ=" 2334 | }, 2335 | "user-home": { 2336 | "version": "2.0.0", 2337 | "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", 2338 | "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", 2339 | "dev": true, 2340 | "requires": { 2341 | "os-homedir": "1.0.2" 2342 | } 2343 | }, 2344 | "util-deprecate": { 2345 | "version": "1.0.2", 2346 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2347 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2348 | }, 2349 | "uuid": { 2350 | "version": "3.1.0", 2351 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", 2352 | "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" 2353 | }, 2354 | "validate-npm-package-license": { 2355 | "version": "3.0.1", 2356 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", 2357 | "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", 2358 | "dev": true, 2359 | "requires": { 2360 | "spdx-correct": "1.0.2", 2361 | "spdx-expression-parse": "1.0.4" 2362 | } 2363 | }, 2364 | "verror": { 2365 | "version": "1.10.0", 2366 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 2367 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 2368 | "requires": { 2369 | "assert-plus": "1.0.0", 2370 | "core-util-is": "1.0.2", 2371 | "extsprintf": "1.3.0" 2372 | }, 2373 | "dependencies": { 2374 | "assert-plus": { 2375 | "version": "1.0.0", 2376 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 2377 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 2378 | } 2379 | } 2380 | }, 2381 | "wordwrap": { 2382 | "version": "1.0.0", 2383 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 2384 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 2385 | "dev": true 2386 | }, 2387 | "wrappy": { 2388 | "version": "1.0.2", 2389 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2390 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2391 | "dev": true 2392 | }, 2393 | "write": { 2394 | "version": "0.2.1", 2395 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 2396 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 2397 | "dev": true, 2398 | "requires": { 2399 | "mkdirp": "0.5.1" 2400 | } 2401 | }, 2402 | "ws": { 2403 | "version": "2.3.1", 2404 | "resolved": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz", 2405 | "integrity": "sha1-a5Sz5EfLajY/eF6vlK9jWejoHIA=", 2406 | "requires": { 2407 | "safe-buffer": "5.0.1", 2408 | "ultron": "1.1.0" 2409 | }, 2410 | "dependencies": { 2411 | "safe-buffer": { 2412 | "version": "5.0.1", 2413 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", 2414 | "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" 2415 | } 2416 | } 2417 | }, 2418 | "xmlhttprequest": { 2419 | "version": "1.8.0", 2420 | "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", 2421 | "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" 2422 | }, 2423 | "xtend": { 2424 | "version": "4.0.1", 2425 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 2426 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", 2427 | "dev": true 2428 | } 2429 | } 2430 | } 2431 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "TheAwesomeBot", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "TheAwesomeBot.js", 6 | "scripts": { 7 | "start": "node start.js", 8 | "test": "if [ \"$TRAVIS_PULL_REQUEST\" = \"false\" ]; then node test/*.js | tap-summary --no-progress; fi", 9 | "lint": "eslint" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/rgoliveira/AwesomeBot.git" 14 | }, 15 | "author": "", 16 | "license": "MIT", 17 | "bugs": { 18 | "url": "https://github.com/rgoliveira/AwesomeBot/issues" 19 | }, 20 | "homepage": "https://github.com/rgoliveira/AwesomeBot", 21 | "dependencies": { 22 | "cheerio": "^0.22.0", 23 | "discord.js": "^11.0.0", 24 | "replit-client": "^0.19.0", 25 | "request": "^2.81.0", 26 | "request-promise": "^4.2.0", 27 | "xmlhttprequest": "^1.8.0" 28 | }, 29 | "devDependencies": { 30 | "eslint": "^3.0.1", 31 | "eslint-config-airbnb": "^14.1.0", 32 | "eslint-plugin-import": "^2.2.0", 33 | "eslint-plugin-jsx-a11y": "^4.0.0", 34 | "eslint-plugin-react": "^6.9.0", 35 | "tap-summary": "^3.0.1", 36 | "tape": "^4.6.3" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "bot_cmd": "!bot", 3 | "voting": { 4 | "immuneRoles": ["Admins", "Mods"], 5 | "voteThreshold": 5, 6 | "timeout_in_minutes": 5 7 | }, 8 | "xkcd": { 9 | "timeLimit": 60, 10 | "limitMessages": false 11 | }, 12 | "weather": { 13 | "icons": { 14 | "clear-day": ":sunny:", 15 | "clear-night": ":crescent_moon:", 16 | "rain": ":cloud_rain:", 17 | "snow": ":cloud_snow:", 18 | "sleet": ":cloud_snow:", 19 | "partly-cloudy-day": ":partly_sunny:", 20 | "partly-cloudy-night": ":partly_sunny:", 21 | "fog": ":fog:", 22 | "cloudy":":cloud:", 23 | "wind": ":wind_blowing_face:" 24 | } 25 | }, 26 | "info":{ 27 | "repo":"rgoliveira/awesomebot" 28 | }, 29 | "commands": [ 30 | "help", 31 | "eval", 32 | "pro", 33 | "stream", 34 | "uptime", 35 | "vote", 36 | "xkcd", 37 | "weather", 38 | "server", 39 | "pbf", 40 | "quickref", 41 | "info" 42 | ] 43 | } 44 | -------------------------------------------------------------------------------- /start.js: -------------------------------------------------------------------------------- 1 | const Bot = require('./TheAwesomeBot.js'); 2 | const Tokens = require('./tokens.json'); 3 | 4 | function start() { 5 | // check for the discord token 6 | let jsonToken = false; 7 | if (Tokens) { 8 | jsonToken = Tokens.discord; 9 | } 10 | const token = jsonToken || process.env.DISCORD_TOKEN; 11 | if (!token) { 12 | throw Error('Discord token not set'); 13 | } 14 | 15 | (new Bot(token).init()); 16 | } 17 | 18 | start(); 19 | 20 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | const test = require('tape'); 2 | const TheAwesomeBot = require('../TheAwesomeBot'); 3 | 4 | const token = process.env.DISCORD_TOKEN || require('../tokens.json').discord; // eslint-disable-line global-require 5 | 6 | test('connect & disconnect', (t) => { 7 | t.timeoutAfter(15000); 8 | t.ok(token, 'discord token should be set'); 9 | 10 | const bot = new TheAwesomeBot(token); 11 | t.false(bot.isReady, 'bot should not be ready'); 12 | bot.init(); 13 | // wait for it to be ready 14 | const si = setInterval(() => { 15 | if (bot.isReady) { 16 | bot.deinit().then(() => { 17 | clearInterval(si); 18 | t.end(); 19 | }); 20 | } 21 | }, 5000); 22 | }); 23 | -------------------------------------------------------------------------------- /tokens.json.example: -------------------------------------------------------------------------------- 1 | { 2 | "discord": "", 3 | "google_geocode": "", 4 | "darksky": "", 5 | "replit": "" 6 | } 7 | --------------------------------------------------------------------------------