First commit

master
Guus van Meerveld 5 years ago
commit 3d15fdd663

2
.gitignore vendored

@ -0,0 +1,2 @@
node_modules
json/config.json

@ -0,0 +1,19 @@
const { Command } = require('discord.js-commando');
const fun = require('../../js/functions.js');
const boot = new Date();
module.exports = class uptimeCommand extends Command {
constructor(client) {
super(client, {
name: 'uptime',
aliases: ['u'],
group: 'bot',
memberName: 'uptime',
description: 'Get the bots uptime'
});
}
run(msg) {
msg.say(fun.unixDur(boot, true))
}
}

@ -0,0 +1,226 @@
const { Command } = require('discord.js-commando');
const { MessageEmbed } = require('discord.js');
const fun = require('../../js/functions.js');
const list = require('../../json/lists.json');
const axios = require('axios');
const db = new (require('json-config-store'))({
cwd: `${process.cwd()}/database`,
configName: 'clanstore.json'
})
module.exports = class clanCommand extends Command {
constructor(client) {
super(client, {
name: 'clan',
aliases: ['c', 'cl'],
group: 'clash',
memberName: 'clan',
description: 'Get stats about a clan',
argsPromptLimit: 0,
args: [
{
key: 'method',
prompt: '',
type: 'string',
default: 'get'
},
{
key: 'clanTag',
prompt: '',
type: 'string',
default: "default"
},
],
examples: ['.clan get #FFFFFFFF', '.clan members #FFFFFFFF']
});
}
run(msg, args) {
if (msg.guild && args.clanTag == "default" && db.has(`${msg.guild.id}.clanTag`)) {
args.clanTag = db.get(`${msg.guild.id}.clanTag`)
}
const clanTag = args.clanTag.replace("#", "") || "";
switch (args.method) {
case "get":
axios.get(`https://api.clashofclans.com/v1/clans/%23${clanTag}`)
.then(res => {
let response = res.data
var labels = 'Labels not set'
if (response.labels.length) {
labels = ''
response.labels.forEach(x => {
if (response.labels.indexOf(x) != response.labels.length - 1) labels += `${x.name} | `
else labels += x.name
})
}
var clanLoc = "Location not set"
if (response.location) {
clanLoc = response.location.name
}
msg.say({
embed: {
title: `${response.name} | ${response.tag.toUpperCase()}`,
color: '#0099ff',
description: response.description,
thumbnail: {
url: response.badgeUrls.small,
},
fields: [
{
name: 'Labels:',
value: `${labels}`
},
{
name: 'Requirements:',
value: `🏆 ${response.requiredTrophies}`,
inline: true
},
{
name: 'Type:',
value: `${list.types[response.type]}`,
inline: true
},
{
name: 'Location:',
value: `${clanLoc}`,
inline: true
},
{
name: 'Trophies:',
value: `<:trophy:722016684935872522> ${response.clanPoints} | <:versustrophy:722016340503822347> ${response.clanVersusPoints} `,
inline: true
},
{
name: 'War:',
value: `W: ${response.warWins} | L: ${response.warLosses || "Not public"}`,
inline: true
},
{
name: 'Warlog:',
value: `Public warlog: ${response.isWarLogPublic ? "✅" : "❌"}`,
inline: true
},
{
name: 'War league:',
value: `League: ${response.warLeague.name}`,
inline: true
}
],
author: {
name: `Requested by: ${msg.author.username}`,
icon_url: `https://cdn.discordapp.com/avatars/${msg.author.id}/${msg.author.avatar}.jpg`
},
footer: {
text: 'Bot by Xeeon#7590'
},
timestamp: new Date()
}
});
}).catch(() => msg.say("Could not find that clan."));
break;
case "unlink":
if (db.has(`${msg.guild.id}`)) {
db.delete(`${msg.guild.id}`)
let embed = {
embed: {
title: "Succefully unlinked!",
color: "ededed",
description: `Unlinked ${msg.guild.name}!`,
author: {
name: `Requested by: ${msg.author.username}`,
icon_url: `https://cdn.discordapp.com/avatars/${msg.author.id}/${msg.author.avatar}.jpg`
},
footer: {
text: 'Bot by Xeeon#7590'
},
timestamp: new Date()
}
}
msg.say(embed)
} else {
msg.say("This server doesn't have any linked clans!")
}
break;
case "members":
axios.get(`https://api.clashofclans.com/v1/clans/%23${clanTag}`)
.then(res => {
let response = res.data
let embed = new MessageEmbed()
.setTitle(`Showing members for ${response.name}`)
.setColor('#1d9e1b')
.setThumbnail(response.badgeUrls.small)
.setTimestamp()
.setAuthor(`Requested by ${msg.author.username}`, `https://cdn.discordapp.com/avatars/${msg.author.id}/${msg.author.avatar}.jpg`)
fun.fieldCreator(embed, response.memberList, 0, "members")
msg.say(embed)
.then(x => fun.addReaction(x, response.memberList, "members"))
}).catch(console.error)
break;
case "link":
if (msg.guild && msg.guild.id) {
if (msg.member.hasPermission("ADMINISTRATOR")) {
if (db.get(`${msg.guild.id}.clanTag`) == clanTag) {
let embed = {
embed: {
title: "Already linked!",
color: "ededed",
thumbnail: {
url: db.get(`${msg.guild.id}.clanBadge`)
},
description: `${msg.guild.name} is linked to ${db.get(`${msg.guild.id}.clanName`)} #${clanTag.toUpperCase()}!`,
author: {
name: `Requested by: ${msg.author.username}`,
icon_url: `https://cdn.discordapp.com/avatars/${msg.author.id}/${msg.author.avatar}.jpg`
},
footer: {
text: 'Bot by Xeeon#7590'
},
timestamp: new Date()
}
}
msg.say(embed)
return
}
axios.get(`https://api.clashofclans.com/v1/clans/%23${clanTag}`)
.then(response => {
db.set(`${msg.guild.id}.clanTag`, clanTag)
db.set(`${msg.guild.id}.clanBadge`, response.data.badgeUrls.small)
db.set(`${msg.guild.id}.clanName`, response.data.name)
let embed = {
embed: {
title: "Succefully linked!",
color: "ededed",
thumbnail: {
url: response.data.badgeUrls.small
},
description: `Linked ${msg.guild.name} to ${response.data.name} #${clanTag.toUpperCase()}!`,
author: {
name: `Requested by: ${msg.author.username}`,
icon_url: `https://cdn.discordapp.com/avatars/${msg.author.id}/${msg.author.avatar}.jpg`
},
footer: {
text: 'Bot by Xeeon#7590'
},
timestamp: new Date()
}
}
msg.say(embed)
}).catch(() => msg.say("An Error occured when reading that command. Please use .help for more information."))
} else msg.say('You don\'t have the rights to execute this command!')
} else msg.say("You can't link a server here!")
break;
default:
msg.say("Invalid usage of command; use .help for further information.")
break;
}
}
};

