diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 17a7059f8..698fa4473 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -21,7 +21,7 @@ Use the provided `.eslintrc.json` to lint your files, include any ignores in you ### Running -1. Get a bot token from the [discord application dashboard here](https://discordapp.com/developers/applications/me) and use it in a copy of `pm2.json`, we ignore `genesis.json` by default in our `.gitignore`. +1. Get a bot token from the [discord application dashboard here](https://discordapp.com/developers/applications/me) and use it in a copy of `pm2.json`, we ignore `genesis.json` by default in our `.gitignore`. 2. Install [pm2](http://pm2.keymetrics.io/docs/usage/quick-start/). @@ -33,7 +33,7 @@ Use the provided `.eslintrc.json` to lint your files, include any ignores in you 6. Invite the bot to your server using the format: -`https://discordapp.com/oauth2/authorize?scope=bot&client_id=&permissions=`. +`https://discordapp.com/oauth2/authorize?scope=bot&client_id=&permissions=`. ### Resources @@ -43,14 +43,12 @@ Use the provided `.eslintrc.json` to lint your files, include any ignores in you * warframe-nexus-query [Docs](https://warframe-community-developers.github.io/warframe-nexus-query) -* warframe-location-query [Docs](https://warframe-community-developers.github.io/warframe-location-query) - * Contact Tobiah on Discord [Cephalon Genesis guild](https://discord.gg/0onjYYKuUBHiR3LK) ## Contributors Nspace * Awesome dude who's working on porting and updating the accumulated tech debt caused by hubot - + Tobiah * Other dude who's helping, writing features, debugging, and sometimes sleeping diff --git a/main.js b/main.js index d451fe9b0..7fbf79f9c 100644 --- a/main.js +++ b/main.js @@ -1,9 +1,7 @@ 'use strict'; const cluster = require('cluster'); -const Nexus = require('warframe-nexus-query'); const Cache = require('json-fetch-cache'); -const NexusFetcher = require('nexus-stats-api'); const Raven = require('raven'); const DataCache = require('./src/resources/DropCache.js'); @@ -37,18 +35,6 @@ process.on('unhandledRejection', (err) => { logger.error(err); }); -const nexusOptions = { - user_key: process.env.NEXUSSTATS_USER_KEY || undefined, - user_secret: process.env.NEXUSSTATS_USER_SECRET || undefined, - api_url: process.env.NEXUS_API_OVERRIDE || undefined, - auth_url: process.env.NEXUS_AUTH_OVERRIDE || undefined, - ignore_limiter: true, -}; - -const nexusFetcher = new NexusFetcher(nexusOptions.nexusKey - && nexusOptions.nexusSecret ? nexusOptions : {}); - -const nexusQuerier = new Nexus(nexusFetcher); const caches = { pc: new Cache('https://api.warframestat.us/pc', 600000), @@ -71,9 +57,7 @@ if (cluster.isMaster) { prefix: process.env.PREFIX, logger, owner: process.env.OWNER, - nexusQuerier, caches, - nexusFetcher, }); shard.start(); } diff --git a/package-lock.json b/package-lock.json index cabeffb6f..b48cae5ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,11 +27,6 @@ } } }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" - }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", @@ -106,11 +101,6 @@ "es-abstract": "1.10.0" } }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" - }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -133,11 +123,6 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, - "async-delay-queue": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/async-delay-queue/-/async-delay-queue-1.0.7.tgz", - "integrity": "sha512-8sVKF391QgwlThu2jyDyi1SQtFODWofZdndYGIkXjOjxTkn0WKqkrqJGmIkSocXuM7sB3z+yGUVTbmzhybpf+w==" - }, "async-limiter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", @@ -172,12 +157,8 @@ "babylon": { "version": "7.0.0-beta.19", "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.19.tgz", - "integrity": "sha1-6SjH6AfpcOBTaweKs+DEj54FJQM=" - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + "integrity": "sha1-6SjH6AfpcOBTaweKs+DEj54FJQM=", + "dev": true }, "balanced-match": { "version": "1.0.0", @@ -185,11 +166,6 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" - }, "bcrypt-pbkdf": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", @@ -207,40 +183,11 @@ } } }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "requires": { - "callsite": "1.0.0" - } - }, - "blitz-js-query": { - "version": "0.2.19", - "resolved": "https://registry.npmjs.org/blitz-js-query/-/blitz-js-query-0.2.19.tgz", - "integrity": "sha512-hHR7FEpaFK9o7hlASfJZS86SjH7rzlHcEe/BoCgRFdw05Tb6wpmeEs+jGX94+m6Sw7Fpx9jUyKntN1/T5MODZA==", - "requires": { - "async-delay-queue": "1.0.7", - "request": "2.83.0", - "request-promise": "4.2.2", - "socket.io-client": "2.0.4" - } - }, - "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" - }, "bluebird": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" - }, "boom": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", @@ -309,6 +256,7 @@ "version": "0.8.9", "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.9.tgz", "integrity": "sha1-mMyJDKZS3S7w5ws3klMQ/56Q/Is=", + "dev": true, "requires": { "underscore-contrib": "0.3.0" } @@ -337,29 +285,10 @@ "supports-color": "2.0.0" } }, - "cheerio": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.19.0.tgz", - "integrity": "sha1-dy5wFfLuKZZQltcepBdbdas1SSU=", - "requires": { - "css-select": "1.0.0", - "dom-serializer": "0.1.0", - "entities": "1.1.1", - "htmlparser2": "3.8.3", - "lodash": "3.10.1" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" - } - } - }, - "chroma-js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-1.3.5.tgz", - "integrity": "sha512-pk279zimJnZccV/OsLCzH9z67vEHdkLdodTn2iooNLjSNnv4+TX1Fc9Ed6OvJveQXIWT4HRVr7t2f5SMWPM8jg==" + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" }, "circular-json": { "version": "0.3.3", @@ -425,21 +354,6 @@ "graceful-readlink": "1.0.1" } }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -473,6 +387,11 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" + }, "cryptiles": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", @@ -491,30 +410,6 @@ } } }, - "css-select": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.0.0.tgz", - "integrity": "sha1-sRIcpRhI3SZOIkTQWM7iVN7rRLA=", - "requires": { - "boolbase": "1.0.0", - "css-what": "1.0.0", - "domutils": "1.4.3", - "nth-check": "1.0.1" - } - }, - "css-what": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-1.0.0.tgz", - "integrity": "sha1-18wt9FGAZm+Z0rFEYmOUaeAPc2w=" - }, - "cwise-compiler": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cwise-compiler/-/cwise-compiler-1.1.3.tgz", - "integrity": "sha1-9NZnQQ6FDToxOn0tt7HlBbsDTMU=", - "requires": { - "uniq": "1.0.1" - } - }, "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", @@ -538,23 +433,19 @@ "assert-plus": "1.0.0" } }, - "data-uri-to-buffer": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-0.0.3.tgz", - "integrity": "sha1-GK6XmmoMqZSwYlhTkW0mYruuCxo=" - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "requires": { "ms": "2.0.0" } }, "decache": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/decache/-/decache-4.3.0.tgz", - "integrity": "sha1-o5XkBwlWmKyKbe8B8qaky3Y49jU=", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/decache/-/decache-4.4.0.tgz", + "integrity": "sha1-b232uF1+fEQQqTL/wmSJt46azRM=", "requires": { "callsite": "1.0.0" } @@ -615,7 +506,7 @@ "denque": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/denque/-/denque-1.2.2.tgz", - "integrity": "sha1-4Gz3zw2outyIy9qr+PwKcNZZ8dQ=" + "integrity": "sha512-x92Ql74lcTbGylXILO9Xf9S0cMpEPP04zVp2bB9e2C7G/n/Q1SgLl78RaSYEPSgpDX9uLgQXCEGAS5BI5dP3yA==" }, "diff": { "version": "3.2.0", @@ -648,6 +539,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, "requires": { "domelementtype": "1.1.3", "entities": "1.1.1" @@ -656,27 +548,22 @@ "domelementtype": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true } } }, "domelementtype": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true }, "domhandler": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "requires": { - "domelementtype": "1.3.0" - } - }, - "domutils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.4.3.tgz", - "integrity": "sha1-CGVRN5bGswYDGFDhdVFrr4C3Km8=", + "dev": true, "requires": { "domelementtype": "1.3.0" } @@ -690,52 +577,11 @@ "jsbn": "0.1.1" } }, - "engine.io-client": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.4.tgz", - "integrity": "sha1-T88TcLRxY70s6b4nM5ckMDUNTqE=", - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "2.6.9", - "engine.io-parser": "2.1.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "3.3.3", - "xmlhttprequest-ssl": "1.5.5", - "yeast": "0.1.2" - }, - "dependencies": { - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "requires": { - "async-limiter": "1.0.0", - "safe-buffer": "5.1.1", - "ultron": "1.1.1" - } - } - } - }, - "engine.io-parser": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", - "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.4", - "has-binary2": "1.0.2" - } - }, "entities": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true }, "error-ex": { "version": "1.3.1", @@ -843,7 +689,8 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "escope": { "version": "3.6.0", @@ -1204,56 +1051,6 @@ "is-property": "1.0.2" } }, - "get-image-colors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/get-image-colors/-/get-image-colors-1.8.1.tgz", - "integrity": "sha1-/iuFZBtkkO30uM5r+H9ZEvtfgxs=", - "requires": { - "chroma-js": "1.3.5", - "get-pixels": "3.3.0", - "get-rgba-palette": "2.0.1", - "get-svg-colors": "1.4.0", - "pify": "2.3.0" - } - }, - "get-pixels": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/get-pixels/-/get-pixels-3.3.0.tgz", - "integrity": "sha1-jZeVvq4YhQuED3SVgbrcBdPjbkE=", - "requires": { - "data-uri-to-buffer": "0.0.3", - "jpeg-js": "0.1.2", - "mime-types": "2.1.17", - "ndarray": "1.0.18", - "ndarray-pack": "1.2.1", - "node-bitmap": "0.0.1", - "omggif": "1.0.9", - "parse-data-uri": "0.2.0", - "pngjs": "2.3.1", - "request": "2.83.0", - "through": "2.3.8" - } - }, - "get-rgba-palette": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/get-rgba-palette/-/get-rgba-palette-2.0.1.tgz", - "integrity": "sha1-XOcPdcbvUogvVN0Hnl7Wi1ojI8o=", - "requires": { - "quantize": "1.0.2" - } - }, - "get-svg-colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-svg-colors/-/get-svg-colors-1.4.0.tgz", - "integrity": "sha512-7AOzW0XUgNG8hy9OdJV6AbojstBn0R2WoB0Nzudro80JQXo6rVzxJgkaLc70qaXazv+NC8o0OvLfk3nll2zxAw==", - "requires": { - "cheerio": "0.19.0", - "chroma-js": "1.3.5", - "is-svg": "1.1.1", - "lodash.compact": "3.0.1", - "lodash.uniq": "3.2.2" - } - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -1299,7 +1096,8 @@ "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true }, "graceful-readlink": { "version": "1.0.1", @@ -1345,26 +1143,6 @@ "ansi-regex": "2.1.1" } }, - "has-binary2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz", - "integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=", - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", @@ -1405,55 +1183,6 @@ "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=", "dev": true }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.3.0", - "domutils": "1.5.1", - "entities": "1.0.0", - "readable-stream": "1.1.14" - }, - "dependencies": { - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" - } - }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -1475,25 +1204,12 @@ "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", "dev": true }, - "image-downloader": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/image-downloader/-/image-downloader-3.3.0.tgz", - "integrity": "sha1-/vB+qPRZCJKm8xhXupfsi9qq0MQ=", - "requires": { - "request": "2.83.0" - } - }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -1546,11 +1262,6 @@ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", "dev": true }, - "iota-array": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz", - "integrity": "sha1-ge9X/l0FgUzVjCSDYyqZwwoOgIc=" - }, "is": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", @@ -1654,11 +1365,6 @@ "integrity": "sha512-y5CXYbzvB3jTnWAZH1Nl7ykUWb6T3BcTs56HUruwBf8MhF56n1HWqhDWnVFo8GHrUPDgvUUNVhrc2U8W7iqz5g==", "dev": true }, - "is-svg": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-1.1.1.tgz", - "integrity": "sha1-rA76r7ZTrFhHNwix+HNjbKEQ4xs=" - }, "is-symbol": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", @@ -1680,11 +1386,6 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, - "jpeg-js": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.1.2.tgz", - "integrity": "sha1-E1uZLAV1yYXPoPSUoyJ+0jhYPs4=" - }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -1704,7 +1405,7 @@ "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=", "dev": true } } @@ -1713,6 +1414,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz", "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=", + "dev": true, "requires": { "xmlcreate": "1.0.2" } @@ -1727,6 +1429,7 @@ "version": "3.5.5", "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.5.tgz", "integrity": "sha1-SEUhsSboGQTWMv+D7JqqCWcI+k0=", + "dev": true, "requires": { "babylon": "7.0.0-beta.19", "bluebird": "3.5.1", @@ -1815,6 +1518,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/klaw/-/klaw-2.0.0.tgz", "integrity": "sha1-WcEo4Nxc5BAgEVEZTuucv4WGUPY=", + "dev": true, "requires": { "graceful-fs": "4.1.11" } @@ -1874,17 +1578,6 @@ "lodash.keys": "3.1.2" } }, - "lodash._basecallback": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/lodash._basecallback/-/lodash._basecallback-3.3.1.tgz", - "integrity": "sha1-t7K7Q9whYEJKIczybFfkQ3cqjic=", - "requires": { - "lodash._baseisequal": "3.0.7", - "lodash._bindcallback": "3.0.1", - "lodash.isarray": "3.0.4", - "lodash.pairs": "3.0.1" - } - }, "lodash._basecopy": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", @@ -1897,58 +1590,17 @@ "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", "dev": true }, - "lodash._baseindexof": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz", - "integrity": "sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw=" - }, - "lodash._baseisequal": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz", - "integrity": "sha1-2AJfdjOdKTQnZ9zIh85cuVpbUfE=", - "requires": { - "lodash.isarray": "3.0.4", - "lodash.istypedarray": "3.0.6", - "lodash.keys": "3.1.2" - } - }, - "lodash._baseuniq": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-3.0.3.tgz", - "integrity": "sha1-ISP6DbLWnCjVvrHB821hUip0AjQ=", - "requires": { - "lodash._baseindexof": "3.1.0", - "lodash._cacheindexof": "3.0.2", - "lodash._createcache": "3.1.2" - } - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" - }, - "lodash._cacheindexof": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz", - "integrity": "sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI=" - }, - "lodash._createcache": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash._createcache/-/lodash._createcache-3.1.2.tgz", - "integrity": "sha1-VtagZAF2JeeevKa4AY4XRAvc8JM=", - "requires": { - "lodash._getnative": "3.9.1" - } - }, "lodash._getnative": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true }, "lodash._isiterateecall": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true }, "lodash.clonedeep": { "version": "4.5.0", @@ -1956,11 +1608,6 @@ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, - "lodash.compact": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.compact/-/lodash.compact-3.0.1.tgz", - "integrity": "sha1-VAzjg3dFl1gHRx4WtKK6IeclbKU=" - }, "lodash.cond": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", @@ -1987,22 +1634,20 @@ "lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true }, "lodash.isarray": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" - }, - "lodash.istypedarray": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz", - "integrity": "sha1-yaR3SYYHUB2OhJTSg7h8OSgc72I=" + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true }, "lodash.keys": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, "requires": { "lodash._getnative": "3.9.1", "lodash.isarguments": "3.1.0", @@ -2015,26 +1660,6 @@ "integrity": "sha1-FQzwoWeR9ZA7iJHqsVRgknS96lU=", "dev": true }, - "lodash.pairs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.pairs/-/lodash.pairs-3.0.1.tgz", - "integrity": "sha1-u+CNV4bu6qCaFckevw3LfSvjJqk=", - "requires": { - "lodash.keys": "3.1.2" - } - }, - "lodash.uniq": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-3.2.2.tgz", - "integrity": "sha1-FGw28l510ZUBukAuiLoUk39jzYs=", - "requires": { - "lodash._basecallback": "3.3.1", - "lodash._baseuniq": "3.0.3", - "lodash._getnative": "3.9.1", - "lodash._isiterateecall": "3.0.9", - "lodash.isarray": "3.0.4" - } - }, "lolex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", @@ -2049,7 +1674,7 @@ "lru-cache": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" @@ -2063,7 +1688,18 @@ "marked": { "version": "0.3.12", "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.12.tgz", - "integrity": "sha512-k4NaW+vS7ytQn6MgJn3fYpQt20/mOgYM5Ft9BYMfQJDz2QT6yEeS9XJ8k2Nw8JTeWK/znPPW2n3UJGzyYEiMoA==" + "integrity": "sha512-k4NaW+vS7ytQn6MgJn3fYpQt20/mOgYM5Ft9BYMfQJDz2QT6yEeS9XJ8k2Nw8JTeWK/znPPW2n3UJGzyYEiMoA==", + "dev": true + }, + "md5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", + "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "1.1.6" + } }, "mime-db": { "version": "1.30.0", @@ -2090,12 +1726,14 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "requires": { "minimist": "0.0.8" } @@ -2169,7 +1807,8 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, "mute-stream": { "version": "0.0.5", @@ -2178,15 +1817,15 @@ "dev": true }, "mysql2": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-1.5.1.tgz", - "integrity": "sha1-JBHW+5WK+GsjBLelO8VLJud+aCs=", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-1.5.2.tgz", + "integrity": "sha512-976p3FxXdNMRRiF6Qe/FCOwaUYw3KXVJiIYu5iE5shM7ggIASgF6G/9gd9rhpBqP8V6MVa3KQJ6Ao1xBeGBljw==", "requires": { "cardinal": "1.0.0", "denque": "1.2.2", "generate-function": "2.0.0", "iconv-lite": "0.4.19", - "long": "3.2.0", + "long": "4.0.0", "lru-cache": "4.1.1", "named-placeholders": "1.1.1", "object-assign": "4.1.1", @@ -2194,6 +1833,13 @@ "safe-buffer": "5.1.1", "seq-queue": "0.0.5", "sqlstring": "2.3.0" + }, + "dependencies": { + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + } } }, "named-placeholders": { @@ -2217,37 +1863,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "ndarray": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.18.tgz", - "integrity": "sha1-tg06cyJOxVXQ+qeXEeUCRI/T95M=", - "requires": { - "iota-array": "1.0.0", - "is-buffer": "1.1.6" - } - }, - "ndarray-pack": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ndarray-pack/-/ndarray-pack-1.2.1.tgz", - "integrity": "sha1-jK6+qqJNXs9w/4YCBjeXfajuWFo=", - "requires": { - "cwise-compiler": "1.1.3", - "ndarray": "1.0.18" - } - }, - "nexus-stats-api": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/nexus-stats-api/-/nexus-stats-api-0.2.4.tgz", - "integrity": "sha512-YALl4ebJqldAysgqddp9JwXClC/CZhxrRH8nwgUCSO/3H94QiLE1xp0ZW4W/xVPYsVX3V7eSLDNaR7jxEd6O/g==", - "requires": { - "blitz-js-query": "0.2.19" - } - }, - "node-bitmap": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/node-bitmap/-/node-bitmap-0.0.1.tgz", - "integrity": "sha1-GA6scAPgxwdhjvMTaPYvhLKmkJE=" - }, "node-md-config": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/node-md-config/-/node-md-config-2.0.1.tgz", @@ -2275,14 +1890,6 @@ "validate-npm-package-license": "3.0.1" } }, - "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "requires": { - "boolbase": "1.0.0" - } - }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -2299,11 +1906,6 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" - }, "object-keys": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", @@ -2322,11 +1924,6 @@ "object-keys": "1.0.11" } }, - "omggif": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.9.tgz", - "integrity": "sha1-3LcCTazVDFK00wPwSALJHAV8dl8=" - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2394,14 +1991,6 @@ "repeat-string": "1.6.1" } }, - "parse-data-uri": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/parse-data-uri/-/parse-data-uri-0.2.0.tgz", - "integrity": "sha1-vwTYUd1ch7CrI45dAazklLYEtMk=", - "requires": { - "data-uri-to-buffer": "0.0.3" - } - }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -2411,22 +2000,6 @@ "error-ex": "1.3.1" } }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "requires": { - "better-assert": "1.0.2" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "requires": { - "better-assert": "1.0.2" - } - }, "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", @@ -2471,7 +2044,8 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true }, "ping": { "version": "0.2.2", @@ -2512,11 +2086,6 @@ "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", "dev": true }, - "pngjs": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-2.3.1.tgz", - "integrity": "sha1-EdHhK5y2TWPjDBQ6Mw9MH1Z9qF8=" - }, "postcss": { "version": "6.0.16", "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz", @@ -2612,18 +2181,14 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" }, - "quantize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/quantize/-/quantize-1.0.2.tgz", - "integrity": "sha1-0lrCAKd7bXD0ASfKFxoQ4zyFRt4=" - }, "raven": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/raven/-/raven-2.3.0.tgz", - "integrity": "sha1-lvFTRr2qQzs7bUcTCARQYVWDPWk=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raven/-/raven-2.4.0.tgz", + "integrity": "sha1-SbfV+DjliT8x3XL4LQWjXkIgP2A=", "requires": { "cookie": "0.3.1", "lsmod": "1.0.0", + "md5": "2.2.1", "stack-trace": "0.0.9", "timed-out": "4.0.1", "uuid": "3.0.0" @@ -2777,6 +2342,7 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.1.tgz", "integrity": "sha1-aUPDUwxNmn5G8c3dUcFY/GcM294=", + "dev": true, "requires": { "underscore": "1.6.0" }, @@ -2784,7 +2350,8 @@ "underscore": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=" + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true } } }, @@ -2989,44 +2556,6 @@ "hoek": "4.2.0" } }, - "socket.io-client": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz", - "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=", - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "2.6.9", - "engine.io-client": "3.1.4", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "3.1.2", - "to-array": "0.1.4" - } - }, - "socket.io-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.2.tgz", - "integrity": "sha1-28IoIVH8T6675Aru3Ady66YZ9/I=", - "requires": { - "component-emitter": "1.2.1", - "debug": "2.6.9", - "has-binary2": "1.0.2", - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - } - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3155,7 +2684,8 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true }, "supports-color": { "version": "2.0.0", @@ -3223,7 +2753,8 @@ "taffydb": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", - "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=" + "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", + "dev": true }, "text-table": { "version": "0.2.0", @@ -3234,18 +2765,14 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" - }, "tough-cookie": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", @@ -3302,6 +2829,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/underscore-contrib/-/underscore-contrib-0.3.0.tgz", "integrity": "sha1-ZltmwkeD+PorGMn4y7Dix9SMJsc=", + "dev": true, "requires": { "underscore": "1.6.0" }, @@ -3309,15 +2837,11 @@ "underscore": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=" + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true } } }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" - }, "user-home": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", @@ -3374,39 +2898,6 @@ "extsprintf": "1.3.0" } }, - "warframe-location-query": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/warframe-location-query/-/warframe-location-query-0.0.3.tgz", - "integrity": "sha1-gHCC90HYu67IfTbj0KVHnzq78f8=", - "requires": { - "jsdoc": "3.5.5", - "json-fetch-cache": "0.0.5", - "json-query": "2.2.2", - "node-md-config": "2.0.1" - } - }, - "warframe-nexus-query": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/warframe-nexus-query/-/warframe-nexus-query-1.3.11.tgz", - "integrity": "sha512-2ibj5yHnH/0zIBi5o1jPyhJk3vxEWpmS4fREPmYNjcWU1mpD4155dDD2jvIcgxBJsJaNeFvErmHOZMcZ+ScJ6w==", - "requires": { - "get-image-colors": "1.8.1", - "image-downloader": "3.3.0", - "json-fetch-cache": "0.1.3", - "json-query": "2.2.2", - "nexus-stats-api": "0.2.4", - "node-md-config": "2.0.1", - "request": "2.83.0", - "request-promise": "4.2.2" - }, - "dependencies": { - "json-fetch-cache": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/json-fetch-cache/-/json-fetch-cache-0.1.3.tgz", - "integrity": "sha1-yO5qH9KSrk6yCemSBdng7YgZbDw=" - } - } - }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -3441,12 +2932,8 @@ "xmlcreate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz", - "integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=" - }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" + "integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=", + "dev": true }, "xtend": { "version": "4.0.1", @@ -3458,11 +2945,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" } } } diff --git a/package.json b/package.json index dc105cc26..ce00c64ff 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,10 @@ "main": "main.js", "scripts": { "test": "npm i", - "build-docs": "node_modules/.bin/jsdoc -t ./node_modules/ink-docstrap/template -c jsdoc.conf -R README.md -r main.js src/. -d docs" + "build-docs": "node_modules/.bin/jsdoc -t ./node_modules/ink-docstrap/template -c jsdoc.conf -R README.md -r main.js src/. -d docs", + "start": "pm2 start genesis.json && pm2 logs genesis", + "preinstall": "npm i -g pm2", + "restart": "pm2 delete genesis && pm2 start genesis.json && pm2 logs genesis" }, "repository": { "type": "git", @@ -22,27 +25,24 @@ ], "author": "warframe-community-developers", "contributors": [ - "aliasfalse (https://github.com/aliasfalse)", + "tobitenno (https://github.com/tobitenno)", "nspacestd (https://github.com/nspacestd)" ], "dependencies": { "bluebird": "^3.5.0", - "decache": "^4.3.0", + "decache": "^4.4.0", "discord.js": "^11.3.0", "json-fetch-cache": "0.0.5", "json-query": "^2.2.2", - "mysql2": "^1.5.1", - "nexus-stats-api": "^0.2.4", + "mysql2": "^1.5.2", "node-md-config": "^2.0.1", "node-wikia": "0.0.3", "pad-left": "^2.1.0", "ping": "^0.2.2", - "raven": "^2.3.0", + "raven": "^2.4.0", "request-promise": "^4.2.2", "right-pad": "^1.0.1", - "sql-template-strings": "^2.2.2", - "warframe-location-query": "0.0.3", - "warframe-nexus-query": "^1.3.5" + "sql-template-strings": "^2.2.2" }, "devDependencies": { "chai": "^3.5.0", diff --git a/src/Logger.js b/src/Logger.js index 25e20c650..c1147b19a 100644 --- a/src/Logger.js +++ b/src/Logger.js @@ -29,11 +29,21 @@ const levels = [ levels.forEach((level) => { Logger.prototype[level.toLowerCase()] = (message) => { if ((levels.indexOf(level) >= levels.indexOf(logLevel)) && levels.indexOf(level) < 3) { - // eslint-disable-next-line no-console - console.log(`[${level}] ${message}`); + const logMsg = `[${level}] ${message}`; + if (logMsg.indexOf('[object Object]') === -1 && logMsg.indexOf('[]') === -1 && message) { + // eslint-disable-next-line no-console + console.log(logMsg); + } + if (level.toLowerCase() === 'debug') { + const verboseMsg = `[${level}] ${JSON.stringify(message, undefined, 2)}`; + if (`[${level}] "${message}"` !== verboseMsg) { + // eslint-disable-next-line no-console + console.log(verboseMsg); + } + } } - if (level.toLowerCase() === 'fatal') { + if (level.toLowerCase() === 'fatal' && this.ravenClient) { this.ravenClient.captureMessage(message, { level: 'fatal', }); diff --git a/src/bot.js b/src/bot.js index f7456282a..ac3d5d9b6 100644 --- a/src/bot.js +++ b/src/bot.js @@ -83,9 +83,7 @@ class Genesis { * @param {number} [options.shardCount] The total number of shards * @param {string} [options.prefix] Prefix for calling the bot * @param {MarkdownSettings} [options.mdConfig] The markdown settings - * @param {WarframeNexusQuery} [options.nexusQuerier] API for querying nexus-stats' warframe api * @param {Object} [options.caches] json-fetch-cache for each Warframe worldstate - * @param {NexusFetcher} [options.nexusFetcher] Nexus Stats direct api */ constructor(discordToken, logger, { shardId = 0, @@ -93,9 +91,7 @@ class Genesis { prefix = process.env.PREFIX, mdConfig = md, owner = null, - nexusQuerier = {}, caches = {}, - nexusFetcher, } = {}) { /** * The Discord.js client for interacting with Discord's API @@ -124,8 +120,6 @@ class Genesis { this.caches = caches; - this.nexusFetcher = nexusFetcher; - this.channelTimeout = 300000; /** @@ -234,12 +228,10 @@ class Genesis { // Notification emitter this.notifier = new Notifier(this); - - this.nexusQuerier = nexusQuerier; } setupHandlers() { - this.client.on('ready', () => this.onReady()); + this.client.on('ready', async () => this.onReady()); this.client.on('message', message => this.onMessage(message)); this.client.on('guildCreate', guild => this.onGuildCreate(guild)); @@ -250,7 +242,7 @@ class Genesis { // kill on disconnect so a new instance can be spawned this.client.on('disconnect', (event) => { this.logger.debug(`Disconnected with close event: ${event.code}`); - // process.exit(4); + process.exit(4); }); // send welcome_messages @@ -269,21 +261,22 @@ class Genesis { await this.commandHandler.loadCommands(); this.setupHandlers(); + const t = await this.client.login(this.token); + this.logger.debug(`Logged in with token ${t}`); + try { - const t = await this.client.login(this.token); - this.logger.debug(`Logged in with token ${t}`); await this.notifier.start(); } catch (err) { - this.logger.error(err.message); + this.logger.error(err); this.logger.fatal(err); - process.exit(1); + process.exit(0); } } /** * Perform actions when the bot is ready */ - onReady() { + async onReady() { this.logger.debug(`${this.client.user.username} ready!`); this.logger.debug(`Bot: ${this.client.user.username}#${this.client.user.discriminator}`); this.client.user.setPresence({ @@ -294,7 +287,7 @@ class Genesis { url: 'https://warframe.com', }, }); - this.settings.ensureData(this.client); + await this.settings.ensureData(this.client); this.readyToExecute = true; const self = this; diff --git a/src/commands/Ondemand/Pricecheck.js b/src/commands/Ondemand/Pricecheck.js index fb56889cd..ff05fc7f1 100644 --- a/src/commands/Ondemand/Pricecheck.js +++ b/src/commands/Ondemand/Pricecheck.js @@ -2,6 +2,7 @@ const Command = require('../../Command.js'); const PriceCheckEmbed = require('../../embeds/PriceCheckEmbed.js'); +const request = require('request-promise'); const inProgressEmbed = { title: 'Processing search...' }; @@ -35,7 +36,12 @@ class PriceCheck extends Command { try { const item = message.strippedContent.match(this.regex)[1]; const sentMessage = await message.channel.send('', { embed: inProgressEmbed }); - const result = await this.bot.nexusQuerier.priceCheckQueryAttachment(item); + const options = { + uri: `https://api.warframestat.us/pricecheck/attachment/${item}`, + json: true, + rejectUnauthorized: false, + }; + const result = await request(options); const embed = new PriceCheckEmbed(this.bot, result, item); sentMessage.edit('', { embed }); return embed.color === 0xff55ff ? diff --git a/src/commands/Ondemand/WhereIs.js b/src/commands/Ondemand/WhereIs.js index 048d8f53c..79946600e 100644 --- a/src/commands/Ondemand/WhereIs.js +++ b/src/commands/Ondemand/WhereIs.js @@ -75,12 +75,18 @@ class Whereis extends Command { const results = data .filter(entry => entry.item.toLowerCase().indexOf(query.toLowerCase()) > -1) .sort(itemSort); + results.forEach((result) => { + result.place = result.place.replace('Derelict/', '') // eslint-disable-line no-param-reassign + .replace('Assassinate (Assassination)', 'Assassinate') + .replace('Defense (Defense)', 'Defense') + .replace('Survival (Survival)', 'Survival'); + }); const longestName = results.length ? results.map(result => result.item) .reduce((a, b) => (a.length > b.length ? a : b)) : ''; const longestRelic = results.length ? results.map(result => result.place) .reduce((a, b) => (a.length > b.length ? a : b)) : ''; query = toTitleCase(query.trim()); - createGroupedArray(results, 60).forEach((group, index) => { + createGroupedArray(results, 55).forEach((group, index) => { const embed = new WhereisEmbed( this.bot, createGroupedArray(group, 4), query, longestName.length, longestRelic.length, diff --git a/src/commands/Settings/Track.js b/src/commands/Settings/Track.js index 5c6193a0f..884e7e587 100644 --- a/src/commands/Settings/Track.js +++ b/src/commands/Settings/Track.js @@ -38,11 +38,11 @@ class Track extends Command { const channelParam = message.strippedContent.match(roomId) ? message.strippedContent.match(roomId)[0].trim().replace(/<|>|#/ig, '') : undefined; const channel = this.getChannel(channelParam, message); const results = []; - for (const event of trackables.events) { - results.push(this.bot.settings.trackEventType(channel, event)); + if (trackables.events.length) { + results.push(this.bot.settings.trackEventTypes(channel, trackables.events)); } - for (const item of trackables.items) { - results.push(this.bot.settings.trackItem(channel, item)); + if (trackables.items.length) { + results.push(this.bot.settings.trackItems(channel, trackables.items)); } Promise.all(results); this.messageManager.notifySettingsChange(message, true, true); diff --git a/src/commands/Settings/Untrack.js b/src/commands/Settings/Untrack.js index 5b7a97717..16f8cdb12 100644 --- a/src/commands/Settings/Untrack.js +++ b/src/commands/Settings/Untrack.js @@ -40,11 +40,11 @@ class Untrack extends Command { const channel = this.getChannel(channelParam, message); const results = []; - for (const event of trackables.events) { - results.push(this.bot.settings.untrackEventType(channel, event)); + if (trackables.events.length) { + results.push(this.bot.settings.untrackEventTypes(channel, trackables.events)); } - for (const item of trackables.items) { - results.push(this.bot.settings.untrackItem(channel, item)); + if (trackables.items.length) { + results.push(this.bot.settings.untrackItems(channel, trackables.items)); } Promise.all(results); this.messageManager.notifySettingsChange(message, true, true); diff --git a/src/embeds/EarthCycleEmbed.js b/src/embeds/EarthCycleEmbed.js index 6022052b4..7c7d89cba 100644 --- a/src/embeds/EarthCycleEmbed.js +++ b/src/embeds/EarthCycleEmbed.js @@ -24,7 +24,7 @@ class EarthCycleEmbed extends BaseEmbed { { name: '_ _', value: `Time remaining until ${state.isDay ? 'night' : 'day'}: ${timeDeltaToString(fromNow(new Date(state.expiry)))}` + - `${state.bountyExpiry ? `\nBounties expire in ${timeDeltaToString(fromNow(new Date(state.expiry)))}` : ''}`, + `${state.bountyExpiry ? `\nBounties expire in ${timeDeltaToString(fromNow(new Date(state.bountyExpiry)))}` : ''}`, }, ]; this.footer.text = `${state.isDay ? 'Night' : 'Day'} starts `; diff --git a/src/embeds/WhereisEmbed.js b/src/embeds/WhereisEmbed.js index d1a10a6b3..317752f6e 100644 --- a/src/embeds/WhereisEmbed.js +++ b/src/embeds/WhereisEmbed.js @@ -20,7 +20,7 @@ class WhereisEmbed extends BaseEmbed { resultsGroups.forEach((results) => { const mappedResults = results.map(result => `\`${rpad(result.item, nameWidth, ' ')} ` + - `| ${rpad(result.place, relicWidth, ' ')} | ${result.rarity} @${parseFloat(result.chance).toFixed(2)}%\``); + `| ${rpad(result.place, relicWidth, ' ')} | ${result.rarity.charAt(0)}@${parseFloat(result.chance).toFixed(2)}%\``); this.fields.push({ name: '_ _', value: mappedResults.join('\n') }); }); diff --git a/src/notifications/Notifier.js b/src/notifications/Notifier.js index a5e530cee..a2afc3020 100644 --- a/src/notifications/Notifier.js +++ b/src/notifications/Notifier.js @@ -104,7 +104,7 @@ class Notifier { .filter(n => !ids.includes(n.id) && n.update && !n.stream && n.translations.en); const streamsToNotify = newData.news .filter(n => !ids.includes(n.id) && n.stream && n.translations.en); - const cetusCycleChange = !ids.includes(newData.cetusCycle.id) && newData.cetusCycle.id !== 'cetusCycle0'; + const cetusCycleChange = !ids.includes(newData.cetusCycle.id) && newData.cetusCycle.expiry; // Concat all notified ids notifiedIds = notifiedIds .concat(newData.alerts.map(a => a.id)) @@ -236,9 +236,6 @@ class Notifier { } async sendAlerts(newAlerts, platform) { - if (newAlerts.length) { - this.logger.debug(`New Alerts! ${newAlerts.length}`); - } await Promise.all(newAlerts.map(a => this.sendAlert(a, platform))); } diff --git a/src/settings/Database.js b/src/settings/Database.js index 09dd8f31a..2af0e0322 100644 --- a/src/settings/Database.js +++ b/src/settings/Database.js @@ -1,7 +1,7 @@ 'use strict'; -const mysql = require('mysql2/promise'); const SQL = require('sql-template-strings'); +const mysql = require('mysql2/promise'); const Promise = require('bluebird'); const schema = require('./schema.js'); const CustomCommand = require('../CustomCommand.js'); @@ -34,6 +34,9 @@ class Database { * @param {Genesis} bot Bot to load the settings for */ constructor(dbOptions, bot) { + this.bot = bot; + this.logger = bot.logger; + const opts = { supportBigNumbers: true, bigNumberStrings: true, @@ -41,8 +44,6 @@ class Database { }; Object.assign(opts, dbOptions); this.db = mysql.createPool(opts); - this.bot = bot; - this.logger = bot.logger; this.defaults = { prefix: '/', @@ -70,21 +71,14 @@ class Database { * Initialize data for guilds in channels for existing guilds * @param {Client} client for pulling guild information */ - ensureData(client) { + async ensureData(client) { const promises = []; client.guilds.array().forEach((guild) => { if (guild.channels.array().length) { promises.push(this.addGuild(guild)); } }); - Promise.all(promises.map(x => x.reflect())) - .then((results) => { - results.forEach((result) => { - if (result && !result.isFulfilled()) { - this.logger.error(result.reason()); - } - }); - }); + await Promise.all(promises); } /** @@ -108,7 +102,7 @@ class Database { */ async getChannelAndGuildCounts() { const query = 'select count(distinct guild_id) as countGuilds, count(distinct id) as countChannels from channels;'; - const res = await this.db.query(query); + const res = this.db.query(query); if (res[0]) { return { channels: res[0].countChannels, @@ -158,9 +152,8 @@ class Database { } await this.setGuildSetting(guild, setting, res[0][0].val); return res[0][0].val; - } else { - return this.defaults[`${setting}`]; } + return this.defaults[`${setting}`]; } async checkWebhookAndReturn(channel, setting) { @@ -238,6 +231,20 @@ class Database { return this.db.query(query); } + /** + * Enables notifications for items in a channel + * @param {Channel} channel The channel where to enable notifications + * @param {string} items The items to track + * @returns {Promise} + */ + async trackItems(channel, items) { + const query = SQL`INSERT IGNORE INTO item_notifications (channel_id, item) VALUES `; + items.forEach((item, index) => { + query.append(SQL`(${channel.id}, ${item})`).append(index !== (items.length - 1) ? ',' : ';'); + }); + return this.db.query(query); + } + /** * Disables notifications for an item in a channel * @param {Channel} channel The channel where to enable notifications @@ -249,6 +256,21 @@ class Database { return this.db.query(query); } + /** + * Disables notifications for items in a channel + * @param {Channel} channel The channel where to enable notifications + * @param {string} items The items to untrack + * @returns {Promise} + */ + async untrackItems(channel, items) { + const query = SQL`DELETE FROM item_notifications WHERE channel_id = ${channel.id} AND (`; + items.forEach((item, index) => { + query.append(index > 0 ? ' OR ' : '').append(SQL`item = ${item}`); + }); + query.append(SQL`);`); + return this.db.query(query); + } + /** * Enables notifications for an event type in a channel * @param {Channel} channel The channel where to enable notifications @@ -260,6 +282,20 @@ class Database { return this.db.query(query); } + /** + * Enables notifications for items in a channel + * @param {Channel} channel The channel where to enable notifications + * @param {string} types The types to track + * @returns {Promise} + */ + async trackEventTypes(channel, types) { + const query = SQL`INSERT IGNORE INTO type_notifications (channel_id, type) VALUES `; + types.forEach((type, index) => { + query.append(SQL`(${channel.id}, ${type})`).append(index !== (types.length - 1) ? ',' : ';'); + }); + return this.db.query(query); + } + /** * Disables notifications for an event type in a channel * @param {Channel} channel The channel where to enable notifications @@ -271,6 +307,21 @@ class Database { return this.db.query(query); } + /** + * Disables notifications for event types in a channel + * @param {Channel} channel The channel where to enable notifications + * @param {string} types The types to untrack + * @returns {Promise} + */ + async untrackEventTypes(channel, types) { + const query = SQL`DELETE FROM type_notifications WHERE channel_id = ${channel.id} AND (`; + types.forEach((type, index) => { + query.append(index > 0 ? ' OR ' : '').append(SQL`type = ${type}`); + }); + query.append(SQL`);`); + return this.db.query(query); + } + /** * Enables or disables pings for an item in a channel * @param {TextChannel} channel The channel where to enable notifications @@ -330,6 +381,7 @@ class Database { if (guild) { const query = SQL`SELECT item_or_type, text FROM pings WHERE guild_id=${guild.id}`; const res = await this.db.query(query); + if (res[0].length === 0) { return []; } @@ -485,6 +537,7 @@ class Database { WHERE channel_id = ${channel.id} AND command_id = ${commandId} AND is_user = true AND target_id = ${memberId}`; const res = await this.db.query(query); + if (!res || res[0].length === 0) { return 'none'; } @@ -503,6 +556,7 @@ class Database { WHERE channel_id = ${channel.id} AND command_id = ${commandId} AND is_user = false AND target_id = ${role.id}`; const res = await this.db.query(query); + if (!res || res[0].length === 0) { return 'none'; } @@ -589,7 +643,8 @@ class Database { * @returns {Promise.} status of removal */ async removeGuild(guild) { - await this.db.query(SQL`DELETE FROM channels WHERE guild_id = ${guild.id}`); + const query = SQL`DELETE FROM channels WHERE guild_id = ${guild.id}`; + await this.db.query(query); const channelIds = guild.channels.keyArray(); const results = []; channelIds.forEach((channelId) => { @@ -790,22 +845,45 @@ class Database { } async getCommandContext(channel) { - const prefix = await this.getGuildSetting(channel.guild, 'prefix'); - const allowCustom = await this.getChannelSetting(channel, 'allowCustom') === '1'; - const allowInline = await this.getChannelSetting(channel, 'allowInline') === '1'; - const webhook = { - id: await this.getChannelSetting(channel, 'webhookId'), - token: await this.getChannelSetting(channel, 'webhookToken'), - name: await this.getChannelSetting(channel, 'webhookName'), - avatar: await this.getChannelSetting(channel, 'webhookAvatar'), - }; - return { - prefix, allowCustom, allowInline, webhook, channel, + this.getChannelSetting(channel, 'prefix'); // ensure it's set at some point + const query = SQL`SELECT setting, val FROM settings where channel_id = ${channel.id} and setting in ('prefix', 'allowCustom', 'allowInline', 'webhookId', 'webhookToken', 'webhookName', 'webhookAvatar');`; + const res = await this.db.query(query); + let context = { + webhook: {}, }; + if (res[0]) { + res[0].map(row => ({ + setting: row.setting, + value: row.val, + })).forEach((row) => { + if (row.setting.indexOf('webhook') === -1) { + context[`${row.setting}`] = row.value; + } else { + context.webhook[`${row.setting.replace('webhook', '').toLowerCase()}`] = row.value; + } + }); + if (!context.prefix) { + context.prefix = this.defaults.prefix; + } + if (typeof context.allowCustom === 'undefined') { + context.allowCustom = this.defaults.allowCustom ? '1' : '0'; + } + if (typeof context.allowInline === 'undefined') { + context.allowInline = this.defaults.allowInline ? '1' : '0'; + } + } else { + context = { + prefix: this.defaults.prefix, + allowCustom: this.defaults.allowCustom ? '1' : '0', + allowInline: this.defaults.allowInline ? '1' : '0', + }; + } + return context; } async getCustomCommands() { - const query = SQL`SELECT * FROM custom_commands WHERE MOD(IFNULL(guild_id, 0) >> 22, ${this.bot.shardCount}) = ${this.bot.shardId}`; + this.logger.debug(`Shards: ${this.bot.shardCount}, this shard's id: ${this.bot.shardId}`); + const query = SQL`SELECT * FROM custom_commands WHERE (guild_id >> 22) % ${this.bot.shardCount} = ${this.bot.shardId}`; const res = await this.db.query(query); if (res[0]) { return res[0].map(value =>