From fa0be297bacd61d6f7a825d00f20b03441d67aae Mon Sep 17 00:00:00 2001 From: mudkipscience Date: Sat, 24 Dec 2022 22:53:14 +1100 Subject: [PATCH 1/5] add cache mainly for API data --- bot/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bot/index.js b/bot/index.js index 80c1bbb..12acf67 100644 --- a/bot/index.js +++ b/bot/index.js @@ -33,6 +33,9 @@ class WoomyClient extends Discord.Client { this.aliases = new Discord.Collection(); this.eventModules = new Discord.Collection(); this.cooldowns = new Discord.Collection(); + + // Cache we can store stuff in + this.cache = new Discord.Collection(); } // Listen for Discord events and pass needed information to the event handler so we can respond to them. From 9e77c291cb974ab7e3a9ffa716a3e4a6d656ae14 Mon Sep 17 00:00:00 2001 From: mudkipscience Date: Sat, 24 Dec 2022 22:55:08 +1100 Subject: [PATCH 2/5] fix a bunch of stuff that is bad practice --- bot/commands/Bot/about.js | 6 +++--- bot/commands/Bot/help.js | 2 +- bot/commands/Fun/garfield.js | 2 +- bot/commands/Fun/inspire.js | 2 +- bot/commands/Utility/avatar.js | 2 +- bot/commands/Utility/server.js | 4 ++-- bot/commands/Utility/user.js | 6 +++--- bot/commands/Utility/weather.js | 4 ++-- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/bot/commands/Bot/about.js b/bot/commands/Bot/about.js index 2fe794e..a6e6915 100644 --- a/bot/commands/Bot/about.js +++ b/bot/commands/Bot/about.js @@ -37,8 +37,8 @@ module.exports = class About extends Command { const embed = new client.EmbedBuilder() .setTitle('About me') .setThumbnail(client.user.avatarURL({format: 'png'})) - .setColor(bot.user.hexAccentColor ?? bot.displayHexColor) - .addFields([ + .setColor(bot.displayHexColor) + .addFields( { name: 'General', value: `» Users: \`${userCount}\`\n» Servers: \`${client.guilds.cache.size}\`\n» Commands: \`${client.commands.size}\`\n» Uptime: \`${uptime}\``, @@ -49,7 +49,7 @@ module.exports = class About extends Command { value: `» RAM Usage: \`${(process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2)} MB\`\n» Woomy version: \`v${client.version} ${build}\`\n» discord.js version: \`v${version}\`\n» node.js version: \`${process.version}\``, inline: true } - ]) + ) .setFooter({ text: 'Made in Australia'}); return interaction.reply({ embeds: [embed], components: [links] }); diff --git a/bot/commands/Bot/help.js b/bot/commands/Bot/help.js index 2c79077..1c7c6a4 100644 --- a/bot/commands/Bot/help.js +++ b/bot/commands/Bot/help.js @@ -64,7 +64,7 @@ module.exports = class Help extends Command { const command = await client.commands.get(input.value); const embed = new client.EmbedBuilder() .setTitle(`${command.category} -> ${command.name.toProperCase()}`) - .setColor(bot.user.hexAccentColor ?? bot.displayHexColor) + .setColor(bot.displayHexColor) .setDescription(command.description) .setFooter({ text: '<> = required, / = either/or, [] = optional'}); diff --git a/bot/commands/Fun/garfield.js b/bot/commands/Fun/garfield.js index e842921..e59ef87 100644 --- a/bot/commands/Fun/garfield.js +++ b/bot/commands/Fun/garfield.js @@ -69,7 +69,7 @@ module.exports = class Garfield extends Command { .then(json => { const embed = new client.EmbedBuilder() .setTitle(`#${json.data.number}: ${json.data.name}`) - .setColor(bot.user.hexAccentColor ?? bot.displayHexColor) + .setColor(bot.displayHexColor) .setImage(json.data.image.src); interaction.editReply({ embeds: [embed] }); }) diff --git a/bot/commands/Fun/inspire.js b/bot/commands/Fun/inspire.js index 1e37cf4..169b1f7 100644 --- a/bot/commands/Fun/inspire.js +++ b/bot/commands/Fun/inspire.js @@ -11,7 +11,7 @@ module.exports = class Inspire extends Command { } async run (client, interaction, data) { //eslint-disable-line no-unused-vars - interaction.deferReply(); + await interaction.deferReply(); fetch('http://inspirobot.me/api?generate=true', { headers: { 'User-Agent': client.config.userAgent }}) .then(res => res.text()) .then(body => interaction.editReply(body)) diff --git a/bot/commands/Utility/avatar.js b/bot/commands/Utility/avatar.js index e189e3e..65ef647 100644 --- a/bot/commands/Utility/avatar.js +++ b/bot/commands/Utility/avatar.js @@ -28,6 +28,6 @@ module.exports = class Avatar extends Command { .setDescription(`[Global avatar](${user.avatarURL({extension: 'png', 'size': 4096})})`) .setImage(member.displayAvatarURL({extension: 'png', 'size': 4096})); - await interaction.reply({embeds: [embed]}); + interaction.reply({embeds: [embed]}); } }; \ No newline at end of file diff --git a/bot/commands/Utility/server.js b/bot/commands/Utility/server.js index 01a395c..16f6974 100644 --- a/bot/commands/Utility/server.js +++ b/bot/commands/Utility/server.js @@ -47,7 +47,7 @@ module.exports = class Avatar extends Command { .setColor(client.functions.embedColor(guild)) .setTitle(guild.name) .setThumbnail(guild.iconURL({extension: 'png', 'size': 4096})) - .addFields([ + .addFields( { name: 'ID', value: guild.id, inline: true }, @@ -84,7 +84,7 @@ module.exports = class Avatar extends Command { { name: 'Features', value: guild.features.join(', ') } - ]); + ); interaction.reply({ embeds: [embed] }); } }; \ No newline at end of file diff --git a/bot/commands/Utility/user.js b/bot/commands/Utility/user.js index e78c44e..fd4eb05 100644 --- a/bot/commands/Utility/user.js +++ b/bot/commands/Utility/user.js @@ -44,7 +44,7 @@ module.exports = class Avatar extends Command { .setTitle(member.user.username + '#' + member.user.discriminator) .setColor(user.hexAccentColor ?? member.displayHexColor) .setThumbnail(member.displayAvatarURL({extension: 'png', 'size': 4096})) - .addFields([ + .addFields( { name: 'Display Name', value: member.nick || user.username, inline: true }, @@ -63,10 +63,10 @@ module.exports = class Avatar extends Command { { name: 'Joined Discord', value: time(user.createdAt, 'D') + time(user.createdAt, 'R'), inline: true } - ]); + ); if (badges.length > 0) { embed.setDescription(badges.join(' ')); } - return await interaction.reply({embeds: [embed]}); + return interaction.reply({embeds: [embed]}); } }; \ No newline at end of file diff --git a/bot/commands/Utility/weather.js b/bot/commands/Utility/weather.js index 0382f79..14f3334 100644 --- a/bot/commands/Utility/weather.js +++ b/bot/commands/Utility/weather.js @@ -64,7 +64,7 @@ module.exports = class Weather extends Command { .setTitle('Current conditions in ' + city.toProperCase() + ', ' + ISO2.code[json.sys.country]) .setThumbnail(`https://openweathermap.org/img/wn/${json.weather[0].icon}@4x.png`) .setColor(embedColor) - .addFields([ + .addFields( { name: 'Condition:', value: json.weather[0].main, inline: true }, { name: 'Temperature:', value: `${tempCelsius}°C ・ ${Math.round(json.main.temp * 9/5 - 459.67)}°F`, inline: true }, { name: 'Min/Max:', value:` @@ -74,7 +74,7 @@ module.exports = class Weather extends Command { { name: 'Humidity:', value: `${json.main.humidity}%`, inline: true }, { name: 'Wind Speed:', value: `${Math.round(json.wind.speed * 10) / 10}km/h ・ ${Math.round(json.wind.speed * 10 / 1.609344)}mi/h`, inline: true }, { name: 'Wind Direction:', value: windrose.getPoint(json.wind.deg).name, inline: true} - ]) + ) .setFooter({ text: 'Powered by openweathermap.org'}); return interaction.reply({embeds: [embed]}); From 0eb76aac2bac30f982ca0b696696ddde3119e44c Mon Sep 17 00:00:00 2001 From: mudkipscience Date: Mon, 26 Dec 2022 16:31:54 +1100 Subject: [PATCH 3/5] 1/3 WIP splatnet --- bot/commands/Utility/splatnet.js | 182 +++++++++++++++++++++++++++++++ package-lock.json | 169 +++++++++++++++------------- package.json | 5 +- 3 files changed, 278 insertions(+), 78 deletions(-) create mode 100644 bot/commands/Utility/splatnet.js diff --git a/bot/commands/Utility/splatnet.js b/bot/commands/Utility/splatnet.js new file mode 100644 index 0000000..3aef77e --- /dev/null +++ b/bot/commands/Utility/splatnet.js @@ -0,0 +1,182 @@ +const Command = require('../../base/Command.js'); +const fetch = require('node-fetch'); +const { pagination } = require('@devraelfreeze/discordjs-pagination'); +const prettifyMiliseconds = require('pretty-ms'); + +module.exports = class Splatnet extends Command { + constructor (name, category) { + super (name, category); + this.name = name, + this.description = 'View the current map rotation, salmon run gear and SplatNet gear for Splatoon 3', + this.category = category, + this.options = [ + { + type: 1, + name: 'maps', + description: 'Get current and upcoming map rotations for turf war, anarchy and X-rank battles.' + }, + { + type: 1, + name: 'sr', + description: 'Get current and upcoming map rotations for salmon run, as well as the monthly gear reward.' + }, + { + type: 1, + name: 'gear', + description: 'View the gear currently available on the SplatNet mobile app.' + } + ]; + } + + async run (client, interaction, data) { //eslint-disable-line no-unused-vars + const subCmd = interaction.options.getSubcommand(); + const embeds = []; + + await interaction.deferReply(); + + if (subCmd === 'maps') { + if (client.cache.has('SPLATNET_MAPS') && Date.now() > client.cache.get('SPLATNET_MAPS').expiry) { + client.cache.delete('SPLATNET_MAPS'); + } + + if (!client.cache.has('SPLATNET_MAPS')) { + fetch('https://splatoon3.ink/data/schedules.json', { headers: { 'User-Agent': client.config.userAgent }}) + .then(res => res.json()) + .then(async json => { + // cache data so we dont spam API + client.cache.set('SPLATNET_MAPS', {data: json, expiry: new Date(json.data.xSchedules.nodes[0].endTime)}); + + embeds.push(new client.EmbedBuilder() + .setTitle('Current Splatoon 3 Maps') + .setColor(interaction.guild.members.me.displayHexColor) + .addFields( + { + name: '<:turf_war:814651383911153692> Turf War', + value: `${json.data.regularSchedules.nodes[0].regularMatchSetting.vsStages[0].name}\n${json.data.regularSchedules.nodes[0].regularMatchSetting.vsStages[1].name}`, + inline: true + }, + { + name: `<:ranked:814651402479468544> Anarchy Series: ${json.data.bankaraSchedules.nodes[0].bankaraMatchSettings[0].vsRule.name}`, + value: `${json.data.bankaraSchedules.nodes[0].bankaraMatchSettings[0].vsStages[0].name}\n${json.data.bankaraSchedules.nodes[0].bankaraMatchSettings[0].vsStages[1].name}`, + inline: true + }, + { + name: `<:ranked:814651402479468544> Anarchy Open: ${json.data.bankaraSchedules.nodes[0].bankaraMatchSettings[1].vsRule.name}`, + value: `${json.data.bankaraSchedules.nodes[0].bankaraMatchSettings[1].vsStages[0].name}\n${json.data.bankaraSchedules.nodes[0].bankaraMatchSettings[1].vsStages[1].name}`, + inline: true + }, + { + name: `<:xRank:1056806341575970898> X rank: ${json.data.xSchedules.nodes[0].xMatchSetting.vsRule.name}`, + value: `${json.data.xSchedules.nodes[0].xMatchSetting.vsStages[0].name}\n${json.data.xSchedules.nodes[0].xMatchSetting.vsStages[1].name}`, + inline: true + } + ) + .setFooter({ text: `Maps changing in ${prettifyMiliseconds(new Date(json.data.xSchedules.nodes[0].endTime).getTime() - Date.now(), { secondsDecimalDigits: 0 })} - Data provided by splatoon3.ink`}) + ); + for (let i = 1; i < json.data.regularSchedules.nodes.length; i++) { + embeds.push(new client.EmbedBuilder() + .setTitle('Upcoming Splatoon 3 Maps') + .setColor(interaction.guild.members.me.displayColor) + .addFields( + { + name: '<:turf_war:814651383911153692> Turf War', + value: `${json.data.regularSchedules.nodes[i].regularMatchSetting.vsStages[0].name}\n${json.data.regularSchedules.nodes[i].regularMatchSetting.vsStages[1].name}`, + inline: true + }, + { + name: `<:ranked:814651402479468544> Anarchy Series: ${json.data.bankaraSchedules.nodes[i].bankaraMatchSettings[0].vsRule.name}`, + value: `${json.data.bankaraSchedules.nodes[i].bankaraMatchSettings[0].vsStages[0].name}\n${json.data.bankaraSchedules.nodes[i].bankaraMatchSettings[0].vsStages[1].name}`, + inline: true + }, + { + name: `<:ranked:814651402479468544> Anarchy Open: ${json.data.bankaraSchedules.nodes[i].bankaraMatchSettings[1].vsRule.name}`, + value: `${json.data.bankaraSchedules.nodes[i].bankaraMatchSettings[1].vsStages[0].name}\n${json.data.bankaraSchedules.nodes[i].bankaraMatchSettings[1].vsStages[1].name}`, + inline: true + }, + { + name: `X rank: ${json.data.xSchedules.nodes[i].xMatchSetting.vsRule.name}`, + value: `${json.data.xSchedules.nodes[i].xMatchSetting.vsStages[0].name}\n${json.data.xSchedules.nodes[i].xMatchSetting.vsStages[1].name}`, + inline: true + } + ) + .setFooter({ text: `Starting in ${prettifyMiliseconds(new Date(json.data.xSchedules.nodes[i].startTime).getTime() - Date.now(), { secondsDecimalDigits: 0 })} - Data provided by splatoon3.ink`}) + ); + } + await pagination({ + embeds: embeds, + author: interaction.member.user, + interaction: interaction, + time: 60000, + disableButtons: false, + }); + }) + .catch(err => { + client.logger.error('SPLATNET_COMMAND_ERROR', `API err or err replying: ${err.stack}`); + return interaction.editReply(`${client.config.emojis.botError} An error occurred, sorry! I've reported this to my developers.`); + }); + } else { + let json = client.cache.get('SPLATNET_MAPS'); + json = json.data; + embeds.push(new client.EmbedBuilder() + .setTitle('Current Splatoon 3 Maps') + .setColor(interaction.guild.members.me.displayColor) + .addFields( + { + name: '<:turf_war:814651383911153692> Turf War', + value: `${json.data.regularSchedules.nodes[0].regularMatchSetting.vsStages[0].name}\n${json.data.regularSchedules.nodes[0].regularMatchSetting.vsStages[1].name}`, + inline: true + }, + { + name: `<:ranked:814651402479468544> Anarchy Series: ${json.data.bankaraSchedules.nodes[0].bankaraMatchSettings[0].vsRule.name}`, + value: `${json.data.bankaraSchedules.nodes[0].bankaraMatchSettings[0].vsStages[0].name}\n${json.data.bankaraSchedules.nodes[0].bankaraMatchSettings[0].vsStages[1].name}`, + inline: true + }, + { + name: `<:ranked:814651402479468544> Anarchy Open: ${json.data.bankaraSchedules.nodes[0].bankaraMatchSettings[1].vsRule.name}`, + value: `${json.data.bankaraSchedules.nodes[0].bankaraMatchSettings[1].vsStages[0].name}\n${json.data.bankaraSchedules.nodes[0].bankaraMatchSettings[1].vsStages[1].name}`, + inline: true + }, + { + name: `X rank: ${json.data.xSchedules.nodes[0].xMatchSetting.vsRule.name}`, + value: `${json.data.xSchedules.nodes[0].xMatchSetting.vsStages[0].name}\n${json.data.xSchedules.nodes[0].xMatchSetting.vsStages[1].name}`, + inline: true + } + ) + .setFooter({ text: `Maps changing in ${prettifyMiliseconds(new Date(json.data.xSchedules.nodes[0].endTime).getTime() - Date.now(), { secondsDecimalDigits: 0 })} - Data provided by splatoon3.ink`}) + ); + + for (let i = 1; i < json.data.regularSchedules.nodes.length; i++) { + embeds.push(new client.EmbedBuilder() + .setTitle('Upcoming Splatoon 3 Maps') + .setColor(interaction.guild.members.me.displayColor) + .addFields( + { + name: '<:turf_war:814651383911153692> Turf War', + value: `${json.data.regularSchedules.nodes[i].regularMatchSetting.vsStages[0].name}\n${json.data.regularSchedules.nodes[i].regularMatchSetting.vsStages[1].name}`, + inline: true + }, + { + name: `<:ranked:814651402479468544> Anarchy Series: ${json.data.bankaraSchedules.nodes[i].bankaraMatchSettings[0].vsRule.name}`, + value: `${json.data.bankaraSchedules.nodes[i].bankaraMatchSettings[0].vsStages[0].name}\n${json.data.bankaraSchedules.nodes[i].bankaraMatchSettings[0].vsStages[1].name}`, + inline: true + }, + { + name: `<:ranked:814651402479468544> Anarchy Open: ${json.data.bankaraSchedules.nodes[i].bankaraMatchSettings[1].vsRule.name}`, + value: `${json.data.bankaraSchedules.nodes[i].bankaraMatchSettings[1].vsStages[0].name}\n${json.data.bankaraSchedules.nodes[i].bankaraMatchSettings[1].vsStages[1].name}`, + inline: true + }, + { + name: `X rank: ${json.data.xSchedules.nodes[i].xMatchSetting.vsRule.name}`, + value: `${json.data.xSchedules.nodes[i].xMatchSetting.vsStages[0].name}\n${json.data.xSchedules.nodes[i].xMatchSetting.vsStages[1].name}`, + inline: true + } + ) + .setFooter({ text: `Starting in ${prettifyMiliseconds(new Date(json.data.xSchedules.nodes[i].startTime).getTime() - Date.now(), { secondsDecimalDigits: 0 })} - Data provided by splatoon3.ink`}) + ); + } + interaction.editReply({embeds: [embeds[0]]}); + } + + } + } +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 97eff8c..ce94af1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,12 +9,13 @@ "version": "2.0.0", "license": "AGPL-3.0", "dependencies": { - "@sentry/node": "^7.23.0", + "@devraelfreeze/discordjs-pagination": "^2.6.8", + "@sentry/node": "^7.28.1", "bufferutil": "^4.0.3", "chalk": "^4.1.2", "discord.js": "^14.7.1", "erlpack": "^0.1.3", - "eslint": "^8.29.0", + "eslint": "^8.30.0", "fs-readdir-recursive": "^1.1.0", "moment": "^2.29.4", "moment-duration-format": "^2.3.2", @@ -27,6 +28,14 @@ "zlib-sync": "^0.1.7" } }, + "node_modules/@devraelfreeze/discordjs-pagination": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/@devraelfreeze/discordjs-pagination/-/discordjs-pagination-2.6.8.tgz", + "integrity": "sha512-qcVyCZ2svyqbFm4EPVeRk89TDcHHD6hLYbMv0gNob+OcM1Pjcr/GTVd2tyynoU3bZDNnhEfekIHVugORxKqFjg==", + "dependencies": { + "discord.js": "^14.2.0" + } + }, "node_modules/@discordjs/builders": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.4.0.tgz", @@ -88,14 +97,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz", + "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.4.0", - "globals": "^13.15.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -110,9 +119,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", @@ -203,12 +212,12 @@ } }, "node_modules/@sentry/core": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.23.0.tgz", - "integrity": "sha512-oNLGsscSdMs1urCbpwe868NsoJWyeTOQXOm5w2e78yE7G6zm2Ra473NQio3lweaEvjQgSGpFyEfAn/3ubZbtPw==", + "version": "7.28.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.28.1.tgz", + "integrity": "sha512-7wvnuvn/mrAfcugWoCG/3pqDIrUgH5t+HisMJMGw0h9Tc33KqrmqMDCQVvjlrr2pWrw/vuUCFdm8CbUHJ832oQ==", "dependencies": { - "@sentry/types": "7.23.0", - "@sentry/utils": "7.23.0", + "@sentry/types": "7.28.1", + "@sentry/utils": "7.28.1", "tslib": "^1.9.3" }, "engines": { @@ -216,13 +225,13 @@ } }, "node_modules/@sentry/node": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.23.0.tgz", - "integrity": "sha512-w6J+5YRsQEn55508yQYT43ahMP5IHruxq8XnFqYMFZvRohVxrZ1qTz7AMoSgc8fDcHr+LKhs1PxJIqqNwkWrFA==", + "version": "7.28.1", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.28.1.tgz", + "integrity": "sha512-n7AbpJqZJjWPpKNGc55mP7AdQ+XSomS9MZJuZ+Xt2AU52aVwGPI4z9aHUJFSDGaMHHiu/toyPnoUES+XZf6/hw==", "dependencies": { - "@sentry/core": "7.23.0", - "@sentry/types": "7.23.0", - "@sentry/utils": "7.23.0", + "@sentry/core": "7.28.1", + "@sentry/types": "7.28.1", + "@sentry/utils": "7.28.1", "cookie": "^0.4.1", "https-proxy-agent": "^5.0.0", "lru_map": "^0.3.3", @@ -233,19 +242,19 @@ } }, "node_modules/@sentry/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.23.0.tgz", - "integrity": "sha512-fZ5XfVRswVZhKoCutQ27UpIHP16tvyc6ws+xq+njHv8Jg8gFBCoOxlJxuFhegD2xxylAn1aiSHNAErFWdajbpA==", + "version": "7.28.1", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.28.1.tgz", + "integrity": "sha512-DvSplMVrVEmOzR2M161V5+B8Up3vR71xMqJOpWTzE9TqtFJRGPtqT/5OBsNJJw1+/j2ssMcnKwbEo9Q2EGeS6g==", "engines": { "node": ">=8" } }, "node_modules/@sentry/utils": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.23.0.tgz", - "integrity": "sha512-ad/XXH03MfgDH/7N7FjKEOVaKrfQWdMaE0nCxZCr2RrvlitlmGQmPpms95epr1CpzSU3BDRImlILx6+TlrXOgg==", + "version": "7.28.1", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.28.1.tgz", + "integrity": "sha512-75/jzLUO9HH09iC9TslNimGbxOP3jgn89P+q7uR+rp2fJfRExHVeKJZQdK0Ij4/SmE7TJ3Uh2r154N0INZEx1g==", "dependencies": { - "@sentry/types": "7.23.0", + "@sentry/types": "7.28.1", "tslib": "^1.9.3" }, "engines": { @@ -546,12 +555,12 @@ } }, "node_modules/eslint": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", - "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", + "version": "8.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz", + "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==", "dependencies": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", + "@eslint/eslintrc": "^1.4.0", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -570,7 +579,7 @@ "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.15.0", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", @@ -827,9 +836,9 @@ } }, "node_modules/globals": { - "version": "13.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", - "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dependencies": { "type-fest": "^0.20.2" }, @@ -885,9 +894,9 @@ ] }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "engines": { "node": ">= 4" } @@ -1772,6 +1781,14 @@ } }, "dependencies": { + "@devraelfreeze/discordjs-pagination": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/@devraelfreeze/discordjs-pagination/-/discordjs-pagination-2.6.8.tgz", + "integrity": "sha512-qcVyCZ2svyqbFm4EPVeRk89TDcHHD6hLYbMv0gNob+OcM1Pjcr/GTVd2tyynoU3bZDNnhEfekIHVugORxKqFjg==", + "requires": { + "discord.js": "^14.2.0" + } + }, "@discordjs/builders": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.4.0.tgz", @@ -1825,14 +1842,14 @@ "integrity": "sha512-e7d+PaTLVQav6rOc2tojh2y6FE8S7REkqLldq1XF4soCx74XB/DIjbVbVLtBemf0nLW77ntz0v+o5DytKwFNLQ==" }, "@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz", + "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==", "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.4.0", - "globals": "^13.15.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -1841,9 +1858,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.11.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", - "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", @@ -1903,23 +1920,23 @@ "integrity": "sha512-Hec5N6zEkZuZFLybVKyLFLlcSgYmR6C1/+9NkIhxPwOf6tgX52ndJCSz8ADejmbrNE0VuNCNkpzhRZzenEC9vA==" }, "@sentry/core": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.23.0.tgz", - "integrity": "sha512-oNLGsscSdMs1urCbpwe868NsoJWyeTOQXOm5w2e78yE7G6zm2Ra473NQio3lweaEvjQgSGpFyEfAn/3ubZbtPw==", + "version": "7.28.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.28.1.tgz", + "integrity": "sha512-7wvnuvn/mrAfcugWoCG/3pqDIrUgH5t+HisMJMGw0h9Tc33KqrmqMDCQVvjlrr2pWrw/vuUCFdm8CbUHJ832oQ==", "requires": { - "@sentry/types": "7.23.0", - "@sentry/utils": "7.23.0", + "@sentry/types": "7.28.1", + "@sentry/utils": "7.28.1", "tslib": "^1.9.3" } }, "@sentry/node": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.23.0.tgz", - "integrity": "sha512-w6J+5YRsQEn55508yQYT43ahMP5IHruxq8XnFqYMFZvRohVxrZ1qTz7AMoSgc8fDcHr+LKhs1PxJIqqNwkWrFA==", + "version": "7.28.1", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.28.1.tgz", + "integrity": "sha512-n7AbpJqZJjWPpKNGc55mP7AdQ+XSomS9MZJuZ+Xt2AU52aVwGPI4z9aHUJFSDGaMHHiu/toyPnoUES+XZf6/hw==", "requires": { - "@sentry/core": "7.23.0", - "@sentry/types": "7.23.0", - "@sentry/utils": "7.23.0", + "@sentry/core": "7.28.1", + "@sentry/types": "7.28.1", + "@sentry/utils": "7.28.1", "cookie": "^0.4.1", "https-proxy-agent": "^5.0.0", "lru_map": "^0.3.3", @@ -1927,16 +1944,16 @@ } }, "@sentry/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.23.0.tgz", - "integrity": "sha512-fZ5XfVRswVZhKoCutQ27UpIHP16tvyc6ws+xq+njHv8Jg8gFBCoOxlJxuFhegD2xxylAn1aiSHNAErFWdajbpA==" + "version": "7.28.1", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.28.1.tgz", + "integrity": "sha512-DvSplMVrVEmOzR2M161V5+B8Up3vR71xMqJOpWTzE9TqtFJRGPtqT/5OBsNJJw1+/j2ssMcnKwbEo9Q2EGeS6g==" }, "@sentry/utils": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.23.0.tgz", - "integrity": "sha512-ad/XXH03MfgDH/7N7FjKEOVaKrfQWdMaE0nCxZCr2RrvlitlmGQmPpms95epr1CpzSU3BDRImlILx6+TlrXOgg==", + "version": "7.28.1", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.28.1.tgz", + "integrity": "sha512-75/jzLUO9HH09iC9TslNimGbxOP3jgn89P+q7uR+rp2fJfRExHVeKJZQdK0Ij4/SmE7TJ3Uh2r154N0INZEx1g==", "requires": { - "@sentry/types": "7.23.0", + "@sentry/types": "7.28.1", "tslib": "^1.9.3" } }, @@ -2163,12 +2180,12 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "eslint": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", - "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", + "version": "8.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz", + "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==", "requires": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", + "@eslint/eslintrc": "^1.4.0", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -2187,7 +2204,7 @@ "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.15.0", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", @@ -2374,9 +2391,9 @@ } }, "globals": { - "version": "13.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", - "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "requires": { "type-fest": "^0.20.2" } @@ -2406,9 +2423,9 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" }, "import-fresh": { "version": "3.3.0", diff --git a/package.json b/package.json index d31c8da..03766f6 100644 --- a/package.json +++ b/package.json @@ -4,12 +4,13 @@ "description": "Made with <3 by mudkipscience", "main": "index.js", "dependencies": { - "@sentry/node": "^7.23.0", + "@devraelfreeze/discordjs-pagination": "^2.6.8", + "@sentry/node": "^7.28.1", "bufferutil": "^4.0.3", "chalk": "^4.1.2", "discord.js": "^14.7.1", "erlpack": "^0.1.3", - "eslint": "^8.29.0", + "eslint": "^8.30.0", "fs-readdir-recursive": "^1.1.0", "moment": "^2.29.4", "moment-duration-format": "^2.3.2", From 3ca0b4cb5c378d3b651954dde5b0504b81b1bf62 Mon Sep 17 00:00:00 2001 From: mudkipscience Date: Mon, 26 Dec 2022 18:00:16 +1100 Subject: [PATCH 4/5] WIP splatnet --- bot/commands/Utility/splatnet.js | 81 ++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 3 deletions(-) diff --git a/bot/commands/Utility/splatnet.js b/bot/commands/Utility/splatnet.js index 3aef77e..233d9e4 100644 --- a/bot/commands/Utility/splatnet.js +++ b/bot/commands/Utility/splatnet.js @@ -2,6 +2,7 @@ const Command = require('../../base/Command.js'); const fetch = require('node-fetch'); const { pagination } = require('@devraelfreeze/discordjs-pagination'); const prettifyMiliseconds = require('pretty-ms'); +const brandAbilities = require('../../assets/s3BrandAbilities.json'); module.exports = class Splatnet extends Command { constructor (name, category) { @@ -17,7 +18,7 @@ module.exports = class Splatnet extends Command { }, { type: 1, - name: 'sr', + name: 'salmonrun', description: 'Get current and upcoming map rotations for salmon run, as well as the monthly gear reward.' }, { @@ -174,9 +175,83 @@ module.exports = class Splatnet extends Command { .setFooter({ text: `Starting in ${prettifyMiliseconds(new Date(json.data.xSchedules.nodes[i].startTime).getTime() - Date.now(), { secondsDecimalDigits: 0 })} - Data provided by splatoon3.ink`}) ); } - interaction.editReply({embeds: [embeds[0]]}); + await pagination({ + embeds: embeds, + author: interaction.member.user, + interaction: interaction, + time: 60000, + disableButtons: false, + }); + } + } + + if (subCmd === 'gear') { + if (client.cache.has('SPLATNET_GEAR') && Date.now() > client.cache.get('SPLATNET_GEAR').expiry) { + client.cache.delete('SPLATNET_GEAR'); + } + + if (!client.cache.has('SPLATNET_GEAR')) { + fetch('https://splatoon3.ink/data/gear.json', { headers: { 'User-Agent': client.config.userAgent }}) + .then(res => res.json()) + .then(async json => { + client.cache.set('SPLATNET_GEAR', {data: json, expiry: new Date(json.data.gesotown.pickupBrand.brandGears[0].saleEndTime)}); + + for (let i = 0; i < json.data.gesotown.pickupBrand.brandGears.length; i++) { + embeds.push(new client.EmbedBuilder() + .setTitle(`${json.data.gesotown.pickupBrand.brandGears[i].gear.name} (${this.starPower(json.data.gesotown.pickupBrand.brandGears[i].gear.additionalGearPowers.length)})`) + .setDescription(`This piece of gear is apart of the ${json.data.gesotown.pickupBrand.brand.name} daily drop. The next drop will be for ${json.data.gesotown.pickupBrand.nextBrand.name}.`) + .setThumbnail(json.data.gesotown.pickupBrand.brandGears[i].gear.image.url) + .setColor(interaction.guild.members.me.displayColor) + .addFields( + { + name: 'Brand', + value: json.data.gesotown.pickupBrand.brandGears[i].gear.brand.name, + inline: true + }, + { + name: 'Price', + value: `${json.data.gesotown.pickupBrand.brandGears[i].price}`, + inline: true, + }, + { + name: 'Main Ability', + value: json.data.gesotown.pickupBrand.brandGears[i].gear.primaryGearPower.name, + inline: true + }, + { + name: 'Common Ability', + value: brandAbilities[json.data.gesotown.pickupBrand.brandGears[i].gear.brand.name.trim()].common, + inline: true + }, + { + name: 'Uncommon Ability', + value: brandAbilities[json.data.gesotown.pickupBrand.brandGears[i].gear.brand.name.trim()].uncommon, + inline: true + } + ) + .setFooter({ text: `Off sale in ${prettifyMiliseconds(new Date(json.data.gesotown.pickupBrand.brandGears[i].saleEndTime).getTime() - Date.now(), { secondsDecimalDigits: 0 })} - Data provided by splatoon3.ink`}) + ); + } + await pagination({ + embeds: embeds, + author: interaction.member.user, + interaction: interaction, + time: 60000, + disableButtons: false, + }); + }) + .catch(err => { + client.logger.error('SPLATNET_COMMAND_ERROR', `API err or err replying: ${err.stack}`); + return interaction.editReply(`${client.config.emojis.botError} An error occurred, sorry! I've reported this to my developers.`); + }); } - } } + + starPower (slots) { + if (slots === 1) return '0*'; + if (slots === 2) return '1*'; + if (slots === 3) return '2*'; + return 'err'; + } }; \ No newline at end of file From d97c5fa569c0dc8125077f6ce06072a3c8b5f601 Mon Sep 17 00:00:00 2001 From: mudkipscience Date: Mon, 26 Dec 2022 18:00:25 +1100 Subject: [PATCH 5/5] added new brands --- ...atoon2brands.json => s3BrandAbilities.json} | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) rename bot/assets/{splatoon2brands.json => s3BrandAbilities.json} (82%) diff --git a/bot/assets/splatoon2brands.json b/bot/assets/s3BrandAbilities.json similarity index 82% rename from bot/assets/splatoon2brands.json rename to bot/assets/s3BrandAbilities.json index 7e958e9..0b9d2a7 100644 --- a/bot/assets/splatoon2brands.json +++ b/bot/assets/s3BrandAbilities.json @@ -5,15 +5,25 @@ }, "Annaki": { - "common": "Main Power Up", + "common": "Ink Saver (Sub)", "uncommon": "Special Saver" }, + "Barazushi": { + "common": "Intensify Action", + "uncommon": "Sub Power Up" + }, + "Cuttlegear": { "common": "N/A", "uncommon": "N/A" }, + "Emberz": { + "common": "Intensify Action", + "uncommon": "Special Charge Up" + }, + "Enperry": { "common": "Sub Power Up", "uncommon": "Ink Resistance Up" @@ -36,7 +46,7 @@ "Inkline": { "common": "Bomb Defence Up DX", - "uncommon": "Main Power Up" + "uncommon": "Intensify Action" }, "Krak-On": { @@ -54,7 +64,7 @@ "uncommon": "Special Saver" }, - "Splash Mob": { + "SplashMob": { "common": "Ink Saver (Main)", "uncommon": "Run Speed Up" }, @@ -75,7 +85,7 @@ }, "ToniKensa": { - "common": "Main Power Up", + "common": "Ink Saver (Main)", "uncommon": "Sub Power Up" },