@ -0,0 +1,177 @@
const { Command } = require('discord.js-commando');
const axios = require('axios');
const list = require('../../json/lists.json');
const fun = require('../../js/functions.js');
const { MessageEmbed } = require('discord.js');
const db = new (require('json-config-store'))({
cwd: `${process.cwd()}/database`,
configName: 'playerstore.json'
})
module.exports = class playerCommand extends Command {
constructor(client) {
super(client, {
name: 'player',
aliases: ['p', 'pl'],
group: 'clash',
memberName: 'player',
description: 'Get a player\'s stats',
argsPromptLimit: 0,
args: [
{
key: 'method',
prompt: '',
type: 'string',
default: 'get'
},
{
key: 'playerTag',
prompt: '',
type: 'string',
default: 'default'
},
]
});
}
run(msg, args) {
if (args.playerTag == "default" && db.has(`${msg.author.id}.playerTag`)) {
args.playerTag = db.get(`${msg.author.id}.playerTag`)
}
const playerTag = args.playerTag.replace("#", "") || "";
switch (args.method) {
case "get":
axios.get(`https://api.clashofclans.com/v1/players/%23${playerTag}`)
.then(res => {
let response = res.data;
if (response.townHallWeaponLevel) var weapon = `(Wpn Lvl ${response.townHallWeaponLevel})`
else var weapon = ""
let embed = new MessageEmbed()
.setTitle(`${response.name} | ${response.tag.toUpperCase()}`)
.setColor('#fcba03')
.setThumbnail(response.league.iconUrls.small)
.setDescription(`Experience level: ${response.expLevel}\nRole: ${list.roles[response.role]}`)
.addField('Trophies:', `<:trophy:722016684935872522> ${response.trophies} | <:versustrophy:722016340503822347> ${response.versusTrophies}`)
.addField('Offense:', `Attack wins: ${response.attackWins} | Warstars: ${response.warStars}`)
response.legendStatistics ? embed.addField(`Best Season: ${response.legendStatistics.bestSeason.id}`, `Trophies: ${response.legendStatistics.bestSeason.trophies} | Rank: #${response.legendStatistics.bestSeason.rank}`) : ""
response.legendStatistics ? embed.addField(`Previous Season: ${response.legendStatistics.previousSeason.id}`, `Trophies: ${response.legendStatistics.previousSeason.trophies} | Rank: #${response.legendStatistics.previousSeason.rank}`) : ""
embed.addField('Town Halls:', `Home: Lvl ${response.townHallLevel} ${weapon} | Builder: Lvl ${response.builderHallLevel}`)
.addField('Clan:', `Name: ${response.clan.name || "Not in a clan"} | Tag: ${response.clan.tag || "None"}`)
.addField('Donations:', `Donated: ${response.donations} | Received: ${response.donationsReceived}`)
.setAuthor(`Requested by: ${msg.author.username}`, `https://cdn.discordapp.com/avatars/${msg.author.id}/${msg.author.avatar}.jpg`)
.setFooter('Bot by Xeeon#7590')
.setTimestamp()
msg.say(embed);
}).catch(() => msg.say("Could not find that player."))
break;
case "link":
if (db.get(`${msg.author.id}.playerTag`) == playerTag) {
let embed = {
embed: {
title: "Already linked!",
color: "ededed",
thumbnail: {
url: db.get(`${msg.author.id}.playerBadge`)
},
description: `${msg.author.username} is linked to ${db.get(`${msg.author.id}.playerName`)} #${playerTag.toUpperCase()}!`,
author: {
name: `Requested by: ${msg.author.username}`,
icon_url: `https://cdn.discordapp.com/avatars/${msg.author.id}/${msg.author.avatar}.jpg`
},
footer: {
text: 'Bot by Xeeon#7590'
},
timestamp: new Date()
}
}
msg.say(embed)
return
}
axios.get(`https://api.clashofclans.com/v1/players/%23${playerTag}`)
.then(response => {
db.set(`${msg.author.id}.playerTag`, playerTag)
db.set(`${msg.author.id}.playerBadge`, response.data.league.iconUrls.small)
db.set(`${msg.author.id}.playerName`, response.data.name)
let embed = {
embed: {
title: "Succefully linked!",
color: "ededed",
thumbnail: {
url: response.data.league.iconUrls.small
},
description: `Linked ${msg.author.username} to ${response.data.name} #${playerTag.toUpperCase()}!`,
author: {
name: `Requested by: ${msg.author.username}`,
icon_url: `https://cdn.discordapp.com/avatars/${msg.author.id}/${msg.author.avatar}.jpg`
},
footer: {
text: 'Bot by Xeeon#7590'
},
timestamp: new Date()
}
}
msg.say(embed)
}).catch(() => msg.say("Could not find that player."))
break;
case "unlink":
if (db.has(`${msg.author.id}`)) {
db.delete(`${msg.author.id}`)
let embed = {
embed: {
title: "Succefully unlinked!",
color: "ededed",
description: `Unlinked ${msg.author.username}!`,
author: {
name: `Requested by: ${msg.author.username}`,
icon_url: `https://cdn.discordapp.com/avatars/${msg.author.id}/${msg.author.avatar}.jpg`
},
footer: {
text: 'Bot by Xeeon#7590'
},
timestamp: new Date()
}
}
msg.say(embed)
} else {
msg.say("You don't have any linked accounts!")
}
break;
case "achievements":
axios.get(`https://api.clashofclans.com/v1/players/%23${playerTag}`)
.then(res => {
var response = res.data
let completed = []
response.achievements.forEach(x => {
if (x.value >= x.target) completed[completed.length] = x.name
})
let embed = new MessageEmbed()
.setTitle(`${response.name} | ${response.tag.toUpperCase()}`)
.setColor('#fcba03')
.setThumbnail(response.league.iconUrls.small)
.setDescription(`Achievements: ${completed.length}/${response.achievements.length}`)
.setAuthor(`Requested by: ${msg.author.username}`, `https://cdn.discordapp.com/avatars/${msg.author.id}/${msg.author.avatar}.jpg`)
.setFooter('Bot by Xeeon#7590')
.setTimestamp()
fun.fieldCreator(embed, response.achievements, 0, "achievements")
msg.say(embed)
.then(x => fun.addReaction(x, response.achievements, "achievements"))
})
break;
default:
msg.say("Invalid usage of command; use .help for further information.")
break;
}
}
}

