From 34bbd823ab006827da2da9b6896934b498d3951b Mon Sep 17 00:00:00 2001 From: ION606 Date: Sat, 16 Jul 2022 19:26:06 +0300 Subject: [PATCH] Mostly cleaning and added the JSON to Map to Print function --- .gitignore | 1 + commands/admin/welcome.js | 1 + commands/anime/asearch.js | 68 +-- commands/interactionhandler.js | 9 +- commands/misc/playAudio.js | 3 +- commands/misc/scraper.js | 5 +- commands/utils/jsonFormatters.js | 74 +++ main.js | 16 +- package-lock.json | 599 +++++++++--------------- package.json | 5 +- side projects/RSSHandlers/simplecast.js | 23 + side projects/feeds.json | 24 + side projects/rssFeed.js | 319 +++++++++++++ 13 files changed, 737 insertions(+), 410 deletions(-) create mode 100644 commands/utils/jsonFormatters.js create mode 100644 side projects/RSSHandlers/simplecast.js create mode 100644 side projects/feeds.json create mode 100644 side projects/rssFeed.js diff --git a/.gitignore b/.gitignore index 2654024..8a01abc 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ config.json !spec/LevelsXP.txt *.sqlite temp.js +trivia.js \ No newline at end of file diff --git a/commands/admin/welcome.js b/commands/admin/welcome.js index f7a931f..a3a9e3f 100644 --- a/commands/admin/welcome.js +++ b/commands/admin/welcome.js @@ -22,6 +22,7 @@ async function welcome(member, welcomechannel, welcomemessage = null, welcomeban // const background = new CanvasImport.Image(); // background.src = arrayBufferToBuffer(data); + // This uses the canvas dimensions to stretch the image onto the entire canvas // context.drawImage(background, 0, 0, canvas.width, canvas.height); diff --git a/commands/anime/asearch.js b/commands/anime/asearch.js index 464d708..0ba8294 100644 --- a/commands/anime/asearch.js +++ b/commands/anime/asearch.js @@ -11,39 +11,47 @@ module.exports = { name += args[i] + " "; i++; } - } + } else { name = args[0]; } + + if (args[args.length - 1] != args[args.length - 1] != '~fancy' && args[args.length - 1] != '~summary' && args[args.length - 1] != '~stats') { args.push('~stats'); } scraper.getInfoFromName(name).then((data) => { - if (args[args.length - 1] == '~stats') { - const newEmbed = new Discord.MessageEmbed() - .setColor('#002eff') - .setTitle(data.title) - //.setURL('https://discordjs.guide/popular-topics/embeds.html#embed-preview') - //.setDescription('My professional resume') - .setImage(data.picture) - .addFields( - {name: 'Genres:', value: data.genres.join(", ")}, - {name: 'Score:', value: data.score}, - {name: 'Episode:', value: data.episodes} - ).setURL(data.trailer); - - message.channel.send({ embeds: [newEmbed] }); - } else if (args[args.length - 1] == '~fancy') { - let temp = `The ${data.genres.join(", ")} anime _${data.title}_ first aired on ${data.premiered}`; - if (data.aired) { temp += `. This anime ran for ${data.aired} for a total of ${data.episodes} episodes.`} - else { temp += ` and is still airing with ${data.episodes} so far!`} + try { + if (args[args.length - 1] == '~stats') { + const newEmbed = new Discord.MessageEmbed() + .setColor('#002eff') + .setTitle(data.title) + //.setURL('https://discordjs.guide/popular-topics/embeds.html#embed-preview') + //.setDescription('My professional resume') + .setImage(data.picture) + .addFields( + {name: 'Genres:', value: data.genres.join(", ")}, + {name: 'Score:', value: data.score}, + {name: 'Episode:', value: data.episodes} + ).setURL(data.trailer); + + message.channel.send({ embeds: [newEmbed] }); + } else if (args[args.length - 1] == '~fancy') { + let temp = `The ${data.genres.join(", ")} anime _${data.title}_ first aired on ${data.premiered}`; + if (data.aired) { temp += `. This anime ran for ${data.aired} for a total of ${data.episodes} episodes.`} + else { temp += ` and is still airing with ${data.episodes} so far!`} - temp += ` This anime has a score of ${data.score} and is ${data.popularity} on MyAnimeList!\n`; - temp += `You can see a trailer for ${data.title} here: ${data.trailer}`; - temp += `\n\n(to see a summary of the anime, use '${bot.prefix}asearch ~summary')`; - - message.channel.send({ embeds: [new Discord.MessageEmbed().setImage(data.picture)]}); - message.channel.send(temp); - } else if (args[args.length - 1] == '~summary') { - let temp = data.synopsis; - message.channel.send(temp); - } else { - message.reply(`Unknown command, try using the format '${bot.prefix}asearch [~stats or ~fancy or ~summary]`); + temp += ` This anime has a score of ${data.score} and is ${data.popularity} on MyAnimeList!\n`; + temp += `You can see a trailer for ${data.title} here: ${data.trailer}`; + temp += `\n\n(to see a summary of the anime, use '${bot.prefix}asearch ~summary')`; + + message.channel.send({ embeds: [new Discord.MessageEmbed().setImage(data.picture)]}); + message.channel.send(temp); + } else if (args[args.length - 1] == '~summary') { + let temp = data.synopsis; + message.channel.send(temp); + } else { + message.reply(`Unknown command, try using the format '${bot.prefix}asearch [~stats or ~fancy or ~summary]`); + } + } catch (err) { + if (err.message.indexOf('MessageEmbed field values must be non-empty strings') != -1) { + message.reply(`Insufficient information on website!\nThe page can be found here: ${data.url}`); + } } }); diff --git a/commands/interactionhandler.js b/commands/interactionhandler.js index ede9ebe..bee3df7 100644 --- a/commands/interactionhandler.js +++ b/commands/interactionhandler.js @@ -1,6 +1,7 @@ const { MongoClient, ServerApiVersion } = require('mongodb'); const { createSubscriptionManual } = require('./premium/stripe.js'); const { pause_start_stop, playNext, showQueue } = require('./misc/playAudio.js'); +// const { RSSInteractionHandler } = require('./premium/rssFeed.js'); async function handle_interaction(interaction, mongouri, turnManager, bot, STATE, items, xp_collection) { @@ -69,7 +70,7 @@ async function handle_interaction(interaction, mongouri, turnManager, bot, STATE pause_start_stop(interaction, bot); } - } //else ifs here + } //Button else ifs here }); client.close(); @@ -129,9 +130,9 @@ async function handle_interaction(interaction, mongouri, turnManager, bot, STATE //Handle the interaction here } - } - - //menu else ifs here + } /*else if (interaction.customId.indexOf('RSS') != -1) { + RSSInteractionHandler(bot, interaction); + }*/ //menu else ifs here } //other selection types here } diff --git a/commands/misc/playAudio.js b/commands/misc/playAudio.js index bd69b19..508a7d3 100644 --- a/commands/misc/playAudio.js +++ b/commands/misc/playAudio.js @@ -211,7 +211,8 @@ function fromMessage(bot, command, msg) { const message = msg.channel.messages.cache.get(data[2]); // console.log(message); - var em = message.embeds[0]; + var em; + if (message.embeds) { em = message.embeds[0]; } var rows; if (command == 'stop') { diff --git a/commands/misc/scraper.js b/commands/misc/scraper.js index 9fb1cea..290e71e 100644 --- a/commands/misc/scraper.js +++ b/commands/misc/scraper.js @@ -12,13 +12,16 @@ module.exports ={ const html = response.data; const $ = cheerio.load(html); //lyrics = $('.para_row').text(); + const haste = await hastebin(html, { extension: "txt" }); - message.channel.send(haste); + message.channel.send(haste); // console.log(lyrics); }) .catch(function(err) { if (err.message.indexOf('The "url" argument must be of type string') != -1) { message.reply("The URL should be a string!"); + } else if (err.code == 'ERR_BAD_REQUEST') { + message.reply("404 link not valid!") } else { message.reply("Oops! There's been an error"); } diff --git a/commands/utils/jsonFormatters.js b/commands/utils/jsonFormatters.js new file mode 100644 index 0000000..0e19554 --- /dev/null +++ b/commands/utils/jsonFormatters.js @@ -0,0 +1,74 @@ +/** + * @param {JSON} inp + * @returns {Map} + */ +function jsonToMapRecursive(inp) { + if (typeof(inp) != 'object') { + return inp; + } + + let m2 = new Map(); + Object.entries(inp).forEach((key) => { m2.set(key[0], jsonToMapRecursive(inp[key[0]])); }); + return m2; +} + + +/** + * + * @param {Map} inp + * @param {int} layer + * @returns The map in string format + * + * @example + * {"key1": "val1", "key2": "key3": {"key4": "Val4"}} ==>> + * ` + * |-- key1 + * | |-- val1 + * | + * |-- key2 + * | |-- val3 + * | | |-- key4 + * | | | |--val4 + * ` + */ +function mapToTableRecursive(inp, layer = 1) { + var temp = ''; + + if (typeof(inp) != 'object') { + // return `?[${inp}]`; + return ''; + } + + Array.from(inp.keys()).forEach((key) => { + var keyTemp = ('| ').repeat(layer); + temp += `${keyTemp}- - ${key}\n`.replaceAll(' - -', '- -'); + temp += mapToTable(inp.get(key), layer + 1); + }); + + temp += ('| ').repeat(layer - 1) + '\n'; + + if (layer == 1) { + var links = new Array(); + + //Post-processing + var l = temp.split('\n') + + l = l.filter((entry, ind) => { + return entry.trim() == '|' || !((/[^A-Za-z0-9 ]+$/).test(entry.trim()) && (/[^A-Za-z0-9 ]+$/).test(l[ind + 1].trim())); + }); + + temp = l.join('\n') + + //Get the links + Array.from(inp.keys()).forEach((key) => { + links.push(key); + }); + + return [temp, links]; + } + + return temp; +} + + + diff --git a/main.js b/main.js index 745cfdb..2794bc9 100644 --- a/main.js +++ b/main.js @@ -84,7 +84,7 @@ let mongouritemp; if (process.env.MONGODB_URI) { mongouritemp = process.env.MONGODB_URI; } else { - mongouritemp = require('./config.json'); + mongouritemp = require('./config.json').mongooseURI; } const mongouri = mongouritemp; bot.mongouri = mongouri; @@ -98,7 +98,7 @@ const { connect } = require('mongoose'); // const commandFiles = fs.readdirSync('./commands/').filter(file => file.endsWith('.js')); // Obsolete? bot.commands = new Discord.Collection(); -const forbiddenFolders = ['db', 'premium', 'dev only']; +const forbiddenFolders = ['db', 'dev only']; //premium, fs.readdirSync('./commands') .forEach(dir => { @@ -108,7 +108,7 @@ fs.readdirSync('./commands') .forEach(file => { const command = require(`./commands/${dir}/${file}`); if (command.name && command.description) { - bot.commands.set(command.name, command); + bot.commands.set(command.name.toLowerCase(), command); } }); } @@ -123,10 +123,12 @@ temp_command = require('./commands/games/game.js'); bot.commands.set('game', temp_command); //Everything in the API should be handled by specific handler functions -const chat = require('./commands/premium/chat.js'); -bot.commands.set('chat', chat); -const stripeCommands = require('./commands/premium/stripe.js'); -bot.commands.set('premium', stripeCommands); +// const chat = require('./commands/premium/chat.js'); +// bot.commands.set('chat', chat); +// const stripeCommands = require('./commands/premium/stripe.js'); +// bot.commands.set('premium', stripeCommands); +// const +// bot.commands.set('RSS', ) //#endregion diff --git a/package-lock.json b/package-lock.json index 099f093..a5c0de7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,10 +15,11 @@ "apt": "^0.0.2", "arraybuffer-to-buffer": "^0.0.7", "axios": "^0.27.2", - "canvas": "^2.9.1", + "canvas": "^2.9.3", "cheerio": "^1.0.0-rc.10", "discord-reply": "^0.1.2", "discord.js": "^13.6.0", + "feedparser": "^2.2.10", "ffmpeg": "^0.0.4", "ffmpeg-static": "^5.0.0", "hastebin-gen": "^2.0.5", @@ -31,6 +32,8 @@ "openai": "^3.0.0", "play-dl": "^1.9.4", "random-memes": "^3.1.0", + "request": "^2.88.2", + "rss-parser": "^3.12.0", "sequelize": "^6.19.0", "sqlite3": "^5.0.3", "stripe": "^9.11.0", @@ -109,14 +112,14 @@ } }, "node_modules/@discordjs/node-pre-gyp": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.2.tgz", - "integrity": "sha512-V239Czn+DXFGLhhuccwEDBoTdgMGrRu30dOlzm1GzrSIjwFj01ZJerNX7x+CEX1NG1Q/1gGfOOkeZFNHjycrRA==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.4.tgz", + "integrity": "sha512-x569MMtdk6jdGo2S58iiZoyv4p/N2Ju8Nh6vvzZb1wyouV7IE3VuU0hg2kqUmTfD0z6r4uD6acvMTuc+iA3f8g==", "dependencies": { - "detect-libc": "^1.0.3", + "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", "make-dir": "^3.1.0", - "node-fetch": "^2.6.5", + "node-fetch": "^2.6.7", "nopt": "^5.0.0", "npmlog": "^5.0.1", "rimraf": "^3.0.2", @@ -128,18 +131,23 @@ } }, "node_modules/@discordjs/opus": { - "version": "0.7.0", - "resolved": "git+ssh://git@github.com/discordjs/opus.git#fbd68eeca7637559bf3141b0ae76d48873b8d18a", + "version": "0.8.0", + "resolved": "git+ssh://git@github.com/discordjs/opus.git#478484d2482c38e3a5f5c7cb8fb2cf9cf3f2c9bc", "hasInstallScript": true, "license": "MIT", "dependencies": { - "@discordjs/node-pre-gyp": "^0.4.2", - "node-addon-api": "^4.2.0" + "@discordjs/node-pre-gyp": "^0.4.4", + "node-addon-api": "^5.0.0" }, "engines": { "node": ">=12.0.0" } }, + "node_modules/@discordjs/opus/node_modules/node-addon-api": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" + }, "node_modules/@discordjs/voice": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.8.0.tgz", @@ -156,70 +164,6 @@ "node": ">=16.9.0" } }, - "node_modules/@discordjs/voice/node_modules/@discordjs/opus": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.5.3.tgz", - "integrity": "sha512-IQhCwCy2WKXLe+qkOkwO1Wjgk20uqeAbqM62tCbzIqbTsXX4YAge8Me9RFnI77Lx+UTkgm4rSVM3VPVdS/GsUw==", - "hasInstallScript": true, - "optional": true, - "peer": true, - "dependencies": { - "@discordjs/node-pre-gyp": "^0.4.0", - "node-addon-api": "^3.2.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@discordjs/voice/node_modules/ffmpeg-static": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-4.4.1.tgz", - "integrity": "sha512-gyGTIf5kgmLDmH7Rwj8vMmNK46bjXKKofHS2gY+LUqoTe/iybVuTuvnhJQR2tZHlKlDG7A/BIH7cRa2jWDKgWw==", - "hasInstallScript": true, - "optional": true, - "peer": true, - "dependencies": { - "@derhuerst/http-basic": "^8.2.0", - "env-paths": "^2.2.0", - "https-proxy-agent": "^5.0.0", - "progress": "^2.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@discordjs/voice/node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "optional": true, - "peer": true - }, - "node_modules/@discordjs/voice/node_modules/prism-media": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.2.tgz", - "integrity": "sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g==", - "peerDependencies": { - "@discordjs/opus": "^0.5.0", - "ffmpeg-static": "^4.2.7 || ^3.0.0 || ^2.4.0", - "node-opus": "^0.3.3", - "opusscript": "^0.0.8" - }, - "peerDependenciesMeta": { - "@discordjs/opus": { - "optional": true - }, - "ffmpeg-static": { - "optional": true - }, - "node-opus": { - "optional": true - }, - "opusscript": { - "optional": true - } - } - }, "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", @@ -245,14 +189,6 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "engines": { - "node": ">=8" - } - }, "node_modules/@napi-rs/canvas": { "version": "0.1.22", "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.22.tgz", @@ -555,6 +491,11 @@ "node": ">=6.5" } }, + "node_modules/addressparser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", + "integrity": "sha512-aQX7AISOMM7HFE0iZ3+YnD07oIeJqWGVnJ+ZIKaBZAk03ftmVYVqsGas/rbXKR21n4D/hKCSHypvcyOkds/xzg==" + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -657,6 +598,11 @@ "node": ">= 6" } }, + "node_modules/array-indexofobject": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-indexofobject/-/array-indexofobject-0.0.1.tgz", + "integrity": "sha512-tpdPBIBm4TMNxSp8O3pZgC7mF4+wn9SmJlhE+7bi5so6x39PvzUqChQMbv93R5ilYGZ1HV+Neki4IH/i+87AoQ==" + }, "node_modules/arraybuffer-to-buffer": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/arraybuffer-to-buffer/-/arraybuffer-to-buffer-0.0.7.tgz", @@ -845,9 +791,9 @@ } }, "node_modules/canvas": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.9.1.tgz", - "integrity": "sha512-vSQti1uG/2gjv3x6QLOZw7TctfufaerTWbVe+NSduHxxLGB+qf3kFgQ6n66DSnuoINtVUjrLLIK2R+lxrBG07A==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.9.3.tgz", + "integrity": "sha512-WOUM7ghii5TV2rbhaZkh1youv/vW1/Canev6Yx6BG2W+1S07w8jKZqKkPnbiPpQEDsnJdN8ouDd7OvQEGXDcUw==", "hasInstallScript": true, "dependencies": { "@mapbox/node-pre-gyp": "^1.0.0", @@ -1060,14 +1006,11 @@ } }, "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", "engines": { - "node": ">=0.10" + "node": ">=8" } }, "node_modules/discord-api-types": { @@ -1091,21 +1034,6 @@ "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" }, - "node_modules/discord-reply/node_modules/@discordjs/opus": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.5.3.tgz", - "integrity": "sha512-IQhCwCy2WKXLe+qkOkwO1Wjgk20uqeAbqM62tCbzIqbTsXX4YAge8Me9RFnI77Lx+UTkgm4rSVM3VPVdS/GsUw==", - "hasInstallScript": true, - "optional": true, - "peer": true, - "dependencies": { - "@discordjs/node-pre-gyp": "^0.4.0", - "node-addon-api": "^3.2.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/discord-reply/node_modules/discord.js": { "version": "12.5.3", "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.3.tgz", @@ -1125,55 +1053,6 @@ "node": ">=12.0.0" } }, - "node_modules/discord-reply/node_modules/ffmpeg-static": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-4.4.1.tgz", - "integrity": "sha512-gyGTIf5kgmLDmH7Rwj8vMmNK46bjXKKofHS2gY+LUqoTe/iybVuTuvnhJQR2tZHlKlDG7A/BIH7cRa2jWDKgWw==", - "hasInstallScript": true, - "optional": true, - "peer": true, - "dependencies": { - "@derhuerst/http-basic": "^8.2.0", - "env-paths": "^2.2.0", - "https-proxy-agent": "^5.0.0", - "progress": "^2.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/discord-reply/node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "optional": true, - "peer": true - }, - "node_modules/discord-reply/node_modules/prism-media": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.2.tgz", - "integrity": "sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g==", - "peerDependencies": { - "@discordjs/opus": "^0.5.0", - "ffmpeg-static": "^4.2.7 || ^3.0.0 || ^2.4.0", - "node-opus": "^0.3.3", - "opusscript": "^0.0.8" - }, - "peerDependenciesMeta": { - "@discordjs/opus": { - "optional": true - }, - "ffmpeg-static": { - "optional": true - }, - "node-opus": { - "optional": true - }, - "opusscript": { - "optional": true - } - } - }, "node_modules/discord-reply/node_modules/tweetnacl": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", @@ -1359,6 +1238,28 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "node_modules/feedparser": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/feedparser/-/feedparser-2.2.10.tgz", + "integrity": "sha512-WoAOooa61V8/xuKMi2pEtK86qQ3ZH/M72EEGdqlOTxxb3m6ve1NPvZcmPFs3wEDfcBbFLId2GqZ4YjsYi+h1xA==", + "dependencies": { + "addressparser": "^1.0.1", + "array-indexofobject": "~0.0.1", + "lodash.assign": "^4.2.0", + "lodash.get": "^4.4.2", + "lodash.has": "^4.5.2", + "lodash.uniq": "^4.5.0", + "mri": "^1.1.5", + "readable-stream": "^2.3.7", + "sax": "^1.2.4" + }, + "bin": { + "feedparser": "bin/feedparser.js" + }, + "engines": { + "node": ">= 10.18.1" + } + }, "node_modules/ffmpeg": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/ffmpeg/-/ffmpeg-0.0.4.tgz", @@ -1368,9 +1269,9 @@ } }, "node_modules/ffmpeg-static": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-5.0.0.tgz", - "integrity": "sha512-z96jGVa8uCVMnyrTvbDZe0d5zbvIVQnfBN+vKDZoVK+ssYpfUJGEmo2DkuY43CA9Ytlsk+5ZVTFTqzvKw1gSaA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-5.0.2.tgz", + "integrity": "sha512-rYeA04AGbvxbUxov6Cn/KDKIzw2rmzwPlgHoqn837NZt0xPdOVA9mJMILz9IX27R45hhSlXS6nThk85XxDivLg==", "hasInstallScript": true, "dependencies": { "@derhuerst/http-basic": "^8.2.0", @@ -1862,6 +1763,26 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "node_modules/lodash.has": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", + "integrity": "sha512-rnYUdIo6xRCJnQmbVFEwcxF144erlD+M3YcJUVesflU9paQaE8p+fJDcIQrlMYbxoANFL+AB9hZrzSBBk5PL+g==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -2122,9 +2043,9 @@ } }, "node_modules/moment": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", - "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==", + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", "engines": { "node": "*" } @@ -2211,6 +2132,14 @@ "node": ">=12.0.0" } }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "engines": { + "node": ">=4" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4788,6 +4717,31 @@ "node": ">=16.0.0" } }, + "node_modules/prism-media": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.4.tgz", + "integrity": "sha512-eW7LXORkTCQznZs+eqe9VjGOrLBxcBPXgNyHXMTSRVhphvd/RrxgIR7WaWt4fkLuhshcdT5KHL88LAfcvS3f5g==", + "peerDependencies": { + "@discordjs/opus": "^0.8.0", + "ffmpeg-static": "^5.0.2 || ^4.2.7 || ^3.0.0 || ^2.4.0", + "node-opus": "^0.3.3", + "opusscript": "^0.0.8" + }, + "peerDependenciesMeta": { + "@discordjs/opus": { + "optional": true + }, + "ffmpeg-static": { + "optional": true + }, + "node-opus": { + "optional": true + }, + "opusscript": { + "optional": true + } + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -4970,6 +4924,23 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rss-parser": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.12.0.tgz", + "integrity": "sha512-aqD3E8iavcCdkhVxNDIdg1nkBI17jgqF+9OqPS1orwNaOgySdpvq6B+DoONLhzjzwV8mWg37sb60e4bmLK117A==", + "dependencies": { + "entities": "^2.0.3", + "xml2js": "^0.4.19" + } + }, + "node_modules/rss-parser/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -5685,74 +5656,10 @@ "ytdl-core": "^4.8.2" } }, - "node_modules/ytdl-core-discord/node_modules/@discordjs/opus": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.5.3.tgz", - "integrity": "sha512-IQhCwCy2WKXLe+qkOkwO1Wjgk20uqeAbqM62tCbzIqbTsXX4YAge8Me9RFnI77Lx+UTkgm4rSVM3VPVdS/GsUw==", - "hasInstallScript": true, - "optional": true, - "peer": true, - "dependencies": { - "@discordjs/node-pre-gyp": "^0.4.0", - "node-addon-api": "^3.2.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/ytdl-core-discord/node_modules/@types/node": { "version": "15.14.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-15.14.9.tgz", "integrity": "sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==" - }, - "node_modules/ytdl-core-discord/node_modules/ffmpeg-static": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-4.4.1.tgz", - "integrity": "sha512-gyGTIf5kgmLDmH7Rwj8vMmNK46bjXKKofHS2gY+LUqoTe/iybVuTuvnhJQR2tZHlKlDG7A/BIH7cRa2jWDKgWw==", - "hasInstallScript": true, - "optional": true, - "peer": true, - "dependencies": { - "@derhuerst/http-basic": "^8.2.0", - "env-paths": "^2.2.0", - "https-proxy-agent": "^5.0.0", - "progress": "^2.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ytdl-core-discord/node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "optional": true, - "peer": true - }, - "node_modules/ytdl-core-discord/node_modules/prism-media": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.2.tgz", - "integrity": "sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g==", - "peerDependencies": { - "@discordjs/opus": "^0.5.0", - "ffmpeg-static": "^4.2.7 || ^3.0.0 || ^2.4.0", - "node-opus": "^0.3.3", - "opusscript": "^0.0.8" - }, - "peerDependenciesMeta": { - "@discordjs/opus": { - "optional": true - }, - "ffmpeg-static": { - "optional": true - }, - "node-opus": { - "optional": true - }, - "opusscript": { - "optional": true - } - } } }, "dependencies": { @@ -5811,14 +5718,14 @@ } }, "@discordjs/node-pre-gyp": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.2.tgz", - "integrity": "sha512-V239Czn+DXFGLhhuccwEDBoTdgMGrRu30dOlzm1GzrSIjwFj01ZJerNX7x+CEX1NG1Q/1gGfOOkeZFNHjycrRA==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.4.tgz", + "integrity": "sha512-x569MMtdk6jdGo2S58iiZoyv4p/N2Ju8Nh6vvzZb1wyouV7IE3VuU0hg2kqUmTfD0z6r4uD6acvMTuc+iA3f8g==", "requires": { - "detect-libc": "^1.0.3", + "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", "make-dir": "^3.1.0", - "node-fetch": "^2.6.5", + "node-fetch": "^2.6.7", "nopt": "^5.0.0", "npmlog": "^5.0.1", "rimraf": "^3.0.2", @@ -5827,11 +5734,18 @@ } }, "@discordjs/opus": { - "version": "git+ssh://git@github.com/discordjs/opus.git#fbd68eeca7637559bf3141b0ae76d48873b8d18a", + "version": "git+ssh://git@github.com/discordjs/opus.git#478484d2482c38e3a5f5c7cb8fb2cf9cf3f2c9bc", "from": "@discordjs/opus@github:discordjs/opus", "requires": { - "@discordjs/node-pre-gyp": "^0.4.2", - "node-addon-api": "^4.2.0" + "@discordjs/node-pre-gyp": "^0.4.4", + "node-addon-api": "^5.0.0" + }, + "dependencies": { + "node-addon-api": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" + } } }, "@discordjs/voice": { @@ -5845,45 +5759,6 @@ "tiny-typed-emitter": "^2.1.0", "tslib": "^2.3.1", "ws": "^8.4.2" - }, - "dependencies": { - "@discordjs/opus": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.5.3.tgz", - "integrity": "sha512-IQhCwCy2WKXLe+qkOkwO1Wjgk20uqeAbqM62tCbzIqbTsXX4YAge8Me9RFnI77Lx+UTkgm4rSVM3VPVdS/GsUw==", - "optional": true, - "peer": true, - "requires": { - "@discordjs/node-pre-gyp": "^0.4.0", - "node-addon-api": "^3.2.1" - } - }, - "ffmpeg-static": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-4.4.1.tgz", - "integrity": "sha512-gyGTIf5kgmLDmH7Rwj8vMmNK46bjXKKofHS2gY+LUqoTe/iybVuTuvnhJQR2tZHlKlDG7A/BIH7cRa2jWDKgWw==", - "optional": true, - "peer": true, - "requires": { - "@derhuerst/http-basic": "^8.2.0", - "env-paths": "^2.2.0", - "https-proxy-agent": "^5.0.0", - "progress": "^2.0.3" - } - }, - "node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "optional": true, - "peer": true - }, - "prism-media": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.2.tgz", - "integrity": "sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g==", - "requires": {} - } } }, "@gar/promisify": { @@ -5906,13 +5781,6 @@ "rimraf": "^3.0.2", "semver": "^7.3.5", "tar": "^6.1.11" - }, - "dependencies": { - "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" - } } }, "@napi-rs/canvas": { @@ -6105,6 +5973,11 @@ "event-target-shim": "^5.0.0" } }, + "addressparser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", + "integrity": "sha512-aQX7AISOMM7HFE0iZ3+YnD07oIeJqWGVnJ+ZIKaBZAk03ftmVYVqsGas/rbXKR21n4D/hKCSHypvcyOkds/xzg==" + }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -6184,6 +6057,11 @@ } } }, + "array-indexofobject": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-indexofobject/-/array-indexofobject-0.0.1.tgz", + "integrity": "sha512-tpdPBIBm4TMNxSp8O3pZgC7mF4+wn9SmJlhE+7bi5so6x39PvzUqChQMbv93R5ilYGZ1HV+Neki4IH/i+87AoQ==" + }, "arraybuffer-to-buffer": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/arraybuffer-to-buffer/-/arraybuffer-to-buffer-0.0.7.tgz", @@ -6326,9 +6204,9 @@ } }, "canvas": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.9.1.tgz", - "integrity": "sha512-vSQti1uG/2gjv3x6QLOZw7TctfufaerTWbVe+NSduHxxLGB+qf3kFgQ6n66DSnuoINtVUjrLLIK2R+lxrBG07A==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.9.3.tgz", + "integrity": "sha512-WOUM7ghii5TV2rbhaZkh1youv/vW1/Canev6Yx6BG2W+1S07w8jKZqKkPnbiPpQEDsnJdN8ouDd7OvQEGXDcUw==", "requires": { "@mapbox/node-pre-gyp": "^1.0.0", "nan": "^2.15.0", @@ -6481,9 +6359,9 @@ "optional": true }, "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" }, "discord-api-types": { "version": "0.26.1", @@ -6503,17 +6381,6 @@ "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" }, - "@discordjs/opus": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.5.3.tgz", - "integrity": "sha512-IQhCwCy2WKXLe+qkOkwO1Wjgk20uqeAbqM62tCbzIqbTsXX4YAge8Me9RFnI77Lx+UTkgm4rSVM3VPVdS/GsUw==", - "optional": true, - "peer": true, - "requires": { - "@discordjs/node-pre-gyp": "^0.4.0", - "node-addon-api": "^3.2.1" - } - }, "discord.js": { "version": "12.5.3", "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.3.tgz", @@ -6529,32 +6396,6 @@ "ws": "^7.4.4" } }, - "ffmpeg-static": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-4.4.1.tgz", - "integrity": "sha512-gyGTIf5kgmLDmH7Rwj8vMmNK46bjXKKofHS2gY+LUqoTe/iybVuTuvnhJQR2tZHlKlDG7A/BIH7cRa2jWDKgWw==", - "optional": true, - "peer": true, - "requires": { - "@derhuerst/http-basic": "^8.2.0", - "env-paths": "^2.2.0", - "https-proxy-agent": "^5.0.0", - "progress": "^2.0.3" - } - }, - "node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "optional": true, - "peer": true - }, - "prism-media": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.2.tgz", - "integrity": "sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g==", - "requires": {} - }, "tweetnacl": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", @@ -6693,6 +6534,22 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "feedparser": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/feedparser/-/feedparser-2.2.10.tgz", + "integrity": "sha512-WoAOooa61V8/xuKMi2pEtK86qQ3ZH/M72EEGdqlOTxxb3m6ve1NPvZcmPFs3wEDfcBbFLId2GqZ4YjsYi+h1xA==", + "requires": { + "addressparser": "^1.0.1", + "array-indexofobject": "~0.0.1", + "lodash.assign": "^4.2.0", + "lodash.get": "^4.4.2", + "lodash.has": "^4.5.2", + "lodash.uniq": "^4.5.0", + "mri": "^1.1.5", + "readable-stream": "^2.3.7", + "sax": "^1.2.4" + } + }, "ffmpeg": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/ffmpeg/-/ffmpeg-0.0.4.tgz", @@ -6702,9 +6559,9 @@ } }, "ffmpeg-static": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-5.0.0.tgz", - "integrity": "sha512-z96jGVa8uCVMnyrTvbDZe0d5zbvIVQnfBN+vKDZoVK+ssYpfUJGEmo2DkuY43CA9Ytlsk+5ZVTFTqzvKw1gSaA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-5.0.2.tgz", + "integrity": "sha512-rYeA04AGbvxbUxov6Cn/KDKIzw2rmzwPlgHoqn837NZt0xPdOVA9mJMILz9IX27R45hhSlXS6nThk85XxDivLg==", "requires": { "@derhuerst/http-basic": "^8.2.0", "env-paths": "^2.2.0", @@ -7087,6 +6944,26 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "lodash.has": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", + "integrity": "sha512-rnYUdIo6xRCJnQmbVFEwcxF144erlD+M3YcJUVesflU9paQaE8p+fJDcIQrlMYbxoANFL+AB9hZrzSBBk5PL+g==" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -7283,9 +7160,9 @@ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" }, "moment": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", - "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==" + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" }, "moment-timezone": { "version": "0.5.34", @@ -7350,6 +7227,11 @@ "debug": "4.x" } }, + "mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -9125,6 +9007,12 @@ "play-audio": "^0.5.2" } }, + "prism-media": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.4.tgz", + "integrity": "sha512-eW7LXORkTCQznZs+eqe9VjGOrLBxcBPXgNyHXMTSRVhphvd/RrxgIR7WaWt4fkLuhshcdT5KHL88LAfcvS3f5g==", + "requires": {} + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -9275,6 +9163,22 @@ "glob": "^7.1.3" } }, + "rss-parser": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.12.0.tgz", + "integrity": "sha512-aqD3E8iavcCdkhVxNDIdg1nkBI17jgqF+9OqPS1orwNaOgySdpvq6B+DoONLhzjzwV8mWg37sb60e4bmLK117A==", + "requires": { + "entities": "^2.0.3", + "xml2js": "^0.4.19" + }, + "dependencies": { + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + } + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -9809,47 +9713,10 @@ "ytdl-core": "^4.8.2" }, "dependencies": { - "@discordjs/opus": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.5.3.tgz", - "integrity": "sha512-IQhCwCy2WKXLe+qkOkwO1Wjgk20uqeAbqM62tCbzIqbTsXX4YAge8Me9RFnI77Lx+UTkgm4rSVM3VPVdS/GsUw==", - "optional": true, - "peer": true, - "requires": { - "@discordjs/node-pre-gyp": "^0.4.0", - "node-addon-api": "^3.2.1" - } - }, "@types/node": { "version": "15.14.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-15.14.9.tgz", "integrity": "sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==" - }, - "ffmpeg-static": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-4.4.1.tgz", - "integrity": "sha512-gyGTIf5kgmLDmH7Rwj8vMmNK46bjXKKofHS2gY+LUqoTe/iybVuTuvnhJQR2tZHlKlDG7A/BIH7cRa2jWDKgWw==", - "optional": true, - "peer": true, - "requires": { - "@derhuerst/http-basic": "^8.2.0", - "env-paths": "^2.2.0", - "https-proxy-agent": "^5.0.0", - "progress": "^2.0.3" - } - }, - "node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "optional": true, - "peer": true - }, - "prism-media": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.2.tgz", - "integrity": "sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g==", - "requires": {} } } } diff --git a/package.json b/package.json index 5fc1d3f..116986d 100644 --- a/package.json +++ b/package.json @@ -6,10 +6,11 @@ "apt": "^0.0.2", "arraybuffer-to-buffer": "^0.0.7", "axios": "^0.27.2", - "canvas": "^2.9.1", + "canvas": "^2.9.3", "cheerio": "^1.0.0-rc.10", "discord-reply": "^0.1.2", "discord.js": "^13.6.0", + "feedparser": "^2.2.10", "ffmpeg": "^0.0.4", "ffmpeg-static": "^5.0.0", "hastebin-gen": "^2.0.5", @@ -22,6 +23,8 @@ "openai": "^3.0.0", "play-dl": "^1.9.4", "random-memes": "^3.1.0", + "request": "^2.88.2", + "rss-parser": "^3.12.0", "sequelize": "^6.19.0", "sqlite3": "^5.0.3", "stripe": "^9.11.0", diff --git a/side projects/RSSHandlers/simplecast.js b/side projects/RSSHandlers/simplecast.js new file mode 100644 index 0000000..468d4ad --- /dev/null +++ b/side projects/RSSHandlers/simplecast.js @@ -0,0 +1,23 @@ +class simpleCast { + constructor(data, url) { + this.title = data.title; + + if (data['itunes:summary']) { + this.description = data['itunes:summary']['#']; + } else { + //

......

+ this.description = data.description.substring(3, s.indexOf('

', 4)); + } + + var audio = data.enclosures.filter((entry) => { return (entry.type.indexOf('audio') != -1) }); + if (audio.length > 0) { + this.audioLink = audio[0].url; + } else { console.log("What?"); } + this.url = url; + + this.thumbnal = data.meta.image.url; + } +} + + +module.exports = { simpleCast } \ No newline at end of file diff --git a/side projects/feeds.json b/side projects/feeds.json new file mode 100644 index 0000000..6ed5b9b --- /dev/null +++ b/side projects/feeds.json @@ -0,0 +1,24 @@ +{ + "News": { + "NYTimes": { + "world": "https://rss.nytimes.com/services/xml/rss/nyt/World.xml", + "US": "https://rss.nytimes.com/services/xml/rss/nyt/HomePage.xml", + "econ": "https://rss.nytimes.com/services/xml/rss/nyt/Economy.xml", + "business": "https://rss.nytimes.com/services/xml/rss/nyt/Business.xml", + "tech": "https://rss.nytimes.com/services/xml/rss/nyt/Technology.xml", + "obituaries": "https://rss.nytimes.com/services/xml/rss/nyt/Obituaries.xml" + }, + "Fox": { + "LatestHeadlines": "https://moxie.foxnews.com/feedburner/latest.xml", + "World": "https://moxie.foxnews.com/feedburner/world.xml", + "US": "https://moxie.foxnews.com/feedburner/national.xml", + "Tech": "https://moxie.foxnews.com/feedburner/scitech.xml", + "Politics": "https://moxie.foxnews.com/feedburner/politics.xml" + }, + "NPR": "https://feeds.npr.org/1001/rss.xml" + }, + "Crime": { + "DateLine_NBC": "https://podcastfeeds.nbcnews.com/HL4TzgYC", + "CrimeJunkie": "https://feeds.simplecast.com/qm_9xx0g" + } +} \ No newline at end of file diff --git a/side projects/rssFeed.js b/side projects/rssFeed.js new file mode 100644 index 0000000..28b738d --- /dev/null +++ b/side projects/rssFeed.js @@ -0,0 +1,319 @@ +const { MessageActionRow, MessageButton, MessageEmbed, MessageSelectMenu, CommandInteractionOptionResolver } = require('discord.js'); +const axios = require('axios'); +const cheerio = require('cheerio'); +var FeedParser = require('feedparser'); +const fetch = require('node-fetch'); +const { VoiceConnectionStatus, AudioPlayerStatus, createAudioPlayer, StreamType, joinVoiceChannel, createAudioResource, getVoiceConnection } = require('@discordjs/voice'); +const play = require('play-dl'); + +const hastebin = require("hastebin-gen"); +const { simpleCast } = require('./RSSHandlers/simplecast.js') + +let Parser = require('rss-parser'); +let parser = new Parser(); +const allFeedsJSON = require('./feeds.json'); + + + + +/** + * @param {JSON} inp + * @returns {Map} + */ +function jsonToMapRecursive(inp) { + if (typeof(inp) != 'object') { + return inp; + } + + let m2 = new Map(); + Object.entries(inp).forEach((key) => { m2.set(key[0], jsonToMapRecursive(inp[key[0]])); }); + return m2; +} + +const allFeeds = jsonToMapRecursive(allFeedsJSON); + + +function mapToTable(inp, layer) { + var temp = ''; + + if (typeof(inp) != 'object') { + // return `?[${inp}]`; + return ''; + } + + Array.from(inp.keys()).forEach((key) => { + var keyTemp = ('| ').repeat(layer); + temp += `${keyTemp}- - ${key}\n`.replaceAll(' - -', '- -'); + temp += mapToTable(inp.get(key), layer + 1); + }); + + temp += ('| ').repeat(layer - 1) + '\n'; + + if (layer == 1) { + var links = new Array(); + + //Post-processing + var l = temp.split('\n') + + l = l.filter((entry, ind) => { + return entry.trim() == '|' || !((/[^A-Za-z0-9 ]+$/).test(entry.trim()) && (/[^A-Za-z0-9 ]+$/).test(l[ind + 1].trim())); + }); + + temp = l.join('\n') + + //Get the links + Array.from(inp.keys()).forEach((key) => { + links.push(key); + }); + + return [temp, links]; + } + + return temp; +} + + +/** + * + * @param {simpleCast} obj + * @returns + */ +function playAudio(bot, message, user, obj) { + const member = message.guild.members.cache.get(user.id); + if (!member.voice.channel) { + message.reply("Please join a voice channel before you try this!"); + return; + } + const channel = bot.channels.cache.get(member.voice.channel.id); + + const connection = joinVoiceChannel({ + channelId: channel.id, + guildId: channel.guild.id, + adapterCreator: channel.guild.voiceAdapterCreator, + }); + + + const resource = createAudioResource(obj.audioLink /*, { inlineVolume: true }*/ ); + + const data = bot.audioData.get(message.channel.guild.id); + if (data && data[1]) { + return message.reply("No podcast queue support yet!"); + } + const player = createAudioPlayer(); + connection.subscribe(player); + bot.audioData.set(message.guild.id, [player, new Array(), null]); + player.play(resource); + + //Create the embed + const newEmbed = new MessageEmbed() + .setColor('#0F00F0') + .setTitle(`${obj.title}`) + .setAuthor({ name: "Selmer Bot", url: "", iconURL: bot.user.displayAvatarURL() }) + .setDescription('IS NOW PLAYING') + .setURL(obj.url) + .setThumbnail(obj.thumbnal); + + const row = new MessageActionRow() + .addComponents( + new MessageButton() + .setCustomId('PAUSE') + .setLabel('⏸️') + .setStyle('SECONDARY'), + new MessageButton() + .setCustomId('STOP') + .setLabel('⏹️') + .setStyle('SECONDARY'), + // new MessageButton() + // .setCustomId('SKIP') + // .setLabel('⏭️') + // .setStyle('SECONDARY') + ); + console.log(obj.audioLink); + const m = message.reply({ embeds: [newEmbed], components: [row] }); +} + + + +async function getAndFormatRSS(bot, message, user, inp) { + + var req = fetch(inp) + const feedparser = new FeedParser(); + + req.then(function (res) { + + if (res.status !== 200) { + throw new Error('Bad status code'); + } + else { + // The response `body` -- res.body -- is a stream + res.body.pipe(feedparser); + } + }, function (err) { + // handle any request errors + }); + + feedparser.on('error', function (error) { + // always handle errors + }); + + const items = new Array(); + feedparser.on('readable', async function () { + // This is where the action is! + var stream = this; // `this` is `feedparser`, which is a stream + var meta = this.meta; // **NOTE** the "meta" is always available in the context of the feedparser instance + var item; + + let i = 0; + while (item = stream.read()) { + items.push(item); + i ++; + if (i >= 100) { break; } + } + }) + + feedparser.addListener('end', () => { + const item = items[Math.round(Math.random() * items.length)]; + + if (inp.indexOf('simplecast') != -1) { + var s = new simpleCast(item, inp); + s.audioLink = 'https://download.samplelib.com/mp3/sample-15s.mp3'; + playAudio(bot, message, user, s); + } + }); + + return; + //Get the feed + const feed = await parser.parseURL(inp); + // const items = feed.items; + const item = items[Math.round(Math.random() * items.length)]; + + var url; + try { + url = item.link || item.guid; + axios(url).then(async response => { + const html = response.data; + const $ = cheerio.load(html); + // console.log(html); + const haste = await hastebin(html, { extension: "txt" }); + console.log(url, '\n', haste); + }) + } catch (err) { + console.log(err); + return console.log(item); + } + + // const newEmbed = new MessageEmbed() + // .setTitle(feed.title) + // .setAuthor({ name: "Selmer Bot", url: "", iconURL: bot.user.displayAvatarURL() }) + // .setTimestamp() + + // console.log(feed.items); + + /* + creator?: 'Ben Casselman and Jeanna Smialek', + title: 'Income and Spending Rose Less Than Prices in May', + link: 'https://www.nytimes.com/2022/06/30/business/economy/income-spending-may.html', + */ + +} + + +function presentFeeds(bot, message, commands, interaction) { + + var r; + var url; + if (commands[0] == 'all') { + r = mapToTable(allFeeds, 1); + } else { + var r2 = allFeeds.get(commands[0]); + // commands = commands.slice(1); + commands.slice(1).forEach((key) => { + r2 = r2.get(key); + }); + + + r = mapToTable(r2, 1); + + if(!r[1]) { url = r2; } + + //Array.from(r2.keys()) + } + + //Check if we have a feed (no more paths) + if (!r[1]) { + // console.log("Commands:", commands, "\nR: ", r); throw 1; + let path = '' + commands.forEach((com) => { path += `${com} --> `}); + path = path.slice(0, path.length - 5); + + interaction.update({ content: `You have chosen ${path}!`, components: []}); + + return getAndFormatRSS(bot, interaction.message, interaction.user, url); + } + + var keyList = new Array(); + r[1].forEach((key) => { + const listEntry = { + label: `${key}`, + description: `Choose a feed from this category!`, + value: `${key}`, + } + + keyList.push(listEntry); + }); + + const row = new MessageActionRow() + .setComponents( + new MessageSelectMenu() + .setCustomId(`RSS|${commands.join('|')}`) + .setPlaceholder('Nothing selected') + .addOptions(keyList) + ) + + if (interaction) { return interaction.update({content: r[0], components: [ row ]}); } + message.reply({ content: r[0], components: [ row ] }); + + /*else if (commands[0].length = 1) { + const data = allFeeds.get(commands[0]).get(commands[1]).get(commands[2]); + interaction.update({ content: `You have chosen ${commands[1]} from the ${commands[0]} section!`, components: []}); + return getAndFormatRSS(bot, interaction.message, data); + }*/ +} + + + +function RSSInteractionHandler(bot, interaction) { + let commands = interaction.values[0].split('|'); + let temp = interaction.customId.split('|').slice(1); + if (temp[0] != 'all') { commands = temp.concat(commands); } + // console.log(interaction.customId, interaction.values); + + presentFeeds(bot, null, commands, interaction); +} + + + +// getAndFormatRSS(null, null, imp[0]); + +// presentFeeds(null, ['all']); + +module.exports = { + name: 'RSS', + description: 'Selmer Bot will present a list of RSS feeds to read from *EXPERAMENTAL*', + execute(message, args, Discord, Client, bot) { + if (!bot.inDebugMode) { return message.reply('Command under development!'); } + if (!args[0]) { + presentFeeds(bot, message, [ 'all' ], null); + } + }, + RSSInteractionHandler +} + + +/* +REMOVED +"ABC": "https://abcnews.go.com/abcnews/topstories" +"FBI": "https://www.fbi.gov/feeds/national-press-releases/rss.xml" (Uhhhh......maybe I should't use this one.....) + + +*/ \ No newline at end of file