diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..21e9899 --- /dev/null +++ b/LICENSE @@ -0,0 +1,15 @@ +The MIT License (MIT) + +Copyright (c) 2016-2018 LBRY Inc + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/bot/bot.js b/bot/bot.js index bd0fbf4..d90da01 100644 --- a/bot/bot.js +++ b/bot/bot.js @@ -44,7 +44,9 @@ bot.on('ready', function() { console.log('Logged in! Serving in ' + bot.guilds.array().length + ' servers'); require('./plugins.js').init(); console.log('type ' + config.prefix + 'help in Discord for a commands list.'); - bot.user.setGame(config.prefix + 'help'); + bot.user + .setActivity(config.prefix + 'help', { type: 'LISTENING' }) + .catch(console.error); //initialize the claimbot (content bot) claimbot.init(bot); @@ -54,15 +56,39 @@ bot.on('ready', function() { supportbot.init(bot); }); +process.on('unhandledRejection', err => { + console.log('unhandledRejection: ' + err); + process.exit(1); //exit node.js with an error +}); + bot.on('disconnected', function() { console.log('Disconnected!'); process.exit(1); //exit node.js with an error }); +bot.on('error', function(error) { + console.log('error: ' + error); + process.exit(1); //exit node.js with an error +}); + function checkMessageForCommand(msg, isEdit) { //check if message is a command if (msg.author.id != bot.user.id && msg.content.startsWith(config.prefix)) { - console.log('treating ' + msg.content + ' from UserID:' + msg.author + ' || UserName: ' + msg.author.username + ' as command'); + //check if user is Online + if (!msg.author.presence.status || msg.author.presence.status == 'offline' || msg.author.presence.status == 'invisible') { + msg.author.send('Please set your Discord Presence to Online to talk to the bot!') + .catch(function(error) { + msg.channel.send(msg.author + + ', Please enable Direct Messages from server members to communicate fully with our bot, ' + + 'it is located in the user setting area under Privacy & Safety tab, ' + + 'select the option allow direct messages from server members' + ).then(msg.channel.send( + 'Please set your Discord Presence to Online to talk to the Bot!' + ) + ); + return; + }); + } var cmdTxt = msg.content.split(' ')[0].substring(config.prefix.length); var suffix = msg.content.substring(cmdTxt.length + config.prefix.length + 1); //add one for the ! and one for the space if (msg.isMentioned(bot.user)) { @@ -77,6 +103,7 @@ function checkMessageForCommand(msg, isEdit) { } let cmd = aliases.hasOwnProperty(cmdTxt) ? commands[aliases[cmdTxt]] : commands[cmdTxt]; + if (cmdTxt === 'help') { //help is special since it iterates over the other commands if (suffix) { @@ -135,6 +162,7 @@ function checkMessageForCommand(msg, isEdit) { } } else if (cmd) { // Add permission check here later on ;) + console.log('treating ' + msg.content + ' from UserID:' + msg.author + ' || UserName: ' + msg.author.username + ' as command'); try { cmd.process(bot, msg, suffix, isEdit); } catch (e) { diff --git a/bot/modules/altprice.js b/bot/modules/altprice.js index 3ddb410..ea21f12 100644 --- a/bot/modules/altprice.js +++ b/bot/modules/altprice.js @@ -1,89 +1,66 @@ -let needle = require("needle"); -let hasPriceBotChannels = require("../helpers.js").hasPriceBotChannels; -let inPrivate = require("../helpers.js").inPrivate; -let config = require("config"); -let ChannelID = config.get("pricebot").mainchannel; +let needle = require('needle'); +let hasPriceBotChannels = require('../helpers.js').hasPriceBotChannels; +let inPrivate = require('../helpers.js').inPrivate; +let config = require('config'); +let ChannelID = config.get('pricebot').mainchannel; -exports.commands = ["altprice"]; +exports.commands = ['altprice']; exports.altprice = { - usage: " ", - description: - "display price of specified alt coin from crypto compare\n**Example:** *!altprice ETH USD 100*", + usage: ' ', + description: 'display price of specified alt coin from crypto compare\n**Example:** *!altprice ETH USD 100*', process: function(bot, msg, suffix) { let dt = new Date(); let timestamp = dt.toUTCString(); if (!hasPriceBotChannels(msg) && !inPrivate(msg)) { - msg.channel.send( - "Please use <#" + ChannelID + "> or DMs to talk to price bot." - ); + msg.channel.send('Please use <#' + ChannelID + '> or DMs to talk to price bot.'); return; } - if (suffix !== "") { + if (suffix !== '') { words = suffix .trim() - .split(" ") + .split(' ') .filter(function(n) { - return n !== ""; + return n !== ''; }); var currency1 = words[0].toUpperCase(); if (words[1] == undefined) { - var currency2 = "BTC"; + var currency2 = 'BTC'; } else { var currency2 = words[1].toUpperCase(); } if (words[2] == undefined) { - var amount = "1"; + var amount = '1'; } else { if (getValidatedAmount(words[2]) === null) { - msg.reply("Please specify a number for "); + msg.reply('Please specify a number for '); return; } var amount = words[2].toUpperCase(); } } else { - var currency1 = "BTC"; - var currency2 = "USD"; - var amount = "1"; + var currency1 = 'BTC'; + var currency2 = 'USD'; + var amount = '1'; } - needle.get("https://min-api.cryptocompare.com/data/all/coinlist", function( - error, - response - ) { + needle.get('https://min-api.cryptocompare.com/data/all/coinlist', function(error, response) { if (error || response.statusCode !== 200) { - msg.channel.send("coinmarketcap API is not available"); + msg.channel.send('coinmarketcap API is not available'); } else { if (!response.body.Data.hasOwnProperty(currency1)) { - msg.channel.send("Invalid Alt Coin"); + msg.channel.send('Invalid Alt Coin'); return; } - needle.get( - "https://min-api.cryptocompare.com/data/price?fsym=" + - currency1 + - "&tsyms=" + - currency2, - function(error, response) { - if (error || response.statusCode !== 200) { - msg.channel.send("coinmarketcap API is not available"); - } else { - var price = Number(response.body[currency2]); - var newprice = price * amount; - var message = - amount + - " " + - currency1 + - " = " + - newprice.toFixed(8) + - " " + - currency2 + - "\n" + - "*Updated: " + - timestamp + - "*"; - msg.channel.send(message); - } + needle.get('https://min-api.cryptocompare.com/data/price?fsym=' + currency1 + '&tsyms=' + currency2, function(error, response) { + if (error || response.statusCode !== 200) { + msg.channel.send('coinmarketcap API is not available'); + } else { + var price = Number(response.body[currency2]); + var newprice = price * amount; + var message = amount + ' ' + currency1 + ' = ' + newprice.toFixed(8) + ' ' + currency2 + '\n' + '*Updated: ' + timestamp + '*'; + msg.channel.send(message); } - ); + }); } }); function getValidatedAmount(amount) { diff --git a/bot/modules/claimbot.js b/bot/modules/claimbot.js index cf5d0b4..2a56877 100644 --- a/bot/modules/claimbot.js +++ b/bot/modules/claimbot.js @@ -1,14 +1,14 @@ -"use strict"; +'use strict'; let lbry; let mongo; let discordBot; -let moment = require("moment"); -let request = require("request"); -let sleep = require("sleep"); -let config = require("config"); -let channels = config.get("claimbot").channels; -const Discord = require("discord.js"); +let moment = require('moment'); +let request = require('request'); +let sleep = require('sleep'); +let config = require('config'); +let channels = config.get('claimbot').channels; +const Discord = require('discord.js'); module.exports = { init: init @@ -16,23 +16,23 @@ module.exports = { function init(discordBot_) { if (lbry) { - throw new Error("init was already called once"); + throw new Error('init was already called once'); } discordBot = discordBot_; - const MongoClient = require("mongodb").MongoClient; - MongoClient.connect(config.get("mongodb").url, function(err, db) { + const MongoClient = require('mongodb').MongoClient; + MongoClient.connect(config.get('mongodb').url, function(err, db) { if (err) { throw err; } mongo = db; - const bitcoin = require("bitcoin"); - lbry = new bitcoin.Client(config.get("lbrycrd")); + const bitcoin = require('bitcoin'); + lbry = new bitcoin.Client(config.get('lbrycrd')); - console.log("Activating claimbot "); - discordBot.channels.get(channels[0]).send("activating claimbot"); + console.log('Activating claimbot '); + discordBot.channels.get(channels[0]).send('activating claimbot'); setInterval(function() { announceNewClaims(); @@ -43,25 +43,21 @@ function init(discordBot_) { function announceNewClaims() { if (!mongo) { - discordPost("Failed to connect to mongo", {}); + discordPost('Failed to connect to mongo', {}); return; } if (!lbry) { - discordPost("Failed to connect to lbrycrd", {}); + discordPost('Failed to connect to lbrycrd', {}); return; } - Promise.all([getLastBlock(), lbryCall("getinfo")]) + Promise.all([getLastBlock(), lbryCall('getinfo')]) .then(function([lastProcessedBlock, currentBlockInfo]) { - const currentHeight = currentBlockInfo["blocks"]; + const currentHeight = currentBlockInfo['blocks']; console.log(currentHeight); if (lastProcessedBlock === null) { - console.log( - "First run. Setting last processed block to " + - currentHeight + - " and exiting." - ); + console.log('First run. Setting last processed block to ' + currentHeight + ' and exiting.'); return setLastBlock(currentHeight); } @@ -71,14 +67,8 @@ function announceNewClaims() { const firstBlockToProcess = testBlock || lastProcessedBlock + 1, lastBlockToProcess = testBlock || currentHeight; - console.log( - "Doing blocks " + firstBlockToProcess + " to " + lastBlockToProcess - ); - return announceClaimsLoop( - firstBlockToProcess, - lastBlockToProcess, - currentHeight - ); + console.log('Doing blocks ' + firstBlockToProcess + ' to ' + lastBlockToProcess); + return announceClaimsLoop(firstBlockToProcess, lastBlockToProcess, currentHeight); } }) .catch(function(err) { @@ -88,27 +78,24 @@ function announceNewClaims() { function announceClaimsLoop(block, lastBlock, currentHeight) { let claimsFound = 0; - return lbryCall("getblockhash", block) + return lbryCall('getblockhash', block) .then(function(blockHash) { - return lbryCall("getblock", blockHash); + return lbryCall('getblock', blockHash); }) .then(function(blockData) { - return Promise.all(blockData["tx"].map(getClaimsForTxid)); + return Promise.all(blockData['tx'].map(getClaimsForTxid)); }) .then(function(arrayOfClaimArrays) { - const claims = Array.prototype - .concat(...arrayOfClaimArrays) - .filter(function(c) { - return !!c; - }); - console.log("Found " + claims.length + " claims in " + block); + const claims = Array.prototype.concat(...arrayOfClaimArrays).filter(function(c) { + return !!c; + }); + console.log('Found ' + claims.length + ' claims in ' + block); claimsFound = claims.length; return Promise.all( claims.map(function(claim) { //the API has a rate limit. to avoid hitting it we must have a small delay between each message //if claims were found in this block, then we wait, otherwise we don't - if (claimsFound > 0 && claim.hasOwnProperty("claimId")) - sleep.msleep(300); + if (claimsFound > 0 && claim.hasOwnProperty('claimId')) sleep.msleep(300); return announceClaim(claim, block, currentHeight); }) ); @@ -125,17 +112,17 @@ function announceClaimsLoop(block, lastBlock, currentHeight) { } function announceClaim(claim, claimBlockHeight, currentHeight) { - console.log("" + claimBlockHeight + ": New claim for " + claim["name"]); + console.log('' + claimBlockHeight + ': New claim for ' + claim['name']); console.log(claim); //ignore supports for now //the issue with supports is that they should be treated completely differently //they are not new claims... - if (claim.hasOwnProperty("supported claimId")) return; + if (claim.hasOwnProperty('supported claimId')) return; let options = { - method: "GET", - url: "http://127.0.0.1:5000/claim_decode/" + claim["name"] + method: 'GET', + url: 'http://127.0.0.1:5000/claim_decode/' + claim['name'] }; request(options, function(error, response, body) { @@ -146,30 +133,22 @@ function announceClaim(claim, claimBlockHeight, currentHeight) { let channelName = null; try { body = JSON.parse(body); - if ( - body.hasOwnProperty("stream") && - body.stream.hasOwnProperty("metadata") - ) { + if (body.hasOwnProperty('stream') && body.stream.hasOwnProperty('metadata')) { claimData = body.stream.metadata; - channelName = body.hasOwnProperty("channel_name") - ? body["channel_name"] - : null; + channelName = body.hasOwnProperty('channel_name') ? body['channel_name'] : null; } } catch (e) { console.error(e); return; } - return Promise.all([ - lbryCall("getvalueforname", claim["name"]), - lbryCall("getclaimsforname", claim["name"]) - ]).then(function([currentWinningClaim, claimsForName]) { + return Promise.all([lbryCall('getvalueforname', claim['name']), lbryCall('getclaimsforname', claim['name'])]).then(function([currentWinningClaim, claimsForName]) { //console.log(JSON.stringify(claimData)); let value = null; if (claimData !== null) value = claimData; else { try { - value = JSON.parse(claim["value"]); + value = JSON.parse(claim['value']); } catch (e) {} } @@ -183,74 +162,52 @@ function announceClaim(claim, claimBlockHeight, currentHeight) { else */ console.log(value); - if (value["author"]) { - text.push("author: " + value["author"]); + if (value['author']) { + text.push('author: ' + value['author']); } - if (value["description"]) { - text.push(value["description"]); + if (value['description']) { + text.push(value['description']); } // if (value['content_type']) // { // text.push("*Content Type:* " + value['content_type']); // } - if (value["nsfw"]) { - text.push("*Warning: Adult Content*"); + if (value['nsfw']) { + text.push('*Warning: Adult Content*'); } //"fee":{"currency":"LBC","amount":186,"version":"_0_0_1","address":"bTGoFCakvQXvBrJg1b7FJzombFUu6iRJsk"} - if (value["fee"]) { + if (value['fee']) { const fees = []; - text.push( - "Price: " + - value["fee"].amount + - " *" + - value["fee"].currency + - "*" - ); + text.push('Price: ' + value['fee'].amount + ' *' + value['fee'].currency + '*'); } - if (!claim["is controlling"]) { + if (!claim['is controlling']) { // the following is based on https://lbry.io/faq/claimtrie-implementation - const lastTakeoverHeight = claimsForName["nLastTakeoverHeight"], + const lastTakeoverHeight = claimsForName['nLastTakeoverHeight'], maxDelay = 4032, // 7 days of blocks at 2.5min per block - activationDelay = Math.min( - maxDelay, - Math.floor((claimBlockHeight - lastTakeoverHeight) / 32) - ), + activationDelay = Math.min(maxDelay, Math.floor((claimBlockHeight - lastTakeoverHeight) / 32)), takeoverHeight = claimBlockHeight + activationDelay, secondsPerBlock = 161, // in theory this should be 150, but in practice its closer to 161 - takeoverTime = - Date.now() + - (takeoverHeight - currentHeight) * secondsPerBlock * 1000; + takeoverTime = Date.now() + (takeoverHeight - currentHeight) * secondsPerBlock * 1000; - text.push( - "Takes effect on approx. **" + - moment(takeoverTime, "x").format("MMMM Do [at] HH:mm [UTC]") + - "** (block " + - takeoverHeight + - ")" - ); + text.push('Takes effect on approx. **' + moment(takeoverTime, 'x').format('MMMM Do [at] HH:mm [UTC]') + '** (block ' + takeoverHeight + ')'); } const richEmbeded = { author: { - name: value["author"] || "Anonymous", - url: "http://open.lbry.io/" + claim["name"], - icon_url: - "http://barkpost-assets.s3.amazonaws.com/wp-content/uploads/2013/11/3dDoge.gif" + name: value['author'] || 'Anonymous', + url: 'http://open.lbry.io/' + claim['name'], + icon_url: 'http://barkpost-assets.s3.amazonaws.com/wp-content/uploads/2013/11/3dDoge.gif' }, - title: - "lbry://" + - (channelName ? channelName + "/" : "") + - claim["name"], + title: 'lbry://' + (channelName ? channelName + '/' : '') + claim['name'], color: 1399626, - description: escapeSlackHtml(text.join("\n")), + description: escapeSlackHtml(text.join('\n')), footer: { - text: - "Block " + claimBlockHeight + " • Claim ID " + claim["claimId"] + text: 'Block ' + claimBlockHeight + ' • Claim ID ' + claim['claimId'] }, - image: { url: !value["nsfw"] ? value["thumbnail"] || "" : "" }, - url: "http://open.lbry.io/" + claim["name"] + image: { url: !value['nsfw'] ? value['thumbnail'] || '' : '' }, + url: 'http://open.lbry.io/' + claim['name'] }; discordPost(text, richEmbeded); @@ -264,13 +221,13 @@ function announceClaim(claim, claimBlockHeight, currentHeight) { function escapeSlackHtml(txt) { return txt - .replace("&", "&") - .replace("<", "<") - .replace(">", ">"); + .replace('&', '&') + .replace('<', '<') + .replace('>', '>'); } function getClaimsForTxid(txid) { - return lbryCall("getclaimsfortx", txid).catch(function(err) { + return lbryCall('getclaimsfortx', txid).catch(function(err) { // an error here most likely means the transaction is spent, // which also means there are no claims worth looking at return []; @@ -279,13 +236,11 @@ function getClaimsForTxid(txid) { function getLastBlock() { return new Promise(function(resolve, reject) { - mongo.collection("claimbot").findOne({}, function(err, obj) { + mongo.collection('claimbot').findOne({}, function(err, obj) { if (err) { reject(err); } else if (!obj) { - mongo - .collection("claimbot") - .createIndex({ last_block: 1 }, { unique: true }); + mongo.collection('claimbot').createIndex({ last_block: 1 }, { unique: true }); resolve(null); } else { resolve(obj.last_block); @@ -296,25 +251,13 @@ function getLastBlock() { function setLastBlock(block) { return new Promise(function(resolve, reject) { - mongo - .collection("claimbot") - .findOneAndUpdate( - { last_block: { $exists: true } }, - { last_block: block }, - { upsert: true, returnOriginal: false }, - function(err, obj) { - if (!err && obj && obj.value.last_block != block) { - reject( - "Last value should be " + - block + - ", but it is " + - obj.value.last_block - ); - } else { - resolve(); - } - } - ); + mongo.collection('claimbot').findOneAndUpdate({ last_block: { $exists: true } }, { last_block: block }, { upsert: true, returnOriginal: false }, function(err, obj) { + if (!err && obj && obj.value.last_block != block) { + reject('Last value should be ' + block + ', but it is ' + obj.value.last_block); + } else { + resolve(); + } + }); }); } @@ -324,7 +267,7 @@ function discordPost(text, params) { channels.forEach(channel => { discordBot.channels .get(channel) - .send("", richEmbeded) + .send('', richEmbeded) .catch(console.error); }); } @@ -333,9 +276,7 @@ function lbryCall(...args) { return new Promise(function(resolve, reject) { lbry.cmd(...args, function(err, ...response) { if (err) { - reject( - new Error("JSONRPC call failed. Args: [" + args.join(", ") + "]") - ); + reject(new Error('JSONRPC call failed. Args: [' + args.join(', ') + ']')); } else { resolve(...response); } diff --git a/bot/modules/commandsV2.js b/bot/modules/commandsV2.js index 3608e49..b35965a 100644 --- a/bot/modules/commandsV2.js +++ b/bot/modules/commandsV2.js @@ -1,6 +1,6 @@ -"use strict"; -let commands = require("../../config/commands"); -const Discord = require("discord.js"); +'use strict'; +let commands = require('../../config/commands'); +const Discord = require('discord.js'); let initialized = false; let discordBot = null; let commandsList = null; @@ -11,12 +11,12 @@ module.exports = { function init(discordBot_) { if (initialized) { - throw new Error("init was already called once"); + throw new Error('init was already called once'); } discordBot = discordBot_; - discordBot.on("message", checkForCommand); + discordBot.on('message', checkForCommand); } /** @@ -28,31 +28,24 @@ let checkForCommand = function(message) { let firstRun = false; if (commandsList === null) { firstRun = true; - commandsList = ""; + commandsList = ''; } //for each message go through all the commands and check if there are any matches Object.keys(commands).forEach(command => { //during the first run also build the cache - if (firstRun) commandsList += command + ", "; + if (firstRun) commandsList += command + ', '; //if a command is found - if ( - !message.author.bot && - message.content.toLowerCase().indexOf(command.toLowerCase()) >= 0 && - commands[command].operation === "send" - ) { + if (!message.author.bot && message.content.toLowerCase().indexOf(command.toLowerCase()) >= 0 && commands[command].operation === 'send') { //send a message to the channel according to the config - message.channel.send("", new Discord.RichEmbed(commands[command].bundle)); + message.channel.send('', new Discord.RichEmbed(commands[command].bundle)); } }); //if the user is requesting the list of commands, then print it - if ( - !message.author.bot && - message.content.toLowerCase().indexOf("!helpcommands") >= 0 - ) { - let bundle = commands["!helpcommands"].bundle; - commandsList = commandsList.replace(/,\s$/g, ""); - bundle.description = "**" + commandsList + "**"; - message.channel.send("", new Discord.RichEmbed(bundle)); + if (!message.author.bot && message.content.toLowerCase().indexOf('!helpcommands') >= 0) { + let bundle = commands['!helpcommands'].bundle; + commandsList = commandsList.replace(/,\s$/g, ''); + bundle.description = '**' + commandsList + '**'; + message.channel.send('', new Discord.RichEmbed(bundle)); } }; diff --git a/bot/modules/hash.js b/bot/modules/hash.js index 720f26a..4d81e14 100644 --- a/bot/modules/hash.js +++ b/bot/modules/hash.js @@ -1,13 +1,13 @@ -let needle = require("needle"); -let config = require("config"); -let hasHashBotChannels = require("../helpers.js").hasHashBotChannels; -let inPrivate = require("../helpers.js").inPrivate; -let ChannelID = config.get("hashbot").mainchannel; +let needle = require('needle'); +let config = require('config'); +let hasHashBotChannels = require('../helpers.js').hasHashBotChannels; +let inPrivate = require('../helpers.js').inPrivate; +let ChannelID = config.get('hashbot').mainchannel; exports.commands = [ - "hash" // command that is in this file, every command needs it own export as shown below + 'hash' // command that is in this file, every command needs it own export as shown below ]; -exports.custom = ["timedhash"]; +exports.custom = ['timedhash']; exports.timedhash = function(bot) { setInterval(function() { @@ -15,55 +15,49 @@ exports.timedhash = function(bot) { }, 6 * 60 * 60 * 1000); function sendMiningInfo(bot) { - needle.get("https://explorer.lbry.io/api/v1/status", function( - error, - response - ) { + needle.get('https://explorer.lbry.io/api/v1/status', function(error, response) { if (error || response.statusCode !== 200) { - msg.channel.send("Explorer API is not available"); + msg.channel.send('Explorer API is not available'); } else { var data = response.body; var height = Number(data.status.height); var hashrate = data.status.hashrate; var difficulty = Number(data.status.difficulty); - needle.get("https://whattomine.com/coins/164.json", function( - error, - response - ) { + needle.get('https://whattomine.com/coins/164.json', function(error, response) { if (error || response.statusCode !== 200) { - msg.channel.send("whattomine API is not available"); + msg.channel.send('whattomine API is not available'); } var data = response.body; var reward = Number(data.block_reward); var block_time = Number(data.block_time); var difficulty24 = Number(data.difficulty24); description = - "Hashrate: " + + 'Hashrate: ' + numberWithCommas(hashrate) + - "\n" + - "Difficulty: " + + '\n' + + 'Difficulty: ' + numberWithCommas(difficulty.toFixed(0)) + - "\n" + - "Difficulty 24 Hour Average: " + + '\n' + + 'Difficulty 24 Hour Average: ' + numberWithCommas(difficulty24.toFixed(0)) + - "\n" + - "Current block: " + + '\n' + + 'Current block: ' + numberWithCommas(height.toFixed(0)) + - "\n" + - "Block Time: " + + '\n' + + 'Block Time: ' + numberWithCommas(block_time.toFixed(0)) + - " seconds \n" + - "Block Reward: " + + ' seconds \n' + + 'Block Reward: ' + numberWithCommas(reward.toFixed(0)) + - " LBC \n" + - "Sources: https://explorer.lbry.io & \n" + - "https://whattomine.com/coins/164-lbc-lbry"; + ' LBC \n' + + 'Sources: https://explorer.lbry.io & \n' + + 'https://whattomine.com/coins/164-lbc-lbry'; const embed = { description: description, color: 7976557, author: { - name: "LBRY Network Stats", - icon_url: "https://i.imgur.com/yWf5USu.png" + name: 'LBRY Network Stats', + icon_url: 'https://i.imgur.com/yWf5USu.png' } }; bot.channels.get(ChannelID).send({ embed }); @@ -72,26 +66,25 @@ exports.timedhash = function(bot) { } }); function numberWithCommas(x) { - return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); + return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','); } } }; exports.hash = { - usage: "", - description: - "Displays current Hashrate of Network\n**!hash power **\n Displays potential Earnings For Given Hashrate", + usage: '', + description: 'Displays current Hashrate of Network\n**!hash power **\n Displays potential Earnings For Given Hashrate', process: function(bot, msg, suffix) { - var command = "!hash"; + var command = '!hash'; words = suffix .trim() - .split(" ") + .split(' ') .filter(function(n) { - return n !== ""; + return n !== ''; }); profitcommand = words[0]; myhashrate = words[1]; - if (profitcommand == "power") { + if (profitcommand == 'power') { sendProfitInfo(bot, msg, suffix); return; } else { @@ -101,60 +94,52 @@ exports.hash = { function sendMiningInfo(bot, msg, suffix) { if (!inPrivate(msg) && !hasHashBotChannels(msg)) { - msg.channel.send( - "Please use <#" + ChannelID + "> or DMs to talk to hash bot." - ); + msg.channel.send('Please use <#' + ChannelID + '> or DMs to talk to hash bot.'); return; } - needle.get("https://explorer.lbry.io/api/v1/status", function( - error, - response - ) { + needle.get('https://explorer.lbry.io/api/v1/status', function(error, response) { if (error || response.statusCode !== 200) { - msg.channel.send("Explorer API is not available"); + msg.channel.send('Explorer API is not available'); } else { var data = response.body; var height = Number(data.status.height); var hashrate = data.status.hashrate; var difficulty = Number(data.status.difficulty); - needle.get("https://whattomine.com/coins/164.json", function( - error, - response - ) { + needle.get('https://whattomine.com/coins/164.json', function(error, response) { if (error || response.statusCode !== 200) { - msg.channel.send("whattomine API is not available"); + msg.channel.send('whattomine API is not available'); } var data = response.body; var reward = Number(data.block_reward); var block_time = Number(data.block_time); var difficulty24 = Number(data.difficulty24); description = - "Hashrate: " + + 'Hashrate: ' + numberWithCommas(hashrate) + - "\n" + - "Difficulty: " + + '\n' + + 'Difficulty: ' + numberWithCommas(difficulty.toFixed(0)) + - "\n" + - "Difficulty 24 Hour Average: " + + '\n' + + 'Difficulty 24 Hour Average: ' + numberWithCommas(difficulty24.toFixed(0)) + - "\n" + - "Current block: " + + '\n' + + 'Current block: ' + numberWithCommas(height.toFixed(0)) + - "\n" + - "Block Time: " + + '\n' + + 'Block Time: ' + numberWithCommas(block_time.toFixed(0)) + - " seconds \n" + - "Block Reward: " + + ' seconds \n' + + 'Block Reward: ' + numberWithCommas(reward.toFixed(0)) + - " LBC \n" + - "Sources: https://explorer.lbry.io & \n" + - "https://whattomine.com/coins/164-lbc-lbry"; + ' LBC \n' + + 'Sources: https://explorer.lbry.io & \n' + + 'https://whattomine.com/coins/164-lbc-lbry'; const embed = { description: description, color: 7976557, author: { - name: "LBRY Network Stats", - icon_url: "https://i.imgur.com/yWf5USu.png" + name: 'LBRY Network Stats', + icon_url: 'https://i.imgur.com/yWf5USu.png' } }; msg.channel.send({ embed }); @@ -164,27 +149,19 @@ exports.hash = { }); } function sendProfitInfo(bot, msg, suffix) { - needle.get("https://whattomine.com/coins/164.json", function( - error, - response - ) { + needle.get('https://whattomine.com/coins/164.json', function(error, response) { if (error || response.statusCode !== 200) { - msg.channel.send("whattomine API is not available"); + msg.channel.send('whattomine API is not available'); } else { words = suffix .trim() - .split(" ") + .split(' ') .filter(function(n) { - return n !== ""; + return n !== ''; }); var myhashrate = words[1]; - if ( - myhashrate == "" || - myhashrate == null || - myhashrate == undefined || - myhashrate == " " - ) { - myhashrate = "100"; + if (myhashrate == '' || myhashrate == null || myhashrate == undefined || myhashrate == ' ') { + myhashrate = '100'; } var Diff = response.body.difficulty24; var Reward = response.body.block_reward; @@ -192,33 +169,32 @@ exports.hash = { var LBC = myHash / 2000 * (1 / ((Diff * 2) ^ 32) * Reward) * 3600; var LBC24 = myHash / 2000 * (1 / ((Diff * 2) ^ 32) * Reward) * 86400; var LBC1w = myHash / 2000 * (1 / ((Diff * 2) ^ 32) * Reward) * 604800; - var LBC1m = - myHash / 2000 * (1 / ((Diff * 2) ^ 32) * Reward) * 2628000; + var LBC1m = myHash / 2000 * (1 / ((Diff * 2) ^ 32) * Reward) * 2628000; var message = - "With **" + + 'With **' + myHash + - " Mh/s** and Average 24 hour Difficulty: **" + + ' Mh/s** and Average 24 hour Difficulty: **' + Diff.toFixed(0) + - "**\n" + - "You can potentially earn the following amounts of **LBC**: \n" + - "1 Hour = **" + + '**\n' + + 'You can potentially earn the following amounts of **LBC**: \n' + + '1 Hour = **' + LBC.toFixed(4) + - "** \n" + - "1 Day = **" + + '** \n' + + '1 Day = **' + LBC24.toFixed(2) + - "** \n" + - "1 Week = **" + + '** \n' + + '1 Week = **' + LBC1w.toFixed(4) + - "** \n" + - "1 Month = **" + + '** \n' + + '1 Month = **' + LBC1m.toFixed(4) + - "** \n"; + '** \n'; const embed = { description: message, color: 7976557, author: { - name: "Hashing Power Calculator!", - icon_url: "https://i.imgur.com/nKHVQgq.png" + name: 'Hashing Power Calculator!', + icon_url: 'https://i.imgur.com/nKHVQgq.png' } }; msg.channel.send({ embed }); @@ -227,7 +203,7 @@ exports.hash = { }); } function numberWithCommas(x) { - return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); + return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','); } } }; diff --git a/bot/modules/ircbridge.js b/bot/modules/ircbridge.js index a9e3960..3154fac 100644 --- a/bot/modules/ircbridge.js +++ b/bot/modules/ircbridge.js @@ -1,7 +1,7 @@ -const discordIRC = require("elmadev-discord-irc").default; -const config = require("config"); -const ircconfig = config.get("irc"); -exports.custom = ["irc"]; +const discordIRC = require('elmadev-discord-irc').default; +const config = require('config'); +const ircconfig = config.get('irc'); +exports.custom = ['irc']; exports.irc = function(bot) { discordIRC([ircconfig]); diff --git a/bot/modules/lbrylink.js b/bot/modules/lbrylink.js index c1696fd..998c330 100644 --- a/bot/modules/lbrylink.js +++ b/bot/modules/lbrylink.js @@ -1,67 +1,88 @@ -let inPrivate = require("../helpers.js").inPrivate; -let ResponseDebug = "false"; +let inPrivate = require('../helpers.js').inPrivate; +let responseDebug = false; exports.custom = [ - "lbrylink" //change this to your function name + 'lbrylink' //change this to your function name ]; exports.lbrylink = function(bot, msg, suffix) { - bot.on("message", msg => { + bot.on('message', msg => { if (inPrivate(msg)) { return; } - var link = msg.content.indexOf("lbry://"); - if (link != -1) { - var text = msg.content.replace("lbry://", "https://open.lbry.io/"); - var message = GetWordByPos(text, link); - if (ResponseDebug == "true") { - console.log("text = " + text); - console.log("message = " + message); + if (msg.content.includes('lbry://')) { + //Extract URL from Message + newURL = msg.content + .replace('lbry://', 'https://open.lbry.io/') + .match(/\bhttps?:\/\/\S+/gi) + .toString(); + if (responseDebug) { + console.log('___________________________'); + console.log('newURL = ' + newURL); } - if (message === "https://open.lbry.io/") { + + //Check if just lbry:// was supplied + if (newURL == 'https://open.lbry.io/') { return; } - if (message.search(">") != -1) { - parsename = message.split(">").pop(); - if (parsename.search("/") == -1) { + + //Check if Username Was Supplied + if (newURL.includes('>')) { + //Get rid of ID from message + parseID = newURL.split('>').pop(); + newURL = 'https://open.lbry.io' + parseID; + if (responseDebug) { + console.log('Username Provided!'); + console.log('parseID = ' + parseID); + console.log('newURL = ' + newURL); + } + + //check if just Username Was Supplied + if (!newURL.substr(20).includes('/')) { return; } - newname = message.split("/").pop(); - message = "https://open.lbry.io/" + newname; - if (ResponseDebug == "true") { - console.log("Username Provided!"); - console.log("parsename = " + parsename); - console.log("newname = " + newname); + + //check if more than username was supplied + //Also check obscurity in username like ``@MSFTserver` vs `@MSFTserverPics` + if (parseID.includes('/')) { + //parse out extra params before `/` like `<@123456789>Pics` + parseID = parseID.split('/').pop(); + newURL = 'https://open.lbry.io/' + parseID; + if (responseDebug) { + console.log('Username no / check'); + console.log('parseID = ' + parseID); + console.log('newURL = ' + newURL); + } + + //checks if username had if after it or just blank to be safe + if (newURL == 'https://open.lbry.io/' || parseID.startsWith('#')) { + return; + } } + + //one last saftey check + if (newURL == 'https://open.lbry.io') { + return; + } + + //If no UserName Found proceed } else { - var newname = message.replace("https://open.lbry.io/", ""); + if (newURL == 'https://open.lbry.io/') { + return; + } + if (responseDebug) { + console.log('___________________________'); + console.log('newURL = ' + newURL); + } } const embed = { - description: - "I see you tried to post a LBRY URL, here's a friendly hyperlink to share and for others to access your content with a single click: \n" + - "[lbry://" + - newname + - "](" + - message + - ")", + description: "I see you tried to post a LBRY URL, here's a friendly hyperlink to share and for others to access your content with a single click: \n" + newURL, color: 7976557, author: { - name: "LBRY Linker", - icon_url: "https://i.imgur.com/yWf5USu.png" + name: 'LBRY Linker', + icon_url: 'https://i.imgur.com/yWf5USu.png' } }; - msg.channel.send({ - embed - }); - } - - function GetWordByPos(str, pos) { - var left = str.substr(0, pos); - var right = str.substr(pos); - - left = left.replace(/^.+ /g, ""); - right = right.replace(/ .+$/g, ""); - - return left + right; + msg.channel.send({ embed }); } }); }; diff --git a/bot/modules/price.js b/bot/modules/price.js index 3b06b2b..d65163f 100644 --- a/bot/modules/price.js +++ b/bot/modules/price.js @@ -1,268 +1,265 @@ -"use strict"; -let jp = require("jsonpath"); -let moment = require("moment"); -let numeral = require("numeral"); -let request = require("request"); -let config = require("config"); -let hasPriceBotChannels = require("../helpers.js").hasPriceBotChannels; -let inPrivate = require("../helpers.js").inPrivate; -let ChannelID = config.get("pricebot").mainchannel; +'use strict'; +let jp = require('jsonpath'); +let moment = require('moment'); +let numeral = require('numeral'); +let request = require('request'); +let config = require('config'); +let hasPriceBotChannels = require('../helpers.js').hasPriceBotChannels; +let inPrivate = require('../helpers.js').inPrivate; +let ChannelID = config.get('pricebot').mainchannel; -exports.commands = ["price"]; +exports.commands = ['price']; exports.price = { - usage: " ", - description: "displays price of lbc", + usage: ' ', + description: 'displays price of lbc', process: function(bot, msg, suffix) { var options = { - defaultCurrency: "BTC", + defaultCurrency: 'BTC', // supported currencies and api steps to arrive at the final value currencies: { USD: { - steps: ["LBCBTC", "BTCUSD"], - format: "$0,0.00", - sign: "USD " + steps: ['LBCBTC', 'BTCUSD'], + format: '$0,0.00', + sign: 'USD ' }, GBP: { - steps: ["LBCBTC", "BTCGBP"], - format: "£0,0.00", - sign: "£" + steps: ['LBCBTC', 'BTCGBP'], + format: '£0,0.00', + sign: '£' }, AUD: { - steps: ["LBCBTC", "BTCAUD"], - format: "$0,0.00", - sign: "AUD " + steps: ['LBCBTC', 'BTCAUD'], + format: '$0,0.00', + sign: 'AUD ' }, BRL: { - steps: ["LBCBTC", "BTCBRL"], - format: "R$0,0.00", - sign: "R$" + steps: ['LBCBTC', 'BTCBRL'], + format: 'R$0,0.00', + sign: 'R$' }, CAD: { - steps: ["LBCBTC", "BTCCAD"], - format: "$0,0.00", - sign: "CAD " + steps: ['LBCBTC', 'BTCCAD'], + format: '$0,0.00', + sign: 'CAD ' }, CHF: { - steps: ["LBCBTC", "BTCCHF"], - format: "CHF 0,0.00", - sign: "CHF" + steps: ['LBCBTC', 'BTCCHF'], + format: 'CHF 0,0.00', + sign: 'CHF' }, CLP: { - steps: ["LBCBTC", "BTCCLP"], - format: "$0,0.00", - sign: "CLP " + steps: ['LBCBTC', 'BTCCLP'], + format: '$0,0.00', + sign: 'CLP ' }, CNY: { - steps: ["LBCBTC", "BTCCNY"], - format: "¥0,0.00", - sign: "¥" + steps: ['LBCBTC', 'BTCCNY'], + format: '¥0,0.00', + sign: '¥' }, DKK: { - steps: ["LBCBTC", "BTCDKK"], - format: "kr 0,0.00", - sign: "kr" + steps: ['LBCBTC', 'BTCDKK'], + format: 'kr 0,0.00', + sign: 'kr' }, EUR: { - steps: ["LBCBTC", "BTCEUR"], - format: "€0,0.00", - sign: "€" + steps: ['LBCBTC', 'BTCEUR'], + format: '€0,0.00', + sign: '€' }, HKD: { - steps: ["LBCBTC", "BTCHKD"], - format: "$0,0.00", - sign: "HKD " + steps: ['LBCBTC', 'BTCHKD'], + format: '$0,0.00', + sign: 'HKD ' }, INR: { - steps: ["LBCBTC", "BTCINR"], - format: "₹0,0.00", - sign: "₹" + steps: ['LBCBTC', 'BTCINR'], + format: '₹0,0.00', + sign: '₹' }, ISK: { - steps: ["LBCBTC", "BTCISK"], - format: "kr 0,0.00", - sign: "kr" + steps: ['LBCBTC', 'BTCISK'], + format: 'kr 0,0.00', + sign: 'kr' }, JPY: { - steps: ["LBCBTC", "BTCJPY"], - format: "¥0,0.00", - sign: "¥" + steps: ['LBCBTC', 'BTCJPY'], + format: '¥0,0.00', + sign: '¥' }, KRW: { - steps: ["LBCBTC", "BTCKRW"], - format: "₩0,0.00", - sign: "₩" + steps: ['LBCBTC', 'BTCKRW'], + format: '₩0,0.00', + sign: '₩' }, NZD: { - steps: ["LBCBTC", "BTCNZD"], - format: "$0,0.00", - sign: "NZD " + steps: ['LBCBTC', 'BTCNZD'], + format: '$0,0.00', + sign: 'NZD ' }, PLN: { - steps: ["LBCBTC", "BTCPLN"], - format: "zł 0,0.00", - sign: "zł" + steps: ['LBCBTC', 'BTCPLN'], + format: 'zł 0,0.00', + sign: 'zł' }, RUB: { - steps: ["LBCBTC", "BTCRUB"], - format: "RUB 0,0.00", - sign: "RUB" + steps: ['LBCBTC', 'BTCRUB'], + format: 'RUB 0,0.00', + sign: 'RUB' }, SEK: { - steps: ["LBCBTC", "BTCSEK"], - format: "kr 0,0.00", - sign: "kr" + steps: ['LBCBTC', 'BTCSEK'], + format: 'kr 0,0.00', + sign: 'kr' }, SGD: { - steps: ["LBCBTC", "BTCSGD"], - format: "$0,0.00", - sign: "SGD " + steps: ['LBCBTC', 'BTCSGD'], + format: '$0,0.00', + sign: 'SGD ' }, THB: { - steps: ["LBCBTC", "BTCTHB"], - format: "฿0,0.00", - sign: "฿" + steps: ['LBCBTC', 'BTCTHB'], + format: '฿0,0.00', + sign: '฿' }, TWD: { - steps: ["LBCBTC", "BTCTWD"], - format: "NT$0,0.00", - sign: "NT$" + steps: ['LBCBTC', 'BTCTWD'], + format: 'NT$0,0.00', + sign: 'NT$' }, IDR: { - steps: ["LBCBTC", "BTCIDR"], - format: "Rp0,0.00", - sign: "Rp" + steps: ['LBCBTC', 'BTCIDR'], + format: 'Rp0,0.00', + sign: 'Rp' }, BTC: { - steps: ["LBCBTC"], - format: "0,0[.][00000000] BTC", - sign: "BTC" + steps: ['LBCBTC'], + format: '0,0[.][00000000] BTC', + sign: 'BTC' } }, // api steps api: { LBCBTC: { - url: "https://bittrex.com/api/v1.1/public/getticker?market=BTC-LBC", - path: "$.result.Bid" + url: 'https://bittrex.com/api/v1.1/public/getticker?market=BTC-LBC', + path: '$.result.Bid' }, BTCUSD: { - url: "https://blockchain.info/ticker", - path: "$.USD.buy" + url: 'https://blockchain.info/ticker', + path: '$.USD.buy' }, BTCGBP: { - url: "https://blockchain.info/ticker", - path: "$.GBP.buy" + url: 'https://blockchain.info/ticker', + path: '$.GBP.buy' }, BTCAUD: { - url: "https://blockchain.info/ticker", - path: "$.AUD.buy" + url: 'https://blockchain.info/ticker', + path: '$.AUD.buy' }, BTCBRL: { - url: "https://blockchain.info/ticker", - path: "$.BRL.buy" + url: 'https://blockchain.info/ticker', + path: '$.BRL.buy' }, BTCCAD: { - url: "https://blockchain.info/ticker", - path: "$.CAD.buy" + url: 'https://blockchain.info/ticker', + path: '$.CAD.buy' }, BTCCHF: { - url: "https://blockchain.info/ticker", - path: "$.CHF.buy" + url: 'https://blockchain.info/ticker', + path: '$.CHF.buy' }, BTCCLP: { - url: "https://blockchain.info/ticker", - path: "$.CLP.buy" + url: 'https://blockchain.info/ticker', + path: '$.CLP.buy' }, BTCCNY: { - url: "https://blockchain.info/ticker", - path: "$.CNY.buy" + url: 'https://blockchain.info/ticker', + path: '$.CNY.buy' }, BTCDKK: { - url: "https://blockchain.info/ticker", - path: "$.DKK.buy" + url: 'https://blockchain.info/ticker', + path: '$.DKK.buy' }, BTCEUR: { - url: "https://blockchain.info/ticker", - path: "$.EUR.buy" + url: 'https://blockchain.info/ticker', + path: '$.EUR.buy' }, BTCHKD: { - url: "https://blockchain.info/ticker", - path: "$.HKD.buy" + url: 'https://blockchain.info/ticker', + path: '$.HKD.buy' }, BTCINR: { - url: "https://blockchain.info/ticker", - path: "$.INR.buy" + url: 'https://blockchain.info/ticker', + path: '$.INR.buy' }, BTCISK: { - url: "https://blockchain.info/ticker", - path: "$.ISK.buy" + url: 'https://blockchain.info/ticker', + path: '$.ISK.buy' }, BTCJPY: { - url: "https://blockchain.info/ticker", - path: "$.JPY.buy" + url: 'https://blockchain.info/ticker', + path: '$.JPY.buy' }, BTCKRW: { - url: "https://blockchain.info/ticker", - path: "$.KRW.buy" + url: 'https://blockchain.info/ticker', + path: '$.KRW.buy' }, BTCNZD: { - url: "https://blockchain.info/ticker", - path: "$.NZD.buy" + url: 'https://blockchain.info/ticker', + path: '$.NZD.buy' }, BTCPLN: { - url: "https://blockchain.info/ticker", - path: "$.PLN.buy" + url: 'https://blockchain.info/ticker', + path: '$.PLN.buy' }, BTCRUB: { - url: "https://blockchain.info/ticker", - path: "$.RUB.buy" + url: 'https://blockchain.info/ticker', + path: '$.RUB.buy' }, BTCSEK: { - url: "https://blockchain.info/ticker", - path: "$.SEK.buy" + url: 'https://blockchain.info/ticker', + path: '$.SEK.buy' }, BTCSGD: { - url: "https://blockchain.info/ticker", - path: "$.SGD.buy" + url: 'https://blockchain.info/ticker', + path: '$.SGD.buy' }, BTCTHB: { - url: "https://blockchain.info/ticker", - path: "$.THB.buy" + url: 'https://blockchain.info/ticker', + path: '$.THB.buy' }, BTCTWD: { - url: "https://blockchain.info/ticker", - path: "$.TWD.buy" + url: 'https://blockchain.info/ticker', + path: '$.TWD.buy' }, BTCIDR: { - url: - "https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=IDR", - path: "$.IDR" + url: 'https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=IDR', + path: '$.IDR' } }, // display date/time format - dtFormat: "Do MMM YYYY h:mma [UTC]", + dtFormat: 'Do MMM YYYY h:mma [UTC]', // refresh rate in milliseconds to retrieve a new price (default to 10 minutes) refreshTime: 100000 }; var words = suffix .trim() - .split(" ") + .split(' ') .filter(function(n) { - return n !== ""; + return n !== ''; }); - var currency = - words.length > 0 ? words[0].toUpperCase() : options.defaultCurrency; + var currency = words.length > 0 ? words[0].toUpperCase() : options.defaultCurrency; var amount = words.length > 1 ? parseFloat(words[1], 10) : 1; - var showHelp = - isNaN(amount) || Object.keys(options.currencies).indexOf(currency) === -1; + var showHelp = isNaN(amount) || Object.keys(options.currencies).indexOf(currency) === -1; // store the last retrieved rate var cachedRates = {}; - var command = "!price"; + var command = '!price'; var currencies = Object.keys(options.currencies); for (var i = 0; i < currencies.length; i++) { @@ -275,9 +272,7 @@ exports.price = { doHelp(bot, msg, suffix); } else { if (!hasPriceBotChannels(msg) && !inPrivate(msg)) { - msg.channel.send( - "Please use <#" + ChannelID + "> or DMs to talk to price bot." - ); + msg.channel.send('Please use <#' + ChannelID + '> or DMs to talk to price bot.'); return; } doSteps(bot, currency, amount); @@ -285,44 +280,32 @@ exports.price = { function doHelp(bot, msg, suffix) { if (!hasPriceBotChannels(msg) && !inPrivate(msg)) { - msg.channel.send( - "Please use <#" + ChannelID + "> or DMs to talk to price bot." - ); + msg.channel.send('Please use <#' + ChannelID + '> or DMs to talk to price bot.'); return; } var message = - "**" + + '**' + command + - "**: show the price of 1 LBC in " + + '**: show the price of 1 LBC in ' + options.defaultCurrency + - "\n" + - "**" + + '\n' + + '**' + command + - " help**: this message\n" + - "**" + + ' help**: this message\n' + + '**' + command + - " CURRENCY**: show the price of 1 LBC in CURRENCY. Supported values for CURRENCY are Listed Below\n" + - "**" + + ' CURRENCY**: show the price of 1 LBC in CURRENCY. Supported values for CURRENCY are Listed Below\n' + + '**' + command + - " CURRENCY AMOUNT**: show the price of AMOUNT LBC in CURRENCY\n" + - "**Supported Currencies:** *usd*, *gbp*, *eur*, *aud*, *brl*, *cad*, *chf*, *clp*, *cny*, *dkk*, *hkd*, *inr*, *isk*, *jpy*, *krw*, *nzd*, *pln* ,*rub*, *sek*, *sgd*, *thb*, *twd*, *idr* and *btc* (case-insensitive)"; + ' CURRENCY AMOUNT**: show the price of AMOUNT LBC in CURRENCY\n' + + '**Supported Currencies:** *usd*, *gbp*, *eur*, *aud*, *brl*, *cad*, *chf*, *clp*, *cny*, *dkk*, *hkd*, *inr*, *isk*, *jpy*, *krw*, *nzd*, *pln* ,*rub*, *sek*, *sgd*, *thb*, *twd*, *idr* and *btc* (case-insensitive)'; msg.channel.send(message); } function formatMessage(amount, rate, option) { var cur = option.sign; var value = numeral(rate.rate * amount).format(option.format); - return ( - "*" + - numeral(amount).format("0,0[.][00000000]") + - " LBC = " + - cur + - " " + - value + - "*\n_last updated " + - rate.time.utc().format(options.dtFormat) + - "_" - ); + return '*' + numeral(amount).format('0,0[.][00000000]') + ' LBC = ' + cur + ' ' + value + '*\n_last updated ' + rate.time.utc().format(options.dtFormat) + '_'; } function doSteps(bot, currency, amount) { @@ -330,9 +313,7 @@ exports.price = { var shouldReload = true; if (cachedRates[currency]) { var cache = cachedRates[currency]; - shouldReload = - cache.time === null || - moment().diff(cache.time) >= options.refreshTime; + shouldReload = cache.time === null || moment().diff(cache.time) >= options.refreshTime; if (!shouldReload) { var message = formatMessage(amount, cache, option); msg.channel.send(message); @@ -354,22 +335,14 @@ exports.price = { if (steps.length > 0) { var pairName = steps[0]; if (!options.api[pairName]) { - msg.channel.send( - "There was a configuration error. " + - pairName + - " pair was not found." - ); + msg.channel.send('There was a configuration error. ' + pairName + ' pair was not found.'); return; } var pair = options.api[pairName]; request.get(pair.url, function(error, response, body) { if (error) { - msg.channel.send( - err.message - ? err.message - : "The request could not be completed at this time. Please try again later." - ); + msg.channel.send(err.message ? err.message : 'The request could not be completed at this time. Please try again later.'); return; } var pairRate = 0; @@ -398,9 +371,7 @@ exports.price = { cachedRates[currency] = result; msg.channel.send(formatMessage(amount, result, option)); } else { - msg.channel.send( - "The rate returned for the " + pairName + " pair was invalid." - ); + msg.channel.send('The rate returned for the ' + pairName + ' pair was invalid.'); } }); } diff --git a/bot/modules/purge.js b/bot/modules/purge.js index 11222c9..a287ae5 100644 --- a/bot/modules/purge.js +++ b/bot/modules/purge.js @@ -1,13 +1,13 @@ -let hasPerms = require("../helpers.js").hasPerms; -let inPrivate = require("../helpers.js").inPrivate; +let hasPerms = require('../helpers.js').hasPerms; +let inPrivate = require('../helpers.js').inPrivate; exports.commands = [ - "purge" // command that is in this file, every command needs it own export as shown below + 'purge' // command that is in this file, every command needs it own export as shown below ]; exports.purge = { - usage: "", - description: "Deletes Messages", + usage: '', + description: 'Deletes Messages', process: function(bot, msg, suffix) { if (inPrivate(msg)) { msg.channel.send("You Cant Purge Message In DM's!"); @@ -15,7 +15,7 @@ exports.purge = { } if (hasPerms(msg)) { if (!suffix) { - var newamount = "2"; + var newamount = '2'; } else { var amount = Number(suffix); var adding = 1; @@ -29,25 +29,15 @@ exports.purge = { .then(messages => { msg.channel.bulkDelete(messages); // Logging the number of messages deleted on both the channel and console. - msg.channel - .send( - "Deletion of messages successful. \n Total messages deleted including command: " + - newamount - ) - .then(message => message.delete(5000)); - console.log( - "Deletion of messages successful. \n Total messages deleted including command: " + - newamount - ); + msg.channel.send('Deletion of messages successful. \n Total messages deleted including command: ' + newamount).then(message => message.delete(5000)); + console.log('Deletion of messages successful. \n Total messages deleted including command: ' + newamount); }) .catch(err => { - console.log("Error while doing Bulk Delete"); + console.log('Error while doing Bulk Delete'); console.log(err); }); } else { - msg.channel - .send("only moderators can use this command!") - .then(message => message.delete(5000)); + msg.channel.send('only moderators can use this command!').then(message => message.delete(5000)); } } }; diff --git a/bot/modules/releasenotes.js b/bot/modules/releasenotes.js index c7e28e4..8240557 100644 --- a/bot/modules/releasenotes.js +++ b/bot/modules/releasenotes.js @@ -1,25 +1,25 @@ -let request = require("request"); -let config = require("config"); -let hasPerms = require("../helpers.js").hasPerms; -let inPrivate = require("../helpers.js").inPrivate; -let ChannelID = config.get("gitrelease").channel; +let request = require('request'); +let config = require('config'); +let hasPerms = require('../helpers.js').hasPerms; +let inPrivate = require('../helpers.js').inPrivate; +let ChannelID = config.get('gitrelease').channel; exports.commands = [ - "releasenotes" // command that is in this file, every command needs it own export as shown below + 'releasenotes' // command that is in this file, every command needs it own export as shown below ]; exports.releasenotes = { - usage: "", - description: "gets current release notes from GITHUB", + usage: '', + description: 'gets current release notes from GITHUB', process: function(bot, msg, suffix) { var headers = { - "Content-Type": "application/json", - "User-Agent": "Super Agent/0.0.1" + 'Content-Type': 'application/json', + 'User-Agent': 'Super Agent/0.0.1' }; // Configure the request var options = { - url: "https://api.github.com/repos/lbryio/lbry-app/releases/latest", - method: "GET", + url: 'https://api.github.com/repos/lbryio/lbry-app/releases/latest', + method: 'GET', headers: headers }; @@ -32,19 +32,18 @@ exports.releasenotes = { if (releasemessage.length < 2000) { message = { embed: { - title: "*Download " + releasename + " here!*", + title: '*Download ' + releasename + ' here!*', description: releasemessage, url: releaseurl, color: 7976557, timestamp: releasedate, author: { - name: "Lbry-app Release Notes for " + releasename, - icon_url: - "http://www.pngall.com/wp-content/uploads/2016/04/Github-PNG-Image.png" + name: 'Lbry-app Release Notes for ' + releasename, + icon_url: 'http://www.pngall.com/wp-content/uploads/2016/04/Github-PNG-Image.png' }, footer: { - icon_url: "https://i.imgur.com/yWf5USu.png", - text: "Lbry-app Updated " + icon_url: 'https://i.imgur.com/yWf5USu.png', + text: 'Lbry-app Updated ' } } }; @@ -52,18 +51,18 @@ exports.releasenotes = { msg.channel.send(message); return; } - if (hasPerms(msg) && suffix === "post") { + if (hasPerms(msg) && suffix === 'post') { bot.channels.get(ChannelID).send(message); } else { - msg.channel.send(msg.author + " Release notes sent via DM"); + msg.channel.send(msg.author + ' Release notes sent via DM'); msg.author.send(message); } } else { message = releasemessage .trim() - .split("###") + .split('###') .filter(function(n) { - return n !== ""; + return n !== ''; }); releasemessage1 = message[0]; releasemessage2 = message[1]; @@ -72,19 +71,18 @@ exports.releasenotes = { releasemessage5 = message[4]; message1 = { embed: { - title: "*Download " + releasename + " here!*", + title: '*Download ' + releasename + ' here!*', description: releasemessage1, url: releaseurl, color: 7976557, timestamp: releasedate, author: { - name: "Lbry-app Release Notes for " + releasename, - icon_url: - "http://www.pngall.com/wp-content/uploads/2016/04/Github-PNG-Image.png" + name: 'Lbry-app Release Notes for ' + releasename, + icon_url: 'http://www.pngall.com/wp-content/uploads/2016/04/Github-PNG-Image.png' }, footer: { - icon_url: "https://i.imgur.com/yWf5USu.png", - text: "Lbry-app Updated " + icon_url: 'https://i.imgur.com/yWf5USu.png', + text: 'Lbry-app Updated ' } } }; @@ -94,12 +92,11 @@ exports.releasenotes = { color: 7976557, timestamp: releasedate, author: { - icon_url: - "http://www.pngall.com/wp-content/uploads/2016/04/Github-PNG-Image.png" + icon_url: 'http://www.pngall.com/wp-content/uploads/2016/04/Github-PNG-Image.png' }, footer: { - icon_url: "https://i.imgur.com/yWf5USu.png", - text: "Lbry-app Updated " + icon_url: 'https://i.imgur.com/yWf5USu.png', + text: 'Lbry-app Updated ' } } }; @@ -109,12 +106,11 @@ exports.releasenotes = { color: 7976557, timestamp: releasedate, author: { - icon_url: - "http://www.pngall.com/wp-content/uploads/2016/04/Github-PNG-Image.png" + icon_url: 'http://www.pngall.com/wp-content/uploads/2016/04/Github-PNG-Image.png' }, footer: { - icon_url: "https://i.imgur.com/yWf5USu.png", - text: "Lbry-app Updated " + icon_url: 'https://i.imgur.com/yWf5USu.png', + text: 'Lbry-app Updated ' } } }; @@ -124,12 +120,11 @@ exports.releasenotes = { color: 7976557, timestamp: releasedate, author: { - icon_url: - "http://www.pngall.com/wp-content/uploads/2016/04/Github-PNG-Image.png" + icon_url: 'http://www.pngall.com/wp-content/uploads/2016/04/Github-PNG-Image.png' }, footer: { - icon_url: "https://i.imgur.com/yWf5USu.png", - text: "Lbry-app Updated " + icon_url: 'https://i.imgur.com/yWf5USu.png', + text: 'Lbry-app Updated ' } } }; @@ -139,12 +134,11 @@ exports.releasenotes = { color: 7976557, timestamp: releasedate, author: { - icon_url: - "http://www.pngall.com/wp-content/uploads/2016/04/Github-PNG-Image.png" + icon_url: 'http://www.pngall.com/wp-content/uploads/2016/04/Github-PNG-Image.png' }, footer: { - icon_url: "https://i.imgur.com/yWf5USu.png", - text: "Lbry-app Updated " + icon_url: 'https://i.imgur.com/yWf5USu.png', + text: 'Lbry-app Updated ' } } }; @@ -156,14 +150,14 @@ exports.releasenotes = { msg.channel.send(message5); return; } - if (hasPerms(msg) && suffix === "post") { + if (hasPerms(msg) && suffix === 'post') { bot.channels.get(ChannelID).send(message1); bot.channels.get(ChannelID).send(message2); bot.channels.get(ChannelID).send(message3); bot.channels.get(ChannelID).send(message4); bot.channels.get(ChannelID).send(message5); } else { - msg.channel.send(msg.author + " Release notes sent via DM"); + msg.channel.send(msg.author + ' Release notes sent via DM'); msg.author.send(message1); msg.author.send(message2); msg.author.send(message3); diff --git a/bot/modules/rolesetter.js b/bot/modules/rolesetter.js index e9a1db0..2b8e041 100644 --- a/bot/modules/rolesetter.js +++ b/bot/modules/rolesetter.js @@ -1,20 +1,20 @@ -let config = require("config"); -let botconfig = config.get("bot"); -let rolelist = config.get("rolelist"); +let config = require('config'); +let botconfig = config.get('bot'); +let rolelist = config.get('rolelist'); exports.commands = [ - "addrole", // command that is in this file, every command needs it own export as shown below - "delrole", - "roles" + 'addrole', // command that is in this file, every command needs it own export as shown below + 'delrole', + 'roles' ]; exports.addrole = { - usage: "", - description: "Adds you to specified role", + usage: '', + description: 'Adds you to specified role', process: function(bot, msg, suffix) { // Here the bot,msg and suffix is avaible, this function can be async if needed. - var newrole = msg.guild.roles.find("name", suffix); - + let newrole = msg.guild.roles.find('name', suffix); + let baserole = msg.guild.roles.find('name', rolelist.baserole); // Checks if the user put a role in the message. if (suffix) { // Checks if the role mentioned in the message is in the allowed roles listed in the wunderbot config. @@ -22,48 +22,35 @@ exports.addrole = { // Checks if the role even exists in the discord server if (newrole !== null) { // Checks if the member has the role that they are trying to add - if (!msg.member.roles.find("name", suffix)) { - msg.member - .addRole(newrole) - .then( - msg.channel.send( - msg.member + " has been added to the " + suffix + " role!" - ) - ); + if (!msg.member.roles.find('name', suffix)) { + msg.member.addRole(newrole).then(msg.channel.send(msg.member + ' has been added to the ' + suffix + ' role!')); + if (baserole !== null) { + if (!msg.member.roles.find('name', rolelist.baserole)) { + msg.member.addRole(baserole).then(msg.channel.send(msg.member + ' has been added to the ' + rolelist.baserole + ' role!')); + } + } else { + msg.channel.send('The ' + rolelist.baserole + " Doesn't exist. Please add that role first!"); + } } else { - msg.channel.send( - "It seems that you already have that role! Try removing it first with the " + - botconfig.prefix + - "delrole command!" - ); + msg.channel.send('It seems that you already have that role! Try removing it first with the ' + botconfig.prefix + 'delrole command!'); } } else { - msg.channel.send( - "The role " + "`" + suffix + "`" + " does not exist!" - ); + msg.channel.send('The role ' + '`' + suffix + '`' + ' does not exist!'); } } else { - msg.channel.send( - "That role isn't one you can add yourself too! Please run the " + - botconfig.prefix + - "roles command to find out which ones are allowed." - ); + msg.channel.send("That role isn't one you can add yourself too! Please run the " + botconfig.prefix + 'roles command to find out which ones are allowed.'); } } else { - msg.channel.send( - "Please specify a role. Type " + - botconfig.prefix + - "roles to see which you may add!" - ); + msg.channel.send('Please specify a role. Type ' + botconfig.prefix + 'roles to see which you may add!'); } } }; exports.delrole = { - usage: "", - description: "Deletes your role specified", + usage: '', + description: 'Deletes your role specified', process: function(bot, msg, suffix) { // Here the bot,msg and suffix is avaible, this function can be async if needed. - let oldrole = msg.guild.roles.find("name", suffix); + let oldrole = msg.guild.roles.find('name', suffix); // Checks if the user put a role in the message. if (suffix) { // Checks if the role mentioned in the message is in the allowed roles listed in the wunderbot config. @@ -71,62 +58,52 @@ exports.delrole = { // Checks if the role even exists in the discord server if (oldrole !== null) { // Checks if the member has the role that they are trying to add - if (msg.member.roles.find("name", suffix)) { - msg.member - .removeRole(oldrole) - .then( - msg.channel.send( - msg.member + " has been removed from the " + suffix + " role!" - ) - ); + if (msg.member.roles.find('name', suffix)) { + msg.member.removeRole(oldrole).then(msg.channel.send(msg.member + ' has been removed from the ' + suffix + ' role!')); } else { - msg.channel.send( - "You don't seem to have that role! Try adding it first with the " + - botconfig.prefix + - "addrole command!" - ); + msg.channel.send("You don't seem to have that role! Try adding it first with the " + botconfig.prefix + 'addrole command!'); } } else { - msg.channel.send( - "The role " + "`" + suffix + "`" + " does not exist!" - ); + msg.channel.send('The role ' + '`' + suffix + '`' + ' does not exist!'); } } else { - msg.channel.send( - "That role isn't one you can add yourself too! Please run the " + - botconfig.prefix + - "roles command to find out which ones are allowed." - ); + msg.channel.send("That role isn't one you can add yourself too! Please run the " + botconfig.prefix + 'roles command to find out which ones are allowed.'); } } else { - msg.channel.send( - "Please specify a role. Type " + - botconfig.prefix + - "roles to see which you may add!" - ); + msg.channel.send('Please specify a role. Type ' + botconfig.prefix + 'roles to see which you may add!'); } } }; exports.roles = { - usage: "", - description: "displays roles you can give yourself", + usage: '', + description: 'displays roles you can give yourself', process: function(bot, msg, suffix) { // Here the bot,msg and suffix is avaible, this function can be async if needed. msg.channel.send({ embed: { color: 3447003, - title: "Wunderbot", - description: "You have accessed the rolebot function of Wunderbot!", + title: 'Wunderbot', + description: 'You have accessed the rolebot function of Wunderbot!', fields: [ { - name: "List of roles", + name: 'List of roles', value: buildRoleString(rolelist.allowedroles), inline: false + }, + { + name: 'How to add a role to yourself', + value: '!addrole (role) - Adds a specified role to yourself.\n!addrole Certified Troll would add the Certified Troll role.', + inline: false + }, + { + name: 'How to remove a role from yourself', + value: '!delrole (role) - Removed a specified role from yourself.\n!delrole Certified Troll would remove the Certified Troll role.', + inline: false } ], footer: { icon_url: msg.author.avatarURL, - text: "Requested by: " + JSON.stringify(msg.author.username) + text: 'Requested by: ' + JSON.stringify(msg.author.username) } } }); @@ -135,9 +112,9 @@ exports.roles = { }; function buildRoleString(roles) { - let str = ""; + let str = ''; for (let i = 0; i < roles.length; i++) { - str += "`" + roles[i] + "`" + "\n"; + str += '`' + roles[i] + '`' + '\n'; } return str; } diff --git a/bot/modules/spam-detection.js b/bot/modules/spam-detection.js index 2a006e6..ef21ea6 100644 --- a/bot/modules/spam-detection.js +++ b/bot/modules/spam-detection.js @@ -2,12 +2,12 @@ const authors = []; let warned = []; let banned = []; let messagelog = []; -let config = require("config"); -let botlog = config.get("moderation").logchannel; -let hasPerms = require("../helpers.js").hasPerms; -let inPrivate = require("../helpers.js").inPrivate; -let hasExcludedSpamChannels = require("../helpers.js").hasExcludedSpamChannels; -let hasExcludedSpamUsers = require("../helpers.js").hasExcludedSpamUsers; +let config = require('config'); +let botlog = config.get('moderation').logchannel; +let hasPerms = require('../helpers.js').hasPerms; +let inPrivate = require('../helpers.js').inPrivate; +let hasExcludedSpamChannels = require('../helpers.js').hasExcludedSpamChannels; +let hasExcludedSpamUsers = require('../helpers.js').hasExcludedSpamUsers; /** * Add simple spam protection to your discord server. @@ -16,26 +16,19 @@ let hasExcludedSpamUsers = require("../helpers.js").hasExcludedSpamUsers; * @return {[type]} [description] */ -exports.custom = ["antiSpam"]; +exports.custom = ['antiSpam']; exports.antiSpam = function(bot) { const warnBuffer = 5; const maxBuffer = 10; const interval = 1500; - const warningMessage = - ", Stop spamming or you will be banned! This is your warning!"; - const banMessage = "has been banned for spamming!"; + const warningMessage = ', Stop spamming or you will be banned! This is your warning!'; + const banMessage = 'has been banned for spamming!'; const maxDuplicatesWarning = 5; const maxDuplicatesBan = 10; - bot.on("message", msg => { - if ( - inPrivate(msg) || - msg.author.bot || - hasPerms(msg) || - hasExcludedSpamChannels(msg) || - hasExcludedSpamUsers(msg) - ) { + bot.on('message', msg => { + if (inPrivate(msg) || msg.author.bot || hasPerms(msg) || hasExcludedSpamChannels(msg) || hasExcludedSpamUsers(msg)) { return; } if (msg.author.id != bot.user.id) { @@ -52,11 +45,7 @@ exports.antiSpam = function(bot) { // Check how many times the same message has been sent. let msgMatch = 0; for (let i = 0; i < messagelog.length; i++) { - if ( - messagelog[i].message == msg.content && - messagelog[i].author == msg.author.id && - msg.author.id !== bot.user.id - ) { + if (messagelog[i].message == msg.content && messagelog[i].author == msg.author.id && msg.author.id !== bot.user.id) { msgMatch++; } } @@ -99,7 +88,7 @@ exports.antiSpam = function(bot) { */ function warn(msg, userid) { warned.push(msg.author.id); - msg.channel.send(msg.author + " " + warningMessage); + msg.channel.send(msg.author + ' ' + warningMessage); } /** @@ -117,21 +106,17 @@ exports.antiSpam = function(bot) { banned.push(msg.author.id); - let user = msg.channel.guild.members.find( - member => member.user.id === msg.author.id - ); + let user = msg.channel.guild.members.find(member => member.user.id === msg.author.id); if (user) { user .ban() .then(member => { - msg.channel.send(msg.author + " " + banMessage); - bot.channels.get(botlog).send(msg.author + " " + banMessage); + msg.channel.send(msg.author + ' ' + banMessage); + bot.channels.get(botlog).send(msg.author + ' ' + banMessage); return true; }) .catch(() => { - msg.channel.send( - "insufficient permission to kick " + msg.author + " for spamming." - ); + msg.channel.send('insufficient permission to kick ' + msg.author + ' for spamming.'); return false; }); } diff --git a/bot/modules/speech.js b/bot/modules/speech.js index 7bd3c26..49a8434 100644 --- a/bot/modules/speech.js +++ b/bot/modules/speech.js @@ -1,56 +1,54 @@ -let request = require("request"); -let wget = require("wget"); -let fs = require("fs"); -let config = require("config"); -let hasSpeechBotChannels = require("../helpers.js").hasSpeechBotChannels; -let inPrivate = require("../helpers.js").inPrivate; -let ChannelID = config.get("speechbot").mainchannel; +let request = require('request'); +let wget = require('wget'); +let fs = require('fs'); +let config = require('config'); +let hasSpeechBotChannels = require('../helpers.js').hasSpeechBotChannels; +let inPrivate = require('../helpers.js').inPrivate; +let ChannelID = config.get('speechbot').mainchannel; //debug output "true/false" outputs same error as slack message in console if set to true //if set to false console will be left blank like normal //some have more info on file details of error -let FullDebug = "true"; +let FullDebug = 'true'; //outputs response from speech, very bulk reply -let ResponseDebug = "false"; +let ResponseDebug = 'false'; exports.commands = [ - "speech" // command that is in this file, every command needs it own export as shown below + 'speech' // command that is in this file, every command needs it own export as shown below ]; exports.speech = { - usage: "", - description: "gets top claim from spee.ch, coming soon post to spee.ch", + usage: '', + description: 'gets top claim from spee.ch, coming soon post to spee.ch', process: function(bot, msg, suffix) { if (!hasSpeechBotChannels(msg) && !inPrivate(msg)) { - msg.channel.send( - "Please use <#" + ChannelID + "> or DMs to talk to speech bot." - ); + msg.channel.send('Please use <#' + ChannelID + '> or DMs to talk to speech bot.'); return; } - var command = "!speech"; + var command = '!speech'; words = suffix .trim() - .split(" ") + .split(' ') .filter(function(n) { - return n !== ""; + return n !== ''; }); var imagename = words[0]; //check if image name is help, if it is then do help message - if (imagename == "help") { + if (imagename == 'help') { doHelp(bot, msg, suffix); return; } else { //check if imagename is defined if not do error if (imagename === undefined) { - if (FullDebug === "true") { - var message = "`no name provided`"; - console.log("no name provided"); + if (FullDebug === 'true') { + var message = '`no name provided`'; + console.log('no name provided'); msg.channel.send(message); doHelp(bot, msg, suffix); return; } else { - var message = "`no name provided`"; + var message = '`no name provided`'; msg.channel.send(message); doHelp(bot, msg, suffix); return; @@ -62,19 +60,13 @@ exports.speech = { //check if a url is provided if none do help message if (filepath === undefined) { - if (FullDebug === "true") { - var message = - "`no url provided, fetching image from:`\n" + - "https://spee.ch/" + - imagename; - console.log("no url provided"); + if (FullDebug === 'true') { + var message = '`no url provided, fetching image from:`\n' + 'https://spee.ch/' + imagename; + console.log('no url provided'); msg.channel.send(message); return; } else { - var message = - "`no url provided, fetching image from:`\n" + - "https://spee.ch/" + - imagename; + var message = '`no url provided, fetching image from:`\n' + 'https://spee.ch/' + imagename; msg.channel.send(message); return; } @@ -87,16 +79,14 @@ exports.speech = { var linkvalid = url.slice(0, 4); //check of url provided begins with http in not throw error and help message - if (linkvalid !== "http") { - if (FullDebug === "true") { - var message = - "`error not a valid url, please start with http or https`"; - console.log("invalid url provided: " + filepath); + if (linkvalid !== 'http') { + if (FullDebug === 'true') { + var message = '`error not a valid url, please start with http or https`'; + console.log('invalid url provided: ' + filepath); msg.channel.send(message); return; } else { - var message = - "`error not a valid url, please start with http or https`"; + var message = '`error not a valid url, please start with http or https`'; msg.channel.send(message); return; } @@ -105,13 +95,13 @@ exports.speech = { //function to check if url is an image var isUriImage = function(uri) { //make sure we remove any nasty GET params - uri = uri.split("?")[0]; + uri = uri.split('?')[0]; //moving on, split the uri into parts that had dots before them - var parts = uri.split("."); + var parts = uri.split('.'); //get the last part ( should be the extension ) var extension = parts[parts.length - 1]; //define some image types to test against - var imageTypes = ["jpg", "jpeg", "tiff", "png", "gif", "bmp"]; + var imageTypes = ['jpg', 'jpeg', 'tiff', 'png', 'gif', 'bmp']; //check if the extension matches anything in the list. if it does set true if not set false if (imageTypes.indexOf(extension) !== -1) { return true; @@ -122,15 +112,13 @@ exports.speech = { //check if url is an image if its not throw error and help message if (isUriImage(url) === false) { - if (FullDebug === "true") { - var message = - "`error not a valid image url, be sure the link includes a file type`"; - console.log("invalid url provided: " + url); + if (FullDebug === 'true') { + var message = '`error not a valid image url, be sure the link includes a file type`'; + console.log('invalid url provided: ' + url); msg.channel.send(message); return; } else { - var message = - "`error not a valid image url, be sure the link includes a file type`"; + var message = '`error not a valid image url, be sure the link includes a file type`'; msg.channel.send(message); return; } @@ -139,49 +127,40 @@ exports.speech = { var eighteen = words[2]; //check is NSFW if yes or no sets proper value if none - if ( - eighteen == "" || - eighteen == "none" || - eighteen == undefined || - eighteen == null || - eighteen == "no" || - eighteen == "false" || - eighteen == false || - eighteen == "n" - ) { - eighteen = "no"; + if (eighteen == '' || eighteen == 'none' || eighteen == undefined || eighteen == null || eighteen == 'no' || eighteen == 'false' || eighteen == false || eighteen == 'n') { + eighteen = 'no'; } else { - eighteen = "yes"; + eighteen = 'yes'; } //prepare url for wget var source = url; //parse the filename to use to save file - filepath = source.split("/").pop(); + filepath = source.split('/').pop(); //set proper directory for downloading image - var outputFile = "speech-uploads/" + filepath; + var outputFile = 'speech-uploads/' + filepath; //set download directory to current working directory var dir = process.cwd(); //set full path to directory for speech uploading - var fullpath = dir + "\\speech-uploads\\" + filepath; + var fullpath = dir + '\\speech-uploads\\' + filepath; //download url via wget var download = wget.download(url, outputFile); //check if url is reachable if not throw error - download.on("error", function(err) { - if (FullDebug === "true") { - console.log("error could not reach: " + url + " : " + err); - var message = "`error url could not be reached`"; + download.on('error', function(err) { + if (FullDebug === 'true') { + console.log('error could not reach: ' + url + ' : ' + err); + var message = '`error url could not be reached`'; msg.channel.send(message); return; } else { - var message = "`error url could not be reached`"; + var message = '`error url could not be reached`'; msg.channel.send(message); return; } }); - download.on("end", output => { + download.on('end', output => { //if no errors and file ready -> do the request output && doSteps(bot, imagename, url, eighteen); }); @@ -191,17 +170,17 @@ exports.speech = { function doHelp(bot, msg, suffix) { msg.channel.send({ embed: { - title: "", + title: '', description: - "**!speech ``** : *displays top claim on speech* \n\n\n" + - "**COMING SOON POSTING TO SPEECH** \n\n" + - "**!speech ` `** : *Uploads Image URL to Spee.ch* \n" + - "**NOTE : dont include spaces in name (NSFW is optional true/false, if left blank will default to false)** \n" + - "EXAMPLE : `!speech my-image-name https://url/to/image.png false`", + '**!speech ``** : *displays top claim on speech* \n\n\n' + + '**COMING SOON POSTING TO SPEECH** \n\n' + + '**!speech ` `** : *Uploads Image URL to Spee.ch* \n' + + '**NOTE : dont include spaces in name (NSFW is optional true/false, if left blank will default to false)** \n' + + 'EXAMPLE : `!speech my-image-name https://url/to/image.png false`', color: 7976557, author: { - name: "Speech Bot Help", - icon_url: "https://i.imgur.com/yWf5USu.png" + name: 'Speech Bot Help', + icon_url: 'https://i.imgur.com/yWf5USu.png' } } }); @@ -211,7 +190,7 @@ exports.speech = { function doSteps(bot, imagename, url, eighteen) { request.post( //url to send post request - "https://spee.ch/api/publish", + 'https://spee.ch/api/publish', //json payload { json: { @@ -223,7 +202,7 @@ exports.speech = { //get response from server function(error, response, body) { //output response if ResponseDebug set to true - if (ResponseDebug === "true") { + if (ResponseDebug === 'true') { console.log(response); console.log(error); console.log(body.success); @@ -231,59 +210,36 @@ exports.speech = { } //check speech response for file path error, if found throw internal error! - if (body.message === "no files found in request") { - if (FullDebug === "true") { - console.log("no file found: " + fullpath); - var message = - "`Failed to upload file internally!!`\n please contact <@244245498746241025> or another moderator if the issue persists"; + if (body.message === 'no files found in request') { + if (FullDebug === 'true') { + console.log('no file found: ' + fullpath); + var message = '`Failed to upload file internally!!`\n please contact <@244245498746241025> or another moderator if the issue persists'; msg.channel.send(message); return; } else { - var message = - "`Failed to upload file internally!!`\n please contact <@244245498746241025> or another moderator if the issue persists"; + var message = '`Failed to upload file internally!!`\n please contact <@244245498746241025> or another moderator if the issue persists'; msg.channel.send(message); return; } } //check speech response for filename error, if found throw internal error! - if (body.message === "no name field found in request") { - if (FullDebug === "true") { - console.log("no name field found: " + imagename); - var message = - "`Failed to upload file internally!!`\n please contact <@244245498746241025> or another moderator if the issue persists"; + if (body.message === 'no name field found in request') { + if (FullDebug === 'true') { + console.log('no name field found: ' + imagename); + var message = '`Failed to upload file internally!!`\n please contact <@244245498746241025> or another moderator if the issue persists'; msg.channel.send(message); return; } else { - var message = - "`Failed to upload file internally!!`\n please contact <@244245498746241025> or another moderator if the issue persists"; + var message = '`Failed to upload file internally!!`\n please contact <@244245498746241025> or another moderator if the issue persists'; msg.channel.send(message); return; } } //if no errors post this message - var message = - 'uploading... \n "name":"' + - imagename + - '",\n "URL": "' + - url + - '",\n "nsfw":"' + - eighteen + - '"\n to spee.ch'; - console.log( - 'uploading... \n "name":"' + - imagename + - '",\n "file name": "' + - filepath + - '",\n "url":"' + - url + - '"\n "path":"' + - fullpath + - '"\n "nsfw": "' + - eighteen + - '"' - ); + var message = 'uploading... \n "name":"' + imagename + '",\n "URL": "' + url + '",\n "nsfw":"' + eighteen + '"\n to spee.ch'; + console.log('uploading... \n "name":"' + imagename + '",\n "file name": "' + filepath + '",\n "url":"' + url + '"\n "path":"' + fullpath + '"\n "nsfw": "' + eighteen + '"'); msg.channel.send(message); } ); diff --git a/bot/modules/stats.js b/bot/modules/stats.js index bbfed25..0f6f4b8 100644 --- a/bot/modules/stats.js +++ b/bot/modules/stats.js @@ -1,152 +1,143 @@ -let jp = require("jsonpath"); -let moment = require("moment"); -let numeral = require("numeral"); -let request = require("request"); -let config = require("config"); -let needle = require("needle"); -let hasStatsBotChannels = require("../helpers.js").hasStatsBotChannels; -let inPrivate = require("../helpers.js").inPrivate; -let ChannelID = config.get("statsbot").mainchannel; -let statsurl = "https://coinmarketcap.com/currencies/library-credit/"; +let jp = require('jsonpath'); +let moment = require('moment'); +let numeral = require('numeral'); +let request = require('request'); +let config = require('config'); +let needle = require('needle'); +let hasStatsBotChannels = require('../helpers.js').hasStatsBotChannels; +let inPrivate = require('../helpers.js').inPrivate; +let ChannelID = config.get('statsbot').mainchannel; +let statsurl = 'https://coinmarketcap.com/currencies/library-credit/'; exports.commands = [ - "stats" // command that is in this file, every command needs it own export as shown below + 'stats' // command that is in this file, every command needs it own export as shown below ]; exports.stats = { - usage: "", - description: "Displays list of current Market stats", + usage: '', + description: 'Displays list of current Market stats', process: function(bot, msg) { - needle.get( - "https://api.coinmarketcap.com/v1/ticker/library-credit/", - function(error, response) { - if (error || response.statusCode !== 200) { - msg.channel.send("coinmarketcap API is not available"); - } else { - var data = response.body[0]; - var rank = data.rank; - var price_usd = Number(data.price_usd); - var price_btc = Number(data.price_btc); - var market_cap_usd = Number(data.market_cap_usd); - var available_supply = Number(data.available_supply); - var total_supply = Number(data.total_supply); - var percent_change_1h = Number(data.percent_change_1h); - var percent_change_24h = Number(data.percent_change_24h); - var json = response.body[0]; - var newjson = parse_obj(json); - var parse = JSON.stringify(newjson); - var volume24_usd = parse.replace(/[^0-9]/g, ""); - var dt = new Date(); - var timestamp = dt.toUTCString(); - var hr_indicator = ":thumbsup:"; - var day_indicator = ":thumbsup:"; - if (percent_change_1h < 0) { - hr_indicator = ":thumbsdown:"; - } - if (percent_change_24h < 0) { - day_indicator = ":thumbsdown:"; - } + needle.get('https://api.coinmarketcap.com/v1/ticker/library-credit/', function(error, response) { + if (error || response.statusCode !== 200) { + msg.channel.send('coinmarketcap API is not available'); + } else { + var data = response.body[0]; + var rank = data.rank; + var price_usd = Number(data.price_usd); + var price_btc = Number(data.price_btc); + var market_cap_usd = Number(data.market_cap_usd); + var available_supply = Number(data.available_supply); + var total_supply = Number(data.total_supply); + var percent_change_1h = Number(data.percent_change_1h); + var percent_change_24h = Number(data.percent_change_24h); + var json = response.body[0]; + var newjson = parse_obj(json); + var parse = JSON.stringify(newjson); + var volume24_usd = parse.replace(/[^0-9]/g, ''); + var dt = new Date(); + var timestamp = dt.toUTCString(); + var hr_indicator = ':thumbsup:'; + var day_indicator = ':thumbsup:'; + if (percent_change_1h < 0) { + hr_indicator = ':thumbsdown:'; + } + if (percent_change_24h < 0) { + day_indicator = ':thumbsdown:'; + } - needle.get( - "https://api.coinmarketcap.com/v1/ticker/library-credit/?convert=GBP", - function(error, response) { + needle.get('https://api.coinmarketcap.com/v1/ticker/library-credit/?convert=GBP', function(error, response) { + if (error || response.statusCode !== 200) { + msg.channel.send('coinmarketcap API is not available'); + } else { + var data = response.body[0]; + var price_gbp = Number(data.price_gbp); + needle.get('https://api.coinmarketcap.com/v1/ticker/library-credit/?convert=EUR', function(error, response) { if (error || response.statusCode !== 200) { - msg.channel.send("coinmarketcap API is not available"); + msg.channel.send('coinmarketcap API is not available'); } else { var data = response.body[0]; - var price_gbp = Number(data.price_gbp); - needle.get( - "https://api.coinmarketcap.com/v1/ticker/library-credit/?convert=EUR", - function(error, response) { - if (error || response.statusCode !== 200) { - msg.channel.send("coinmarketcap API is not available"); - } else { - var data = response.body[0]; - var price_eur = Number(data.price_eur); - description = - "**Rank: [" + - rank + - "](" + - statsurl + - ")**\n" + - "**Data**\n" + - "Market Cap: [$" + - numberWithCommas(market_cap_usd) + - "](" + - statsurl + - ") \n" + - "Total Supply: [" + - numberWithCommas(total_supply) + - " LBC](" + - statsurl + - ")\n" + - "Circulating Supply: [" + - numberWithCommas(available_supply) + - " LBC](" + - statsurl + - ")\n" + - "24 Hour Volume: [$" + - volume24_usd + - "](" + - statsurl + - ") \n\n" + - "**Price**\n" + - "BTC: [₿" + - price_btc.toFixed(8) + - "](" + - statsurl + - ")\n" + - "USD: [$" + - price_usd.toFixed(2) + - "](" + - statsurl + - ") \n" + - "EUR: [€" + - price_eur.toFixed(2) + - "](" + - statsurl + - ") \n" + - "GBP: [£" + - price_gbp.toFixed(2) + - "](" + - statsurl + - ") \n\n" + - "**% Change**\n" + - "1 Hour: [" + - percent_change_1h + - "](" + - statsurl + - ") " + - hr_indicator + - " \n\n" + - "1 Day: [" + - percent_change_24h + - "](" + - statsurl + - ") " + - day_indicator + - " \n\n"; - const embed = { - description: description, - color: 7976557, - footer: { - text: "Last Updated: " + timestamp - }, - author: { - name: "Coin Market Cap Stats (LBC)", - url: statsurl, - icon_url: "https://i.imgur.com/yWf5USu.png" - } - }; - msg.channel.send({ embed }); - } + var price_eur = Number(data.price_eur); + description = + '**Rank: [' + + rank + + '](' + + statsurl + + ')**\n' + + '**Data**\n' + + 'Market Cap: [$' + + numberWithCommas(market_cap_usd) + + '](' + + statsurl + + ') \n' + + 'Total Supply: [' + + numberWithCommas(total_supply) + + ' LBC](' + + statsurl + + ')\n' + + 'Circulating Supply: [' + + numberWithCommas(available_supply) + + ' LBC](' + + statsurl + + ')\n' + + '24 Hour Volume: [$' + + volume24_usd + + '](' + + statsurl + + ') \n\n' + + '**Price**\n' + + 'BTC: [₿' + + price_btc.toFixed(8) + + '](' + + statsurl + + ')\n' + + 'USD: [$' + + price_usd.toFixed(2) + + '](' + + statsurl + + ') \n' + + 'EUR: [€' + + price_eur.toFixed(2) + + '](' + + statsurl + + ') \n' + + 'GBP: [£' + + price_gbp.toFixed(2) + + '](' + + statsurl + + ') \n\n' + + '**% Change**\n' + + '1 Hour: [' + + percent_change_1h + + '](' + + statsurl + + ') ' + + hr_indicator + + ' \n\n' + + '1 Day: [' + + percent_change_24h + + '](' + + statsurl + + ') ' + + day_indicator + + ' \n\n'; + const embed = { + description: description, + color: 7976557, + footer: { + text: 'Last Updated: ' + timestamp + }, + author: { + name: 'Coin Market Cap Stats (LBC)', + url: statsurl, + icon_url: 'https://i.imgur.com/yWf5USu.png' } - ); + }; + msg.channel.send({ embed }); } - } - ); - } + }); + } + }); } - ); + }); function parse_obj(obj) { var array = []; var prop; @@ -154,7 +145,7 @@ exports.stats = { if (obj.hasOwnProperty(prop)) { var key = parseInt(prop, 10); var value = obj[prop]; - if (typeof value == "object") { + if (typeof value == 'object') { value = parse_obj(value); } array[key] = value; @@ -163,7 +154,7 @@ exports.stats = { return array; } function numberWithCommas(x) { - return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); + return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','); } } }; diff --git a/bot/modules/supportbot.js b/bot/modules/supportbot.js index a7dfb9e..d0938e1 100644 --- a/bot/modules/supportbot.js +++ b/bot/modules/supportbot.js @@ -1,35 +1,35 @@ -"use strict"; +'use strict'; //let config = require("config"); //let rolelist = config.get("rolelist"); -const Discord = require("discord.js"); +const Discord = require('discord.js'); let initialized = false; let discordBot = null; module.exports = { - init: init + init: init }; function init(discordBot_) { - if (initialized) { - throw new Error("init was already called once"); - } + if (initialized) { + throw new Error('init was already called once'); + } - discordBot = discordBot_; + discordBot = discordBot_; - discordBot.on("message", checkForCommand); + discordBot.on('message', checkForCommand); } /** * * @param {String} message */ -let checkForCommand = function (message) { - //if the close command is found - if (!message.author.bot && message.content.toLowerCase().indexOf('!close') >= 0) { - //send the -close command twice with a 4 seconds timeout - message.channel.send("-close").catch(console.error); - setTimeout(() => { - message.channel.send("-close").catch(console.error); - }, 4000); - } -}; \ No newline at end of file +let checkForCommand = function(message) { + //if the close command is found + if (!message.author.bot && message.content.toLowerCase().indexOf('!close') >= 0) { + //send the -close command twice with a 4 seconds timeout + message.channel.send('-close').catch(console.error); + setTimeout(() => { + message.channel.send('-close').catch(console.error); + }, 4000); + } +}; diff --git a/bot/modules/tipfix.js b/bot/modules/tipfix.js index 38e0f4d..02f4fa2 100644 --- a/bot/modules/tipfix.js +++ b/bot/modules/tipfix.js @@ -1,9 +1,8 @@ -"use strict"; -exports.commands = ["tip"]; +'use strict'; +exports.commands = ['tip']; exports.tip = { - usage: "", - description: - "balance: get your balance\n deposit: get address for your deposits\n withdraw ADDRESS AMOUNT: withdraw AMOUNT credits to ADDRESS\n : mention a user with @ and then the amount to tip them", + usage: '', + description: 'balance: get your balance\n deposit: get address for your deposits\n withdraw ADDRESS AMOUNT: withdraw AMOUNT credits to ADDRESS\n : mention a user with @ and then the amount to tip them', process: function(bot) { return; // Tipping is now handled by the separate tipbot(in branch tipbot_dc), no need to to anything here... } diff --git a/bot/modules/welcome.js b/bot/modules/welcome.js index a3456a1..3f0637d 100644 --- a/bot/modules/welcome.js +++ b/bot/modules/welcome.js @@ -1,217 +1,223 @@ -let hasPerms = require("../helpers.js").hasPerms; -let inPrivate = require("../helpers.js").inPrivate; +let hasPerms = require('../helpers.js').hasPerms; +let inPrivate = require('../helpers.js').inPrivate; -exports.custom = ["onUserJoin"]; +exports.custom = ['onUserJoin']; exports.onUserJoin = function(bot) { - bot.on("guildMemberAdd", member => { + bot.on('guildMemberAdd', member => { member.send({ embed: { - title: "*Click here for more info about LBRY!*", + title: '*Click here for more info about LBRY!*', description: - "**Welcome to LBRY Discord Community, you are now officially a LBRYian!** \n" + - "If you are new to LBRY and would like to learn more, see the links at the end of this message. \n" + - "This community allows LBRYians to interact with the team directly and for us to engage users in order to grow the LBRY platform! \n" + - "**Looking for *Rewards Verification*? Please make a request in the #verification channel by typing **-new** - this will create a ticket (channel) for your request. A mod will reach out to you, please be patient . **Note: DO NOT message any team members or post in other channels about verification concerns.**. Only 1 Reward account is allowed per household** \n", - url: "https://lbry.io/what", + '**Welcome to LBRY Discord Community, you are now officially a LBRYian!** \n' + + 'If you are new to LBRY and would like to learn more, see the links at the end of this message. \n' + + 'This community allows LBRYians to interact with the team directly and for us to engage users in order to grow the LBRY platform! \n' + + '**Looking for *Rewards Verification*? Please make a request in the #verification channel by typing **-new** - this will create a ticket (channel) for your request. A mod will reach out to you, please be patient . **Note: DO NOT message any team members or post in other channels about verification concerns.**. Only 1 Reward account is allowed per household** \n', + url: 'https://lbry.io/what', color: 7976557, author: { - name: "Welcome to LBRY Discord Community", - icon_url: "https://i.imgur.com/yWf5USu.png" + name: 'Welcome to LBRY Discord Community', + icon_url: 'https://i.imgur.com/yWf5USu.png' } } + }).catch(function(error) { + bot.channels.get('369896313082478594').send(member + + ', Please enable Direct Messages from server members to communicate fully with our bot, it is located in the user setting area under Privacy & Safety tab, select the option allow direct messages from server members\nSince the bot could not send you our Welcome message please check the posts in <#428634445176766464> and available commands in <#428661678796832768>' + ) }); member.send({ embed: { description: - "1. Be respectful to other community members. Harrasment and vulgarity will not be tolerated \n" + - "2. Do not spam, advertise or post referral links \n" + - "3. Use appropriate channels for your discussions/questions. If you are looking for help with LBRY, use #help, for price talk, use #market-and-trading \n" + - "4. #general discussions should be at least somewhat related to LBRY, otherwise there is #random \n" + - "5. Do not post **not safe for work (NFSW)** content in any non-marked channels, there is #random-nsfw for that \n" + - "6. Do not direct message and LBRY team or mods without being asked to do so \n" + - "7. Do not request free LBC, begging will not be tolerated \n", + '1. Be respectful to other community members. Harrasment and vulgarity will not be tolerated \n' + + '2. Do not spam, advertise or post referral links \n' + + '3. Use appropriate channels for your discussions/questions. If you are looking for help with LBRY, use #help, for price talk, use #market-and-trading \n' + + '4. #general discussions should be at least somewhat related to LBRY, otherwise there is #random \n' + + '5. Do not post **not safe for work (NFSW)** content in any non-marked channels, there is #random-nsfw for that \n' + + '6. Do not direct message and LBRY team or mods without being asked to do so \n' + + '7. Do not request free LBC, begging will not be tolerated \n', color: 7976557, author: { - name: "Ground rules", - icon_url: "https://i.imgur.com/yWf5USu.png" + name: 'Ground rules', + icon_url: 'https://i.imgur.com/yWf5USu.png' } } - }); + }).catch(function(error) {console.log('could not send dm')}); member.send({ embed: { description: - "1. Type !tip help in the #bot-sandbox channel to interact with our Tipbot which can be used to send and receive LBRY Credits (LBC). **Enable 2FA in your Discord account settings!** \n" + - "2. See the Frequently Asked Questions (FAQ) section below prior to asking for help or information on LBRY \n" + - "3. Backing up your LBRY wallet is your responsbility, see FAQ link below \n" + - "4. You can find the LBRY Block explorer at https://explorer.lbry.io \n" + - "5. Want to contribute more? Check out https://lbry.io/faq/contributing \n" + - "6. Are you a dev? Check out the #dev channel \n" + - "7. Want to share something you published? Post it on the #publishers channel \n", + '1. Type !tip help in the #bot-sandbox channel to interact with our Tipbot which can be used to send and receive LBRY Credits (LBC). **Enable 2FA in your Discord account settings!** \n' + + '2. See the Frequently Asked Questions (FAQ) section below prior to asking for help or information on LBRY \n' + + '3. Backing up your LBRY wallet is your responsbility, see FAQ link below \n' + + '4. You can find the LBRY Block explorer at https://explorer.lbry.io \n' + + '5. Want to contribute more? Check out https://lbry.io/faq/contributing \n' + + '6. Are you a dev? Check out the #dev channel \n' + + '7. Want to share something you published? Post it on the #publishers channel \n', color: 7976557, author: { - name: "Helpful hints", - icon_url: "https://i.imgur.com/yWf5USu.png" + name: 'Helpful hints', + icon_url: 'https://i.imgur.com/yWf5USu.png' } } - }); + }).catch(function(error) {console.log('could not send dm')}); member.send({ embed: { - title: "*Click here for more info about LBRY!*", + title: '*Click here for more info about LBRY!*', description: - "[**LBRY**](https://lbry.io) is a protocol providing fully decentralized network for the discovery, distribution, and payment of data. It utilizes the [**LBRY blockchain**](https://lbry.io/what#the-network) as a global namespace and database of digital content. Blockchain entries contain searchable content metadata, identities, and rights and access rules. \n[_**Download the LBRY App here**_](https://lbry.io/get)", - url: "https://lbry.io/what", + '[**LBRY**](https://lbry.io) is a protocol providing fully decentralized network for the discovery, distribution, and payment of data. It utilizes the [**LBRY blockchain**](https://lbry.io/what#the-network) as a global namespace and database of digital content. Blockchain entries contain searchable content metadata, identities, and rights and access rules. \n[_**Download the LBRY App here**_](https://lbry.io/get)', + url: 'https://lbry.io/what', color: 7976557, author: { - name: "What is LBRY?", - url: "https://lbry.io/what", - icon_url: "https://i.imgur.com/yWf5USu.png" + name: 'What is LBRY?', + url: 'https://lbry.io/what', + icon_url: 'https://i.imgur.com/yWf5USu.png' } } - }); + }).catch(function(error) {console.log('could not send dm')}); member.send({ embed: { - title: "*Click here to see all LBRY Frequently Asked Questions (FAQ)!*", + title: '*Click here to see all LBRY Frequently Asked Questions (FAQ)!*', description: - "Want to backup your LBRY wallet? [**Backup**](https://lbry.io/faq/how-to-backup-wallet) \nLooking for LBRY data? [**Behind the scenes files**](https://lbry.io/faq/lbry-directories) \nTrouble starting LBRY? [**Startup troubleshooting**](https://lbry.io/faq/startup-troubleshooting) \nNeed help finding your log files (will help us troubleshoot!)? [**Find logs**](https://lbry.io/faq/how-to-find-lbry-log-file) \nNot able to stream any content? [**Troublshoot streaming**](https://lbry.io/faq/unable-to-stream)\nNeed help with publishing? [**How to Publish**](https://lbry.io/faq/how-to-publish) \nWant more LBRY Credits (LBC)? [**Get LBC**](https://lbry.io/faq/earn-credits) \nLooking for referral information? [**Referrals**](https://lbry.io/faq/referrals)", - url: "https://lbry.io/faq", + 'Want to backup your LBRY wallet? [**Backup**](https://lbry.io/faq/how-to-backup-wallet) \nLooking for LBRY data? [**Behind the scenes files**](https://lbry.io/faq/lbry-directories) \nTrouble starting LBRY? [**Startup troubleshooting**](https://lbry.io/faq/startup-troubleshooting) \nNeed help finding your log files (will help us troubleshoot!)? [**Find logs**](https://lbry.io/faq/how-to-find-lbry-log-file) \nNot able to stream any content? [**Troublshoot streaming**](https://lbry.io/faq/unable-to-stream)\nNeed help with publishing? [**How to Publish**](https://lbry.io/faq/how-to-publish) \nWant more LBRY Credits (LBC)? [**Get LBC**](https://lbry.io/faq/earn-credits) \nLooking for referral information? [**Referrals**](https://lbry.io/faq/referrals)', + url: 'https://lbry.io/faq', color: 7976557, author: { - name: "LBRY FAQ", - url: "https://lbry.io/faq", - icon_url: "https://spee.ch/8/Id5Qoc3w.png" + name: 'LBRY FAQ', + url: 'https://lbry.io/faq', + icon_url: 'https://spee.ch/8/Id5Qoc3w.png' } } - }); + }).catch(function(error) {console.log('could not send dm')}); member.send({ embed: { - title: "*Have you checked out spee.ch yet?!*", + title: '*Have you checked out spee.ch yet?!*', description: "[**spee.ch**](https://spee.ch) runs on top of the LBRY network - it's essentially an open source, censorship resistent and decentralized image and video sharing site with the added benefit of being a web-based (works on mobile too!) gateway into the LBRY network. spee.ch can be used to retrieve LBRY images/videos that are free by accessing them through a web browser. \nFor example, if content is located at lbry://loose-cannons-episode1#12c87bb42dd8832167b1e54edf72bbd37bc47622, you can view it on spee.ch at: https://spee.ch/12c87bb42dd8832167b1e54edf72bbd37bc47622/loose-cannons-episode1. You can also view channels on spee.ch, such as: https://spee.ch/@copchronicles:5c039dc7423657e59d78939df72c186e43273675 or https://spee.ch/@MinutePhysics:589276465a23c589801d874f484cc39f307d7ec7 \n\nspee.ch also allows you to create a channel to group your uploads and retreive them easily. These channels are separate from any you may have in the LBRY app since they exist on the spee.ch site via a login process. You can even share your channel name and password so that others can contribute to it.", - url: "https://spee.ch/about", + url: 'https://spee.ch/about', color: 7976557, author: { - name: "spee.ch", - url: "https://spee.ch", - icon_url: - "http://www.pd4pic.com/images/flag-green-blue-purple-indigo-bars-background.png" + name: 'spee.ch', + url: 'https://spee.ch', + icon_url: 'http://www.pd4pic.com/images/flag-green-blue-purple-indigo-bars-background.png' } } - }); + }).catch(function(error) {console.log('could not send dm')}); }); }; exports.commands = [ - "welcome" // command that is in this file, every command needs it own export as shown below + 'welcome' // command that is in this file, every command needs it own export as shown below ]; exports.welcome = { - usage: "<@username>", - description: "send welcome message to specified user", + usage: '<@username>', + description: 'send welcome message to specified user', process: function(bot, msg, suffix) { if (inPrivate(msg)) { - msg.channel.send("command cannot be used in a DM"); + msg.channel.send('command cannot be used in a DM'); return; } - if (suffix == "") { - msg.channel.send("no user defined"); + if (suffix == '') { + msg.channel.send('no user defined'); return; } if (!hasPerms(msg)) { - msg.channel.send("You Dont Have Permission To Use This Command!"); + msg.channel.send('You Dont Have Permission To Use This Command!'); return; } msg.mentions.members.first().send({ embed: { - title: "*Click here for more info about LBRY!*", + title: '*Click here for more info about LBRY!*', description: - "**Welcome to LBRY Discord Community, you are now officially a LBRYian!** \n" + - "If you are new to LBRY and would like to learn more, see the links at the end of this message. \n" + - "This community allows LBRYians to interact with the team directly and for us to engage users in order to grow the LBRY platform! \n" + - "**Looking for *Rewards Verification*? Please make a request in the #verification channel by typing **-new** - this will create a ticket (channel) for your request. A mod will reach out to you, please be patient, **Note: DO NOT message any team members or post in other channels about verification concerns.**. Only 1 Reward account is allowed per household** \n", - url: "https://lbry.io/what", + '**Welcome to LBRY Discord Community, you are now officially a LBRYian!** \n' + + 'If you are new to LBRY and would like to learn more, see the links at the end of this message. \n' + + 'This community allows LBRYians to interact with the team directly and for us to engage users in order to grow the LBRY platform! \n' + + '**Looking for *Rewards Verification*? Please make a request in the #verification channel by typing **-new** - this will create a ticket (channel) for your request. A mod will reach out to you, please be patient, **Note: DO NOT message any team members or post in other channels about verification concerns.**. Only 1 Reward account is allowed per household** \n', + url: 'https://lbry.io/what', color: 7976557, author: { - name: "Welcome to LBRY Discord Community", - icon_url: "https://i.imgur.com/yWf5USu.png" + name: 'Welcome to LBRY Discord Community', + icon_url: 'https://i.imgur.com/yWf5USu.png' } } + }).catch(function(error) { + msg.channel.send(msg.mentions.members.first() + + ', Please enable Direct Messages from server members to communicate fully with our bot, it is located in the user setting area under Privacy & Safety tab, select the option allow direct messages from server members' + ) }); msg.mentions.members.first().send({ embed: { description: - "1. Be respectful to other community members. Harrasment and vulgarity will not be tolerated \n" + - "2. Do not spam, advertise or post referral links \n" + - "3. Use appropriate channels for your discussions/questions. If you are looking for help with LBRY, use #help, for price talk, use #market-and-trading \n" + - "4. #general discussions should be at least somewhat related to LBRY, otherwise there is #random \n" + - "5. Do not post **not safe for work (NFSW)** content in any non-marked channels, there is #random-nsfw for that \n" + - "6. Do not direct message and LBRY team or mods without being asked to do so \n" + - "7. Do not request free LBC, begging will not be tolerated \n", + '1. Be respectful to other community members. Harrasment and vulgarity will not be tolerated \n' + + '2. Do not spam, advertise or post referral links \n' + + '3. Use appropriate channels for your discussions/questions. If you are looking for help with LBRY, use #help, for price talk, use #market-and-trading \n' + + '4. #general discussions should be at least somewhat related to LBRY, otherwise there is #random \n' + + '5. Do not post **not safe for work (NFSW)** content in any non-marked channels, there is #random-nsfw for that \n' + + '6. Do not direct message and LBRY team or mods without being asked to do so \n' + + '7. Do not request free LBC, begging will not be tolerated \n', color: 7976557, author: { - name: "Ground rules", - icon_url: "https://i.imgur.com/yWf5USu.png" + name: 'Ground rules', + icon_url: 'https://i.imgur.com/yWf5USu.png' } } - }); + }).catch(function(error) {console.log('could not send dm')}); msg.mentions.members.first().send({ embed: { description: - "1. Type !tip help in the #bot-sandbox channel to interact with our Tipbot which can be used to send and receive LBRY Credits (LBC). **Enable 2FA in your Discord account settings!** \n" + - "2. See the Frequently Asked Questions (FAQ) section below prior to asking for help or information on LBRY \n" + - "3. Backing up your LBRY wallet is your responsbility, see FAQ link below \n" + - "4. You can find the LBRY Block explorer at https://explorer.lbry.io \n" + - "5. Want to contribute more? Check out https://lbry.io/faq/contributing \n" + - "6. Are you a dev? Check out the #dev channel \n" + - "7. Want to share something you published? Post it on the #publishers channel \n", + '1. Type !tip help in the #bot-sandbox channel to interact with our Tipbot which can be used to send and receive LBRY Credits (LBC). **Enable 2FA in your Discord account settings!** \n' + + '2. See the Frequently Asked Questions (FAQ) section below prior to asking for help or information on LBRY \n' + + '3. Backing up your LBRY wallet is your responsbility, see FAQ link below \n' + + '4. You can find the LBRY Block explorer at https://explorer.lbry.io \n' + + '5. Want to contribute more? Check out https://lbry.io/faq/contributing \n' + + '6. Are you a dev? Check out the #dev channel \n' + + '7. Want to share something you published? Post it on the #publishers channel \n', color: 7976557, author: { - name: "Helpful hints", - icon_url: "https://i.imgur.com/yWf5USu.png" + name: 'Helpful hints', + icon_url: 'https://i.imgur.com/yWf5USu.png' } } - }); + }).catch(function(error) {console.log('could not send dm')}); msg.mentions.members.first().send({ embed: { - title: "*Click here for more info about LBRY!*", + title: '*Click here for more info about LBRY!*', description: - "[**LBRY**](https://lbry.io) is a protocol providing fully decentralized network for the discovery, distribution, and payment of data. It utilizes the [**LBRY blockchain**](https://lbry.io/what#the-network) as a global namespace and database of digital content. Blockchain entries contain searchable content metadata, identities, and rights and access rules. \n[_**Download the LBRY App here**_](https://lbry.io/get)", - url: "https://lbry.io/what", + '[**LBRY**](https://lbry.io) is a protocol providing fully decentralized network for the discovery, distribution, and payment of data. It utilizes the [**LBRY blockchain**](https://lbry.io/what#the-network) as a global namespace and database of digital content. Blockchain entries contain searchable content metadata, identities, and rights and access rules. \n[_**Download the LBRY App here**_](https://lbry.io/get)', + url: 'https://lbry.io/what', color: 7976557, author: { - name: "What is LBRY?", - url: "https://lbry.io/what", - icon_url: "https://i.imgur.com/yWf5USu.png" + name: 'What is LBRY?', + url: 'https://lbry.io/what', + icon_url: 'https://i.imgur.com/yWf5USu.png' } } - }); + }).catch(function(error) {console.log('could not send dm')}); msg.mentions.members.first().send({ embed: { - title: "*Click here to see all LBRY Frequently Asked Questions (FAQ)!*", + title: '*Click here to see all LBRY Frequently Asked Questions (FAQ)!*', description: - "Want to backup your LBRY wallet? [**Backup**](https://lbry.io/faq/how-to-backup-wallet) \nLooking for LBRY data? [**Behind the scenes files**](https://lbry.io/faq/lbry-directories) \nTrouble starting LBRY? [**Startup troubleshooting**](https://lbry.io/faq/startup-troubleshooting) \nNeed help finding your log files (will help us troubleshoot!)? [**Find logs**](https://lbry.io/faq/how-to-find-lbry-log-file) \nNot able to stream any content? [**Troublshoot streaming**](https://lbry.io/faq/unable-to-stream)\nNeed help with publishing? [**How to Publish**](https://lbry.io/faq/how-to-publish) \nWant more LBRY Credits (LBC)? [**Get LBC**](https://lbry.io/faq/earn-credits) \nLooking for referral information? [**Referrals**](https://lbry.io/faq/referrals)", - url: "https://lbry.io/faq", + 'Want to backup your LBRY wallet? [**Backup**](https://lbry.io/faq/how-to-backup-wallet) \nLooking for LBRY data? [**Behind the scenes files**](https://lbry.io/faq/lbry-directories) \nTrouble starting LBRY? [**Startup troubleshooting**](https://lbry.io/faq/startup-troubleshooting) \nNeed help finding your log files (will help us troubleshoot!)? [**Find logs**](https://lbry.io/faq/how-to-find-lbry-log-file) \nNot able to stream any content? [**Troublshoot streaming**](https://lbry.io/faq/unable-to-stream)\nNeed help with publishing? [**How to Publish**](https://lbry.io/faq/how-to-publish) \nWant more LBRY Credits (LBC)? [**Get LBC**](https://lbry.io/faq/earn-credits) \nLooking for referral information? [**Referrals**](https://lbry.io/faq/referrals)', + url: 'https://lbry.io/faq', color: 7976557, author: { - name: "LBRY FAQ", - url: "https://lbry.io/faq", - icon_url: "https://spee.ch/8/Id5Qoc3w.png" + name: 'LBRY FAQ', + url: 'https://lbry.io/faq', + icon_url: 'https://spee.ch/8/Id5Qoc3w.png' } } - }); + }).catch(console.error).then(console.log('could not send dm')); msg.mentions.members.first().send({ embed: { - title: "*Have you checked out spee.ch yet?!*", + title: '*Have you checked out spee.ch yet?!*', description: "[**spee.ch**](https://spee.ch) runs on top of the LBRY network - it's essentially an open source, censorship resistent and decentralized image and video sharing site with the added benefit of being a web-based (works on mobile too!) gateway into the LBRY network. spee.ch can be used to retrieve LBRY images/videos that are free by accessing them through a web browser. \nFor example, if content is located at lbry://loose-cannons-episode1#12c87bb42dd8832167b1e54edf72bbd37bc47622, you can view it on spee.ch at: https://spee.ch/12c87bb42dd8832167b1e54edf72bbd37bc47622/loose-cannons-episode1. You can also view channels on spee.ch, such as: https://spee.ch/@copchronicles:5c039dc7423657e59d78939df72c186e43273675 or https://spee.ch/@MinutePhysics:589276465a23c589801d874f484cc39f307d7ec7 \n\nspee.ch also allows you to create a channel to group your uploads and retreive them easily. These channels are separate from any you may have in the LBRY app since they exist on the spee.ch site via a login process. You can even share your channel name and password so that others can contribute to it.", - url: "https://spee.ch/about", + url: 'https://spee.ch/about', color: 7976557, author: { - name: "spee.ch", - url: "https://spee.ch", - icon_url: - "http://www.pd4pic.com/images/flag-green-blue-purple-indigo-bars-background.png" + name: 'spee.ch', + url: 'https://spee.ch', + icon_url: 'http://www.pd4pic.com/images/flag-green-blue-purple-indigo-bars-background.png' } } - }); + }).catch(function(error) {console.log('could not send dm')}); } }; diff --git a/config/commands.json b/config/commands.json index b752e0e..781a45b 100644 --- a/config/commands.json +++ b/config/commands.json @@ -1,674 +1,779 @@ { - "!helpcommands": { - "usage": "", - "description": "Displays Helpful Commands", - "operation": "none", - "bundle": { - "url": "", - "title": "", - "description": "filled at runtime", - "color": 7976557, - "author": { - "name": "List of Helpful LBRY Commands", - "url": "", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!what": { - "usage": "", - "description": "What is Lbry?", - "operation": "send", - "bundle": { - "url": "https://lbry.io/what", - "title": "*Click Here for more Info!*", - "description": "[**LBRY**](https://lbry.io) is a protocol providing fully decentralized network for the discovery, distribution, and payment of data. It utilizes the [**LBRY blockchain**](https://lbry.io/what#the-network) as a global namespace and database of digital content. Blockchain entries contain searchable content metadata, identities, and rights and access rules. \n[_**Get the App here**_](https://lbry.io/get)", - "color": 7976557, - "author": { - "name": "What is LBRY?", - "url": "https://lbry.io/what", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!begging": { - "usage": "", - "description": "Dont Request Free Coins Message", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "**Please don't request free coins or invites, we have a strict policy against begging. Further offenses will result in removal from the chat.**", - "color": 7976557, - "author": { - "name": "BEGGING!", - "url": "", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!beta": { - "usage": "", - "description": "beta message", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Even though LBRY is in Open Beta, it's still beta software! There will be bugs and issues to be worked out, thanks for your patience!", - "color": 7976557, - "author": { - "name": "Open Beta", - "url": "", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!github": { - "usage": "", - "description": "Lbry Github", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "The official github for LBRY is [github.com/lbryio](https://github.com/lbryio)", - "color": 7976557, - "author": { - "name": "GitHub", - "url": "https://github.com/lbryio", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!appdownload": { - "usage": "", - "description": "LBRY-app Installers", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "**Installers for the LBRY Application are available for download** [**HERE**](https://lbry.io/get)", - "color": 7976557, - "author": { - "name": "Get The App", - "url": "http://lbry.io/get?auto=1", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!daemondownload": { - "usage": "", - "description": "LBRY Daemon Installers", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Installers for the LBRY Daemon are available for download [**HERE**](https://github.com/lbryio/lbry/releases)", - "color": 7976557, - "author": { - "name": "Daemon Download", - "url": "https://github.com/lbryio/lbry/releases", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!directories": { - "usage": "", - "description": "Lbry-app Directories", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "You can find details about the folders your LBRY files are stored in at [lbry.io/faq/lbry-directories](https://lbry.io/faq/lbry-directories)", - "color": 7976557, - "author": { - "name": "Directories", - "url": "https://lbry.io/faq/lbry-directories", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!faq": { - "usage": "", - "description": "LBRY F.A.Q.", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "These questions and many more have been answered on the [F.A.Q Page](https://lbry.io/faq/)", - "color": 7976557, - "author": { - "name": "F.A.Q", - "url": "https://lbry.io/faq/", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!contribute": { - "usage": "", - "description": "Contributing to LBRY", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Want to help develop and contribute to the Lbry Project?\nCheck out this **[GUIDE](https://lbry.io/faq/contributing)** that will get you startd.", - "color": 7976557, - "author": { - "name": "Contributing to LBRY", - "url": "https://lbry.io/faq/contributing", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!news": { - "usage": "", - "description": "LBRY inc. News Feed", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "check out the News Feed **[HERE](https://lbry.io/news)**.", - "color": 7976557, - "author": { - "name": "LBRY inc. News Feed", - "url": "https://lbry.io/news", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!name": { - "usage": "", - "description": "Change Name Message", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Hey, glad to see you love LBRY so much, but for the safety of our users we ask that you avoid using discord names that include the word lbry. This is to prevent impersonation and scams.", - "color": 7976557, - "author": { - "name": "Discord Username", - "url": "", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!mining": { - "usage": "", - "description": "Mining LBRY Credits (LBC)", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "We have a dedicated channel for mining discussion, feel free to join <#363049669636390913>, we have guides pinned in that channel to get you started mining some LBC!", - "color": 7976557, - "author": { - "name": "Mining", - "url": "", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!pricestance": { - "usage": "", - "description": "Our Stance on LBC Price", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Details about our stance on price can be found here: [lbry.io/news/acryptypical](https://lbry.io/news/acryptypical)", - "color": 7976557, - "author": { - "name": "CEO's Stance on Price", - "url": "https://lbry.io/news/acryptypical", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!youtuber": { - "usage": "", - "description": "Are you a Youtuber curious about LBRY?", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Are you a Youtuber curious about LBRY? Have a look at [lbry.io/youtube](https://lbry.io/youtube)", - "color": 7976557, - "author": { - "name": "Are you a Youtuber?", - "url": "https://lbry.io/youtube", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!publish": { - "usage": "", - "description": "How To Publish on LBRY?", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "We've created a small guide to help with the Publishing features of LBRY, check it out here: [lbry.io/faq/how-to-publish](https://lbry.io/faq/how-to-publish)", - "color": 7976557, - "author": { - "name": "How To Publish on LBRY?", - "url": "https://lbry.io/faq/how-to-publish", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!random": { - "usage": "", - "description": "Off-Topic Message", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Please keep conversation on topic, or move random conversations to #363084227518136322 if you wish to continue", - "color": 7976557, - "author": { - "name": "Random", - "url": "", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!naming": { - "usage": "", - "description": "How does LBRY naming work?", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Names exist so that we can map a human readable and understandable word or term to a more difficult to remember number or ID. In the traditional domain system, names map to numerical IP addresses. In LBRY, names map to a unique, permanent ID representing a piece of digital content and/or a publisher identity. Learn more **[HERE](https://lbry.io/faq/naming)**", - "color": 7976557, - "author": { - "name": "How does LBRY naming work?", - "url": "https://lbry.io/faq/naming", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!bounty": { - "usage": "", - "description": "LBRY Bounties", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "You can earn LBRY Credits for completing tasks as part of the LBRY Bounty Program, All bounties can be seen on the **[Bounty Home Page](https://lbry.io/bounty)**.\nBounties range from simple typo fixes to third party applications and custom projects!", - "color": 7976557, - "author": { - "name": "LBRY Bounties", - "url": "https://lbry.io/bounty", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!roadmap": { - "usage": "", - "description": "The Lbry RoadMap", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Check Out The **[RoadMap](https://lbry.io/roadmap)**, it only outlines past and anticipated technical changes, it does not cover other initiatives. Development was fast and furious among a small group prior to 0.6, and release notes are sparse.", - "color": 7976557, - "author": { - "name": "RoadMap", - "url": "https://lbry.io/roadmap", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!referrals": { - "usage": "", - "description": "What are Referrals?", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Please see [lbry.io/faq/referrals](https://lbry.io/faq/referrals) - referral redemptions are currently in test mode and limited to one. But you can see your entire referral history in your LBRY app.", - "color": 7976557, - "author": { - "name": "Referrals", - "url": "https://lbry.io/faq/referrals", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!rewards": { - "usage": "", - "description": "What are Rewards?", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "[Rewards](https://lbry.io/faq/rewards) are given to legitimate users who are using the system (and in turn are testing things for us). In order to redeem rewards, you may need to verify your identity through a Credit Card or other manual methods.\n Please see [lbry.io/faq/identity-requirements](https://lbry.io/faq/identity-requirements)", - "color": 7976557, - "author": { - "name": "Rewards", - "url": "https://lbry.io/faq/rewards", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!rewardsvsreferrals": { - "usage": "", - "description": "What the Difference Between Rewards & Referrals?", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Rewards are different to referral bonuses. Rewards are given for testing the LBRY software and system. Referrals are given for sharing LBRY with the masses.", - "color": 7976557, - "author": { - "name": "Rewards Vs. Referrals", - "url": "", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!cc": { - "usage": "", - "description": "Credit Card Verification?", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "In an effort to limit abuse, newly invited LBRY users will be required to verify their identity via a Credit Card or by a manual verification process in order to be eligible for Rewards. Prepaid or Virtual credit cards are disallowed. Certain countries (where we've previously seen abuse) are being denied, but that list may expand later on. If you use Tor/Proxy/VPN, you also may be denied. If credit card verification does not work for you, please go to the <#363050496023592961> channel for assistance.\n**Verification is purely optional and ONLY relevant for Rewards, the app can be used without providing CC information**\n**Please See:https://lbry.io/faq/identity-requirements**", - "color": 7976557, - "author": { - "name": "Credit Card Verification", - "url": "https://lbry.io/faq/identity-requirements", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!verify": { - "usage": "", - "description": "How to Verify?", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Please download the latest version from [HERE](https://lbry.io/get) Upon install, you'll be greeted with a welcome message. If you already had the App installed, then go to the wallet (bank icon in the top right) > Rewards - this should show your current status. New users will need to verify in order to access rewards. Type !cc or !verification for more information.", - "color": 7976557, - "author": { - "name": "How To Verify?", - "url": "", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!verification": { - "usage": "", - "description": "Verification Help Message", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "If you would like to be verified go to <#363050496023592961> and type *`-new`* \nthis will create a ticket (channel) for your request. A LBRY mod will get back to you as soon as possible. We appreciate your patience. Only one account per household is allowed access to LBRY Rewards. Check out our [YouTube Sync FAQ](https://lbry.io/faq/youtube) for assistance with the YouTube Sync rewards verification method.", - "color": 7976557, - "author": { - "name": "Rewards Verification", - "url": "", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!logfile":{ - "usage": "", - "description": "How to find LBRY-app Log File?", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "You can find your log files by following the guide [HERE](https://lbry.io/faq/how-to-find-lbry-log-file)", - "color": 7976557, - "author": { - "name": "How to find my LogFile?", - "url": "https://lbry.io/faq/how-to-find-lbry-log-file", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!backup": { - "usage": "", - "description": "How to Backup the Wallet", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Please see this guide on how to backup your wallet: [lbry.io/faq/how-to-backup-wallet](https://lbry.io/faq/how-to-backup-wallet)", - "color": 7976557, - "author": { - "name": "How to Backup my Wallet?", - "url": "https://lbry.io/faq/how-to-backup-wallet", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!startup": { - "usage": "", - "description": "Startup Troubleshooting?", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Please see [lbry.io/faq/startup-troubleshooting](https://lbry.io/faq/startup-troubleshooting) if you are having trouble getting LBRY to start correctly.", - "color": 7976557, - "author": { - "name": "Startup Troubleshooting", - "url": "https://lbry.io/faq/startup-troubleshooting", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!streamingissues": { - "usage": "", - "description": "Unable To Stream?", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Please see [lbry.io/faq/unable-to-stream](https://lbry.io/faq/unable-to-stream) if you are experiencing problems viewing **ANY** LBRY content.", - "color": 7976557, - "author": { - "name": "Streaming Troubleshooting", - "url": "https://lbry.io/faq/unable-to-stream", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!ports": { - "usage": "", - "description": "LBRY Ports", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "The daemon uses ports **3333** and **4444**. It may interfere with mining software, Start the miner after the app and you should be okay. Also these ports need to be port forwarded on your router. Google is your friend there. \n **Please see this tutorial on how to change ports : [lbry.io/faq/how-to-change-port](https://lbry.io/faq/how-to-change-port)**", - "color": 7976557, - "author": { - "name": "Ports", - "url": "https://lbry.io/faq/how-to-change-port", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!migrate":{ - "usage": "", - "description": "How to Migrate your Wallet/Data", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Please see [lbry.io/faq/backup-data](https://lbry.io/faq/backup-data) for instructions on how to backup and/or migrate your LBRY data", - "color": 7976557, - "author": { - "name": "How To Backup/Migrate LBRY Data?", - "url": "https://lbry.io/faq/backup-data", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!tipping": { - "usage": "", - "description": "Details About LBRY-app Tipping", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Please see [lbry.io/faq/tipping](https://lbry.io/faq/tipping) for details about tipping in the LBRY-App", - "color": 7976557, - "author": { - "name": "LBRY-App Tipping?", - "url": "https://lbry.io/faq/tipping", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!email": { - "usage": "", - "description": "How to change Email in LBRY-app?", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "If you need to change your LBRY connected email, please see instructions [HERE](https://lbry.io/faq/how-to-change-email)", - "color": 7976557, - "author": { - "name": "LBRY-App Change connected E-mail?", - "url": "https://lbry.io/faq/how-to-change-email", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!cli": { - "usage": "", - "description": "How to interact with LBRY CLI?", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "If you are interested in interacting with the LBRY protocol via commands, check out [lbry.io/faq/how-to-cli](https://lbry.io/faq/how-to-cli)", - "color": 7976557, - "author": { - "name": "Interact with the LBRY CLI", - "url": "https://lbry.io/faq/how-to-cli", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!ipfstorrent": { - "usage": "", - "description": "How is LBRY different from IPFS / BitTorrent?", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "If you are interested in how LBRY is different from IPFS or BitTorrent, check out [lbry.io/faq/different-ipfs](https://lbry.io/faq/different-ipfs)", - "color": 7976557, - "author": { - "name": "How is LBRY different from IPFS / BitTorrent?", - "url": "https://lbry.io/faq/different-ipfs", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!shapeshift": { - "usage": "", - "description": "How can I convert my crypto into LBC?", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Please see this guide on how to convert your crypto into LBC: [lbry.io/faq/shapeshift](https://lbry.io/faq/shapeshift)", - "color": 7976557, - "author": { - "name": "How can I convert my crypto into LBC?", - "url": "https://lbry.io/faq/shapeshift", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!youtube": { - "usage": "", - "description": "What is YouTube Sync?", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Please see this guide on how youtube sync works, check out [lbry.io/faq/youtube](https://lbry.io/faq/youtube)", - "color": 7976557, - "author": { - "name": "What is YouTube Sync?", - "url": "https://lbry.io/faq/youtube", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!transactions": { - "usage": "", - "description": "What types of LBRY transactions are there?", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Please see this guide on [transaction types](https://lbry.io/faq/transaction-types)", - "color": 7976557, - "author": { - "name": "What types of LBRY transactions are there?", - "url": "https://lbry.io/faq/transaction-types", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!team": { - "usage": "", - "description": "Meet the Team!", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Get to know the [Offical Team](https://lbry.io/team) behind the scenes of lbry inc.", - "color": 7976557, - "author": { - "name": "Meet the Team!", - "url": "https://lbry.io/team", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!phone": { - "usage": "", - "description": "Phone Verification!", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description" : "[Phone number](https://lbry.io/faq/phone) verification provides another method for LBRY users to participate in the rewards program", - "color": 7976557, - "author": { - "name": "Phone Verification!", - "url": "https://lbry.io/faq/phone", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } - }, - "!tipbot": { - "usage": "", - "description": "Tipbot Help Message", - "operation": "send", - "bundle": { - "url": "", - "title": "", - "description": "Type `!tip help` to interact with our Tipbot which can be used to send and receive LBRY Credits (LBC). <#369896313082478594> should be used to talk to bots in order to avoid spamming other channels.", - "color": 7976557, - "author": { - "name": "Tipbot Help Message", - "url": "", - "icon_url": "https://i.imgur.com/yWf5USu.png" - } - } + "!helpcommands": { + "usage": "", + "description": "Displays Helpful Commands", + "operation": "none", + "bundle": { + "url": "", + "title": "", + "description": "filled at runtime", + "color": 7976557, + "author": { + "name": "List of Helpful LBRY Commands", + "url": "", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } } + }, + "!what": { + "usage": "", + "description": "What is Lbry?", + "operation": "send", + "bundle": { + "url": "https://lbry.io/what", + "title": "*Click Here for more Info!*", + "description": + "[**LBRY**](https://lbry.io) is a protocol providing fully decentralized network for the discovery, distribution, and payment of data. It utilizes the [**LBRY blockchain**](https://lbry.io/what#the-network) as a global namespace and database of digital content. Blockchain entries contain searchable content metadata, identities, and rights and access rules. \n[_**Get the App here**_](https://lbry.io/get)", + "color": 7976557, + "author": { + "name": "What is LBRY?", + "url": "https://lbry.io/what", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!begging": { + "usage": "", + "description": "Dont Request Free Coins Message", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "**Please don't request free coins or invites, we have a strict policy against begging. Further offenses will result in removal from the chat.**", + "color": 7976557, + "author": { + "name": "BEGGING!", + "url": "", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!beta": { + "usage": "", + "description": "beta message", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "Even though LBRY is in Open Beta, it's still beta software! There will be bugs and issues to be worked out, thanks for your patience!", + "color": 7976557, + "author": { + "name": "Open Beta", + "url": "", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!github": { + "usage": "", + "description": "Lbry Github", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "The official github for LBRY is [github.com/lbryio](https://github.com/lbryio)", + "color": 7976557, + "author": { + "name": "GitHub", + "url": "https://github.com/lbryio", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!appdownload": { + "usage": "", + "description": "LBRY-app Installers", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "**Installers for the LBRY Application are available for download** [**HERE**](https://lbry.io/get)", + "color": 7976557, + "author": { + "name": "Get The App", + "url": "http://lbry.io/get?auto=1", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!daemondownload": { + "usage": "", + "description": "LBRY Daemon Installers", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "Installers for the LBRY Daemon are available for download [**HERE**](https://github.com/lbryio/lbry/releases)", + "color": 7976557, + "author": { + "name": "Daemon Download", + "url": "https://github.com/lbryio/lbry/releases", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!directories": { + "usage": "", + "description": "Lbry-app Directories", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "You can find details about the folders your LBRY files are stored in at [lbry.io/faq/lbry-directories](https://lbry.io/faq/lbry-directories)", + "color": 7976557, + "author": { + "name": "Directories", + "url": "https://lbry.io/faq/lbry-directories", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!faq": { + "usage": "", + "description": "LBRY F.A.Q.", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "These questions and many more have been answered on the [F.A.Q Page](https://lbry.io/faq/)", + "color": 7976557, + "author": { + "name": "F.A.Q", + "url": "https://lbry.io/faq/", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!contribute": { + "usage": "", + "description": "Contributing to LBRY", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "Want to help develop and contribute to the Lbry Project?\nCheck out this **[GUIDE](https://lbry.io/faq/contributing)** that will get you startd.", + "color": 7976557, + "author": { + "name": "Contributing to LBRY", + "url": "https://lbry.io/faq/contributing", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!news": { + "usage": "", + "description": "LBRY inc. News Feed", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "check out the News Feed **[HERE](https://lbry.io/news)**.", + "color": 7976557, + "author": { + "name": "LBRY inc. News Feed", + "url": "https://lbry.io/news", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!name": { + "usage": "", + "description": "Change Name Message", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "Hey, glad to see you love LBRY so much, but for the safety of our users we ask that you avoid using discord names that include the word lbry. This is to prevent impersonation and scams.", + "color": 7976557, + "author": { + "name": "Discord Username", + "url": "", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!mining": { + "usage": "", + "description": "Mining LBRY Credits (LBC)", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "We have a dedicated channel for mining discussion, feel free to join <#363049669636390913>, we have guides pinned in that channel to get you started mining some LBC!", + "color": 7976557, + "author": { + "name": "Mining", + "url": "", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!pricestance": { + "usage": "", + "description": "Our Stance on LBC Price", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "Details about our stance on price can be found here: [lbry.io/news/acryptypical](https://lbry.io/news/acryptypical)", + "color": 7976557, + "author": { + "name": "CEO's Stance on Price", + "url": "https://lbry.io/news/acryptypical", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!youtuber": { + "usage": "", + "description": "Are you a Youtuber curious about LBRY?", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "Are you a Youtuber curious about LBRY? Have a look at [lbry.io/youtube](https://lbry.io/youtube)", + "color": 7976557, + "author": { + "name": "Are you a Youtuber?", + "url": "https://lbry.io/youtube", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!publish": { + "usage": "", + "description": "How To Publish on LBRY?", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "We've created a small guide to help with the Publishing features of LBRY, check it out here: [lbry.io/faq/how-to-publish](https://lbry.io/faq/how-to-publish)", + "color": 7976557, + "author": { + "name": "How To Publish on LBRY?", + "url": "https://lbry.io/faq/how-to-publish", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!random": { + "usage": "", + "description": "Off-Topic Message", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "Please keep conversation on topic, or move random conversations to #363084227518136322 if you wish to continue", + "color": 7976557, + "author": { + "name": "Random", + "url": "", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!naming": { + "usage": "", + "description": "How does LBRY naming work?", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": + "Names exist so that we can map a human readable and understandable word or term to a more difficult to remember number or ID. In the traditional domain system, names map to numerical IP addresses. In LBRY, names map to a unique, permanent ID representing a piece of digital content and/or a publisher identity. Learn more **[HERE](https://lbry.io/faq/naming)**", + "color": 7976557, + "author": { + "name": "How does LBRY naming work?", + "url": "https://lbry.io/faq/naming", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!bounty": { + "usage": "", + "description": "LBRY Bounties", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": + "You can earn LBRY Credits for completing tasks as part of the LBRY Bounty Program, All bounties can be seen on the **[Bounty Home Page](https://lbry.io/bounty)**.\nBounties range from simple typo fixes to third party applications and custom projects!", + "color": 7976557, + "author": { + "name": "LBRY Bounties", + "url": "https://lbry.io/bounty", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!roadmap": { + "usage": "", + "description": "The Lbry RoadMap", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": + "Check Out The **[RoadMap](https://lbry.io/roadmap)**, it only outlines past and anticipated technical changes, it does not cover other initiatives. Development was fast and furious among a small group prior to 0.6, and release notes are sparse.", + "color": 7976557, + "author": { + "name": "RoadMap", + "url": "https://lbry.io/roadmap", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!referrals": { + "usage": "", + "description": "What are Referrals?", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "Please see [lbry.io/faq/referrals](https://lbry.io/faq/referrals) - referral redemptions are currently in test mode and limited to one. But you can see your entire referral history in your LBRY app.", + "color": 7976557, + "author": { + "name": "Referrals", + "url": "https://lbry.io/faq/referrals", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!rewards": { + "usage": "", + "description": "What are Rewards?", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": + "[Rewards](https://lbry.io/faq/rewards) are given to legitimate users who are using the system (and in turn are testing things for us). In order to redeem rewards, you may need to verify your identity through a Credit Card or other manual methods.\n Please see [lbry.io/faq/identity-requirements](https://lbry.io/faq/identity-requirements)", + "color": 7976557, + "author": { + "name": "Rewards", + "url": "https://lbry.io/faq/rewards", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!rewardsvsreferrals": { + "usage": "", + "description": "What the Difference Between Rewards & Referrals?", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "Rewards are different to referral bonuses. Rewards are given for testing the LBRY software and system. Referrals are given for sharing LBRY with the masses.", + "color": 7976557, + "author": { + "name": "Rewards Vs. Referrals", + "url": "", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!cc": { + "usage": "", + "description": "Credit Card Verification?", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": + "In an effort to limit abuse, newly invited LBRY users will be required to verify their identity via a Credit Card or by a manual verification process in order to be eligible for Rewards. Prepaid or Virtual credit cards are disallowed. Certain countries (where we've previously seen abuse) are being denied, but that list may expand later on. If you use Tor/Proxy/VPN, you also may be denied. If credit card verification does not work for you, please go to the <#363050496023592961> channel for assistance.\n**Verification is purely optional and ONLY relevant for Rewards, the app can be used without providing CC information**\n**Please See:https://lbry.io/faq/identity-requirements**", + "color": 7976557, + "author": { + "name": "Credit Card Verification", + "url": "https://lbry.io/faq/identity-requirements", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!verify": { + "usage": "", + "description": "How to Verify?", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": + "Please download the latest version from [HERE](https://lbry.io/get) Upon install, you'll be greeted with a welcome message. If you already had the App installed, then go to the wallet (bank icon in the top right) > Rewards - this should show your current status. New users will need to verify in order to access rewards. Type !cc or !verification for more information.", + "color": 7976557, + "author": { + "name": "How To Verify?", + "url": "", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!verification": { + "usage": "", + "description": "Verification Help Message", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": + "If you would like to be verified go to <#363050496023592961> and type *`-new`* \nthis will create a ticket (channel) for your request. A LBRY mod will get back to you as soon as possible. We appreciate your patience. Only one account per household is allowed access to LBRY Rewards. Check out our [YouTube Sync FAQ](https://lbry.io/faq/youtube) for assistance with the YouTube Sync rewards verification method.", + "color": 7976557, + "author": { + "name": "Rewards Verification", + "url": "", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!logfile": { + "usage": "", + "description": "How to find LBRY-app Log File?", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "You can find your log files by following the guide [HERE](https://lbry.io/faq/how-to-find-lbry-log-file)", + "color": 7976557, + "author": { + "name": "How to find my LogFile?", + "url": "https://lbry.io/faq/how-to-find-lbry-log-file", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!backup": { + "usage": "", + "description": "How to Backup the Wallet", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "Please see this guide on how to backup your wallet: [lbry.io/faq/how-to-backup-wallet](https://lbry.io/faq/how-to-backup-wallet)", + "color": 7976557, + "author": { + "name": "How to Backup my Wallet?", + "url": "https://lbry.io/faq/how-to-backup-wallet", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!startup": { + "usage": "", + "description": "Startup Troubleshooting?", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "Please see [lbry.io/faq/startup-troubleshooting](https://lbry.io/faq/startup-troubleshooting) if you are having trouble getting LBRY to start correctly.", + "color": 7976557, + "author": { + "name": "Startup Troubleshooting", + "url": "https://lbry.io/faq/startup-troubleshooting", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!streamingissues": { + "usage": "", + "description": "Unable To Stream?", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "Please see [lbry.io/faq/unable-to-stream](https://lbry.io/faq/unable-to-stream) if you are experiencing problems viewing **ANY** LBRY content.", + "color": 7976557, + "author": { + "name": "Streaming Troubleshooting", + "url": "https://lbry.io/faq/unable-to-stream", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!ports": { + "usage": "", + "description": "LBRY Ports", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": + "The daemon uses ports **3333** and **4444**. It may interfere with mining software, Start the miner after the app and you should be okay. Also these ports need to be port forwarded on your router. Google is your friend there. \n **Please see this tutorial on how to change ports : [lbry.io/faq/how-to-change-port](https://lbry.io/faq/how-to-change-port)**", + "color": 7976557, + "author": { + "name": "Ports", + "url": "https://lbry.io/faq/how-to-change-port", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!migrate": { + "usage": "", + "description": "How to Migrate your Wallet/Data", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "Please see [lbry.io/faq/backup-data](https://lbry.io/faq/backup-data) for instructions on how to backup and/or migrate your LBRY data", + "color": 7976557, + "author": { + "name": "How To Backup/Migrate LBRY Data?", + "url": "https://lbry.io/faq/backup-data", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!tipping": { + "usage": "", + "description": "Details About LBRY-app Tipping", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "Please see [lbry.io/faq/tipping](https://lbry.io/faq/tipping) for details about tipping in the LBRY-App", + "color": 7976557, + "author": { + "name": "LBRY-App Tipping?", + "url": "https://lbry.io/faq/tipping", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!email": { + "usage": "", + "description": "How to change Email in LBRY-app?", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "If you need to change your LBRY connected email, please see instructions [HERE](https://lbry.io/faq/how-to-change-email)", + "color": 7976557, + "author": { + "name": "LBRY-App Change connected E-mail?", + "url": "https://lbry.io/faq/how-to-change-email", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!cli": { + "usage": "", + "description": "How to interact with LBRY CLI?", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "If you are interested in interacting with the LBRY protocol via commands, check out [lbry.io/faq/how-to-cli](https://lbry.io/faq/how-to-cli)", + "color": 7976557, + "author": { + "name": "Interact with the LBRY CLI", + "url": "https://lbry.io/faq/how-to-cli", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!ipfstorrent": { + "usage": "", + "description": "How is LBRY different from IPFS / BitTorrent?", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "If you are interested in how LBRY is different from IPFS or BitTorrent, check out [lbry.io/faq/different-ipfs](https://lbry.io/faq/different-ipfs)", + "color": 7976557, + "author": { + "name": "How is LBRY different from IPFS / BitTorrent?", + "url": "https://lbry.io/faq/different-ipfs", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!shapeshift": { + "usage": "", + "description": "How can I convert my crypto into LBC?", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "Please see this guide on how to convert your crypto into LBC: [lbry.io/faq/shapeshift](https://lbry.io/faq/shapeshift)", + "color": 7976557, + "author": { + "name": "How can I convert my crypto into LBC?", + "url": "https://lbry.io/faq/shapeshift", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!youtube": { + "usage": "", + "description": "What is YouTube Sync?", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "Please see this guide on how youtube sync works, check out [lbry.io/faq/youtube](https://lbry.io/faq/youtube)", + "color": 7976557, + "author": { + "name": "What is YouTube Sync?", + "url": "https://lbry.io/faq/youtube", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!transactions": { + "usage": "", + "description": "What types of LBRY transactions are there?", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "Please see this guide on [transaction types](https://lbry.io/faq/transaction-types)", + "color": 7976557, + "author": { + "name": "What types of LBRY transactions are there?", + "url": "https://lbry.io/faq/transaction-types", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!team": { + "usage": "", + "description": "Meet the Team!", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "Get to know the [Offical Team](https://lbry.io/team) behind the scenes of lbry inc.", + "color": 7976557, + "author": { + "name": "Meet the Team!", + "url": "https://lbry.io/team", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!phone": { + "usage": "", + "description": "Phone Verification!", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "[Phone number](https://lbry.io/faq/phone) verification provides another method for LBRY users to participate in the rewards program", + "color": 7976557, + "author": { + "name": "Phone Verification!", + "url": "https://lbry.io/faq/phone", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!basic": { + "usage": "", + "description": "LBRY App Basics!", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "[LBRY App Basics](https://lbry.io/faq/lbry-basics) The purpose of this FAQ is to answer questions about some of the basic functionality available in the LBRY App", + "color": 7976557, + "author": { + "name": "LBRY App Basics!", + "url": "https://lbry.io/faq/lbry-basics", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!shop": { + "usage": "", + "description": "LBRY Inc. Shop!", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "Visit our at-cost [merchandise store](https://shop.lbry.io) to check out the latest LBRY swag.", + "color": 7976557, + "author": { + "name": "LBRY Inc. Shop!", + "url": "https://shop.lbry.io", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!content": { + "usage": "", + "description": "What content can I legally upload to LBRY?", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "[Read our FAQ](https://lbry.io/faq/content) to learn more about LBRY's content policy.", + "color": 7976557, + "author": { + "name": "What content can I legally upload to LBRY ?", + "url": "https://lbry.io/faq/content", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!aup": { + "usage": "", + "description": "Acceptable Use Policy", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "[Read Our FAQ](https://lbry.io/faq/acceptable-use-policy) to learn more about LBRY's Acceptable Use Policy", + "color": 7976557, + "author": { + "name": "Acceptable Use Policy", + "url": "https://lbry.io/faq/acceptable-use-policy", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!meet": { + "usage": "", + "description": "Wanna Meet Up?", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "LBRY is looking for ambassadors to spread the word to [College campuses](https://lbry.io/college) and [Meetup](https://lbry.io/meet) groups worldwide! ", + "color": 7976557, + "author": { + "name": "Wanna Meet Up?", + "url": "https://lbry.io/meet", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!alpha": { + "usage": "", + "description": "Android Alpha Tester", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "Sign up to become an alpha tester for our [Android app](https://lbry.io/android-alpha)!", + "color": 7976557, + "author": { + "name": "Android Alpha Tester", + "url": "https://lbry.io/android-alpha", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + }, + "!tipbot": { + "usage": "", + "description": "Tipbot Help Message", + "operation": "send", + "bundle": { + "url": "", + "title": "", + "description": "Type `!tip help` to interact with our Tipbot which can be used to send and receive LBRY Credits (LBC). <#369896313082478594> should be used to talk to bots in order to avoid spamming other channels.", + "color": 7976557, + "author": { + "name": "Tipbot Help Message", + "url": "", + "icon_url": "https://i.imgur.com/yWf5USu.png" + } + } + } } diff --git a/config/default.json.example b/config/default.json.example index 8cc9366..20b5082 100644 --- a/config/default.json.example +++ b/config/default.json.example @@ -5,6 +5,10 @@ "prefix": "!", "debug": false }, + "moderation": { + "perms": ["Moderator Team","LBRY TEAM"], // Roles that have access to all commands. + "logchannel": "371620338263523328" // Channel to log the bots moderation.. + }, "lbrycrd": { "port": 9245, "user": "user", @@ -76,10 +80,9 @@ "mainchannel": "363050205043621908" // Main Stats Bot channel for directing with help message }, "rolelist": { - "allowedroles": [ - "Reward Scammer", - "Reported Scammer" - ] + // The roles here are Case Sensitive to how they are in your Discord Server! + "baserole": "LBRYian", + "allowedroles": ["NSFW", "Marketers", "Miners", "Off-Topic Chats"] }, "claimbot": { "channels": [ diff --git a/package-lock.json b/package-lock.json index 91b3ae9..bb18db4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,38 +6,34 @@ "dependencies": { "JSONSelect": { "version": "0.4.0", - "resolved": - "https://registry.npmjs.org/JSONSelect/-/JSONSelect-0.4.0.tgz", + "resolved": "https://registry.npmjs.org/JSONSelect/-/JSONSelect-0.4.0.tgz", "integrity": "sha1-oI7cxn6z/L6Z7WMIVTRKDPKCu40=" }, "ajv": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", - "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { "co": "4.6.0", - "fast-deep-equal": "1.0.0", + "fast-deep-equal": "1.1.0", "fast-json-stable-stringify": "2.0.0", "json-schema-traverse": "0.3.1" } }, "ansi-regex": { "version": "2.1.1", - "resolved": - "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { "version": "2.2.1", - "resolved": - "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": - "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "optional": true, "requires": { "micromatch": "2.3.11", @@ -55,16 +51,13 @@ }, "arr-flatten": { "version": "1.1.0", - "resolved": - "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": - "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "optional": true }, "array-unique": { "version": "0.2.1", - "resolved": - "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", "optional": true }, @@ -75,8 +68,7 @@ }, "assert-plus": { "version": "1.0.0", - "resolved": - "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "async": { @@ -89,17 +81,14 @@ }, "async-each": { "version": "1.0.1", - "resolved": - "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "optional": true }, "async-limiter": { "version": "1.0.0", - "resolved": - "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": - "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" }, "asynckit": { "version": "0.4.0", @@ -140,8 +129,7 @@ }, "babel-code-frame": { "version": "6.26.0", - "resolved": - "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "requires": { "chalk": "1.1.3", @@ -151,8 +139,7 @@ }, "babel-core": { "version": "6.26.0", - "resolved": - "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", "requires": { "babel-code-frame": "6.26.0", @@ -178,8 +165,7 @@ }, "babel-generator": { "version": "6.26.0", - "resolved": - "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", "requires": { "babel-messages": "6.23.0", @@ -194,8 +180,7 @@ }, "babel-helper-function-name": { "version": "6.24.1", - "resolved": - "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "requires": { "babel-helper-get-function-arity": "6.24.1", @@ -207,8 +192,7 @@ }, "babel-helper-get-function-arity": { "version": "6.24.1", - "resolved": - "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "requires": { "babel-runtime": "6.26.0", @@ -217,14 +201,12 @@ }, "babel-helper-mark-eval-scopes": { "version": "0.1.1", - "resolved": - "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.1.1.tgz", "integrity": "sha1-RVQ0Xt+fJUlCe9IJjlMCU/ivKZI=" }, "babel-helper-remap-async-to-generator": { "version": "6.24.1", - "resolved": - "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "requires": { "babel-helper-function-name": "6.24.1", @@ -236,14 +218,12 @@ }, "babel-helper-remove-or-void": { "version": "0.1.1", - "resolved": - "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.1.1.tgz", "integrity": "sha1-nX4YVtxvr8tBsoOkFnMNwYRPZtc=" }, "babel-helpers": { "version": "6.24.1", - "resolved": - "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "requires": { "babel-runtime": "6.26.0", @@ -252,8 +232,7 @@ }, "babel-messages": { "version": "6.23.0", - "resolved": - "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "requires": { "babel-runtime": "6.26.0" @@ -261,8 +240,7 @@ }, "babel-plugin-minify-dead-code-elimination": { "version": "0.1.7", - "resolved": - "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.1.7.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.1.7.tgz", "integrity": "sha1-d09TbzR7mDk6J7qnF4cpaIE8NCw=", "requires": { "babel-helper-mark-eval-scopes": "0.1.1", @@ -272,38 +250,32 @@ }, "babel-plugin-syntax-async-generators": { "version": "6.13.0", - "resolved": - "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=" }, "babel-plugin-syntax-class-properties": { "version": "6.13.0", - "resolved": - "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" }, "babel-plugin-syntax-export-extensions": { "version": "6.13.0", - "resolved": - "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=" }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", - "resolved": - "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" }, "babel-plugin-syntax-trailing-function-commas": { "version": "6.22.0", - "resolved": - "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" }, "babel-plugin-transform-async-generator-functions": { "version": "6.24.1", - "resolved": - "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", "requires": { "babel-helper-remap-async-to-generator": "6.24.1", @@ -313,8 +285,7 @@ }, "babel-plugin-transform-class-properties": { "version": "6.24.1", - "resolved": - "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", "requires": { "babel-helper-function-name": "6.24.1", @@ -325,8 +296,7 @@ }, "babel-plugin-transform-es2015-block-scoping": { "version": "6.26.0", - "resolved": - "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "requires": { "babel-runtime": "6.26.0", @@ -338,8 +308,7 @@ }, "babel-plugin-transform-es2015-for-of": { "version": "6.23.0", - "resolved": - "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "requires": { "babel-runtime": "6.26.0" @@ -347,8 +316,7 @@ }, "babel-plugin-transform-es2015-modules-commonjs": { "version": "6.26.0", - "resolved": - "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", "requires": { "babel-plugin-transform-strict-mode": "6.24.1", @@ -359,8 +327,7 @@ }, "babel-plugin-transform-export-extensions": { "version": "6.22.0", - "resolved": - "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", "requires": { "babel-plugin-syntax-export-extensions": "6.13.0", @@ -369,14 +336,12 @@ }, "babel-plugin-transform-inline-consecutive-adds": { "version": "0.1.2", - "resolved": - "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.1.2.tgz", "integrity": "sha1-VELp8cGceKeJn4pN7m/UgfYQAfU=" }, "babel-plugin-transform-object-rest-spread": { "version": "6.26.0", - "resolved": - "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", "requires": { "babel-plugin-syntax-object-rest-spread": "6.13.0", @@ -385,8 +350,7 @@ }, "babel-plugin-transform-strict-mode": { "version": "6.24.1", - "resolved": - "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "requires": { "babel-runtime": "6.26.0", @@ -395,8 +359,7 @@ }, "babel-polyfill": { "version": "6.26.0", - "resolved": - "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", "requires": { "babel-runtime": "6.26.0", @@ -406,18 +369,15 @@ "dependencies": { "regenerator-runtime": { "version": "0.10.5", - "resolved": - "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" } } }, "babel-preset-node8": { "version": "1.2.0", - "resolved": - "https://registry.npmjs.org/babel-preset-node8/-/babel-preset-node8-1.2.0.tgz", - "integrity": - "sha512-pJR+UU+mWOYbgeNkEDZj/ORaks8de9+t0hZmaTHWBMo8x4OQ/GKaXfX2RSasYtFJVqaudOSMG3omE3Q3hhC1uA==", + "resolved": "https://registry.npmjs.org/babel-preset-node8/-/babel-preset-node8-1.2.0.tgz", + "integrity": "sha512-pJR+UU+mWOYbgeNkEDZj/ORaks8de9+t0hZmaTHWBMo8x4OQ/GKaXfX2RSasYtFJVqaudOSMG3omE3Q3hhC1uA==", "requires": { "babel-plugin-minify-dead-code-elimination": "0.1.7", "babel-plugin-syntax-trailing-function-commas": "6.22.0", @@ -433,8 +393,7 @@ }, "babel-register": { "version": "6.26.0", - "resolved": - "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "requires": { "babel-core": "6.26.0", @@ -448,8 +407,7 @@ }, "babel-runtime": { "version": "6.26.0", - "resolved": - "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { "core-js": "2.5.1", @@ -458,8 +416,7 @@ }, "babel-template": { "version": "6.26.0", - "resolved": - "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "requires": { "babel-runtime": "6.26.0", @@ -471,8 +428,7 @@ }, "babel-traverse": { "version": "6.26.0", - "resolved": - "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "requires": { "babel-code-frame": "6.26.0", @@ -488,8 +444,7 @@ }, "babel-types": { "version": "6.26.0", - "resolved": - "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "requires": { "babel-runtime": "6.26.0", @@ -501,19 +456,16 @@ "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": - "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" }, "balanced-match": { "version": "1.0.0", - "resolved": - "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "bcrypt-pbkdf": { "version": "1.0.1", - "resolved": - "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { @@ -522,8 +474,7 @@ "dependencies": { "tweetnacl": { "version": "0.14.5", - "resolved": - "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "optional": true } @@ -531,8 +482,7 @@ }, "binary-extensions": { "version": "1.10.0", - "resolved": - "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", "optional": true }, @@ -542,23 +492,21 @@ "integrity": "sha1-/54LYqcbu4rd2zTuLkJ9rCHBCW8=" }, "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": - "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" }, "boom": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "requires": { - "hoek": "4.2.0" + "hoek": "4.2.1" } }, "brace-expansion": { "version": "1.1.8", - "resolved": - "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "requires": { "balanced-match": "1.0.0", @@ -577,14 +525,13 @@ } }, "bson": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", - "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.6.tgz", + "integrity": "sha512-D8zmlb46xfuK2gGvKmUjIklQEouN2nQ0LEHHeZ/NoHM2LDiMk2EYzZ5Ntw/Urk+bgMDosOZxaRzXxvhI5TcAVQ==" }, "buffer-shims": { "version": "1.0.0", - "resolved": - "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" }, "caseless": { @@ -604,6 +551,14 @@ "supports-color": "2.0.0" } }, + "check-env": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/check-env/-/check-env-1.3.0.tgz", + "integrity": "sha1-vSsjDY023HNC3FKGhpQHvPFyzjo=", + "requires": { + "cowsay": "1.3.0" + } + }, "chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", @@ -612,6 +567,7 @@ "requires": { "anymatch": "1.3.2", "async-each": "1.0.1", + "fsevents": "1.1.3", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -622,13 +578,18 @@ }, "chrono-node": { "version": "1.3.5", - "resolved": - "https://registry.npmjs.org/chrono-node/-/chrono-node-1.3.5.tgz", + "resolved": "https://registry.npmjs.org/chrono-node/-/chrono-node-1.3.5.tgz", "integrity": "sha1-oklSmKMtqCvMAa2b59d++l4kQSI=", "requires": { - "moment": "2.19.1" + "moment": "2.21.0" } }, + "ci-info": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", + "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", + "dev": true + }, "cjson": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/cjson/-/cjson-0.2.1.tgz", @@ -645,10 +606,9 @@ "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=" }, "combined-stream": { - "version": "1.0.5", - "resolved": - "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { "delayed-stream": "1.0.0" } @@ -656,19 +616,17 @@ "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": - "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" }, "concat-map": { "version": "0.0.1", - "resolved": - "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "config": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/config/-/config-1.27.0.tgz", - "integrity": "sha1-OrMNAID/dvQHwvR6wTJq39kIr18=", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/config/-/config-1.30.0.tgz", + "integrity": "sha1-HWCp81NIoTwXV5jThOgaWhbDum4=", "requires": { "json5": "0.4.0", "os-homedir": "1.0.2" @@ -683,8 +641,7 @@ }, "convert-source-map": { "version": "1.5.0", - "resolved": - "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=" }, "core-js": { @@ -694,10 +651,20 @@ }, "core-util-is": { "version": "1.0.2", - "resolved": - "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "cowsay": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/cowsay/-/cowsay-1.3.0.tgz", + "integrity": "sha512-cbPcPpK2wdFwC7VnFy7LOQRq7N1IWO2F57cYjpTN06H8WryLzSST9Q8rwdO3Z98JHHpwexdAuxLLhSIUkkg8Qw==", + "requires": { + "get-stdin": "5.0.1", + "optimist": "0.6.1", + "string-width": "2.1.1", + "strip-eof": "1.0.0" + } + }, "cryptiles": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", @@ -709,14 +676,18 @@ "boom": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": - "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", "requires": { - "hoek": "4.2.0" + "hoek": "4.2.1" } } } }, + "cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -728,45 +699,61 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": - "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, "delayed-stream": { "version": "1.0.0", - "resolved": - "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "detect-indent": { "version": "4.0.0", - "resolved": - "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "requires": { "repeating": "2.0.1" } }, "discord.js": { - "version": "11.2.1", - "resolved": - "https://registry.npmjs.org/discord.js/-/discord.js-11.2.1.tgz", - "integrity": - "sha512-8Mor+IREVWHinjRd6Bu6OwRfT+ET/WEoLWMl8crFvBVcTFmaO/TSwP39C8QIGCB2YMVMYMdljjX/w17AUMemqg==", + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-11.3.2.tgz", + "integrity": "sha512-Abw9CTMX3Jb47IeRffqx2VNSnXl/OsTdQzhvbw/JnqCyqc2imAocc7pX2HoRmgKd8CgSqsjBFBneusz/E16e6A==", "requires": { - "long": "3.2.0", - "prism-media": "0.0.1", - "snekfetch": "3.5.8", + "long": "4.0.0", + "prism-media": "0.0.2", + "snekfetch": "3.6.4", "tweetnacl": "1.0.0", - "ws": "3.3.0" + "ws": "4.1.0" + }, + "dependencies": { + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "prism-media": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-0.0.2.tgz", + "integrity": "sha512-L6yc8P5NVG35ivzvfI7bcTYzqFV+K8gTfX9YaJbmIFfMXTs71RMnAupvTQPTCteGsiOy9QcNLkQyWjAafY/hCQ==" + }, + "snekfetch": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/snekfetch/-/snekfetch-3.6.4.tgz", + "integrity": "sha512-NjxjITIj04Ffqid5lqr7XdgwM7X61c/Dns073Ly170bPQHLm6jkmelye/eglS++1nfTWktpP6Y2bFXjdPlQqdw==" + } } }, "ebnf-parser": { "version": "0.1.10", - "resolved": - "https://registry.npmjs.org/ebnf-parser/-/ebnf-parser-0.1.10.tgz", + "resolved": "https://registry.npmjs.org/ebnf-parser/-/ebnf-parser-0.1.10.tgz", "integrity": "sha1-zR9rpHfFY4xAyX7ZtXLbW6tdgzE=" }, "ecc-jsbn": { @@ -778,23 +765,77 @@ "jsbn": "0.1.1" } }, + "elmadev-discord-irc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/elmadev-discord-irc/-/elmadev-discord-irc-2.4.1.tgz", + "integrity": "sha512-HXy4F40xdK314EpEhbWgdE6DKVjOysTca3f+E+LzhSAuHZHyMIyvey0stq+39AH+4hs9WSpJUnyGE0/9vaZJ6Q==", + "requires": { + "check-env": "1.3.0", + "commander": "2.10.0", + "discord.js": "11.1.0", + "irc-colors": "1.4.2", + "irc-formatting": "1.0.0-rc3", + "irc-upd": "0.6.1", + "lodash": "4.17.4", + "simple-markdown": "0.2.2", + "strip-json-comments": "2.0.1", + "winston": "2.3.1" + }, + "dependencies": { + "commander": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.10.0.tgz", + "integrity": "sha512-q/r9trjmuikWDRJNTBHAVnWhuU6w+z80KgBq7j9YDclik5E7X4xi0KnlZBNFA1zOQ+SH/vHMWd2mC9QTOz7GpA==", + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "discord.js": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-11.1.0.tgz", + "integrity": "sha1-U1HVnjeY9TbeGXXpLK5NEa89kmY=", + "requires": { + "long": "3.2.0", + "prism-media": "0.0.1", + "snekfetch": "3.5.8", + "tweetnacl": "0.14.5", + "ws": "2.3.1" + } + }, + "safe-buffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "ws": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz", + "integrity": "sha1-a5Sz5EfLajY/eF6vlK9jWejoHIA=", + "requires": { + "safe-buffer": "5.0.1", + "ultron": "1.1.0" + } + } + } + }, "embed-creator": { - "version": "1.1.4", - "resolved": - "https://registry.npmjs.org/embed-creator/-/embed-creator-1.1.4.tgz", - "integrity": - "sha512-/UDtZyrj+0X5actMc2N2u/XoHYGHZrzGToG3vBPGjz3diufnHBrYQnkXeGE8kCTn/xkleXnXuNbIijwqPexB6A==" + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/embed-creator/-/embed-creator-1.2.3.tgz", + "integrity": "sha512-omDI6gfeO4pLdnAj4GNhDhqTFPAaJ/ac78qO6I8lDAI8h8aO7k4zy/VPQ9QHCu4LxQkDqosPSjoXsrX1Ms8RFQ==" }, "es6-promise": { "version": "3.2.1", - "resolved": - "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" }, "escape-string-regexp": { "version": "1.0.5", - "resolved": - "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { @@ -821,8 +862,7 @@ }, "estraverse": { "version": "0.0.4", - "resolved": - "https://registry.npmjs.org/estraverse/-/estraverse-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-0.0.4.tgz", "integrity": "sha1-AaCTLf7ldGhKWYr1pnw7+bZCjbI=" }, "esutils": { @@ -832,8 +872,7 @@ }, "expand-brackets": { "version": "0.1.5", - "resolved": - "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "optional": true, "requires": { @@ -842,8 +881,7 @@ }, "expand-range": { "version": "1.8.2", - "resolved": - "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "optional": true, "requires": { @@ -866,33 +904,38 @@ }, "extsprintf": { "version": "1.3.0", - "resolved": - "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" + }, "fast-deep-equal": { - "version": "1.0.0", - "resolved": - "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" }, "fast-json-stable-stringify": { "version": "2.0.0", - "resolved": - "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, "filename-regex": { "version": "2.0.1", - "resolved": - "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", "optional": true }, "fill-range": { "version": "2.2.3", - "resolved": - "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", "optional": true, "requires": { @@ -920,32 +963,823 @@ }, "forever-agent": { "version": "0.6.1", - "resolved": - "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" + "combined-stream": "1.0.6", + "mime-types": "2.1.18" } }, "fs-readdir-recursive": { "version": "1.0.0", - "resolved": - "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz", "integrity": "sha1-jNF0XItPiinIyuw5JHaSG6GV9WA=" }, "fs.realpath": { "version": "1.0.0", - "resolved": - "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "optional": true, + "requires": { + "nan": "2.10.0", + "node-pre-gyp": "0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + } + } + }, + "get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=" + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -957,8 +1791,7 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": - "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -980,8 +1813,7 @@ }, "glob-parent": { "version": "2.0.0", - "resolved": - "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "requires": { "is-glob": "2.0.1" @@ -990,28 +1822,29 @@ "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": - "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" }, "graceful-fs": { "version": "4.1.11", - "resolved": - "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, "har-schema": { "version": "2.0.0", - "resolved": - "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { "version": "5.0.3", - "resolved": - "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "ajv": "5.3.0", + "ajv": "5.5.2", "har-schema": "2.0.0" } }, @@ -1026,25 +1859,22 @@ "hawk": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": - "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", "requires": { "boom": "4.3.1", "cryptiles": "3.1.2", - "hoek": "4.2.0", + "hoek": "4.2.1", "sntp": "2.1.0" } }, "hoek": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", - "integrity": - "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" }, "home-or-tmp": { "version": "2.0.0", - "resolved": - "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "requires": { "os-homedir": "1.0.2", @@ -1053,22 +1883,52 @@ }, "hooks-fixed": { "version": "2.0.2", - "resolved": - "https://registry.npmjs.org/hooks-fixed/-/hooks-fixed-2.0.2.tgz", - "integrity": - "sha512-YurCM4gQSetcrhwEtpQHhQ4M7Zo7poNGqY4kQGeBS6eZtOcT3tnNs01ThFa0jYBByAiYt1MjMjP/YApG0EnAvQ==" + "resolved": "https://registry.npmjs.org/hooks-fixed/-/hooks-fixed-2.0.2.tgz", + "integrity": "sha512-YurCM4gQSetcrhwEtpQHhQ4M7Zo7poNGqY4kQGeBS6eZtOcT3tnNs01ThFa0jYBByAiYt1MjMjP/YApG0EnAvQ==" }, "http-signature": { "version": "1.2.0", - "resolved": - "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { "assert-plus": "1.0.0", "jsprim": "1.4.1", - "sshpk": "1.13.1" + "sshpk": "1.14.1" } }, + "husky": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz", + "integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==", + "dev": true, + "requires": { + "is-ci": "1.1.0", + "normalize-path": "1.0.0", + "strip-indent": "2.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", + "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", + "dev": true + } + } + }, + "iconv": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/iconv/-/iconv-2.2.3.tgz", + "integrity": "sha1-4ITWDut9c9p/CpwJbkyKvgkL+u0=", + "optional": true, + "requires": { + "nan": "2.10.0" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -1091,10 +1951,32 @@ "loose-envify": "1.3.1" } }, + "irc-colors": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/irc-colors/-/irc-colors-1.4.2.tgz", + "integrity": "sha512-QZ1g4d9XTGKgBAp7lrltCetefqd3zfYs3SFQ4YyRSORORCmy/9EkU/r8LJrlSnaWc3Z+54EgHXBRlOHaCvpyHA==" + }, + "irc-formatting": { + "version": "1.0.0-rc3", + "resolved": "https://registry.npmjs.org/irc-formatting/-/irc-formatting-1.0.0-rc3.tgz", + "integrity": "sha1-lSDqPWpBuDk5SyHFEbWf6+2lU3c=", + "requires": { + "zeropad": "1.1.0" + } + }, + "irc-upd": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/irc-upd/-/irc-upd-0.6.1.tgz", + "integrity": "sha512-J/h33P1fnWFmClTahUsz0WBx1xVe/HydwvWTDHxzW/Z94+MbhsePde3xZ6mrjVFkN+ahjYpMCGuom3GU9+VpMg==", + "requires": { + "iconv": "2.2.3", + "irc-colors": "1.4.2", + "node-icu-charset-detector": "0.2.0" + } + }, "is-binary-path": { "version": "1.0.1", - "resolved": - "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "optional": true, "requires": { @@ -1104,20 +1986,26 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": - "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-ci": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", + "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", + "dev": true, + "requires": { + "ci-info": "1.1.3" + } }, "is-dotfile": { "version": "1.0.3", - "resolved": - "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", "optional": true }, "is-equal-shallow": { "version": "0.1.3", - "resolved": - "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "optional": true, "requires": { @@ -1126,15 +2014,13 @@ }, "is-extendable": { "version": "0.1.1", - "resolved": - "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "optional": true }, "is-extglob": { "version": "1.0.0", - "resolved": - "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "is-finite": { @@ -1145,6 +2031,11 @@ "number-is-nan": "1.0.1" } }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", @@ -1164,22 +2055,19 @@ }, "is-posix-bracket": { "version": "0.1.1", - "resolved": - "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", "optional": true }, "is-primitive": { "version": "2.0.0", - "resolved": - "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "optional": true }, "is-typedarray": { "version": "1.0.0", - "resolved": - "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "isarray": { @@ -1250,20 +2138,17 @@ }, "json-schema": { "version": "0.2.3", - "resolved": - "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-traverse": { "version": "0.3.1", - "resolved": - "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" }, "json-stringify-safe": { "version": "5.0.1", - "resolved": - "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json5": { @@ -1272,13 +2157,13 @@ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, "jsonpath": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-0.2.12.tgz", - "integrity": "sha1-W/nZEftGFsHjNwvs658NskrjTNI=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.0.0.tgz", + "integrity": "sha1-Rc2dTE0NaCXZC9fkD4PxGCsT3Qc=", "requires": { "esprima": "1.2.2", "jison": "0.4.13", - "static-eval": "0.2.3", + "static-eval": "2.0.0", "underscore": "1.7.0" } }, @@ -1306,10 +2191,18 @@ "is-buffer": "1.1.6" } }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, "lex-parser": { "version": "0.1.4", - "resolved": - "https://registry.npmjs.org/lex-parser/-/lex-parser-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/lex-parser/-/lex-parser-0.1.4.tgz", "integrity": "sha1-ZMTwJfF/1Tv7RXY/rrFvAVp0dVA=" }, "lodash": { @@ -1319,14 +2212,12 @@ }, "lodash.get": { "version": "4.4.2", - "resolved": - "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" }, "lodash.some": { "version": "4.6.0", - "resolved": - "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" }, "long": { @@ -1336,8 +2227,7 @@ }, "loose-envify": { "version": "1.3.1", - "resolved": - "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "requires": { "js-tokens": "3.0.2" @@ -1345,8 +2235,7 @@ }, "micromatch": { "version": "2.3.11", - "resolved": - "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "optional": true, "requires": { @@ -1366,24 +2255,22 @@ } }, "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" }, "mime-types": { - "version": "2.1.17", - "resolved": - "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "requires": { - "mime-db": "1.30.0" + "mime-db": "1.33.0" } }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": - "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "1.1.8" } @@ -1402,24 +2289,23 @@ } }, "moment": { - "version": "2.19.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.1.tgz", - "integrity": "sha1-VtoaLRy/AdOLfhr8McELz6GSkWc=" + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.21.0.tgz", + "integrity": "sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ==" }, "mongodb": { - "version": "2.2.33", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.33.tgz", - "integrity": "sha1-tTfEcdNKZlG0jzb9vyl1A0Dgi1A=", + "version": "2.2.34", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.34.tgz", + "integrity": "sha1-o09Zu+thdUrsQy3nLD/iFSakTBo=", "requires": { "es6-promise": "3.2.1", - "mongodb-core": "2.1.17", + "mongodb-core": "2.1.18", "readable-stream": "2.2.7" }, "dependencies": { "readable-stream": { "version": "2.2.7", - "resolved": - "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", "requires": { "buffer-shims": "1.0.0", @@ -1434,30 +2320,28 @@ } }, "mongodb-core": { - "version": "2.1.17", - "resolved": - "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.17.tgz", - "integrity": "sha1-pBizN6FKFJkPtRC5I97mqBMXPfg=", + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.18.tgz", + "integrity": "sha1-TEYTm986HwMt7ZHbSfOO7AFlkFA=", "requires": { - "bson": "1.0.4", + "bson": "1.0.6", "require_optional": "1.0.1" } }, "mongoose": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-4.13.0.tgz", - "integrity": - "sha512-PVUEQ4eS1Bh0Q4IqWRph+li8VMwBxHetdJ1O/P/vE8DktOtBOM1G1G0QOrtQSW1FDrLFSVYkzK4IfI7vJeihQg==", + "version": "4.13.12", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-4.13.12.tgz", + "integrity": "sha512-pH8NK5AYGbnPeEFFGs5ACk18vzzcy4DFT48U9kKvkfg6SI3nJZkzGfN7o1NDWjy+kP26hWyU/AMhYTfe5hSVnA==", "requires": { "async": "2.1.4", - "bson": "1.0.4", + "bson": "1.0.6", "hooks-fixed": "2.0.2", "kareem": "1.5.0", "lodash.get": "4.4.2", - "mongodb": "2.2.33", + "mongodb": "2.2.34", "mpath": "0.3.0", "mpromise": "0.5.5", - "mquery": "2.3.2", + "mquery": "2.3.3", "ms": "2.0.0", "muri": "1.3.0", "regexp-clone": "0.0.1", @@ -1475,12 +2359,11 @@ "integrity": "sha1-9bJCWddjrMIlewoMjG2Gb9UXMuY=" }, "mquery": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-2.3.2.tgz", - "integrity": - "sha512-KXWMypZSvhCuqRtza+HMQZdYw7PfFBjBTFvP31NNAq0OX0/NTIgpcDpkWQ2uTxk6vGQtwQ2elhwhs+ZvCA8OaA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-2.3.3.tgz", + "integrity": "sha512-NC8L14kn+qxJbbJ1gbcEMDxF0sC3sv+1cbRReXXwVvowcwY1y9KoVZFq0ebwARibsadu8lx8nWGvm3V0Pf0ZWQ==", "requires": { - "bluebird": "3.5.1", + "bluebird": "3.5.0", "debug": "2.6.9", "regexp-clone": "0.0.1", "sliced": "0.0.5" @@ -1501,15 +2384,42 @@ "muri": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/muri/-/muri-1.3.0.tgz", - "integrity": - "sha512-FiaFwKl864onHFFUV/a2szAl7X0fxVlSKNdhTf+BM8i8goEgYut8u5P9MqQqIYwvaMxjzVESsoEm/2kfkFH1rg==" + "integrity": "sha512-FiaFwKl864onHFFUV/a2szAl7X0fxVlSKNdhTf+BM8i8goEgYut8u5P9MqQqIYwvaMxjzVESsoEm/2kfkFH1rg==" + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" + }, + "needle": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.0.tgz", + "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", + "requires": { + "debug": "2.6.9", + "iconv-lite": "0.4.19", + "sax": "1.2.4" + } + }, + "negative-zero": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negative-zero/-/negative-zero-1.0.0.tgz", + "integrity": "sha1-mvQi827/stxYK83Ga4a/GtuhFgU=" }, "node-config": { "version": "0.0.2", - "resolved": - "https://registry.npmjs.org/node-config/-/node-config-0.0.2.tgz", + "resolved": "https://registry.npmjs.org/node-config/-/node-config-0.0.2.tgz", "integrity": "sha1-RrQNz7yw5m1GoV+BtU6sITD7FQ0=" }, + "node-icu-charset-detector": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-icu-charset-detector/-/node-icu-charset-detector-0.2.0.tgz", + "integrity": "sha1-wjINo3Tdy2cfxUy0oOBB4Vb/1jk=", + "optional": true, + "requires": { + "nan": "2.10.0" + } + }, "nomnom": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.5.2.tgz", @@ -1521,16 +2431,14 @@ "dependencies": { "underscore": { "version": "1.1.7", - "resolved": - "https://registry.npmjs.org/underscore/-/underscore-1.1.7.tgz", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.1.7.tgz", "integrity": "sha1-QLq4S60Z0jAJbo1u9ii/8FXYPbA=" } } }, "normalize-path": { "version": "2.1.1", - "resolved": - "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "requires": { "remove-trailing-separator": "1.1.0" @@ -1538,8 +2446,7 @@ }, "number-is-nan": { "version": "1.0.1", - "resolved": - "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "numeral": { @@ -1549,20 +2456,17 @@ }, "oauth-sign": { "version": "0.8.2", - "resolved": - "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" }, "object-assign": { "version": "4.1.1", - "resolved": - "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object.omit": { "version": "2.0.1", - "resolved": - "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "optional": true, "requires": { @@ -1578,10 +2482,38 @@ "wrappy": "1.0.2" } }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.3" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + } + } + }, "os-homedir": { "version": "1.0.2", - "resolved": - "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-tmpdir": { @@ -1591,8 +2523,7 @@ }, "output-file-sync": { "version": "1.1.2", - "resolved": - "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", "requires": { "graceful-fs": "4.1.11", @@ -1602,8 +2533,7 @@ }, "parse-glob": { "version": "3.0.4", - "resolved": - "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "optional": true, "requires": { @@ -1615,16 +2545,19 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": - "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "performance-now": { "version": "2.1.0", - "resolved": - "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", @@ -1632,27 +2565,24 @@ "optional": true }, "prettier": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.7.4.tgz", - "integrity": "sha1-XoYkrpNjyA+V7GRFhOzfVddPk/o=", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.8.1.tgz", + "integrity": "sha512-YD5mApxnu/o/u7kiy5C4ouMfzJMXGEQdHyGHtQd0KwN/CrwTwD8RuTNzpInZEYZn9S8m10zDvVT5gAO4pp+0FA==", "dev": true }, "prism-media": { "version": "0.0.1", - "resolved": - "https://registry.npmjs.org/prism-media/-/prism-media-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-0.0.1.tgz", "integrity": "sha1-o0JcnKvVDRxsAuVDlBoRiVZnvRA=" }, "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": - "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" }, "process-nextick-args": { "version": "1.0.7", - "resolved": - "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, "punycode": { @@ -1663,15 +2593,12 @@ "qs": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": - "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" }, "randomatic": { "version": "1.1.7", - "resolved": - "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": - "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "optional": true, "requires": { "is-number": "3.0.0", @@ -1680,8 +2607,7 @@ "dependencies": { "is-number": { "version": "3.0.0", - "resolved": - "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "optional": true, "requires": { @@ -1690,8 +2616,7 @@ "dependencies": { "kind-of": { "version": "3.2.2", - "resolved": - "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "optional": true, "requires": { @@ -1713,10 +2638,8 @@ }, "readable-stream": { "version": "2.3.3", - "resolved": - "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": - "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "optional": true, "requires": { "core-util-is": "1.0.2", @@ -1742,17 +2665,13 @@ }, "regenerator-runtime": { "version": "0.11.0", - "resolved": - "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": - "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==" + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==" }, "regex-cache": { "version": "0.4.4", - "resolved": - "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": - "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "optional": true, "requires": { "is-equal-shallow": "0.1.3" @@ -1760,26 +2679,22 @@ }, "regexp-clone": { "version": "0.0.1", - "resolved": - "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" }, "remove-trailing-separator": { "version": "1.1.0", - "resolved": - "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "repeat-element": { "version": "1.1.2", - "resolved": - "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" }, "repeat-string": { "version": "1.6.1", - "resolved": - "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "optional": true }, @@ -1792,77 +2707,87 @@ } }, "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": - "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "version": "2.85.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", + "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", "requires": { "aws-sign2": "0.7.0", "aws4": "1.6.0", "caseless": "0.12.0", - "combined-stream": "1.0.5", + "combined-stream": "1.0.6", "extend": "3.0.1", "forever-agent": "0.6.1", - "form-data": "2.3.1", + "form-data": "2.3.2", "har-validator": "5.0.3", "hawk": "6.0.2", "http-signature": "1.2.0", "is-typedarray": "1.0.0", "isstream": "0.1.2", "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", + "mime-types": "2.1.18", "oauth-sign": "0.8.2", "performance-now": "2.1.0", "qs": "6.5.1", "safe-buffer": "5.1.1", "stringstream": "0.0.5", - "tough-cookie": "2.3.3", + "tough-cookie": "2.3.4", "tunnel-agent": "0.6.0", - "uuid": "3.1.0" + "uuid": "3.2.1" } }, "require_optional": { "version": "1.0.1", - "resolved": - "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": - "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", "requires": { "resolve-from": "2.0.0", - "semver": "5.4.1" + "semver": "5.5.0" } }, "resolve-from": { "version": "2.0.0", - "resolved": - "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" }, "safe-buffer": { "version": "5.1.1", - "resolved": - "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": - "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": - "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" }, "set-immediate-shim": { "version": "1.0.1", - "resolved": - "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", "optional": true }, + "simple-markdown": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-markdown/-/simple-markdown-0.2.2.tgz", + "integrity": "sha512-AHdtgtmYo7VR48kmm+lzQRJpyjv5G+2hk/4zMH3O1A288u0goKTCHwEFPRNcrqQt5SkmFUXLAycgoH7oxfYOZA==" + }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, + "sleep": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/sleep/-/sleep-5.1.1.tgz", + "integrity": "sha1-h4+h1E0I7rDyb7IBjvhinrGjq5Q=", + "requires": { + "nan": "2.10.0" + } + }, "sliced": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", @@ -1871,38 +2796,33 @@ "snekfetch": { "version": "3.5.8", "resolved": "https://registry.npmjs.org/snekfetch/-/snekfetch-3.5.8.tgz", - "integrity": - "sha512-osq7soqKBObV4u/WE9tGQT/m5JdqTU1PWVPcT0We3sKZ99h9QA7wSj7ZWrwEwgRbELeO5BrVCanYjDYtVYcwrQ==" + "integrity": "sha512-osq7soqKBObV4u/WE9tGQT/m5JdqTU1PWVPcT0We3sKZ99h9QA7wSj7ZWrwEwgRbELeO5BrVCanYjDYtVYcwrQ==" }, "sntp": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": - "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "requires": { - "hoek": "4.2.0" + "hoek": "4.2.1" } }, "source-map": { "version": "0.5.7", - "resolved": - "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "source-map-support": { "version": "0.4.18", - "resolved": - "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": - "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "requires": { "source-map": "0.5.7" } }, "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "requires": { "asn1": "0.2.3", "assert-plus": "1.0.0", @@ -1916,102 +2836,147 @@ "dependencies": { "tweetnacl": { "version": "0.14.5", - "resolved": - "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "optional": true } } }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, "static-eval": { - "version": "0.2.3", - "resolved": - "https://registry.npmjs.org/static-eval/-/static-eval-0.2.3.tgz", - "integrity": "sha1-Aj8XrJ/uQm6niMEuo5IG3Bdfiyo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.0.tgz", + "integrity": "sha512-6flshd3F1Gwm+Ksxq463LtFd1liC77N/PX1FVVc3OzL3hAmo2fwHFbuArkcfi7s9rTNsLEhcRmXGFZhlgy40uw==", "requires": { - "escodegen": "0.0.28" + "escodegen": "1.9.1" }, "dependencies": { "escodegen": { - "version": "0.0.28", - "resolved": - "https://registry.npmjs.org/escodegen/-/escodegen-0.0.28.tgz", - "integrity": "sha1-Dk/xcV8yh3XWyrUaxEpAbNer/9M=", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", + "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", "requires": { - "esprima": "1.0.4", - "estraverse": "1.3.2", - "source-map": "0.5.7" + "esprima": "3.1.3", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.6.1" } }, "esprima": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" }, "estraverse": { - "version": "1.3.2", - "resolved": - "https://registry.npmjs.org/estraverse/-/estraverse-1.3.2.tgz", - "integrity": "sha1-N8K4k+8T1yPydth41g2FNRUqbEI=" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } } } }, "string_decoder": { "version": "1.0.3", - "resolved": - "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": - "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { "safe-buffer": "5.1.1" } }, "stringstream": { "version": "0.0.5", - "resolved": - "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" }, "strip-ansi": { "version": "3.0.1", - "resolved": - "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "2.1.1" } }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "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=" + }, "supports-color": { "version": "2.0.0", - "resolved": - "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" }, "to-fast-properties": { "version": "1.0.3", - "resolved": - "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" }, "tough-cookie": { - "version": "2.3.3", - "resolved": - "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "requires": { "punycode": "1.4.1" } }, "trim-right": { "version": "1.0.1", - "resolved": - "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" }, + "tunnel": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.2.tgz", + "integrity": "sha1-8jvNi3p7ioZCYbIIT2b5MZM5YzQ=" + }, "tunnel-agent": { "version": "0.6.0", - "resolved": - "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { "safe-buffer": "5.1.1" @@ -2022,6 +2987,14 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.0.tgz", "integrity": "sha1-cT2LgY2kIGh0C/aDhtBHnmb8ins=" }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "1.1.2" + } + }, "ultron": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.0.tgz", @@ -2029,8 +3002,7 @@ }, "underscore": { "version": "1.7.0", - "resolved": - "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" }, "user-home": { @@ -2040,15 +3012,13 @@ }, "util-deprecate": { "version": "1.0.2", - "resolved": - "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": - "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" }, "v8flags": { "version": "2.1.1", @@ -2068,20 +3038,64 @@ "extsprintf": "1.3.0" } }, + "wget": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/wget/-/wget-0.0.1.tgz", + "integrity": "sha1-i7ga8LjmC13yYtPIHlc34fSTHlM=", + "requires": { + "tunnel": "0.0.2" + } + }, + "winston": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.3.1.tgz", + "integrity": "sha1-C0hCDZeMAYBM8CMLZIhhWYIloRk=", + "requires": { + "async": "1.0.0", + "colors": "1.0.3", + "cycle": "1.0.3", + "eyes": "0.1.8", + "isstream": "0.1.2", + "stack-trace": "0.0.10" + }, + "dependencies": { + "async": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", + "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" + } + } + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.0.tgz", - "integrity": - "sha512-XPwGf44sJI6zgBpiWk44HQG6pK7HABl4F77Uydtb6BcgTC8fFpXHKM8bGu4AdBMtIjREDbNlvGitRZnwi0vXCA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", + "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", "requires": { "async-limiter": "1.0.0", - "safe-buffer": "5.1.1", - "ultron": "1.1.0" + "safe-buffer": "5.1.1" + } + }, + "zeropad": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/zeropad/-/zeropad-1.1.0.tgz", + "integrity": "sha1-Ml+T6y0OAW/0QtTjW90CbsLNopI=", + "requires": { + "negative-zero": "1.0.0" } } } diff --git a/package.json b/package.json index 41d85a1..1dd8c1c 100644 --- a/package.json +++ b/package.json @@ -4,26 +4,26 @@ "babel-preset-node8": "^1.2.0", "bitcoin": "^3.0.1", "chrono-node": "^1.3.5", - "config": "^1.27.0", - "discord.js": "^11.2.1", + "config": "^1.30.0", + "discord.js": "^11.3.2", "elmadev-discord-irc": "^2.4.1", - "embed-creator": "^1.1.4", - "jsonpath": "^0.2.12", - "moment": "^2.19.1", - "mongoose": "^4.12.3", + "embed-creator": "^1.2.3", + "jsonpath": "^1.0.0", + "moment": "^2.21.0", + "mongoose": "^4.13.12", "needle": "^2.0.1", "node-config": "^0.0.2", "numeral": "^2.0.6", - "request": "^2.83.0", + "request": "^2.85.0", "sleep": "^5.1.1", "wget": "^0.0.1" }, "scripts": { - "prettier": "prettier * --write", + "prettier": "prettier --write \"{bot,.}/**/*.{js,json}\" --single-quote --print-width 240", "build": "babel bot -d dist", "prod": "babel bot -d dist & node dist/bot.js", - "lint": "prettier --write bot/**/*.js", - "precommit": "prettier --write bot/**/*.js" + "lint": "prettier --write \"{bot,.}/**/*.{js,json}\" --single-quote --print-width 240", + "precommit": "prettier --write \"{bot,.}/**/*.{js,json}\" --single-quote --print-width 240" }, "devDependencies": { "husky": "^0.14.3",