@ -0,0 +1,7 @@
{
"433347979747786753": {
"clanTag": "9Y80JU8C",
"clanBadge": "https://api-assets.clashofclans.com/badges/70/lYW_zen4bRRQ94B0gmtUoE2dxMwi4aVZn3PEmw-EvG4.png",
"clanName": "Toothbrush"
}
}

@ -0,0 +1,7 @@
{
"306849399336861707": {
"playerTag": "9QYC2JG2",
"playerBadge": "https://api-assets.clashofclans.com/leagues/72/4wtS1stWZQ-1VJ5HaCuDPfdhTWjeZs_jPar_YPzK6Lg.png",
"playerName": "Xeeon"
}
}

@ -0,0 +1,32 @@
console.clear()
const { CommandoClient } = require('discord.js-commando');
const path = require('path');
const axios = require('axios')
const config = require('./json/config.json');
axios.defaults.headers.Authorization = `Bearer ${config.authToken}`
const client = new CommandoClient({
commandPrefix: '.',
owner: '306849399336861707'
});
client.registry
.registerDefaultTypes()
.registerGroups([
['clash', 'Clash commands'],
['bot', 'Bot commands']
])
.registerDefaultGroups()
.registerDefaultCommands()
.registerCommandsIn(path.join(__dirname, 'commands'));
client.once('ready', () => {
console.log(`Logged in as ${client.user.tag}!`);
client.user.setActivity('.help');
});
client.on('error', console.error);
client.login(config.discordToken);

@ -0,0 +1,87 @@
const list = require('../json/lists.json');
module.exports.unixDur=function(r,t){function a(h){return 1==h?0:1}function g(h){return t?h:""}var b=new Date(new Date-r),k=b.getFullYear()-1970,d=b.getMonth(),c=b.getDate()-1,e=b.getHours()-1,f=b.getMinutes();b=b.getSeconds();var l=["Second","Seconds"],m=["Minute","Minutes"],n=["Hour","Hours"],p=["Day","Days"],q=["Month","Months"],u=["Year","Years"];return 0==b&&1>f&&1>e&&1>c&&1>d?"Nu":1>f&&1>e&&1>c&&1>d?b+" "+l[a(b)]:1>e&&1>c&&1>d?f+" "+m[a(f)]+g(" and "+b+" "+l[a(b)]):1>c&&1>d?e+" "+n[a(e)]+g(", "+f+" "+m[a(f)]+" and "+b+" "+l[a(b)]):1>d?c+" "+p[a(c)]+g(", "+e+" "+n[a(e)]+" and "+f+" "+m[a(f)]):1>k?d+" "+q[a(d)]+g(", "+c+" "+p[a(c)]+" and "+e+" "+n[a(e)]):k+" "+u[a(k)]+g(", "+d+" "+q[a(d)]+" and "+c+" "+p[a(c)])};
module.exports.addReaction = (embedMsg, array, type) => {
const filter = (reaction, user) => ['⏪', '◀️', '▶️', '⏩'].includes(reaction.emoji.name) && !user.bot
embedMsg.awaitReactions(filter, { time: 600000, errors: ['time'], max: 1 })
.then(collected => {
const reaction = collected.first();
var embed = embedMsg
embed.embeds.fields = ""
console.log(embed);
switch (reaction.emoji.name) {
case '⏪':
module.exports.fieldCreator(embed, array, 0, type)
embedMsg.edit(embed)
break;
case '◀️':
// embedMsg.edit(fun.listEmbed(response, page - 1, msg))
break;
case '▶️':
// embedMsg.edit(fun.listEmbed(response, page + 1, msg))
break;
case '⏩':
module.exports.fieldCreator(embed, array, module.exports.arrGroups(array).length, type)
break;
}
module.exports.addReaction(embedMsg)
})
.catch(console.error);
(async () => {
await embedMsg.react('⏪')
await embedMsg.react('◀️')
await embedMsg.react('▶️')
await embedMsg.react('⏩')
})()
}
module.exports.fieldCreator = (embed, array, page, type) => {
module.exports.arrGroups(array, 5)[page].forEach(x => {
switch (type) {
case "achievements":
if (x.completionInfo) var info = x.completionInfo
else var info = ""
embed.addFields({
name: `Name: ${x.name}`,
value: `Objective: ${module.exports.format(x.info)} \nProgress: ${module.exports.format(x.value)}/${module.exports.format(x.target)} \n${module.exports.format(info)}`
})
break;
case "members":
embed.addFields({
name: `${x.name} | ${x.tag}`,
value: `Role: ${list.roles[x.role]} \nLeague: ${x.league.name} | Trophies: ${x.trophies} \nDonated: ${x.donations} | Received: ${x.donationsReceived}`
})
break;
}
})
return embed
}
module.exports.format = (n) => {
return n.toString().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1.")
}
module.exports.arrGroups = (array, size) => {
var result = [];
var pos = 0;
while (pos < array.length) {
result.push(array.slice(pos, pos + size));
pos += size;
}
return result;
}
function customAbs(number, arrLength) {
if (number < 0) return 0
else if (number > arrLength - 1) return arrLength - 1
else return number
}

@ -0,0 +1,13 @@
{
"roles": {
"leader": "Leader",
"coLeader": "Co-Leader",
"admin": "Elder",
"member": "Member"
},
"types": {
"inviteOnly": "Invite only",
"closed": "Closed",
"open": "Anyone can join"
}
}

187
package-lock.json generated

@ -0,0 +1,187 @@
{
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"@discordjs/collection": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.5.tgz",
"integrity": "sha512-CU1q0UXQUpFNzNB7gufgoisDHP7n+T3tkqTsp3MNUkVJ5+hS3BCvME8uCXAUFlz+6T2FbTCu75A+yQ7HMKqRKw=="
},
"@discordjs/form-data": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz",
"integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
}
},
"abort-controller": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
"integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
"requires": {
"event-target-shim": "^5.0.0"
}
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
"axios": {
"version": "0.19.2",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz",
"integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==",
"requires": {
"follow-redirects": "1.5.10"
}
},
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": {
"delayed-stream": "~1.0.0"
}
},
"common-tags": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz",
"integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw=="
},
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"requires": {
"ms": "2.0.0"
}
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
"discord.js": {
"version": "12.2.0",
"resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.2.0.tgz",
"integrity": "sha512-Ueb/0SOsxXyqwvwFYFe0msMrGqH1OMqpp2Dpbplnlr4MzcRrFWwsBM9gKNZXPVBHWUKiQkwU8AihXBXIvTTSvg==",
"requires": {
"@discordjs/collection": "^0.1.5",
"@discordjs/form-data": "^3.0.1",
"abort-controller": "^3.0.0",
"node-fetch": "^2.6.0",
"prism-media": "^1.2.0",
"setimmediate": "^1.0.5",
"tweetnacl": "^1.0.3",
"ws": "^7.2.1"
}
},
"discord.js-commando": {
"version": "github:discordjs/Commando#bdbd84e2a978322f3af12c21e729eb7b7cd4a3dc",
"from": "github:discordjs/Commando",
"requires": {
"common-tags": "^1.8.0",
"require-all": "^3.0.0"
}
},
"dot-prop": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
"integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
"requires": {
"is-obj": "^1.0.0"
}
},
"event-target-shim": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
"integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="
},
"follow-redirects": {
"version": "1.5.10",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
"integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
"requires": {
"debug": "=3.1.0"
}
},
"is-obj": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
"integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
},
"json-config-store": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/json-config-store/-/json-config-store-0.0.1.tgz",
"integrity": "sha1-qhgF6bGVEdJz9NCwXQKBPAywTig=",
"requires": {
"dot-prop": "^4.1.0",
"mkdirp": "^0.5.1"
}
},
"mime-db": {
"version": "1.44.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
"integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
},
"mime-types": {
"version": "2.1.27",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
"integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
"requires": {
"mime-db": "1.44.0"
}
},
"minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"mkdirp": {
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"requires": {
"minimist": "^1.2.5"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"node-fetch": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
"integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA=="
},
"prism-media": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.2.tgz",
"integrity": "sha512-I+nkWY212lJ500jLe4tN9tWO7nRiBAVdMv76P9kffZjYhw20raMlW1HSSvS+MLXC9MmbNZCazMrAr+5jEEgTuw=="
},
"require-all": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/require-all/-/require-all-3.0.0.tgz",
"integrity": "sha1-Rz1JcEvjEBFc4ST3c4Ox69hnExI="
},
"setimmediate": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
"integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
},
"tweetnacl": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
"integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw=="
},
"ws": {
"version": "7.3.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz",
"integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w=="
}
}
}