From 9abb74fa84e5d8e71cb77449f7d919bbf41bffea Mon Sep 17 00:00:00 2001 From: night0721 Date: Sat, 18 Sep 2021 00:28:39 +0800 Subject: [PATCH] moved unused commands to unused dir & new v13 cmds --- .env.example | 15 +- .gitattributes | 2 + .gitignore | 3 - README.md | 115 + bot.js | 20 +- cat/Path/fantastic.js | 13 - cat/Path/fight.js | 72 - cat/Path/gae.js | 37 - cat/Path/gg.js | 26 - cat/Path/how.js | 25 - cat/Path/nab.js | 30 - cat/Path/pp.js | 20 - cat/fantastic.js | 13 - cat/fight.js | 72 - cat/gae.js | 37 - cat/gg.js | 26 - cat/how.js | 19 - cat/nab.js | 30 - cat/pp.js | 22 - command/Economy/bet.js | 53 + {commands => command}/Economy/inv.js | 49 +- {commands => command}/Economy/lb.js | 22 +- command/Economy/profile.js | 46 + {commands => command}/Economy/shop.js | 8 +- {commands => command}/Economy/slots.js | 46 +- {commands => command}/Economy/work.js | 13 +- command/Fun/8ball.js | 6 +- command/Fun/cat.js | 43 +- command/Fun/dog.js | 43 +- command/Fun/drake.js | 4 +- command/Fun/ds.js | 4 +- {commands => command}/Fun/hangman.js | 54 +- command/Fun/kiss.js | 2 +- command/Fun/meme.js | 43 +- command/Fun/simprate.js | 34 + command/Information/botinfo.js | 5 +- command/Information/help.js | 6 +- command/Moderation/purge.js | 100 +- command/Moderation/slowmode.js | 102 + command/Owner/eval.js | 3 +- command/Owner/restart.js | 3 +- command/Utilities/docs.js | 13 +- command/Utilities/github.js | 59 + command/Utilities/rank.js | 303 ++ command/Utilities/timer.js | 17 +- commands/Config/prefix-reset.js | 13 +- commands/Economy/bal.js | 29 - commands/Economy/bet.js | 52 - commands/Economy/daily.js | 46 - commands/Economy/profile.js | 47 - commands/Fun/8ball.js | 56 - commands/Fun/ascii.js | 21 - commands/Fun/cat.js | 25 - commands/Fun/coinflip.js | 18 - commands/Fun/dino.js | 102 - commands/Fun/dog.js | 25 - commands/Fun/drake.js | 24 - commands/Fun/ds.js | 18 - commands/Fun/emojify.js | 40 - commands/Fun/hack.js | 129 - commands/Fun/hexcolor.js | 84 - commands/Fun/hug.js | 29 - commands/Fun/kiss.js | 29 - commands/Fun/meme.js | 25 - commands/Fun/obama.js | 45 - commands/Fun/rickroll.js | 30 - commands/Fun/rps.js | 91 - commands/Fun/say.js | 12 - commands/Fun/ship.js | 31 - commands/Fun/simprate.js | 26 - commands/Fun/sr.js | 15 - commands/Fun/triggered.js | 18 - commands/Giveaway/giveaway.js | 6 +- commands/Moderation/mute.js | 14 +- commands/Moderation/pin.js | 21 - commands/Moderation/slowmode.js | 57 - commands/Moderation/warns.js | 2 +- commands/Owner/eval.js | 111 - commands/Owner/guilds.js | 24 - commands/Owner/restart.js | 13 - commands/Owner/spider.js | 19 - commands/Owner/test.js | 32 - commands/Utilities/afk.js | 26 - commands/Utilities/avatar.js | 49 - commands/Utilities/botinfo.js | 49 - commands/Utilities/choose.js | 15 - commands/Utilities/docs.js | 19 - commands/Utilities/emoji.js | 21 - commands/Utilities/help.js | 237 +- commands/Utilities/invite.js | 29 - commands/Utilities/messageinfo.js | 30 - commands/Utilities/modmail.js | 138 - commands/Utilities/permission.js | 105 - commands/Utilities/ping.js | 28 - commands/Utilities/poll.js | 24 - commands/Utilities/rank.js | 42 - commands/Utilities/report.js | 78 - commands/Utilities/roleinfo.js | 90 - commands/Utilities/servericon.js | 16 - commands/Utilities/serverinfo.js | 118 - commands/Utilities/snipe.js | 73 - commands/Utilities/suggest.js | 77 - commands/Utilities/timer.js | 61 - commands/Utilities/userinfo.js | 118 - config.json | 15 +- events/afk.js | 6 - events/card.js | 64 - events/emoji.js | 6 +- events/goodBye.js | 68 - events/guild.js | 99 +- events/guildCreate.js | 33 - events/guildDelete.js | 47 - events/log.js | 447 -- events/message.js | 427 -- events/messageCreate.js | 367 +- events/messsageDelete.js | 31 - events/reactionroles.js | 30 - events/ready.js | 50 - events/slash.js | 35 - events/starboard.js | 83 + events/startTyping.js | 10 - events/typingStart.js | 10 - package-lock.json | 3988 ----------------- package.json | 31 +- start.bat | 1 + .../commands}/Config/choices.js | 17 +- .../commands}/Config/cmd-list.js | 0 .../commands}/Config/create.js | 0 .../commands}/Config/delete.js | 0 .../commands}/Config/migrate.js | 0 .../commands}/Config/modmail-category.js | 6 +- .../commands}/Config/modmail-role.js | 4 +- {commands => unused/commands}/Config/panel.js | 0 .../commands}/Config/rr-add.js | 0 .../commands}/Config/rr-rmv.js | 14 +- {commands => unused/commands}/Fun/connect4.js | 0 {commands => unused/commands}/Fun/quote.js | 0 unused/commands/Utilities/modmail.js | 165 + unused/events/messageCreate.js | 240 + unused/models/custom-commands.js | 11 + unused/models/modmail.js | 11 + unused/models/reaction.js | 10 + util/Data/output.json | 1 + util/assets/fonts/Poppins-Regular.ttf | Bin 0 -> 160316 bytes util/assets/fonts/Poppins-SemiBold.ttf | Bin 0 -> 157312 bytes util/dist/cmds.js | 39 + util/dist/err.js | 224 + util/dist/handler.js | 82 + util/dist/item.js | 68 + util/dist/manager.js | 86 + util/dist/npm.sh | 4 + util/dist/slash.js | 224 + util/functions/economy.js | 248 + util/functions/function.js | 366 ++ util/functions/mongoose.js | 540 +++ util/pagination/pagify.js | 119 - util/pagination/pagination.js | 33 +- 157 files changed, 3739 insertions(+), 9121 deletions(-) create mode 100644 .gitattributes create mode 100644 README.md delete mode 100644 cat/Path/fantastic.js delete mode 100644 cat/Path/fight.js delete mode 100644 cat/Path/gae.js delete mode 100644 cat/Path/gg.js delete mode 100644 cat/Path/how.js delete mode 100644 cat/Path/nab.js delete mode 100644 cat/Path/pp.js delete mode 100644 cat/fantastic.js delete mode 100644 cat/fight.js delete mode 100644 cat/gae.js delete mode 100644 cat/gg.js delete mode 100644 cat/how.js delete mode 100644 cat/nab.js delete mode 100644 cat/pp.js create mode 100644 command/Economy/bet.js rename {commands => command}/Economy/inv.js (50%) rename {commands => command}/Economy/lb.js (52%) create mode 100644 command/Economy/profile.js rename {commands => command}/Economy/shop.js (75%) rename {commands => command}/Economy/slots.js (65%) rename {commands => command}/Economy/work.js (52%) rename {commands => command}/Fun/hangman.js (60%) create mode 100644 command/Fun/simprate.js create mode 100644 command/Moderation/slowmode.js create mode 100644 command/Utilities/github.js create mode 100644 command/Utilities/rank.js delete mode 100644 commands/Economy/bal.js delete mode 100644 commands/Economy/bet.js delete mode 100644 commands/Economy/daily.js delete mode 100644 commands/Economy/profile.js delete mode 100644 commands/Fun/8ball.js delete mode 100644 commands/Fun/ascii.js delete mode 100644 commands/Fun/cat.js delete mode 100644 commands/Fun/coinflip.js delete mode 100644 commands/Fun/dino.js delete mode 100644 commands/Fun/dog.js delete mode 100644 commands/Fun/drake.js delete mode 100644 commands/Fun/ds.js delete mode 100644 commands/Fun/emojify.js delete mode 100644 commands/Fun/hack.js delete mode 100644 commands/Fun/hexcolor.js delete mode 100644 commands/Fun/hug.js delete mode 100644 commands/Fun/kiss.js delete mode 100644 commands/Fun/meme.js delete mode 100644 commands/Fun/obama.js delete mode 100644 commands/Fun/rickroll.js delete mode 100644 commands/Fun/rps.js delete mode 100644 commands/Fun/say.js delete mode 100644 commands/Fun/ship.js delete mode 100644 commands/Fun/simprate.js delete mode 100644 commands/Fun/sr.js delete mode 100644 commands/Fun/triggered.js delete mode 100644 commands/Moderation/pin.js delete mode 100644 commands/Moderation/slowmode.js delete mode 100644 commands/Owner/eval.js delete mode 100644 commands/Owner/guilds.js delete mode 100644 commands/Owner/restart.js delete mode 100644 commands/Owner/spider.js delete mode 100644 commands/Owner/test.js delete mode 100644 commands/Utilities/afk.js delete mode 100644 commands/Utilities/avatar.js delete mode 100644 commands/Utilities/botinfo.js delete mode 100644 commands/Utilities/choose.js delete mode 100644 commands/Utilities/docs.js delete mode 100644 commands/Utilities/emoji.js delete mode 100644 commands/Utilities/invite.js delete mode 100644 commands/Utilities/messageinfo.js delete mode 100644 commands/Utilities/modmail.js delete mode 100644 commands/Utilities/permission.js delete mode 100644 commands/Utilities/ping.js delete mode 100644 commands/Utilities/poll.js delete mode 100644 commands/Utilities/rank.js delete mode 100644 commands/Utilities/report.js delete mode 100644 commands/Utilities/roleinfo.js delete mode 100644 commands/Utilities/servericon.js delete mode 100644 commands/Utilities/serverinfo.js delete mode 100644 commands/Utilities/snipe.js delete mode 100644 commands/Utilities/suggest.js delete mode 100644 commands/Utilities/timer.js delete mode 100644 commands/Utilities/userinfo.js delete mode 100644 events/card.js delete mode 100644 events/goodBye.js delete mode 100644 events/guildCreate.js delete mode 100644 events/guildDelete.js delete mode 100644 events/log.js delete mode 100644 events/message.js delete mode 100644 events/messsageDelete.js delete mode 100644 events/reactionroles.js delete mode 100644 events/slash.js create mode 100644 events/starboard.js delete mode 100644 events/startTyping.js delete mode 100644 events/typingStart.js delete mode 100644 package-lock.json create mode 100644 start.bat rename {commands => unused/commands}/Config/choices.js (91%) rename {commands => unused/commands}/Config/cmd-list.js (100%) rename {commands => unused/commands}/Config/create.js (100%) rename {commands => unused/commands}/Config/delete.js (100%) rename {commands => unused/commands}/Config/migrate.js (100%) rename {commands => unused/commands}/Config/modmail-category.js (85%) rename {commands => unused/commands}/Config/modmail-role.js (88%) rename {commands => unused/commands}/Config/panel.js (100%) rename {commands => unused/commands}/Config/rr-add.js (100%) rename {commands => unused/commands}/Config/rr-rmv.js (66%) rename {commands => unused/commands}/Fun/connect4.js (100%) rename {commands => unused/commands}/Fun/quote.js (100%) create mode 100644 unused/commands/Utilities/modmail.js create mode 100644 unused/events/messageCreate.js create mode 100644 unused/models/custom-commands.js create mode 100644 unused/models/modmail.js create mode 100644 unused/models/reaction.js create mode 100644 util/Data/output.json create mode 100644 util/assets/fonts/Poppins-Regular.ttf create mode 100644 util/assets/fonts/Poppins-SemiBold.ttf create mode 100644 util/dist/cmds.js create mode 100644 util/dist/err.js create mode 100644 util/dist/handler.js create mode 100644 util/dist/item.js create mode 100644 util/dist/manager.js create mode 100644 util/dist/npm.sh create mode 100644 util/dist/slash.js create mode 100644 util/functions/economy.js create mode 100644 util/functions/function.js create mode 100644 util/functions/mongoose.js delete mode 100644 util/pagination/pagify.js diff --git a/.env.example b/.env.example index 0d48060..9096285 100644 --- a/.env.example +++ b/.env.example @@ -1,11 +1,12 @@ TOKEN = MONGO = mongodb://127.0.0.1:27017/test -CLIENT_SECRET = -CLIENT_ID = -SPOTIFY_ID = -SPOTIFY_SECRET = -PORT = 3000 +mongo = +testmongo = +cathmongo = +CLIENT_SECRET = +CLIENT_ID = +SPOTIFY_ID = +SPOTIFY_SECRET = host = lavalink.darrennathanael.com port = 2095 -password = whatwasthelastingyousaid -api = http://localhost:3000 +password = whatwasthelastingyousaid \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore index b6d79a5..950b6dd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,4 @@ node_modules package-lock.json .env -/events/log.js -/.prettierignore -/util/functions/economy(backup).js .vscode \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..b94640b --- /dev/null +++ b/README.md @@ -0,0 +1,115 @@ +# CATH.EXE [![botStatus](https://discord-md-badge.vercel.app/api/shield/bot/800966959268364288?style=flat-square&flat-Square&theme=clean-inverted&compact=true)](https://discord.com/oauth2/authorize?client_id=800966959268364288&permissions=4231314550&scope=bot%20applications.commands) + + + + +**Cath.exe** is a Multipurpose Discord Bot with many features that include but are not limited to Moderation, Music and Economy. The Call of Duty Stats are courtesy of [**Project Lighthouse**](https://discord.gg/ARNFCu9NxK) by [**Path.exe**](https://www.youtube.com/channel/UC0hvUWYhyx_DOEBzLWEJxsw).

+If you like this bot, feel free to **Star** and **fork** this repository.

+ + + +[![inviteme](https://badgen.net/badge/Invite%20Me/Online/5865F2?icon=discord&color=5865F2&style=for-the-badge&scale=1.4)](https://discord.com/oauth2/authorize?client_id=800966959268364288&permissions=4231314550&scope=bot%20applications.commands) +[![Support Server](https://img.shields.io/discord/718762019586572341?label=Support%20Server&logo=Discord&colorB=5865F2&style=for-the-badge&logoColor=white) ](https://discord.gg/SR7TeNJG67) +![Repo Stars](https://img.shields.io/github/stars/night0721/cath.exe?logo=github&color=5865F2&style=for-the-badge) +[![Open in Visual Studio Code](https://img.shields.io/badge/Visual_Studio_Code-5865F2?style=for-the-badge&logo=visual%20studio%20code&logoColor=white)](https://open.vscode.dev/night0721/cath/) +[![Trello](https://img.shields.io/badge/Trello-5865F2?style=for-the-badge&logo=trello&logoColor=white)](https://trello.com/b/dIgR0QNm) + + + +## Build with: + +[![JavaScript](https://img.shields.io/badge/JavaScript-F7DF1E?style=for-the-badge&logo=javascript&logoColor=black)](https://developer.mozilla.org/en-US/docs/Web/JavaScript) +[![node](https://img.shields.io/badge/Node.js-43853D?style=for-the-badge&logo=node.js&logoColor=white)](https://nodejs.org/en/) +[![npm](https://img.shields.io/badge/npm-CB3837?style=for-the-badge&logo=npm&logoColor=white)](https://www.npmjs.com/) +[![MongoDB](https://img.shields.io/badge/MongoDB-4EA94B?style=for-the-badge&logo=mongodb&logoColor=white)](https://mongodb.com/) +
+ +# Deployment + +## Deploy Online + +[![Run On Replit](https://img.shields.io/static/v1?label=Run%20On&message=Repl.it&color=5865F2&logo=replit&logoColor=white&style=for-the-badge&scale=1.4)](https://repl.it/github/night0721/cath.exe) +[![Deploy On Heroku](https://img.shields.io/static/v1?label=Deploy%20On&message=Heroku&color=5865F2&logo=heroku&logoColor=white&style=for-the-badge&scale=1.4)](https://heroku.com/deploy?template=https://github.com/night0721/cath.exe) + +## Deployment Locally + +### Prerequisite + +Download all these programs on your local machine by clicking on the badge & following the standard installing procedure. You can use any IDE but we recommand VS Code. + +[![git](https://badgen.net/badge/icon/git?icon=git&label&color=5865F2&style=for-the-badge&scale=1.4)](https://git-scm.com/downloads) +[![Open in Visual Studio Code](https://img.shields.io/badge/Visual_Studio_Code-5865F2?style=for-the-badge&logo=visual%20studio%20code&logoColor=white)](https://code.visualstudio.com/Download) +[![node](https://img.shields.io/badge/Node.js-43853D?style=for-the-badge&logo=node.js&logoColor=white)]() + +### Step by Step Walkthrough + +### [![YouTube Tutorial](https://img.shields.io/badge/YouTube-FF0000?style=for-the-badge&logo=youtube&logoColor=white)](https://youtu.be/_D5xG7XoF88) + +1. Clone this repository + +```cmd +git clone https://github.com/night0721/cath.exe +``` + +2. Rename the [`.env.example` + ](https://github.com/night0721/cath.exe/blob/main/.env.example) file to `.env`
+ +3. Create an application from Discord Developer's Portal then copy these things into the `.env` file.
+ [![Open Discord Developer Portal](https://badgen.net/badge/icon/discord?icon=discord&label=Developer%20Portal&color=5865F2&style=for-the-badge)](https://discord.com/developers/applications) - **Bot Token**
- **Application ID** (Client ID)
- **Client Secret**
+4. To view the logs, Create 5 Channels & 5 Webhooks in _your_ **Discord Server:** corresponding to these logs. + + - **Server Log** (Log new Server Added/Premium Server)
+ - **Error Log** (Log Unhandled Rejection Error)
+ - **Ready Log** (Log when bot online)
+ - **Command Log** (Log command usage)
+ - **DM Log** (Log when someone send DM to Bot)
+ + _You can also just use one Channel & one Webhook for everything but it will be really inconvenient._ + +
+ +5. One by one paste the webhook url in a web browser & copy the **ID** & the **TOKEN** and paste it in the corresponding feilds in the `.env` file.
+ +6. After this, you need to install all dependencies by using this command. This will takes a few minutes. + + ```cmd + npm i + ``` + +7. Now, to start the bot use this command in the terminal. + ```cmd + node . + ``` + +# Additional Steps + +To enable the Economy Commands, you need to Setup a MongoDB Database. You can also watch a video guide [here](https://youtu.be/dQw4w9WgXcQ). + +1. Create a Free [MongoDB Account](https://www.mongodb.com/cloud/atlas/register) +2. Click on the `Create a New Database`. +3. Selct the `CREATE` option in the **Shared** Teir. +4. Select a `Cloud Provider & Region` that is geographically closer to the average user that will use the bot. _This will effect the responce time of the bot._ +5. Then you can Name your Cluster, after that click on `Create Cluster`. _This will take a couple of minutes._ +6. Then click on `Database Access` from the sidebar & then click on `Add New Database User`. +7. Under the `Password - Authentication Method`. Enter a username & password. then click on `Add User`. +8. After that, click on `Network Access` from the sidebar & then click on `Add IP Address`. & click on the `Add Current IP Address` Then click on `Confirm`. +9. now, Click on `Database` from the sidebar & then click on `Connect`. +10. Then on click on `Connect your Application`. & Copy the link. +11. The paste that link in the `MONGODB` feild in the `.env` file. +12. Now you need to modify that link, + - Replace `` with the password for the user that you created in **Step 7**. + - Replace `myFirstDatabase` with the name of the Database that you named in **Step 5**. +13. That's it! + +# Support, Feature Request & Bug Reports + +## Support & Feature Request + +Join the official [Support Server](https://discord.gg/SbQHChmGcp) on Discord & we will be happy to assist you.
+To Request new features contact us on Discord using the support server. + +## Report Bugs + +You can report bugs or issues by opening a issue in this repository. Alternatevely you can also contact us on Discord using the support server. + +[![Support Server](https://img.shields.io/discord/718762019586572341?label=Support%20Server&logo=Discord&colorB=5865F2&style=for-the-badge&logoColor=white) ](https://discord.gg/SR7TeNJG67) diff --git a/bot.js b/bot.js index adf7f9a..67306c6 100644 --- a/bot.js +++ b/bot.js @@ -1,13 +1,24 @@ const { Client, Collection, MessageEmbed, Intents } = require("discord.js"); const { GiveawaysManager } = require("discord-giveaways"); +const config = require("./config.json"); +const version = require("./package.json").version; require("dotenv").config(); const client = new Client({ allowedMentions: { parse: ["users", "roles"], repliedUser: true }, + presence: { + activities: [ + { + name: `v${version} | ${config.prefix}help`, + type: "STREAMING", + url: "https://www.youtube.com/watch?v=_D5xG7XoF88", + }, + ], + }, restTimeOffset: 0, partials: ["MESSAGE", "CHANNEL", "REACTION", "GUILD_MEMBER"], intents: [ Intents.FLAGS.GUILDS, - Intents.FLAGS.GUILD_MEMBERS, + //Intents.FLAGS.GUILD_MEMBERS, Intents.FLAGS.GUILD_BANS, Intents.FLAGS.GUILD_EMOJIS_AND_STICKERS, Intents.FLAGS.GUILD_INVITES, @@ -15,7 +26,7 @@ const client = new Client({ Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MESSAGE_REACTIONS, Intents.FLAGS.DIRECT_MESSAGES, - Intents.FLAGS.GUILD_PRESENCES, + //Intents.FLAGS.GUILD_PRESENCES, ], }); module.exports = client; @@ -26,19 +37,20 @@ client.commands = new Collection(); client.slashCommands = new Collection(); client.aliases = new Collection(); client.esnipes = new Collection(); +client.hide = new Collection(); client.snipes = new Array(); client.queue = new Map(); client.Timers = new Map(); -client.config = require("./config.json"); +client.config = config; client.function = require("./util/functions/function"); client.data = require("./util/functions/mongoose"); client.err = require("./util/dist/err"); +client.serr = require("./util/dist/slash"); client.cat = client.config.ca; client.SuggestionLog = client.config.Suggestion; client.ReportLog = client.config.Report; client.DMLog = client.config.DMLog; client.CMDLog = client.config.CMDLog; -client.ReadyLog = client.config.ReadyLog; client.ServerLog = client.config.ServerLog; client.ErrorLog = client.config.ErrorLog; client.color = client.config.color; diff --git a/cat/Path/fantastic.js b/cat/Path/fantastic.js deleted file mode 100644 index df3ff93..0000000 --- a/cat/Path/fantastic.js +++ /dev/null @@ -1,13 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "fantastic", - timeout: 60000, - - run: async (client, message, args) => { - message.delete(); - const player = args.join(" "); - message.channel.send( - `${player} is a fantastic CoDM player. Just need to work on communication, map awareness, info scouting, bomb plants, positioning, teamfighting, gun skill , utility usage, rotations and getting kills.` - ); - }, -}; diff --git a/cat/Path/fight.js b/cat/Path/fight.js deleted file mode 100644 index f85404d..0000000 --- a/cat/Path/fight.js +++ /dev/null @@ -1,72 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "fight", - description: "Goooooooooooooooolag!", - timeout: 15000, - - run: async (client, message, args) => { - const gaes = [ - "Gae", - "Super Gae", - "Ultra Gae", - "Snow Gae", - "Ultimate Gae", - "Terminal Gae", - "Akimbo Gae", - "Dead(extended timer)", - "Mega Gae", - "Cheez Gae", - "Gath Gae", - "Koosun Gae", - "KDR Gae", - "Gaezer Gae", - "Big Gae", - "Horni Gae", - "Zero Gae", - "Gae beyond repair", - "Dead×2(extended timer)", - "Not Gae", - "Animus Gae", - "Dust Gae", - "Orcus Gae", - "Gulag Cleaner", - "Kedar Gae", - "Smol Gae", - "Meta Gae", - "Mono Gae", - "Stippled Gae", - "BSA Gae", - "Oreo Gae", - "Random Gae", - "Tortol Gae", - "Amogus Gae", - "Gae×2", - "Dan Gae", - "Real Gae©®™", - "Mastered Ultra Instinct Gae", - "Bamboozled", - "More Gae", - "Morrre Gae", - "Most Gae", - "Undisputable Gae", - "Gae Prince of Horni", - "Gae with Y", - "Phatopenisis Gae", - "Gathophile", - "a Bot", - "locknload with 200 round RPD gae", - "ros gae", - "Cath Gae", - "Cat drinking a cat gae", - "Night Gae", - ]; - const gae = gaes[Math.floor(Math.random() * gaes.length)]; - const embed = new MessageEmbed() - .setTitle("**Gulag Fight**") - .setDescription( - `**${message.author} has taken a chance at redemption in The Gulag. \nYou fight only to find out that you're \`${gae}\`. If you somehow turned out to not be gae, DM an admin to get your timer halved ||only if your mute is less than 69m||**` - ) - .setColor(5198940); - message.channel.send(embed); - }, -}; diff --git a/cat/Path/gae.js b/cat/Path/gae.js deleted file mode 100644 index 4adb457..0000000 --- a/cat/Path/gae.js +++ /dev/null @@ -1,37 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "gae", - timeout: 15000, - - run: async (client, message, args) => { - const MEE6 = [ - "u = gae", - "pLeaSe gAE", - "REEEEEEEEEEEEEEEEEEEEEE*GAE*EEEEEEEEEEEEEEEEEEEEEEEEEEE", - "Enough with the gae jokes, U gae", - "Plain ol' gae", - "", - "By the way, Deity bot is my senpai.\nShe is the most beautiful bot I've ever seen <3", - "aight imma gae out", - "*gae with extra steps*", - "**wae r u gae**", - "u gae bro?", - "**100%** gae", - "I bet you do **tiktok**", - "**G.A.E.**", - "The next person to chat is gae", - "Whoever used C.gae, is **gae**", - "*Its ok to be gae*", - "*succ my* **cheez**", - "**gae gae gae gae gae gae**", - "**Be gae**", - "There's no cooldown so y'all get muted for being *gae*", - "Ok stop using this command, really. U gae?", - "What the hell, u gae?", - "**GAEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE**", - ]; - const MEE6Index = MEE6[Math.floor(Math.random() * MEE6.length)]; - message.delete(); - message.channel.send(`${MEE6Index}`); - }, -}; diff --git a/cat/Path/gg.js b/cat/Path/gg.js deleted file mode 100644 index f3df604..0000000 --- a/cat/Path/gg.js +++ /dev/null @@ -1,26 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "gg", - timeout: 15000, - - run: async (client, message, args) => { - const GG = [ - "**GIT GUD**", - "Git gud kid", - "good game *question mark*", - "gg l0ser", - "delet cod gg", - "*ggwp*", - "I was lagging doe", - "```Stop using this command```", - " ez pz ", - "", - "**GOOD GAME WELL PLAYED**", - " get rektd ", - "", - ]; - const GGIndex = GG[Math.floor(Math.random() * GG.length)]; - message.delete(); - message.channel.send(`${GGIndex}`); - }, -}; diff --git a/cat/Path/how.js b/cat/Path/how.js deleted file mode 100644 index 1f326fd..0000000 --- a/cat/Path/how.js +++ /dev/null @@ -1,25 +0,0 @@ -const { MessageEmbed } = require("discord.js"); -module.exports = { - name: "howgae", - description: "Check how gae is the user", - usage: "(User)", - Path: true, - - run: async (client, message, args) => { - const target = message.mentions.users.first() || message.author; - if (target.id === "366562874039992331") { - message.channel.send( - new MessageEmbed() - .setTitle(`${target.username}'s gae rate`) - .setDescription(`You are 69420% gae`) - ); - } else { - let simp = Math.floor(Math.random() * 100); - message.channel.send( - new MessageEmbed() - .setTitle(`${target.username}'s gae rate`) - .setDescription(`You are ${simp}% gae`) - ); - } - }, -}; diff --git a/cat/Path/nab.js b/cat/Path/nab.js deleted file mode 100644 index 77b57f2..0000000 --- a/cat/Path/nab.js +++ /dev/null @@ -1,30 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "nab", - timeout: 15000, - - run: async (client, message, args) => { - const NAB = [ - "stop being a nab, nab", - "Lmao you a nab", - "Biggest nab of all time", - "You're just a nab", - "Okay calm down nab", - "**Stop** spamming this command you **nab**", - "```I told you to stop spamming this command nab```", - "Get rekt nab XD Jajajajajaja", - "**N.A.B.**", - "Better luck next time nab", - "Ooooh look at me im better than you nab", - "Whoever used C.nab, is a nab", - "Stfu nab", - "**you cant aim**", - "*bonjour* nab", - "u = ", - "Go back to tiktok ", - ]; - const NABIndex = NAB[Math.floor(Math.random() * NAB.length)]; - message.delete(); - message.channel.send(`${NABIndex}`); - }, -}; diff --git a/cat/Path/pp.js b/cat/Path/pp.js deleted file mode 100644 index e688c4e..0000000 --- a/cat/Path/pp.js +++ /dev/null @@ -1,20 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "pp", - description: "Check how long is the user", - usage: "(User)", - - run: async (client, message, args) => { - let user = message.mentions.users.first() || message.author; - let embed = new MessageEmbed() - .addField( - `${user.username}\'s peepee`, - `8${"=".repeat(Math.floor(Math.random() * 20))}D` - ) - .setColor(client.color) - .setTitle("Peepee size machine") - .setTimestamp() - .setFooter(`Made by ${client.author}`); - message.inlineReply(embed); - }, -}; diff --git a/cat/fantastic.js b/cat/fantastic.js deleted file mode 100644 index 8742380..0000000 --- a/cat/fantastic.js +++ /dev/null @@ -1,13 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "fantastic", - timeout: 60000, - - run: async (client, message, args) => { - message.delete(); - const player = args.join(" ") || message.author.username; - message.channel.send( - `${player} is a fantastic CoDM player. Just need to work on communication, map awareness, info scouting, bomb plants, positioning, teamfighting, gun skill , utility usage, rotations and getting kills.` - ); - }, -}; diff --git a/cat/fight.js b/cat/fight.js deleted file mode 100644 index 49eee9c..0000000 --- a/cat/fight.js +++ /dev/null @@ -1,72 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "fight", - description: "Goooooooooooooooolag!", - timeout: 15000, - - run: async (client, message, args) => { - const gaes = [ - "Gae", - "Super Gae", - "Ultra Gae", - "Snow Gae", - "Ultimate Gae", - "Terminal Gae", - "Akimbo Gae", - "Dead(extended timer)", - "Mega Gae", - "Cheez Gae", - "Gath Gae", - "Koosun Gae", - "KDR Gae", - "Gaezer Gae", - "Big Gae", - "Horni Gae", - "Zero Gae", - "Gae beyond repair", - "Dead×2(extended timer)", - "Not Gae", - "Animus Gae", - "Dust Gae", - "Orcus Gae", - "Gulag Cleaner", - "Kedar Gae", - "Smol Gae", - "Meta Gae", - "Mono Gae", - "Stippled Gae", - "BSA Gae", - "Oreo Gae", - "Random Gae", - "Tortol Gae", - "Amogus Gae", - "Gae×2", - "Dan Gae", - "Real Gae©®™", - "Mastered Ultra Instinct Gae", - "Bamboozled", - "More Gae", - "Morrre Gae", - "Most Gae", - "Undisputable Gae", - "Gae Prince of Horni", - "Gae with Y", - "Phatopenisis Gae", - "Gathophile", - "a Bot", - "locknload with 200 round RPD gae", - "ros gae", - "Cath Gae", - "Cat drinking a cat gae", - "Night Gae", - ]; - const gae = gaes[Math.floor(Math.random() * gaes.length)]; - const embed = new MessageEmbed() - .setTitle("**Gulag Fight**") - .setDescription( - `**${message.author} has taken a chance at redemption in The Gulag. \nYou fight only to find out that you're \`${gae}\`. If you somehow turned out to not be gae, DM an admin to get your timer halved ||only if your mute is less than 69m||**` - ) - .setColor(5198940); - message.channel.send({ embeds: [embed] }); - }, -}; diff --git a/cat/gae.js b/cat/gae.js deleted file mode 100644 index 4adb457..0000000 --- a/cat/gae.js +++ /dev/null @@ -1,37 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "gae", - timeout: 15000, - - run: async (client, message, args) => { - const MEE6 = [ - "u = gae", - "pLeaSe gAE", - "REEEEEEEEEEEEEEEEEEEEEE*GAE*EEEEEEEEEEEEEEEEEEEEEEEEEEE", - "Enough with the gae jokes, U gae", - "Plain ol' gae", - "", - "By the way, Deity bot is my senpai.\nShe is the most beautiful bot I've ever seen <3", - "aight imma gae out", - "*gae with extra steps*", - "**wae r u gae**", - "u gae bro?", - "**100%** gae", - "I bet you do **tiktok**", - "**G.A.E.**", - "The next person to chat is gae", - "Whoever used C.gae, is **gae**", - "*Its ok to be gae*", - "*succ my* **cheez**", - "**gae gae gae gae gae gae**", - "**Be gae**", - "There's no cooldown so y'all get muted for being *gae*", - "Ok stop using this command, really. U gae?", - "What the hell, u gae?", - "**GAEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE**", - ]; - const MEE6Index = MEE6[Math.floor(Math.random() * MEE6.length)]; - message.delete(); - message.channel.send(`${MEE6Index}`); - }, -}; diff --git a/cat/gg.js b/cat/gg.js deleted file mode 100644 index f3df604..0000000 --- a/cat/gg.js +++ /dev/null @@ -1,26 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "gg", - timeout: 15000, - - run: async (client, message, args) => { - const GG = [ - "**GIT GUD**", - "Git gud kid", - "good game *question mark*", - "gg l0ser", - "delet cod gg", - "*ggwp*", - "I was lagging doe", - "```Stop using this command```", - " ez pz ", - "", - "**GOOD GAME WELL PLAYED**", - " get rektd ", - "", - ]; - const GGIndex = GG[Math.floor(Math.random() * GG.length)]; - message.delete(); - message.channel.send(`${GGIndex}`); - }, -}; diff --git a/cat/how.js b/cat/how.js deleted file mode 100644 index 5a342fa..0000000 --- a/cat/how.js +++ /dev/null @@ -1,19 +0,0 @@ -const { MessageEmbed } = require("discord.js"); -module.exports = { - name: "howgae", - description: "Check how gae is the user", - usage: "(User)", - Path: true, - - run: async (client, message, args) => { - const target = message.mentions.users.first() || message.author; - let simp = Math.floor(Math.random() * 100); - message.reply({ - embeds: [ - new MessageEmbed() - .setTitle(`${target.username}'s gae rate`) - .setDescription(`You are ${simp}% gae`), - ], - }); - }, -}; diff --git a/cat/nab.js b/cat/nab.js deleted file mode 100644 index 77b57f2..0000000 --- a/cat/nab.js +++ /dev/null @@ -1,30 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "nab", - timeout: 15000, - - run: async (client, message, args) => { - const NAB = [ - "stop being a nab, nab", - "Lmao you a nab", - "Biggest nab of all time", - "You're just a nab", - "Okay calm down nab", - "**Stop** spamming this command you **nab**", - "```I told you to stop spamming this command nab```", - "Get rekt nab XD Jajajajajaja", - "**N.A.B.**", - "Better luck next time nab", - "Ooooh look at me im better than you nab", - "Whoever used C.nab, is a nab", - "Stfu nab", - "**you cant aim**", - "*bonjour* nab", - "u = ", - "Go back to tiktok ", - ]; - const NABIndex = NAB[Math.floor(Math.random() * NAB.length)]; - message.delete(); - message.channel.send(`${NABIndex}`); - }, -}; diff --git a/cat/pp.js b/cat/pp.js deleted file mode 100644 index ea11be5..0000000 --- a/cat/pp.js +++ /dev/null @@ -1,22 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "pp", - description: "Check how long is the user", - usage: "(User)", - - run: async (client, message, args) => { - let user = message.mentions.users.first() || message.author; - let embed = new MessageEmbed() - .addField( - `${user.username}\'s peepee`, - `8${"=".repeat(Math.floor(Math.random() * 20))}D` - ) - .setColor(client.color) - .setTitle("Peepee size machine") - .setTimestamp() - .setFooter(`Made by ${client.author}`); - message.reply({ - embeds: [embed], - }); - }, -}; diff --git a/command/Economy/bet.js b/command/Economy/bet.js new file mode 100644 index 0000000..3440bd3 --- /dev/null +++ b/command/Economy/bet.js @@ -0,0 +1,53 @@ +const { MessageEmbed } = require("discord.js"); +module.exports = { + name: "gamble", + usage: "(Number)", + timeout: 5000, + description: "Win double amount of coins or lose all coins", + category: "Economy", + options: [ + { + type: 10, + name: "cp", + description: "The number of CP you want to bet", + required: true, + }, + ], + run: async (client, interaction, args, utils, data) => { + const max = 1000000; + const amt = args[0]; + if ((await client.bal(interaction.user.id)) < amt) { + return client.serr(interaction, "Economy", "bet", 20); + } + if (amt > max) { + return client.serr(interaction, "Economy", "bet", 101); + } + if (utils.toBool() === true) { + const winamt = amt * 1; + await client.add(interaction.user.id, winamt, interaction); + await client.ADDBWin(interaction.user.id); + const abc = new MessageEmbed() + .setColor("GREEN") + .setTimestamp() + .setTitle(`${interaction.user.username} wins a gamble game`) + .setDescription( + `You win\n**${winamt}**${client.currency}\nYou now have **${ + parseInt(await client.bal(interaction.user.id)) + amt + }**${client.currency}` + ); + await interaction.followUp({ embeds: [abc] }); + } else { + await client.rmv(interaction.user.id, amt); + const cba = new MessageEmbed() + .setColor("RED") + .setTimestamp() + .setTitle(`${interaction.user.username} loses a gamble game`) + .setDescription( + `You lost\n**${amt}**${client.currency}\nYou now have **${ + parseInt(await client.bal(interaction.user.id)) - amt + }**${client.currency}` + ); + await interaction.followUp({ embeds: [cba] }); + } + }, +}; diff --git a/commands/Economy/inv.js b/command/Economy/inv.js similarity index 50% rename from commands/Economy/inv.js rename to command/Economy/inv.js index 3ec0a11..f28531b 100644 --- a/commands/Economy/inv.js +++ b/command/Economy/inv.js @@ -1,57 +1,56 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); +const { MessageEmbed } = require("discord.js"); const inv = require("../../models/econ"); const util = require("../../util/pagination/pagination"); module.exports = { name: "inventory", - aliases: ["inv"], description: "Check the inventory of an user", usage: "{User}", category: "Economy", timeout: 5000, - run: async (client, message, args) => { - const p = await client.prefix(message); + options: [ + { + type: 6, + name: "user", + description: "The user you want to see", + required: false, + }, + ], + run: async (client, interaction, args, data, utils) => { const user = - message.mentions.users.first() || - message.guild.members.cache.get(args[0]) || - message.guild.members.cache.find( - r => - r.user.username.toLowerCase() === args.join(" ").toLocaleLowerCase() - ) || - message.guild.members.cache.find( - r => r.displayName.toLowerCase() === args.join(" ").toLocaleLowerCase() - ) || - message.member; + interaction.guild.members.cache.get(args[0]) || interaction.member; inv.findOne({ User: user.id }, async (err, data) => { if (data) { if (!data.Inventory) - return client.err(message, "Economy", "inv", 25); - if (data.Inventory === undefined) return client.err(message, "Economy", "inv", 25) + return interaction.followUp({ + content: `User doesn't have any data`, + }); const mappedData = Object.keys(data.Inventory).map(key => { if (data.Inventory[key] == 0) { return; } return `\n**${key}** — ${data.Inventory[key]}`; }); - if (mappedData.length == 0) { - return client.err(message, "Economy", "inv", 25); + return interaction.followUp({ + content: `User doesn't have any data`, + }); } const c = util.chunk(mappedData, 5).map(x => x.join("\n")); const embed = new MessageEmbed() .setTimestamp() .setTitle(`${user.displayName}'s inventory`) - .setColor("client.color") + .setColor(client.color) .setDescription(c[0]) .setFooter(`Page 1 of ${c.length}`); try { - const msg = await message.channel.send(embed); + const msg = await interaction.followUp({ embeds: [embed] }); if (mappedData.length > 5) - await util.pagination(msg, message.author, c); + await util.pagination(msg, interaction.user, c); } catch (e) { console.log(e); } - } - else return client.err(message, "Economy", "inv", 25); + } else + return interaction.followUp({ content: `User doesn't have any data` }); }); - } -} \ No newline at end of file + }, +}; diff --git a/commands/Economy/lb.js b/command/Economy/lb.js similarity index 52% rename from commands/Economy/lb.js rename to command/Economy/lb.js index 0832b31..c13f84b 100644 --- a/commands/Economy/lb.js +++ b/command/Economy/lb.js @@ -1,16 +1,18 @@ const Levels = require("discord-xp"); -const { Client, Message, MessageEmbed } = require("discord.js"); +const { MessageEmbed } = require("discord.js"); module.exports = { name: "leaderboard", - aliases: ["lb"], timeout: 5000, - usage: "Check the leaderboard of a server", + description: "Check the leaderboard of a server", category: "Economy", Level: true, - run: async (client, message, args) => { - const rawLeaderboard = await Levels.fetchLeaderboard(message.guild.id, 10); + run: async (client, interaction, args) => { + const rawLeaderboard = await Levels.fetchLeaderboard( + interaction.guild.id, + 10 + ); if (rawLeaderboard.length < 1) - return client.err(message, "Economy", "lb", 10); + return interaction.followUp({ content: "There isn't any data" }); const leaderboard = await Levels.computeLeaderboard( client, rawLeaderboard, @@ -23,13 +25,13 @@ module.exports = { } XP: ${e.xp.toLocaleString()}` ); const embed = new MessageEmbed() - .setTitle(`**Leaderboard for ${message.guild.name}**`) + .setTitle(`**Leaderboard for ${interaction.guild.name}**`) .setDescription(`\n${lb.join("\n")}`) .setFooter( - `Requested by ${message.author.tag}`, - message.author.displayAvatarURL({ dynamic: true }) + `Requested by ${interaction.user.tag}`, + interaction.user.displayAvatarURL({ dynamic: true }) ) .setColor(client.color); - message.reply(embed); + interaction.followUp({ embeds: [embed] }); }, }; diff --git a/command/Economy/profile.js b/command/Economy/profile.js new file mode 100644 index 0000000..0ba6487 --- /dev/null +++ b/command/Economy/profile.js @@ -0,0 +1,46 @@ +const { MessageEmbed } = require("discord.js"); +module.exports = { + name: "profile", + usage: "(User)", + description: "Check an user economy profile", + type: "CHAT_INPUT", + options: [ + { + type: 6, + name: "user", + description: "The user you want to see", + required: false, + }, + ], + run: async (client, interaction, args, data, utils) => { + const user = + interaction.guild.members.cache.get(args[0]) || interaction.member; + const bjwin = await client.bjWin(user.user.id); + const swin = await client.sWin(user.user.id); + const bwin = await client.bWin(user.user.id); + const cmdused = await client.cmdsUSED(user.user.id); + const bal = await client.bal(user.user.id); + const multi = await client.multi(interaction); + const game = new MessageEmbed() + .setFooter( + `Requested by ${user.user.tag}`, + user.user.displayAvatarURL({ dynamic: true, size: 4096 }) + ) + .setColor("7196ef") + .setTitle(`${user.displayName}'s profile`) + .addField( + "**Stats**\n", + `🃏 Blackjack wins: \`${bjwin}\`\n` + + `🎰 Slots wins: \`${swin}\`\n` + + `🕹 Bet wins: \`${bwin}\`\n` + + `⌨️Commands used: \`${cmdused}\`\n` + + `Totalwins: \`${bjwin + swin + bwin}\``, + true + ) + .addField( + "**Balance**\n", + `💲CP: \`${bal}\`\n` + `➕Multiplier: \`${`1.${multi}x`}\`` + ); + await interaction.followUp({ embeds: [game] }); + }, +}; diff --git a/commands/Economy/shop.js b/command/Economy/shop.js similarity index 75% rename from commands/Economy/shop.js rename to command/Economy/shop.js index 5158015..ec04af5 100644 --- a/commands/Economy/shop.js +++ b/command/Economy/shop.js @@ -1,11 +1,11 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); +const { MessageEmbed } = require("discord.js"); const util = require("../../util/pagination/pagination"); const items = require("../../util/dist/item"); module.exports = { name: "shop", description: "Check the items from the shop", category: "Economy", - run: async (client, message, args) => { + run: async (client, interaction, args) => { const list = items.map((value, index) => { return `**${value.item}** — ${value.price.toLocaleString()}${ client.currency @@ -19,8 +19,8 @@ module.exports = { .setColor(client.color) .setFooter(`Page 1 of ${c.length}`); try { - const msg = await message.channel.send(embed); - if (list.length > 5) await util.pagination(msg, message.author, c); + const msg = await interaction.followUp({ embeds: [embed] }); + if (list.length > 5) await util.pagination(msg, interaction.user, c); } catch (e) { console.log(e); } diff --git a/commands/Economy/slots.js b/command/Economy/slots.js similarity index 65% rename from commands/Economy/slots.js rename to command/Economy/slots.js index deccd4a..3e6151b 100644 --- a/commands/Economy/slots.js +++ b/command/Economy/slots.js @@ -1,11 +1,19 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); +const { MessageEmbed } = require("discord.js"); module.exports = { name: "slots", usage: "(Number)", timeout: 5000, description: "Win more coins by slots", category: "Economy", - run: async (client, message, args) => { + options: [ + { + type: 10, + name: "cp", + description: "The number of CP you want to bet", + required: true, + }, + ], + run: async (client, interaction, args) => { const max = 1000000; const slots = [ "<:blushca:852174555513618502>", @@ -21,12 +29,10 @@ module.exports = { const slotseven = slots[Math.floor(Math.random() * slots.length)]; const sloteight = slots[Math.floor(Math.random() * slots.length)]; const slotnine = slots[Math.floor(Math.random() * slots.length)]; - if (!args[0]) return client.err(message, "Economy", "slots", 5); - if (isNaN(args[0])) return client.err(message, "Economy", "slots", 7); - const amt = parseInt(args[0]); - if (amt > max) return client.err(message, "Economy", "slots", 101); - if ((await client.bal(message.author.id)) < amt) { - return client.err(message, "Economy", "slots", 20); + const amt = args[0]; + if (amt > max) return client.serr(interaction, "Economy", "bet", 101); + if ((await client.bal(interaction.user.id)) < amt) { + return client.serr(interaction, "Economy", "bet", 20); } if ( (slotOne === slotTwo && slotOne === slotThree) || @@ -34,10 +40,12 @@ module.exports = { (slotseven === sloteight && slotseven === slotnine) ) { const winamt = Math.floor(Math.random() * 2 * amt); - await client.add(message.author.id, winamt, message); - await client.ADDSWin(message.author.id); + await client.add(interaction.user.id, winamt, interaction); + await client.ADDSWin(interaction.user.id); const won = new MessageEmbed() .setColor("GREEN") + .setFooter(`Made by ${client.author}`) + .setTimestamp() .addField( "|-----|-----|----|", `| ${slotfour} | ${slotfive} | ${slotsix} |` @@ -50,17 +58,19 @@ module.exports = { "|-----|-----|----|", `| ${slotseven} | ${sloteight} | ${slotnine} |` ) - .setTitle(`${message.author.username} wins a slots game`) + .setTitle(`${interaction.user.username} wins a slots game`) .setDescription( - `You win\n**${winamt}**${client.currency}\nYou now have **${ - parseInt(await client.bal(message.author.id)) - amt + `You win\n**${winamt + amt}**${client.currency}\nYou now have **${ + parseInt(await client.bal(interaction.user.id)) - amt }**${client.currency}` ); - message.reply(won); + interaction.followUp({ embeds: [won] }); } else { - await client.rmv(message.author.id, amt); + await client.rmv(interaction.user.id, amt); const lost = new MessageEmbed() .setColor("RED") + .setFooter(`Made by ${client.author}`) + .setTimestamp() .addField( "|-----|-----|----|", `| ${slotfour} | ${slotfive} | ${slotsix} |` @@ -73,13 +83,13 @@ module.exports = { "|-----|-----|----|", `| ${slotseven} | ${sloteight} | ${slotnine} |` ) - .setTitle(`${message.author.username} loses a slots game`) + .setTitle(`${interaction.user.username} loses a slots game`) .setDescription( `You lost\n**${amt}**${client.currency}\nYou now have **${ - parseInt(await client.bal(message.author.id)) - amt + parseInt(await client.bal(interaction.user.id)) - amt }**${client.currency}` ); - message.reply(lost); + interaction.followUp({ embeds: [lost] }); } }, }; diff --git a/commands/Economy/work.js b/command/Economy/work.js similarity index 52% rename from commands/Economy/work.js rename to command/Economy/work.js index 5d3b4f1..f0424a2 100644 --- a/commands/Economy/work.js +++ b/command/Economy/work.js @@ -1,10 +1,9 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); module.exports = { name: "work", description: "Work to earn money", category: "Economy", timeout: 1000 * 60 * 10, - run: async (client, message, args) => { + run: async (client, interaction, args, utils) => { const job = [ "Software engineer", "Programmer", @@ -15,11 +14,11 @@ module.exports = { "Editor", "Banker", ]; - const earning = client.function.rndint(5000, 3000); + const earning = utils.rndint(5000, 3000); const jobs = job[Math.floor(Math.random() * job.length)]; - await client.add(message.author.id, earning, message); - return message.reply( - `You worked as a **${jobs}** and earned **${earning}${client.currency}**` - ); + await client.add(interaction.user.id, earning, interaction); + interaction.followUp({ + content: `You worked as a **${jobs}** and earned **${earning}${client.currency}**`, + }); }, }; diff --git a/command/Fun/8ball.js b/command/Fun/8ball.js index 0e464a7..f008b4a 100644 --- a/command/Fun/8ball.js +++ b/command/Fun/8ball.js @@ -1,5 +1,5 @@ const { MessageEmbed } = require("discord.js"); -const axios = require("axios"); +const { random8ball } = require("cath"); module.exports = { name: "8ball", usage: "(Question)", @@ -15,9 +15,7 @@ module.exports = { }, ], run: async (client, interaction, args) => { - const data = await axios - .get(`${process.env.api}/api/v1/fun/8ball`) - .then(res => res.data.answer); + const data = await random8ball(); const embed = new MessageEmbed() .setAuthor( `🎱 ${interaction.member.user.tag} asks`, diff --git a/command/Fun/cat.js b/command/Fun/cat.js index 536846e..68f81e5 100644 --- a/command/Fun/cat.js +++ b/command/Fun/cat.js @@ -1,5 +1,5 @@ const { MessageEmbed } = require("discord.js"); -const fetch = require("node-fetch"); +const { getreddit } = require("cath"); module.exports = { name: "cat", category: "Fun", @@ -7,29 +7,22 @@ module.exports = { run: async (client, interaction, args) => { let subreddits = ["cat", "cats"]; let subreddit = subreddits[Math.floor(Math.random() * subreddits.length)]; - fetch(`https://www.reddit.com/r/${subreddit}/random/.json`).then( - async res => { - let content = await res.json(); - let permalink = content[0].data.children[0].data.permalink; - let memeURL = `https://reddit.com${permalink}`; - let memeImage = content[0].data.children[0].data.url; - let memeTitle = content[0].data.children[0].data.title; - let memeUpvotes = content[0].data.children[0].data.ups; - let memeDownvotes = content[0].data.children[0].data.downs; - let memeNumComments = content[0].data.children[0].data.num_comments; - const memeEmbed = new MessageEmbed() - .setTitle(`A cat image | ${memeTitle}`) - .setAuthor( - interaction.member.user.tag, - interaction.user.displayAvatarURL({ dynamic: true }) - ) - .setURL(`${memeURL}`) - .setImage(memeImage) - .setTimestamp() - .setColor(client.color) - .setFooter(` 👍 ${memeUpvotes} 💬 ${memeNumComments}`); - await interaction.followUp({ embeds: [memeEmbed] }); - } - ); + const data = await getreddit(subreddit); + await interaction.followUp({ + embeds: [ + new MessageEmbed({ + title: data.title, + url: data.url, + image: { url: data.image }, + timestamp: Date.now(), + footer: { text: data.footer }, + color: client.color, + author: { + name: interaction.member.user.tag, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }), + }, + }), + ], + }); }, }; diff --git a/command/Fun/dog.js b/command/Fun/dog.js index 32f9389..5a72f2a 100644 --- a/command/Fun/dog.js +++ b/command/Fun/dog.js @@ -1,5 +1,5 @@ const { MessageEmbed } = require("discord.js"); -const fetch = require("node-fetch"); +const { getreddit } = require("cath"); module.exports = { name: "dog", category: "Fun", @@ -7,29 +7,22 @@ module.exports = { run: async (client, interaction, args) => { let subreddits = ["dog", "dogs"]; let subreddit = subreddits[Math.floor(Math.random() * subreddits.length)]; - fetch(`https://www.reddit.com/r/${subreddit}/random/.json`).then( - async res => { - let content = await res.json(); - let permalink = content[0].data.children[0].data.permalink; - let memeURL = `https://reddit.com${permalink}`; - let memeImage = content[0].data.children[0].data.url; - let memeTitle = content[0].data.children[0].data.title; - let memeUpvotes = content[0].data.children[0].data.ups; - let memeDownvotes = content[0].data.children[0].data.downs; - let memeNumComments = content[0].data.children[0].data.num_comments; - const memeEmbed = new MessageEmbed() - .setTitle(`A dog image | ${memeTitle}`) - .setAuthor( - interaction.member.user.tag, - interaction.user.displayAvatarURL({ dynamic: true }) - ) - .setURL(`${memeURL}`) - .setImage(memeImage) - .setTimestamp() - .setColor(client.color) - .setFooter(` 👍 ${memeUpvotes} 💬 ${memeNumComments}`); - await interaction.followUp({ embeds: [memeEmbed] }); - } - ); + const data = await getreddit(subreddit); + await interaction.followUp({ + embeds: [ + new MessageEmbed({ + title: data.title, + url: data.url, + image: { url: data.image }, + timestamp: Date.now(), + footer: { text: data.footer }, + color: client.color, + author: { + name: interaction.member.user.tag, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }), + }, + }), + ], + }); }, }; diff --git a/command/Fun/drake.js b/command/Fun/drake.js index a51bbdb..27d0db4 100644 --- a/command/Fun/drake.js +++ b/command/Fun/drake.js @@ -1,5 +1,5 @@ const { MessageAttachment } = require("discord.js"); -const fetch = require("node-fetch"); +const axios = require("axios"); module.exports = { name: "drake", description: "Drake meme", @@ -20,7 +20,7 @@ module.exports = { }, ], run: async (client, interaction, args) => { - const res = await fetch( + const res = await axios.get( `https://frenchnoodles.xyz/api/endpoints/drake/?text1=${args[0]}&text2=${args[1]}`, {} ); diff --git a/command/Fun/ds.js b/command/Fun/ds.js index e009586..c99d3e5 100644 --- a/command/Fun/ds.js +++ b/command/Fun/ds.js @@ -1,4 +1,4 @@ -const fetch = require("node-fetch"); +const axios = require("axios"); module.exports = { name: "doublestruck", description: "Doublestruck your text", @@ -15,7 +15,7 @@ module.exports = { ], run: async (client, interaction, args) => { let text = args[0].split(" ").join("+"); - let res = await fetch( + let res = await axios.get( "https://api.popcatdev.repl.co/doublestruck?text=" + text ); let json = await res.json(); diff --git a/commands/Fun/hangman.js b/command/Fun/hangman.js similarity index 60% rename from commands/Fun/hangman.js rename to command/Fun/hangman.js index 1de8918..505a064 100644 --- a/commands/Fun/hangman.js +++ b/command/Fun/hangman.js @@ -1,21 +1,22 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -const { stripIndents } = require("common-tags"); -const { get } = require("node-superfetch"); +const axios = require("axios"); +const { MessageEmbed } = require("discord.js"); const playing = new Set(); module.exports = { name: "hangman", description: "Play a hangman game", category: "Fun", - run: async (client, message, args) => { - if (playing.has(message.channel.id)) - return message.reply("Only one game may be occurring per channel."); - playing.add(message.channel.id); + run: async (client, interaction, args) => { + await interaction.deleteReply(); + if (playing.has(interaction.channel.id)) + return interaction.followUp({ + content: "Only one game may be occurring per channel.", + }); + playing.add(interaction.channel.id); try { - const { body } = await get("https://emilia-api.xyz/api/hangman").set( - "Authorization", - `Bearer MzU2MDA1NzA4MTQ5NTU1MjAy.5r4BVOkZX8L1ial8chloqopkphU0w19us0UbqgxOQOo` - ); - const word = body.word; + const data = await axios + .get(`${process.env.api}/api/v1/fun/hangman`) + .then(res => res.data); + const word = data.word; let points = 0; let displayText = null; let guessed = false; @@ -25,7 +26,12 @@ module.exports = { while (word.length !== confirmation.length && points < 6) { const embed = new MessageEmbed() .setColor(client.color) - .setTitle("Hangman game").setDescription(stripIndents` + .setFooter( + interaction.user.tag, + interaction.user.displayAvatarURL({ dynamic: true }) + ) + .setTimestamp() + .setTitle("Hangman game").setDescription(` ${displayText === null ? "Here we go!" : displayText ? "Good job!" : "Nope!"} \`${display.join(" ")}\`. Which letter do you choose? Incorrect Tries: ${incorrect.join(", ") || "None"} @@ -40,22 +46,23 @@ module.exports = { ============= \`\`\` `); - let m = await message.channel.send(embed); + let m = await interaction.channel.send({ embeds: [embed] }); const filter = res => { const choice = res.content.toLowerCase(); return ( - res.author.id === message.author.id && + res.author.id === interaction.user.id && !confirmation.includes(choice) && !incorrect.includes(choice) ); }; - const guess = await message.channel.awaitMessages(filter, { + const guess = await interaction.channel.awaitMessages({ + filter, max: 1, time: 30000, }); //m.delete(); if (!guess.size) { - await message.reply("Sorry, time is up!"); + await interaction.channel.send({ content: "Sorry, time is up!" }); break; } const choice = guess.first().content.toLowerCase(); @@ -76,12 +83,17 @@ module.exports = { points++; } } - playing.delete(message.channel.id); + playing.delete(interaction.channel.id); if (word.length === confirmation.length || guessed) - return message.channel.send(`You won. The word is **${word}**!`); - return message.channel.send(`You lost. The word is **${word}**.`); + return interaction.channel.send({ + content: `You won. The word is **${word}**!`, + }); + return interaction.channel.send({ + content: `You lost. The word is **${word}**.`, + }); } catch (err) { - playing.delete(message.channel.id); + console.log(err); + playing.delete(interaction.channel.id); } }, }; diff --git a/command/Fun/kiss.js b/command/Fun/kiss.js index 184bcd4..eeaa048 100644 --- a/command/Fun/kiss.js +++ b/command/Fun/kiss.js @@ -1,4 +1,4 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); +const { MessageEmbed } = require("discord.js"); module.exports = { name: "kiss", description: "Kiss someone", diff --git a/command/Fun/meme.js b/command/Fun/meme.js index a62c1d5..dd0ca06 100644 --- a/command/Fun/meme.js +++ b/command/Fun/meme.js @@ -1,5 +1,5 @@ const { MessageEmbed } = require("discord.js"); -const fetch = require("node-fetch"); +const { getreddit } = require("cath"); module.exports = { name: "meme", category: "Fun", @@ -7,29 +7,22 @@ module.exports = { run: async (client, interaction, args) => { let subreddits = ["comedyheaven", "dank", "meme", "memes"]; let subreddit = subreddits[Math.floor(Math.random() * subreddits.length)]; - fetch(`https://www.reddit.com/r/${subreddit}/random/.json`).then( - async res => { - let content = await res.json(); - let permalink = content[0].data.children[0].data.permalink; - let memeURL = `https://reddit.com${permalink}`; - let memeImage = content[0].data.children[0].data.url; - let memeTitle = content[0].data.children[0].data.title; - let memeUpvotes = content[0].data.children[0].data.ups; - let memeDownvotes = content[0].data.children[0].data.downs; - let memeNumComments = content[0].data.children[0].data.num_comments; - const memeEmbed = new MessageEmbed() - .setTitle(`${memeTitle}`) - .setAuthor( - interaction.member.user.tag, - interaction.user.displayAvatarURL({ dynamic: true }) - ) - .setURL(`${memeURL}`) - .setImage(memeImage) - .setTimestamp() - .setColor(client.color) - .setFooter(` 👍 ${memeUpvotes} 💬 ${memeNumComments}`); - await interaction.followUp({ embeds: [memeEmbed] }); - } - ); + const data = await getreddit(subreddit); + await interaction.followUp({ + embeds: [ + new MessageEmbed({ + title: data.title, + url: data.url, + image: { url: data.image }, + timestamp: Date.now(), + footer: { text: data.footer }, + color: client.color, + author: { + name: interaction.member.user.tag, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }), + }, + }), + ], + }); }, }; diff --git a/command/Fun/simprate.js b/command/Fun/simprate.js new file mode 100644 index 0000000..6aa4fc9 --- /dev/null +++ b/command/Fun/simprate.js @@ -0,0 +1,34 @@ +const { MessageEmbed } = require("discord.js"); + +module.exports = { + name: "simprate", + description: "Check how simp is the user", + usage: "(@User)", + category: "Fun", + options: [ + { + type: 6, + name: "user", + description: "The user you want to see", + required: true, + }, + ], + run: async (client, interaction, args) => { + let simp = Math.floor(Math.random() * 100); + let user = interaction.guild.members.cache.get(args[0]); + interaction.followUp({ + embeds: [ + new MessageEmbed() + .setTitle(`${user.user.username}'s simp rate`) + .setDescription(`${user.user.username} is a ${simp}% simp`) + .setColor(client.color) + .setFooter(`Made by ${client.author}`) + .setTimestamp() + .setAuthor( + `Requested by ${interaction.user.tag}`, + interaction.user.displayAvatarURL({ dynamic: true }) + ), + ], + }); + }, +}; diff --git a/command/Information/botinfo.js b/command/Information/botinfo.js index a0ca047..f7a3695 100644 --- a/command/Information/botinfo.js +++ b/command/Information/botinfo.js @@ -2,13 +2,12 @@ const { MessageEmbed, version: djsversion } = require("discord.js"); const version = require("../../package.json").version; const { utc } = require("moment"); const os = require("os"); -const ms = require("ms"); module.exports = { name: "botinfo", description: "Check the info of the bot", category: "Information", type: "CHAT_INPUT", - run: async (client, interaction, args) => { + run: async (client, interaction, args, utils) => { const core = os.cpus()[0]; const embed = new MessageEmbed() .setURL(client.web) @@ -35,7 +34,7 @@ module.exports = { .addField( "System", `**❯ Platform:** ${process.platform} - **❯ Uptime:** ${ms(os.uptime() * 1000, { long: true })} + **❯ Uptime:** ${utils.timer(os.uptime() * 1000, { long: true })} **❯ CPU:** \u3000 Cores: ${os.cpus().length} \u3000 Model: ${core.model} diff --git a/command/Information/help.js b/command/Information/help.js index 644e5b6..f051cbd 100644 --- a/command/Information/help.js +++ b/command/Information/help.js @@ -64,7 +64,11 @@ module.exports = { "**Premium**", "**You can either boost support server or subscribe to developer's team [Ko-fi](https://ko-fi.com/cathteam) or gift a nitro to one of the developer team **" ) - .setFooter(`Made by ${client.author}`); + .setURL(client.web) + .setFooter( + `Requested by ${interaction.user.tag}`, + interaction.user.displayAvatarURL({ dynamic: true }) + ); const components = state => [ new Discord.MessageActionRow().addComponents( new Discord.MessageSelectMenu() diff --git a/command/Moderation/purge.js b/command/Moderation/purge.js index 28ad3ba..905a5c3 100644 --- a/command/Moderation/purge.js +++ b/command/Moderation/purge.js @@ -19,49 +19,69 @@ module.exports = { ], type: "CHAT_INPUT", run: async (client, interaction, args) => { - let query = interaction.options.get("amount"); - let ch = interaction.options.get("channel"); - let channel = interaction.guild.channels.cache.get(ch.value); - if (query.value > 100) { - return interaction.followUp({ - content: "The amount of messages must be in range of 1-100", + try { + let query = interaction.options.get("amount"); + let ch = interaction.options.get("channel"); + let channel = interaction.guild.channels.cache.get(ch.value); + if (query.value > 100) { + return interaction.followUp({ + content: "The amount of messages must be in range of 1-100", + }); + } + if (channel.type !== "GUILD_TEXT") { + return interaction.followUp({ + content: "Please provide a text channel instead of voice or category", + }); + } + const limit = await interaction.channel.messages.fetch({ + limit: query.value, }); - } - if (channel.type !== "GUILD_TEXT") { - return interaction.followUp({ - content: "Please provide a text channel instead of voice or category", - }); - } - await channel.bulkDelete(query.value, true).then(async m => { - const msg = await channel.send({ - embeds: [ - new MessageEmbed() - .setTitle(`Message Cleared`) - .addField( - "**Moderator**", - `${ + await channel.bulkDelete(limit, true).then(async m => { + const results = {}; + for (const [, deleted] of m) { + const user = `${deleted.author.username}#${deleted.author.discriminator}`; + if (!results[user]) results[user] = 0; + results[user]++; + } + const userMessageMap = Object.entries(results); + channel.send({ + embeds: [ + new MessageEmbed() + .setTitle(`Message Cleared`) + .addField( + "**Moderator**", + `${ + interaction.member.nickname + ? interaction.member.nickname + : interaction.user.username + }`, + true + ) + .addField( + "Amount of Message Deleted", + `${m.size}/${query.value}`, + true + ) + .addField( + "Authors", + `${userMessageMap + .map(([user, messages]) => `**${user}** : ${messages}`) + .join("\n")}`, + false + ) + .setTimestamp() + .setFooter( interaction.member.nickname ? interaction.member.nickname - : interaction.user.username - }`, - true - ) - .addField( - "Amount of Message Deleted", - `${m.size}/${query.value}`, - true - ) - .setTimestamp() - .setFooter( - interaction.member.nickname - ? interaction.member.nickname - : interaction.user.username, - interaction.user.displayAvatarURL({ dynamic: true }) - ) - .setColor(client.color), - ], + : interaction.user.username, + interaction.user.displayAvatarURL({ dynamic: true }) + ) + .setColor(client.color), + ], + }); }); - setTimeout(() => msg.delete(), 10000); - }); + } catch (e) { + console.log(e); + } }, }; diff --git a/command/Moderation/slowmode.js b/command/Moderation/slowmode.js new file mode 100644 index 0000000..874a72f --- /dev/null +++ b/command/Moderation/slowmode.js @@ -0,0 +1,102 @@ +const Discord = require("discord.js"); +module.exports = { + name: "slowmode", + UserPerm: "MANAGE_CHANNELS", + description: "Set slowmode at a specific channel", + BotPerm: "MANAGE_CHANNELS", + usage: "(Time)", + category: "Moderation", + run: async (client, interaction, args, utils) => { + await interaction.deleteReply(); + const menu = new Discord.MessageSelectMenu() + .setCustomId("select") + .setPlaceholder("Select a time") + .addOptions([ + { label: "OFF", value: "OFF" }, + { label: "5s", value: "5s" }, + { label: "10s", value: "10s" }, + { label: "15s", value: "15s" }, + { label: "30s", value: "30s" }, + { label: "1m", value: "1m" }, + { label: "2m", value: "2m" }, + { label: "5m", value: "5m" }, + { label: "10m", value: "10m" }, + { label: "15m", value: "15m" }, + { label: "30m", value: "30m" }, + { label: "1h", value: "1h" }, + { label: "2h", value: "2h" }, + { label: "6h", value: "6h" }, + ]); + let row = new Discord.MessageActionRow().addComponents(menu); + const slowmoEmbed = new Discord.MessageEmbed() + .setColor(client.color) + .setTitle("Slowmode") + .setFooter(`Made by ${client.author}`) + .setTimestamp() + .setAuthor( + `Requested by ${interaction.user.tag}`, + interaction.user.displayAvatarURL({ dynmiac: true }) + ); + interaction.channel + .send({ embeds: [slowmoEmbed], components: [row] }) + .then(sent => { + const filter = i => { + i.deferUpdate(); + if (i.user.id === interaction.user.id) return true; + return; + }; + const collector = sent.createMessageComponentCollector({ + filter, + componentType: "SELECT_MENU", + time: 30e3, + }); + + collector.on("collect", collected => { + collector.resetTimer({ time: 30e3 }); + menu.setPlaceholder(`Set to: ${collected.values[0]}`); + row = new Discord.MessageActionRow().addComponents(menu); + if (collected.values[0] !== "OFF") { + const embed = new Discord.MessageEmbed() + .setColor("GREEN") + .setTitle("Slowmode Added") + .addField("**Moderator**", interaction.user.tag, true) + .addField("**Channel**", `<#${interaction.channel.id}>`, true) + .addField( + "**Rate**", + `${utils.ms(utils.ms(collected.values[0]), { long: true })}`, + true + ) + .setFooter( + interaction.member.displayName || interaction.user.username, + interaction.user.displayAvatarURL({ dynamic: true }) + ) + .setThumbnail(client.user.displayAvatarURL()); + interaction.channel.setRateLimitPerUser( + utils.ms(collected.values[0]) / 1e3 + ); + return sent.edit({ embeds: [embed], components: [row] }); + } else { + const embed = new Discord.MessageEmbed() + .setColor("RED") + .setTitle("Slowmode Removed") + .addField("**Moderator**", interaction.user.tag, true) + .addField("**Channel**", `<#${interaction.channel.id}>`, true) + .setFooter( + interaction.member.displayName || interaction.user.username, + interaction.user.displayAvatarURL({ dynamic: true }) + ) + .setThumbnail(client.user.displayAvatarURL()) + .setColor("RED"); + interaction.channel.setRateLimitPerUser(0); + return sent.edit({ embeds: [embed], components: [row] }); + } + }); + + collector.on("end", () => { + menu.setDisabled(true); + row = new Discord.MessageActionRow().addComponents(menu); + return sent.edit({ components: [row] }); + }); + }); + }, +}; diff --git a/command/Owner/eval.js b/command/Owner/eval.js index b9c1627..1463959 100644 --- a/command/Owner/eval.js +++ b/command/Owner/eval.js @@ -71,7 +71,8 @@ module.exports = { (evaled.length === 1 ? ["❌", "⏹️"] : reactions).some( e => e === reaction.emoji.name ) && user.id === interaction.user.id; - let collector = mainMessage.createReactionCollector(filter, { + let collector = mainMessage.createReactionCollector({ + filter, time: 300000, }); collector.on("collect", async (reaction, user) => { diff --git a/command/Owner/restart.js b/command/Owner/restart.js index 10712dc..91c7b9e 100644 --- a/command/Owner/restart.js +++ b/command/Owner/restart.js @@ -4,10 +4,11 @@ module.exports = { description: "Restart the bot", Owner: true, run: async (client, interaction, args) => { + await interaction.deleteReply(); const msg = await interaction.channel.send("Restarting..."); await client.destroy(); await client.login(process.env.TOKEN); await msg.delete(); - await interaction.followUp("Restarted"); + await interaction.channel.send("Restarted"); }, }; diff --git a/command/Utilities/docs.js b/command/Utilities/docs.js index a58e228..90cb327 100644 --- a/command/Utilities/docs.js +++ b/command/Utilities/docs.js @@ -1,4 +1,4 @@ -const fetch = require("node-fetch"); +const axios = require("axios"); module.exports = { name: "docs", usage: "(Query)", @@ -14,11 +14,12 @@ module.exports = { ], run: async (client, interaction, args) => { const query = args.join(" "); - fetch( - `https://djsdocs.sorta.moe/v2/embed?src=stable&q=${encodeURIComponent( - query - )}` - ) + await axios + .get( + `https://djsdocs.sorta.moe/v2/embed?src=stable&q=${encodeURIComponent( + query + )}` + ) .then(res => res.json()) .then(async data => { await interaction.followUp({ embeds: [data] }); diff --git a/command/Utilities/github.js b/command/Utilities/github.js new file mode 100644 index 0000000..098734f --- /dev/null +++ b/command/Utilities/github.js @@ -0,0 +1,59 @@ +const { MessageEmbed } = require("discord.js"); +const moment = require("moment"); +const axios = require("axios"); +module.exports = { + name: "github", + description: `Get Github User Information`, + options: [ + { + type: 3, + name: "username", + description: "The username you want to search", + required: true, + }, + ], + run: async (client, interaction, args) => { + try { + axios + .get(`https://api.github.com/users/${args[0]}`) + .then(res => res.data) + .then(body => { + if (body.message) + return interaction.followUp({ content: "User Not Found" }); + let { + login, + avatar_url, + name, + id, + html_url, + public_repos, + followers, + following, + location, + created_at, + bio, + } = body; + const embed = new MessageEmbed() + .setAuthor(`${login} Information`, avatar_url) + .setColor(client.color) + .setThumbnail(`${avatar_url}`) + .setTimestamp() + .addField(`Username`, `${login}`) + .addField(`ID`, `${id}`) + .addField(`Bio`, `${bio || "None"}`) + .addField(`Public Repositories`, `${public_repos || "None"}`, true) + .addField(`Followers`, `${followers}`, true) + .addField(`Following`, `${following}`, true) + .addField(`Location`, `${location || "None"}`) + .addField( + `Account Created`, + moment.utc(created_at).format("dddd, MMMM, Do YYYY") + ) + .setFooter(`Made by ${client.author}`); + interaction.followUp({ embeds: [embed] }); + }); + } catch (error) { + console.log(error); + } + }, +}; diff --git a/command/Utilities/rank.js b/command/Utilities/rank.js new file mode 100644 index 0000000..f5d5aad --- /dev/null +++ b/command/Utilities/rank.js @@ -0,0 +1,303 @@ +const Levels = require("discord-xp"); +const Canvas = require("canvas"), + Discord = require(`discord.js`); +const { registerFont } = require("canvas"); +registerFont("./util/assets/fonts/Poppins-Regular.ttf", { + family: "Poppins-Regular", +}); +registerFont("./util/assets/fonts/Poppins-SemiBold.ttf", { + family: "Poppins-Bold", +}); +module.exports = { + name: "rank", + description: "Shows an image of someone's ranking", + type: "CHAT_INPUT", + options: [ + { + type: 6, + name: "user", + description: "The user you want to see", + required: false, + }, + ], + run: async (client, interaction, args) => { + const badges = [1, 8]; + for (let i = badges[0]; i <= badges[1]; i++) client[`badge${i}`] = null; + setBadge = function (variable, value) { + const number = Number(variable); + for (let i = badges[0]; i <= badges[1]; i++) + if (number === i) { + client[`badge${number}`] = value; + break; + } + return client; + }; + + const member = + interaction.guild.members.cache.get(args[0]) || interaction.member; + + const user = await Levels.fetch(member.id, interaction.guild.id); + console.log(user); + const canvas = Canvas.createCanvas(1080, 400), + ctx = canvas.getContext("2d"); + + let BackgroundRadius = "50", //50 | 0 if u want no rounded background | 50 if u want a very rounded background + BackGroundImg = "https://images7.alphacoders.com/109/1092420.jpg", + AttachmentName = "rank.png", + Username = member.user.username, + AvatarRoundRadius = "50", // 30 if u want squared round Avatar | 100 IF u want rounded + DrawLayerColor = "#000000", + DrawLayerOpacity = "0.4", + BoxColor = "#6eaedb", //Lvl and REP Box COlor + LevelBarFill = "#ffffff", // + LevelBarBackground = "#ffffff", + Rank = user.position, + TextEXP = "20XP", + TextReputation = "+ 2.18k rep", + BarRadius = "15", + TextXpNeded = "{current}/{needed}", + CurrentXP = user.xp, + NeededXP = Levels.xpFor(parseInt(user.level) + 1); + + //SET BADGES + //setBadge("1", "Bronze") // .png | file name need to be Number_Name in this case is "1_bronze" + //setBadge("2", "Gold") // .png | file name need to be Number_Name in this case is "2_Gold" + //SET BADGES + + //BackGround + ctx.beginPath(); + ctx.moveTo(0 + Number(BackgroundRadius), 0); + ctx.lineTo(0 + 1080 - Number(BackgroundRadius), 0); + ctx.quadraticCurveTo(0 + 1080, 0, 0 + 1080, 0 + Number(BackgroundRadius)); + ctx.lineTo(0 + 1080, 0 + 400 - Number(BackgroundRadius)); + ctx.quadraticCurveTo( + 0 + 1080, + 0 + 400, + 0 + 1080 - Number(BackgroundRadius), + 0 + 400 + ); + + ctx.lineTo(0 + Number(BackgroundRadius), 0 + 400); + ctx.quadraticCurveTo(0, 0 + 400, 0, 0 + 400 - Number(BackgroundRadius)); + ctx.lineTo(0, 0 + Number(BackgroundRadius)); + ctx.quadraticCurveTo(0, 0, 0 + Number(BackgroundRadius), 0); + ctx.closePath(); + ctx.clip(); + ctx.fillStyle = "#000000"; + ctx.fillRect(0, 0, 1080, 400); + let background = await Canvas.loadImage(BackGroundImg); + ctx.drawImage(background, 0, 0, 1080, 400); + ctx.restore(); + + //Layer + ctx.fillStyle = DrawLayerColor; + ctx.globalAlpha = DrawLayerOpacity; + ctx.fillRect(40, 0, 240, canvas.height); + ctx.globalAlpha = 1; + + //RoundedBox Function + function RoundedBox(ctx, x, y, width, height, radius) { + ctx.beginPath(); + ctx.moveTo(x + radius, y); + ctx.lineTo(x + width - radius, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + radius); + ctx.lineTo(x + width, y + height - radius); + ctx.quadraticCurveTo( + x + width, + y + height, + x + width - radius, + y + height + ); + ctx.lineTo(x + radius, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - radius); + ctx.lineTo(x, y + radius); + ctx.quadraticCurveTo(x, y, x + radius, y); + ctx.closePath(); + } + + //Avatar + let avatar = await Canvas.loadImage( + member.user.displayAvatarURL({ dynamic: true, format: "png" }) + ); + ctx.save(); + RoundedBox(ctx, 40 + 30, 30, 180, 180, Number(AvatarRoundRadius)); + ctx.strokeStyle = "#BFC85A22"; + ctx.stroke(); + ctx.clip(); + ctx.drawImage(avatar, 40 + 30, 30, 180, 180); + ctx.restore(); + //Avatar + + //Reputation + ctx.save(); + RoundedBox(ctx, 40 + 30, 30 + 180 + 30, 180, 50, 10); + ctx.strokeStyle = "#BFC85A22"; + ctx.stroke(); + ctx.clip(); + ctx.fillStyle = BoxColor; + ctx.globalAlpha = "1"; + ctx.fillRect(40 + 30, 30 + 180 + 30, 180, 50, 50); + ctx.globalAlpha = 1; + ctx.fillStyle = "#ffffff"; + ctx.shadowColor = "#000000"; + ctx.shadowBlur = 20; + ctx.shadowOffsetX = 1; + ctx.shadowOffsetY = 1; + ctx.font = '32px "Poppins-Bold"'; + ctx.textAlign = "center"; + ctx.fillText(TextReputation, 40 + 30 + 180 / 2, 30 + 180 + 30 + 38); + ctx.restore(); + //Reputation + + //EXP + ctx.save(); + RoundedBox(ctx, 40 + 30, 30 + 180 + 30 + 50 + 30, 180, 50, 10); + ctx.strokeStyle = "#BFC85A22"; + ctx.stroke(); + ctx.clip(); + ctx.fillStyle = BoxColor; + ctx.globalAlpha = "1"; + ctx.fillRect(40 + 30, 30 + 180 + 30 + 50 + 30, 180, 50); + ctx.globalAlpha = 1; + ctx.fillStyle = "#ffffff"; + ctx.shadowColor = "#000000"; + ctx.shadowBlur = 20; + ctx.shadowOffsetX = 1; + ctx.shadowOffsetY = 1; + ctx.font = '32px "Poppins-Bold"'; + ctx.textAlign = "center"; + ctx.fillText(TextEXP, 40 + 30 + 180 / 2, 30 + 180 + 30 + 30 + 50 + 38); + ctx.restore(); + //EXP + + //ctx.save() + //ctx.textAlign = "left"; + //ctx.fillStyle = "#ffffff"; + //ctx.shadowColor = '#000000'; + //ctx.font = '15px "Poppins-Bold"' + //ctx.fillText(member.user.username, 390, 200); + //ctx.restore() + + //Username + ctx.save(); + ctx.textAlign = "left"; + ctx.fillStyle = "#ffffff"; + ctx.shadowColor = "#000000"; + ctx.shadowBlur = 15; + ctx.shadowOffsetX = 1; + ctx.shadowOffsetY = 1; + ctx.font = '39px "Poppins-Bold"'; + ctx.fillText(Username, 390, 80); + ctx.restore(); + //Username + + //Rank + ctx.save(); + ctx.textAlign = "right"; + ctx.fillStyle = "#ffffff"; + ctx.shadowColor = "#000000"; + ctx.shadowBlur = 15; + ctx.shadowOffsetX = 1; + ctx.shadowOffsetY = 1; + ctx.font = '55px "Poppins-Bold"'; + ctx.fillText("#" + Rank, canvas.width - 50 - 5, 80); + ctx.restore(); + + //Rank Name + ctx.save(); + ctx.textAlign = "left"; + ctx.fillStyle = "#ffffff"; + ctx.shadowColor = "#000000"; + ctx.shadowBlur = 15; + ctx.shadowOffsetX = 1; + ctx.shadowOffsetY = 1; + ctx.font = '30px "Poppins-Bold"'; + ctx.fillText("Diamond Nature", 390, 120); + ctx.restore(); + + //Badges + ctx.save(); + RoundedBox(ctx, 390, 305, 660, 70, Number(15)); + ctx.strokeStyle = "#BFC85A22"; + ctx.stroke(); + ctx.clip(); + ctx.fillStyle = "#ffffff"; + ctx.globalAlpha = "0.2"; + ctx.fillRect(390, 305, 660, 70); + ctx.restore(); + const badgeNames = ["1", "2", "3", "4", "5", "6", "7", "8"]; + for (let index = 0; index < badgeNames.length; index++) { + let badge = `badge${index + 1}`; + if (!client[badge]) { + ctx.fillStyle = "#ffffff"; + ctx.globalAlpha = "0.2"; + ctx.textAlign = "center"; + ctx.font = '90px "Poppins-Bold"'; + ctx.fillText(".", 75 * index + 450, 345); + } else { + ctx.globalAlpha = 1; + let badgeImg = await Canvas.loadImage( + ["bronze", "silver", "gold", "diamond"].includes( + client[badge].toLowerCase() + ) + ? `${__dirname}/${badgeNames[index]}_${client[ + badge + ].toLowerCase()}.png` + : client[badge] + ); + ctx.drawImage(badgeImg, 75 * index + 420, 315, 50, 50); + } + } + //Badges + + //Level Bar + ctx.save(); + RoundedBox(ctx, 390, 145, 660, 50, Number(BarRadius)); + ctx.strokeStyle = "#BFC85A22"; + ctx.stroke(); + ctx.clip(); + ctx.fillStyle = LevelBarBackground; + ctx.globalAlpha = "0.2"; + ctx.fillRect(390, 145, 660, 50, 50); + ctx.restore(); + + const percent = (100 * CurrentXP) / NeededXP; + const progress = (percent * 660) / 100; + + ctx.save(); + RoundedBox(ctx, 390, 145, progress, 50, Number(BarRadius)); + ctx.strokeStyle = "#BFC85A22"; + ctx.stroke(); + ctx.clip(); + ctx.fillStyle = LevelBarFill; + ctx.globalAlpha = "0.5"; + ctx.fillRect(390, 145, progress, 50, 50); + ctx.restore(); + + //Next Rank + ctx.save(); + ctx.textAlign = "left"; + ctx.fillStyle = "#ffffff"; + ctx.globalAlpha = "0.8"; + ctx.font = '30px "Poppins-Bold"'; + ctx.fillText("Next Rank: " + "None", 390, 230); + ctx.restore(); + + const latestXP = Number(CurrentXP) - Number(NeededXP); + const textXPEdited = TextXpNeded.replace(/{needed}/g, NeededXP) + .replace(/{current}/g, CurrentXP) + .replace(/{latest}/g, latestXP); + ctx.textAlign = "center"; + ctx.fillStyle = "#ffffff"; + ctx.globalAlpha = 1; + ctx.font = '30px "Poppins-Bold"'; + ctx.fillText(textXPEdited, 730, 180); + //Level Bar + + const attachment = new Discord.MessageAttachment( + canvas.toBuffer(), + AttachmentName + ); + await interaction.followUp({ files: [attachment] }); + }, +}; diff --git a/command/Utilities/timer.js b/command/Utilities/timer.js index ad7c086..d6c08f5 100644 --- a/command/Utilities/timer.js +++ b/command/Utilities/timer.js @@ -1,4 +1,3 @@ -const ms = require("ms"); const { MessageEmbed } = require("discord.js"); module.exports = { name: "timer", @@ -16,14 +15,18 @@ module.exports = { ], run: async (client, interaction, args, utils) => { const time = args[0]; - const mss = ms(args[0]); + const mss = utils.ms(args[0]); if (!time.endsWith("d")) { if (!time.endsWith("h")) { if (!time.endsWith("m")) { - if (!time.endsWith("s")) { - return await interaction.followUp({ - content: "You can only use valid time (Example: 3s)", - }); + if (!time.endsWith("w")) { + if (!time.endsWith("mo")) { + if (!time.endsWith("s")) { + return await interaction.followUp({ + content: "You can only use valid time (Example: 3s)", + }); + } + } } } } @@ -64,6 +67,6 @@ module.exports = { client.Timers.delete( interaction.user.id + " G " + interaction.guild.name ); - }, ms(time)); + }, utils.ms(time)); }, }; diff --git a/commands/Config/prefix-reset.js b/commands/Config/prefix-reset.js index 39f85e4..2898251 100644 --- a/commands/Config/prefix-reset.js +++ b/commands/Config/prefix-reset.js @@ -1,17 +1,16 @@ const schema = require("../../models/guilds"); const prefix = require("../../config.json").prefix; -const { confirmation } = require("@reconlx/discord.js"); module.exports = { name: "prefix-reset", aliases: ["pr"], description: 'Reset the prefix to "C." at the server', UserPerm: "ADMINISTRATOR", category: "Config", - run: async (client, message) => { + run: async (client, message, args, utils) => { message.channel - .send("**Do you want to reset your prefix?**") + .send({ content: "**Do you want to reset your prefix?**" }) .then(async msg => { - const emoji = await confirmation( + const emoji = await utils.confirmation( msg, message.author, ["✅", "❌"], @@ -25,11 +24,13 @@ module.exports = { await schema.findOneAndUpdate({ Guild: message.guild.id }, data); } }); - message.channel.send(`The prefix has been reset to **${prefix}**`); + message.channel.send({ + content: `The prefix has been reset to **${prefix}**`, + }); } if (emoji === "❌") { msg.delete(); - message.channel.send("Cancelled."); + message.channel.send({ content: "Cancelled." }); } }); }, diff --git a/commands/Economy/bal.js b/commands/Economy/bal.js deleted file mode 100644 index 23b7542..0000000 --- a/commands/Economy/bal.js +++ /dev/null @@ -1,29 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "balance", - aliases: ["bal"], - usage: "(User)", - category: "Economy", - run: async (client, message, args) => { - const user = - message.mentions.members.first() || - message.guild.members.cache.get(args[0]) || - message.guild.members.cache.find( - r => - r.user.username.toLowerCase() === args.join(" ").toLocaleLowerCase() - ) || - message.guild.members.cache.find( - r => r.displayName.toLowerCase() === args.join(" ").toLocaleLowerCase() - ) || - message.member; - const bal = await client.bal(user.id); - let embed = new MessageEmbed() - .addField(`${client.currency} Balance`, `**${bal}**`) - .setColor(client.color) - .setURL(client.web) - .setTitle(`${user.displayName}'s Balance`) - .setTimestamp() - .setFooter(`Requested by ${message.author.tag}`); - message.inlineReply(embed); - }, -}; diff --git a/commands/Economy/bet.js b/commands/Economy/bet.js deleted file mode 100644 index 5efd736..0000000 --- a/commands/Economy/bet.js +++ /dev/null @@ -1,52 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "gamble", - aliases: ["bet"], - usage: "(Number)", - timeout: 5000, - description: "Win double amount of coins or lose all coins", - category: "Economy", - run: async (client, message, args) => { - const max = 1000000; - if (!args[0]) { - return client.err(message, "Economy", "bet", 5); - } - if (isNaN(args[0])) { - return client.err(message, "Economy", "bet", 7); - } - const amt = parseInt(args[0]); - if ((await client.bal(message.author.id)) < amt) { - return client.err(message, "Economy", "bet", 20); - } - if (amt > max) { - return client.err(message, "Economy", "bet", 101); - } - if (client.function.random() === true) { - const winamt = amt * 1; - await client.add(message.author.id, winamt, message); - await client.ADDBWin(message.author.id); - const abc = new MessageEmbed() - .setColor("GREEN") - .setTimestamp() - .setTitle(`${message.author.username} wins a gamble game`) - .setDescription( - `You win\n**${winamt}**${client.currency}\nYou now have **${ - parseInt(await client.bal(message.author.id)) - amt - }**${client.currency}` - ); - message.reply(abc); - } else { - await client.rmv(message.author.id, amt); - const cba = new MessageEmbed() - .setColor("RED") - .setTimestamp() - .setTitle(`${message.author.username} loses a gamble game`) - .setDescription( - `You lost\n**${amt}**${client.currency}\nYou now have **${ - parseInt(await client.bal(message.author.id)) - amt - }**${client.currency}` - ); - message.reply(cba); - } - }, -}; diff --git a/commands/Economy/daily.js b/commands/Economy/daily.js deleted file mode 100644 index 8ce0fb1..0000000 --- a/commands/Economy/daily.js +++ /dev/null @@ -1,46 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "daily", - description: "Earns daily money", - category: "Economy", - timeout: 1000 * 60 * 60 * 24, - run: async (client, message, args) => { - var money; - const user = await client.data.getUser(message.author.id); - if (user) { - if (user.Premium == true) { - money = 20000; - let pre_embed = new MessageEmbed() - .setAuthor( - message.author.tag, - message.author.displayAvatarURL({ dyanmic: true }) - ) - .setDescription( - `**Here is your daily ${money}${client.currency}!\nThanks for supporting Cath!**` - ) - .setURL(client.web) - .setColor(client.color) - .setFooter(`Made by ${client.author}`) - .setTimestamp(); - await client.add(message.author.id, money, message); - return message.inlineReply(pre_embed); - } else { - money = 10000; - let norm_embed = new MessageEmbed() - .setAuthor( - message.author.tag, - message.author.displayAvatarURL({ dyanmic: true }) - ) - .setDescription( - `Here is your daily ${money}${client.currency}!\nBe [premium](https://discord.gg/SbQHChmGcp) user, you can get more coins everyday!` - ) - .setURL(client.web) - .setColor(client.color) - .setFooter(`Made by ${client.author}`) - .setTimestamp(); - await client.add(message.author.id, money, message); - return message.inlineReply(norm_embed); - } - } - }, -}; diff --git a/commands/Economy/profile.js b/commands/Economy/profile.js deleted file mode 100644 index b97827b..0000000 --- a/commands/Economy/profile.js +++ /dev/null @@ -1,47 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "profile", - usage: "(User)", - description: "Check an user economy profile", - category: "Economy", - run: async (client, message, args, data, utils) => { - const user = - message.mentions.members.first() || - message.guild.members.cache.get(args[0]) || - message.guild.members.cache.find( - r => - r.user.username.toLowerCase() === args.join(" ").toLocaleLowerCase() - ) || - message.guild.members.cache.find( - r => r.displayName.toLowerCase() === args.join(" ").toLocaleLowerCase() - ) || - message.member; - const bjwin = await client.bjWin(message.author.id); - const swin = await client.sWin(message.author.id); - const bwin = await client.bWin(message.author.id); - const cmdused = await client.cmdsUSED(message.author.id); - const bal = await client.bal(message.author.id); - const multi = await client.multi(message); - const game = new MessageEmbed() - .setFooter( - `Requested by ${message.author.tag}`, - message.author.displayAvatarURL({ dynamic: true, size: 4096 }) - ) - .setColor("7196ef") - .setTitle(`${user.displayName}'s profile`) - .addField( - "**Stats**\n", - `🃏 Blackjack wins: \`${bjwin}\`\n` + - `🎰 Slots wins: \`${swin}\`\n` + - `🕹 Bet wins: \`${bwin}\`\n` + - `⌨️Commands used: \`${cmdused}\`\n` + - `Totalwins: \`${bjwin + swin + bwin}\``, - true - ) - .addField( - "**Balance**\n", - `💲CP: \`${bal}\`\n` + `➕Multiplier: \`${`1.${multi}x`}\`` - ); - message.reply(game); - }, -}; diff --git a/commands/Fun/8ball.js b/commands/Fun/8ball.js deleted file mode 100644 index 5cb1218..0000000 --- a/commands/Fun/8ball.js +++ /dev/null @@ -1,56 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); - -const answers = [ - "Maybe.", - "Certainly not.", - "I hope so.", - "Not in your wildest dreams.", - "There is a good chance.", - "Quite likely.", - "I think so.", - "I hope not.", - "I hope so.", - "Never!", - "Fuhgeddaboudit.", - "Ahaha! Really?!?", - "Pfft.", - "Sorry, bucko.", - "Hell, yes.", - "Hell to the no.", - "The future is bleak.", - "The future is uncertain.", - "I would rather not say.", - "Who cares?", - "Possibly.", - "Never, ever, ever.", - "There is a small chance.", - "Yes!", -]; - -module.exports = { - name: "8ball", - usage: "(Question)", - description: "8ball an answer", - category: "Fun", - run: async (client, message, args) => { - if (!args.join(" ").endsWith("?")) - return client.err(message, "Fun", "8ball", 101); - else { - const embed = new MessageEmbed() - .setAuthor( - `🎱 ${message.member.displayName} asks`, - message.author.displayAvatarURL({ dynamic: true }) - ) - .setDescription( - `**🎱Question:** \n${args.join(" ")} \n**🎱Answer:** \n ${ - answers[Math.floor(Math.random() * answers.length)] - }` - ) - .setColor(client.color) - .setTimestamp() - .setURL(client.web) - .setFooter(`Made by ${client.author}`); - message.inlineReply(embed); - } - }, -}; diff --git a/commands/Fun/ascii.js b/commands/Fun/ascii.js deleted file mode 100644 index 19cc1ab..0000000 --- a/commands/Fun/ascii.js +++ /dev/null @@ -1,21 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "ascii", - description: "Converts text into ASCII art", - category: "Fun", - /** - * @param {Client} client - * @param {Message} message - * @param {String[]} args - */ - run: async (client, message, args) => { - const figlet = require("figlet"); - if (!args[0]) return client.err(message, "Fun", "ascii", 12); - let msg = args.slice(0).join(" "); - figlet.text(msg, async (err, data) => { - if (err) console.log(err); - if (data.length > 2000) return client.err(message, "Fun", "ascii", 54); - message.channel.send(`\`\`\`${data}\`\`\``); - }); - }, -}; diff --git a/commands/Fun/cat.js b/commands/Fun/cat.js deleted file mode 100644 index 40e941a..0000000 --- a/commands/Fun/cat.js +++ /dev/null @@ -1,25 +0,0 @@ -const api = require("imageapi.js"); -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "cat", - aliases: ["cats"], - category: "Fun", - description: "A cat command", - run: async (client, message, args) => { - const wait = await message.inlineReply("Getting cat picture..."); - let subreddits = ["cat", "cats"]; - let subreddit = subreddits[Math.floor(Math.random() * subreddits.length)]; - const img = await api(subreddit).catch(err => console.log(err)); - const Embed = new MessageEmbed() - .setTitle(`A cat picture from r/${subreddit}`) - .setURL(`https://reddit.com/r/${subreddit}`) - .setColor(client.color) - .setImage(img) - .setTimestamp() - .setAuthor( - message.author.tag, - message.author.displayAvatarURL({ dynamic: true }) - ); - wait.edit("", { embed: Embed }); - }, -}; diff --git a/commands/Fun/coinflip.js b/commands/Fun/coinflip.js deleted file mode 100644 index 34100b1..0000000 --- a/commands/Fun/coinflip.js +++ /dev/null @@ -1,18 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "coinflip", - aliases: ["cf"], - description: "Flip a coin", - category: "Fun", - run: async (client, message, args) => { - let HT = ["Heads!", "Tails!"]; - let pick = HT[Math.floor(Math.random() * HT.length)]; - let embed = new MessageEmbed() - .setColor(client.color) - .setTitle("CoinFilp Game") - .setTimestamp() - .setFooter(`Made by ${client.author}`) - .setDescription(pick); - message.inlineReply(embed); - }, -}; diff --git a/commands/Fun/dino.js b/commands/Fun/dino.js deleted file mode 100644 index 83d50db..0000000 --- a/commands/Fun/dino.js +++ /dev/null @@ -1,102 +0,0 @@ -const Discord = require("discord.js"); -const ms = require("ms"); - -module.exports = { - name: "dinochrome", - aliases: ["dino"], - category: "Fun", - description: "Dinosaur in Chrome", - run: async (client, message, args) => { - let msg = await message.channel.send(`---------------🦖`); - let time = 1 * 1000; - - setTimeout(function () { - msg.edit(`-----------🦖----`); - }, time); - time += 1.5 * 1000; - - setTimeout(function () { - msg.edit(`----------🦖------`); - }, time); - time += 1.5 * 1000; - - setTimeout(function () { - msg.edit(`--------🦖--------`); - }, time); - time += 1.5 * 1000; - - setTimeout(function () { - msg.edit(`------🦖-----------`); - }, time); - time += 1.5 * 1000; - - setTimeout(function () { - msg.edit(`-------🦖-----------`); - }, time); - time += 1.5 * 1000; - - setTimeout(function () { - msg.edit(`---🌵-----🦖---------`); - }, time); - time += 1.5 * 1000; - - setTimeout(function () { - msg.edit(`---🌵-🦖-------------`); - }, time); - time += 1.5 * 1000; - - setTimeout(function () { - msg.edit(`🦖\n ---🌵--------------`); - }, time); - time += 1.5 * 1000; - - setTimeout(function () { - msg.edit(`------🦖---🌵--------------`); - }, time); - time += 1.5 * 1000; - - setTimeout(function () { - msg.edit(`----🦖-----🌵----------------`); - }, time); - time += 1.5 * 1000; - - setTimeout(function () { - msg.edit(`-🌵🌵-----🦖-------🌵--------`); - }, time); - time += 1.5 * 1000; - - setTimeout(function () { - msg.edit(`----🌵🌵-🦖----------🌵------`); - }, time); - time += 1.5 * 1000; - - setTimeout(function () { - msg.edit(`🦖\n ---🌵🌵-------------🌵---`); - }, time); - time += 1.5 * 1000; - - setTimeout(function () { - msg.edit(`-----🦖---🌵🌵-------------🌵--`); - }, time); - time += 1.5 * 1000; - - setTimeout(function () { - msg.edit(`-------🦖-----🌵🌵-------------`); - }, time); - time += 1.5 * 1000; - - setTimeout(function () { - msg.edit(`🎂----🦖--------🌵🌵-----------`); - }, time); - time += 1.5 * 1000; - - setTimeout(function () { - msg.edit(`---🎂--🦖----------🌵🌵---------`); - }, time); - time += 1.5 * 1000; - - setTimeout(function () { - msg.edit(`**Ⓜⓘⓢⓢⓘⓞⓝ Ⓒⓞⓜⓟⓛⓔⓣⓔⓓ !**\n ---🎂🦖----------🌵🌵-------------`); - }, time); - }, -}; diff --git a/commands/Fun/dog.js b/commands/Fun/dog.js deleted file mode 100644 index b14fad2..0000000 --- a/commands/Fun/dog.js +++ /dev/null @@ -1,25 +0,0 @@ -const api = require("imageapi.js"); -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "dog", - aliases: ["dogs"], - category: "Fun", - description: "A dog command", - run: async (client, message, args) => { - const wait = await message.inlineReply("Getting dog picture..."); - let subreddits = ["dog", "dogs"]; - let subreddit = subreddits[Math.floor(Math.random() * subreddits.length)]; - const img = await api(subreddit).catch(err => console.log(err)); - const Embed = new MessageEmbed() - .setTitle(`A dog picture from r/${subreddit}`) - .setURL(`https://reddit.com/r/${subreddit}`) - .setColor(client.color) - .setImage(img) - .setTimestamp() - .setAuthor( - message.author.tag, - message.author.displayAvatarURL({ dynamic: true }) - ); - wait.edit("", { embed: Embed }); - }, -}; diff --git a/commands/Fun/drake.js b/commands/Fun/drake.js deleted file mode 100644 index 305a65c..0000000 --- a/commands/Fun/drake.js +++ /dev/null @@ -1,24 +0,0 @@ -const { - Client, - Message, - MessageEmbed, - MessageAttachment, -} = require("discord.js"); -const fetch = require("node-fetch"); -module.exports = { - name: "drake", - description: "Drake meme", - usage: "(Text) (Text)", - category: "Fun", - run: async (client, message, args) => { - const t1 = args[0]; - const t2 = args.slice(1).join(" "); - const res = await fetch( - `https://frenchnoodles.xyz/api/endpoints/drake/?text1=${t1}&text2=${t2}`, - {} - ); - let i = await res.buffer(); - const drake = new MessageAttachment(i); - message.inlineReply(drake); - }, -}; diff --git a/commands/Fun/ds.js b/commands/Fun/ds.js deleted file mode 100644 index 3f22020..0000000 --- a/commands/Fun/ds.js +++ /dev/null @@ -1,18 +0,0 @@ -const fetch = require("node-fetch"); -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "ds", - aliases: ["doublestruck"], - description: "Doublestruck your text", - usage: "(text)", - category: "Fun", - run: async (client, message, args) => { - let text = args.join("+"); - if (!text) return client.err(message, "Fun", "ds", 12); - let res = await fetch( - "https://api.popcatdev.repl.co/doublestruck?text=" + text - ); - let json = await res.json(); - message.inlineReply(json.text); - }, -}; diff --git a/commands/Fun/emojify.js b/commands/Fun/emojify.js deleted file mode 100644 index bfcafe0..0000000 --- a/commands/Fun/emojify.js +++ /dev/null @@ -1,40 +0,0 @@ -module.exports = { - name: "emojify", - usage: "(Word)", - description: "Emojify a sentence", - run: async (client, message, args) => { - const mapping = { - " ": " ", - 0: ":zero:", - 1: ":one:", - 2: ":two:", - 3: ":three:", - 4: ":four:", - 5: ":five:", - 6: ":six:", - 7: ":seven:", - 8: ":eight:", - 9: ":nine:", - "!": ":grey_exclamation:", - "?": ":grey_question:", - "#": ":hash:", - "*": ":asterisk:", - }; - - "abcdefghijklmnopqrstuvwxyz".split("").forEach(c => { - mapping[c] = mapping[c.toUpperCase()] = ` :regional_indicator_${c}:`; - }); - - if (!args[0]) { - return client.err(message, "Fun", "emojify", 12); - } - message.channel.send( - args - .slice(0) - .join(" ") - .split("") - .map(c => mapping[c] || c) - .join("") - ); - }, -}; diff --git a/commands/Fun/hack.js b/commands/Fun/hack.js deleted file mode 100644 index 76c399a..0000000 --- a/commands/Fun/hack.js +++ /dev/null @@ -1,129 +0,0 @@ -const { MessageEmbed } = require("discord.js"); -module.exports = { - name: "hack", - description: "Hack a user", - usage: "(User)", - category: "Fun", - run: async (client, message, args) => { - let answers = [ - "@yousuck.noob", - "@hesnoob.haha", - "@thisguy.suck", - "@paypal.removed", - "@noob.haha", - "@hacked.xyz", - "@susmate.com", - "@gmail.sus", - "@why-im.withyou", - "@someone-end.me", - "@isnoob.io", - "@username-is.noob", - "@hahaget.lost", - "@yahoo.sus", - "@botmail.zip", - "@gmail.com", - "@yahoo.com", - ]; - let passwords = [ - "Disb****", - "disc******", - "pass**********", - "get****", - "mails***", - "endm****", - "gamer***********", - "asegeio*********", - "whys*******", - "Brot******", - "imwith*******", - "luckyyougotthispasswordlolnocencor", - "starb*******", - "egghunt2***", - "secr*****", - ]; - let ips = [ - "10.313.523.502.00.1", - "25.537.753.462.29.2", - "21.175.866.974.07.08", - "32.653.587.825.35.5", - "12.172.764.781.22.8", - "91.723.242.452.09.3", - "92.743.116.896.85.6", - "84.091.000.853.54.7", - "51.071.124.129.12.0", - ]; - const answer = answers[Math.floor(Math.random() * answers.length)]; - const passwrd = passwords[Math.floor(Math.random() * passwords.length)]; - const ip = ips[Math.floor(Math.random() * ips.length)]; - const taggedUser = message.mentions.users.first(); - if (!taggedUser) { - return client.err(message, "Fun", "hack", 1); - } - message.channel.send(`Hacking ${taggedUser.username}...`); - message.channel.send("Status: ■□□□□□□□□□□ 0%").then(msg => { - client.function.sleep(100); - msg.edit("Status: ■■□□□□□□□□□ 7%: Hacking Email..."); - client.function.sleep(600); - msg.edit( - `Status: ■■■□□□□□□□□ 8%:\n \`Email: ${taggedUser.username}@yousuck.noob\`\n \`Password: ${passwrd}\` ` - ); - client.function.sleep(600); - msg.edit("Status: ■■□□□□□□□□□ 9%: Logging in to the Email..."); - client.function.sleep(2000); - msg.edit("Status: ■■■□□□□□□□□ 12%: Turning off the antivirus"); - client.function.sleep(1000); - msg.edit("Status: ■■■■□□□□□□ 14%: Downloading SYNAPSE X"); - client.function.sleep(100); - msg.edit("Status: ■■■□□□□□□□□ 17%: Deleting Captcha..."); - client.function.sleep(100); - msg.edit("Status: ■■□□□□□□□□□ 20%: Deleting Paypal account..."); - client.function.sleep(10); - msg.edit("Status: ■■■□□□□□□□□ 21%"); - client.function.sleep(12); - msg.edit("Status: ■■■■□□□□□□□ 22%"); - client.function.sleep(100); - msg.edit("Status: ■■■■■□□□□□□ 24%: Paypal account deleted"); - client.function.sleep(1000); - msg.edit("Status: ■■■■□□□□□□ 29%: Hacking is almost ready..."); - client.function.sleep(80); - msg.edit("Status: ■■■□□□□□□□□ 31%"); - client.function.sleep(80); - msg.edit("Status: ■■■■□□□□□□□ 36%"); - client.function.sleep(40); - msg.edit("Status: ■■■■■□□□□□□ 41%"); - client.function.sleep(60); - msg.edit("Status: ■■■■□□□□□□□ 47%"); - client.function.sleep(50); - msg.edit("Status: ■■■■■■□□□□□ 53%"); - client.function.sleep(3000); - msg.edit( - `Status: ■■■■■■■□□□□ 58%: Email password changed so ${taggedUser.username} can not login` - ); - client.function.sleep(500); - msg.edit("Status: ■■■■■■□□□□□ 66%"); - client.function.sleep(60); - msg.edit("Status: ■■■■■□□□□□□ 74%"); - client.function.sleep(20); - msg.edit(`Status: ■■■■■□□□□□□ 79%: IP address found: ${ip}`); - client.function.sleep(83); - msg.edit("Status: ■■■■■■□□□□ 80%"); - client.function.sleep(50); - msg.edit("Status: ■■■■■■■□□□ 85%"); - client.function.sleep(14); - msg.edit("Status: ■■■■■■■■■□□ 93%"); - client.function.sleep(70); - msg.edit("Status: ■■■■■■■■■■□ 97%"); - client.function.sleep(90); - msg.edit("Status: ■■■■■■■■■■■ 100%").then(() => { - const embed = new MessageEmbed() - .setDescription(`${taggedUser} has been hacked!`) - .addField("Email", `${taggedUser.username}${answer}`) - .addField("Password", `${passwrd}`) - .addField("IP address", `${ip}`) - .setFooter(`Made by ${client.author}`) - .setColor("020203a"); - message.channel.send(embed); - }); - }); - }, -}; diff --git a/commands/Fun/hexcolor.js b/commands/Fun/hexcolor.js deleted file mode 100644 index 2e8165e..0000000 --- a/commands/Fun/hexcolor.js +++ /dev/null @@ -1,84 +0,0 @@ -const Canvas = require("canvas"); -const { - Client, - Message, - MessageEmbed, - MessageAttachment, -} = require("discord.js"); -const axios = require("axios"); - -module.exports = { - name: "hexcolor", - usage: "(Hex Color Code)", - description: "Get Hex and RGB info of a color", - aliases: ["hex"], - category: "Fun", - run: async (client, message, args) => { - let color; - if (args[0]) { - if (/(#|0x)([0-9A-F]{6})/i.test(args[0])) { - color = args[0].match(/(#|0x)([0-9A-F]{6})/i)[2]; - } else { - return client.err(message, "Fun", "hexcolor", 101); - } - } else { - color = message.member.displayHexColor; - } - try { - message.channel.startTyping(); - const aa = color.replace("#", "", "0x", ""); - const colour = await axios.get( - `https://www.thecolorapi.com/scheme?hex=${aa}` - ); - const canvas = Canvas.createCanvas(200, 200); - const ctx = canvas.getContext("2d"); - ctx.beginPath(); - ctx.rect(0, 0, 200, 200); - ctx.fillStyle = `${colour.data.seed.hex.value}`; - ctx.fill(); - const rightpic = new MessageAttachment(canvas.toBuffer(), "wea.jpg"); - const canvasx = Canvas.createCanvas(500, 100); - const ctxt = canvasx.getContext("2d"); - let y = canvasx.height / 2; - ctxt.font = "12px Roboto"; - ctxt.textAlign = "center"; - let addup = 0; - for (let i = 0; i < 5; i++) { - ctxt.beginPath(); - ctxt.rect(addup, 0, 100, 100); - ctxt.fillStyle = `${colour.data.colors[i].hex.value}`; - ctxt.fill(); - addup = addup + 100; - ctxt.beginPath(); - ctxt.rect(addup - 80, y - 15, 60, 30); - ctxt.fillStyle = `black`; - ctxt.fill(); - ctxt.fillStyle = `white`; - ctxt.fillText( - `${colour.data.colors[i].hex.value}`, - addup - 51, - y + 4.3 - ); - } - const attachment = new MessageAttachment(canvasx.toBuffer(), "color.jpg"); - const embed = new MessageEmbed() - .setColor(`0x${colour.data.seed.hex.value}`) - .setDescription( - `\`HEX: ${colour.data.seed.hex.value} RGB: ${colour.data.seed.rgb.value}\`\n🔽Color Scheme🔽` - ) - .setTitle("Color Information (Click here for more info)") - .setURL(`https://www.colorhexa.com/${colour.data.seed.hex.clean}`) - .attachFiles(attachment) - .setURL(client.web) - .setImage("attachment://color.jpg") - .attachFiles(rightpic) - .setThumbnail("attachment://wea.jpg"); - message.channel.send(embed); - } catch (e) { - console.log(e); - return client.err(message, "Utilities", "hexcolor", 999); - } finally { - message.channel.stopTyping(); - } - }, -}; diff --git a/commands/Fun/hug.js b/commands/Fun/hug.js deleted file mode 100644 index 12220e8..0000000 --- a/commands/Fun/hug.js +++ /dev/null @@ -1,29 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "hug", - usage: "(User)", - description: "Hug someone", - category: "Fun", - run: async (client, message, args) => { - const words = args.slice(1).join(" "); - const user = - message.mentions.users.first() || - message.guild.members.cache.get(args[0]); - if (!user) { - return client.err(message, "Fun", "hug", 1); - } - if (user.id === message.author.id) { - return client.err(message, "Fun", "hug", 33); - } - const embed = new MessageEmbed(); - embed.setDescription(`${message.author} **hugs** ${user}`); - if (words) { - embed.addField("Words:", reason); - } - embed.setImage( - `https://media.tenor.com/images/ca88f916b116711c60bb23b8eb608694/tenor.gif` - ); - embed.setColor(client.color); - message.inlineReply(embed).then(msg => msg.react("💕")); - }, -}; diff --git a/commands/Fun/kiss.js b/commands/Fun/kiss.js deleted file mode 100644 index 095f228..0000000 --- a/commands/Fun/kiss.js +++ /dev/null @@ -1,29 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "kiss", - usage: "(User)", - description: "Kiss someone", - category: "Fun", - run: async (client, message, args) => { - const words = args.slice(1).join(" "); - const user = - message.mentions.users.first() || - message.guild.members.cache.get(args[0]); - if (!user) { - return client.err(message, "Fun", "kiss", 1); - } - if (user.id === message.author.id) { - return client.err(message, "Fun", "kiss", 33); - } - const embed = new MessageEmbed(); - embed.setDescription(`${message.author} **kisses** ${user}`); - if (words) { - embed.addField("Words: ", words); - } - embed.setImage( - `https://media.discordapp.net/attachments/814310468906123274/817656819416825896/image0.gif` - ); - embed.setColor(client.color); - message.inlineReply(embed).then(msg => msg.react("💕")); - }, -}; diff --git a/commands/Fun/meme.js b/commands/Fun/meme.js deleted file mode 100644 index d7bc090..0000000 --- a/commands/Fun/meme.js +++ /dev/null @@ -1,25 +0,0 @@ -const api = require("imageapi.js"); -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "meme", - aliases: ["memes"], - category: "Fun", - description: "A meme command", - run: async (client, message, args) => { - const wait = await message.inlineReply("Getting meme..."); - let subreddits = ["comedyheaven", "dank", "meme", "memes"]; - let subreddit = subreddits[Math.floor(Math.random() * subreddits.length)]; - const img = await api(subreddit).catch(err => console.log(err)); - const Embed = new MessageEmbed() - .setTitle(`A meme from r/${subreddit}`) - .setURL(`https://reddit.com/r/${subreddit}`) - .setColor(client.color) - .setImage(img) - .setTimestamp() - .setAuthor( - message.author.tag, - message.author.displayAvatarURL({ dynamic: true }) - ); - wait.edit("", { embed: Embed }); - }, -}; diff --git a/commands/Fun/obama.js b/commands/Fun/obama.js deleted file mode 100644 index 15fdbfa..0000000 --- a/commands/Fun/obama.js +++ /dev/null @@ -1,45 +0,0 @@ -const o = "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠛⠛⠛⠉⠉⠉⠋⠛⠛⠛⠻⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿"; -const b = "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠛⠉⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠉⠙⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿"; -const a = "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠋⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠈⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿"; -const m = "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠏⠄⠄⠄⠄⠄⠄⠄⠂⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠈⠹⣿⣿⣿⣿⣿⣿⣿"; -const a2 = "⣿⣿⣿⣿⣿⣿⣿⣿⣿⠛⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠠⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠘⢻⣿⣿⣿⣿⣿"; -const aa = "⣿⣿⣿⣿⣿⣿⣿⣿⠃⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⢀⠄⢠⠄⠄⡀⠄⠄⢀⠂⠄⠄⠄⠄⠄⠄⠄⠄⠄⡁⠄⠄⢛⣿⣿⣿⣿"; -const ab = "⣿⣿⣿⣿⣿⣿⣿⡇⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠐⡈⢔⠸⣐⢕⢕⢵⢰⢱⢰⢐⢤⡡⡢⣕⢄⢢⢠⠄⠄⠄⠄⠄⠄⠙⣿⣿⣿"; -const ac = "⣿⣿⣿⣿⣿⣿⣿⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⡁⠂⠅⢕⠌⡎⡎⣎⢎⢮⢮⣳⡳⣝⢮⢺⢜⢕⢕⢍⢎⠪⡐⠄⠁⠄⠸⣿⣿"; -const ad = "⣿⣿⣿⣿⣿⣿⠏⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠐⠄⠄⢅⠣⡡⡣⣣⡳⡵⣝⡮⣗⣗⡯⣗⣟⡮⡮⣳⣣⣳⢱⢱⠱⣐⠄⠂⠄⢿⣿"; -const ae = "⣿⣿⣿⣿⣿⣿⠄⠄⠄⠄⠄⠄⠄⠂⠄⠄⠄⠄⠄⠄⢂⢈⠢⡱⡱⡝⣮⣿⣟⣿⣽⣷⣿⣯⣿⣷⣿⣿⣿⣾⣯⣗⡕⡇⡇⠄⠂⡀⢹⣿"; -const af = "⣿⣿⣿⣿⣿⡟⠄⠄⠄⠄⠄⠄⠂⠄⠄⠄⠄⠄⠄⠐⢀⢂⢕⢸⢨⢪⢳⡫⣟⣿⣻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡺⡮⡣⡣⠠⢂⠒⢸⣿"; -const ag = "⣿⣿⣿⣿⣿⡇⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠠⠐⠄⡂⠆⡇⣗⣝⢮⢾⣻⣞⣿⣿⣿⣿⣿⣿⣿⣿⢿⣽⣯⡯⣺⢸⢘⠨⠔⡅⢨⣿"; -const ah = "⣿⣿⠋⠉⠙⠃⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠁⠄⠄⠄⡂⡪⡪⡪⡮⡮⡯⣻⣽⣾⣿⣿⣿⣟⣿⣿⣿⣽⣿⣿⡯⣯⡺⡸⡰⡱⢐⡅⣼⣿"; -const ai = "⣿⠡⡀⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠠⠈⠆⠱⠑⠝⠜⠕⡝⡝⣞⢯⢿⣿⣿⡿⣟⣿⣿⣿⡿⡿⣽⣷⣽⡸⡨⡪⣂⠊⣿⣿"; -const aj = "⣿⠡⠄⡨⣢⠐⠁⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠐⠍⡓⣗⡽⣝⠽⠍⠅⠑⠁⠉⠘⠘⠘⠵⡑⢜⢀⢀⢉⢽"; -const ak = "⣿⠁⠠⢱⢘⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠈⠈⠱⣁⠜⡘⠌⠄⠄⡪⣳⣟⡮⢅⠤⠠⠄⠄⣀⣀⡀⡀⠄⠈⡂⢲⡪⡠⣿"; -const al = "⣿⡇⠨⣺⢐⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⡀⠄⠄⠄⠤⡠⡢⢒⠦⠠⠄⠄⠄⡸⢽⣟⢮⠢⡂⡐⠄⡈⡀⠤⡀⠄⠑⢄⠨⢸⡺⣐⣿"; -const am = "⣿⣿⠈⠕⠁⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⡂⡪⡐⡥⢤⣰⣰⣰⡴⡮⠢⠂⠄⠄⡊⢮⢺⢕⢵⢥⡬⣌⣒⡚⣔⢚⢌⢨⢚⠌⣾⡪⣾⣿"; -const an = "⣿⣿⣆⠄⡀⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⡑⢕⢕⡯⡷⣕⢧⢓⢭⠨⡀⠄⡂⠨⡨⣪⡳⣝⢝⡽⣻⣻⣞⢽⣲⢳⢱⢡⠱⠨⣟⢺⣿⣿"; -const ao = "⣿⣿⣿⡆⠄⡅⠇⡄⠄⠄⠄⠄⠄⠄⠄⠐⠨⢪⢹⢽⢽⣺⢝⠉⠁⠁⠄⠄⠄⢌⢎⡖⡯⡎⡗⢝⠜⣶⣯⣻⢮⡻⣟⣳⡕⠅⣷⣿⣿⣿"; -const ap = "⣿⣿⣿⣿⣶⣶⣿⣷⠄⠄⠄⠄⠄⠄⠄⠄⠈⠔⡑⠕⠝⠄⡀⠄⠄⠊⢆⠂⠨⡪⣺⣮⣿⡾⡜⣜⡜⣄⠙⢞⣿⢿⡿⣗⢝⢸⣾⣿⣿⣿"; -const aq = "⣿⣿⣿⣿⣿⣿⣿⣿⠄⠄⠄⠄⠄⡀⠄⠄⠄⠄⢀⠄⠠⠄⠠⠄⠄⠄⠄⠄⠄⠊⠺⡹⠳⡙⡜⡓⡭⡺⡀⠄⠣⡻⡹⡸⠨⣣⣿⣿⣿⣿"; -const ar = "⣿⣿⣿⣿⣿⣿⣿⣿⠄⠄⠄⠄⠄⠠⠄⠄⣂⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⢄⠤⡤⡄⡆⡯⡢⡣⡣⡓⢕⠽⣄⠄⠨⡂⢌⣼⣿⣿⣿⣿⣿"; -const a_ = "⣿⣿⣿⣿⣿⣿⣿⣿⡆⠄⠄⠄⠄⠈⠆⠄⠸⡂⠄⠄⠄⢀⠄⢀⠈⠄⠂⠁⠙⠝⠼⠭⠣⠣⠣⠑⠌⠢⠣⡣⡠⡘⣰⣱⣿⣿⣿⣿⣿⣿"; -const at = "⣿⣿⣿⣿⣿⣿⣿⣿⡇⠄⠄⠄⠄⠄⢑⠄⠈⡱⠄⢘⠄⡀⠨⢐⣧⣳⣷⣶⣦⣤⣴⣶⣶⣶⡶⠄⡠⡢⡕⣜⠎⡮⣣⣿⣿⣿⣿⣿⣿⣿"; -const au = "⣿⣿⣿⣿⣿⣿⣿⣿⡇⠄⠄⠄⠄⠄⠄⠢⠄⠨⠄⠄⠣⡀⠄⢀⢀⢙⠃⡿⢿⠿⡿⡿⢟⢋⢔⡱⣝⢜⡜⡪⡪⣵⣿⣿⣿⣿⣿⣿⣿⣿"; -const av = "⣿⣿⣿⣿⣿⣿⣿⣿⡁⠄⠄⠄⠄⠄⠄⠄⠅⠄⠡⠄⠄⠡⢀⢂⠢⡡⠡⠣⡑⣏⢯⡻⡳⣹⡺⡪⢎⠎⡆⢣⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿"; -const aw = "⣿⣿⣿⣿⣿⣿⣿⣿⣇⠄⠄⠄⠄⠄⠄⠄⠐⠄⠄⠁⠄⢈⠄⢂⠕⡕⡝⢕⢎⢎⢮⢎⢯⢺⢸⢬⠣⢃⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿"; -const ax = "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⡀⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠠⠨⡐⠌⢆⢇⢧⢭⣣⡳⣵⢫⣳⢱⠱⢑⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿"; -const ay = "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣆⠄⠄⠄⠄⠄⠄⠄⠄⠄⠄⠁⡊⢌⢢⢡⢣⢪⡺⡪⡎⡎⡎⡚⣨⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿"; -const az = "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⡀⠄⠄⠄⠄⠄⠄⠄⠄⠄⠕⡅⢗⢕⡳⡭⣳⢕⠕⡱⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿"; -const ba = "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⡀⠄⠄⠄⠄⠄⠄⠄⠄⠄⠌⠄⠑⠩⢈⢂⣱⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿"; -const bb = "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⡀⢄⠄⣀⠄⡀⣀⢠⢄⣖⣖⣞⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿"; -const bc = "⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⣱⡐⡕⡕⡽⣝⣟⣮⣾⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿"; - -module.exports = { - name: "obama", - category: "Utilities", - description: "Obama", - run: async (client, message, args) => { - message.inlineReply( - `${o}\n${b}\n${a}\n${m}\n${a2}\n${aa}\n${ab}\n${ac}\n${ad}\n${ae}\n${af}\n${ag}\n${ah}\n${ai}\n${aj}\n${ak}\n${al}\n${am}\n${an}\n${ao}\n${ap}\n${aq}\n${ar}\n${a_}\n${at}\n${au}\n${av}\n${aw}\n${ax}\n${ay}\n${az}\n${ba}\n${bb}\n${bc}` - ); - }, -}; diff --git a/commands/Fun/rickroll.js b/commands/Fun/rickroll.js deleted file mode 100644 index d4cbb66..0000000 --- a/commands/Fun/rickroll.js +++ /dev/null @@ -1,30 +0,0 @@ -const { - Client, - Message, - MessageEmbed, - MessageAttachment, -} = require("discord.js"); - -module.exports = { - name: "rickroll", - aliases: ["rick", "nevergonnagiveyouup", "never"], - description: "Rickroll?", - category: "Fun", - run: async (client, message, args) => { - const roll = [ - "Never gonna give you up", - "Never gonna let you down", - "Never gonna run around and desert you", - "Never gonna make you cry", - "Never gonna say goodbye", - "Never gonna tell a lie and hurt you", - ]; - const rick = roll[Math.floor(Math.random() * roll.length)]; - const rickroll = new MessageAttachment( - "https://i.pinimg.com/originals/88/82/bc/8882bcf327896ab79fb97e85ae63a002.gif" - ); - message.inlineReply(`**${rick}**`, { - files: [rickroll], - }); - }, -}; diff --git a/commands/Fun/rps.js b/commands/Fun/rps.js deleted file mode 100644 index 0d99efb..0000000 --- a/commands/Fun/rps.js +++ /dev/null @@ -1,91 +0,0 @@ -const { MessageEmbed } = require("discord.js"); -module.exports = { - name: "rps", - aliases: ["rockpapersscissors"], - description: "Play a rock paper scissors game", - category: "Fun", - run: async (client, message, args) => { - let embed = new MessageEmbed() - .setTitle("RPS GAME") - .setAuthor( - message.author.tag, - message.author.displayAvatarURL({ dynamic: true }) - ) - .setDescription( - "```Add a reaction to one of these emojis to play the game!```" - ) - .setColor(client.color) - .setFooter(`Made by ${client.author}`) - .setTimestamp(); - let msg = await message.channel.send(embed); - await msg.react("✊"); - await msg.react("✂"); - await msg.react("📄"); - const filter = (reaction, user) => { - return ( - ["✊", "✂", "📄"].includes(reaction.emoji.name) && - user.id === message.author.id - ); - }; - const choices = ["✊", "✂", "📄"]; - const me = choices[Math.floor(Math.random() * choices.length)]; - msg - .awaitReactions(filter, { max: 1, time: 60000, error: ["time"] }) - .then(async collected => { - const reaction = collected.first(); - if ( - (me === "✊" && reaction.emoji.name === "✂") || - (me === "📄" && reaction.emoji.name === "✊") || - (me === "✂" && reaction.emoji.name === "📄") - ) { - const reaction = collected.first(); - let result = new MessageEmbed() - .setTitle("You lost!") - .setColor("RED") - .setFooter(`Made by ${client.author}`) - .setTimestamp() - .setAuthor( - message.author.tag, - message.author.displayAvatarURL({ dynamic: true }) - ) - .addField("Your choice", `${reaction.emoji.name}`) - .addField("My choice", `${me}`); - await msg.edit("", result); - } else if (me === reaction.emoji.name) { - const reaction = collected.first(); - let result = new MessageEmbed() - .setTitle("Tie!") - .setColor("GREY") - .setFooter(`Made by ${client.author}`) - .setTimestamp() - .setAuthor( - message.author.tag, - message.author.displayAvatarURL({ dynamic: true }) - ) - .addField("Your choice", `${reaction.emoji.name}`) - .addField("My choice", `${me}`); - await msg.edit("", result); - } else { - const reaction = collected.first(); - let result = new MessageEmbed() - .setTitle("You won!") - .setColor("GREEN") - .setFooter(`Made by ${client.author}`) - .setTimestamp() - .setAuthor( - message.author.tag, - message.author.displayAvatarURL({ dynamic: true }) - ) - .addField("Your choice", `${reaction.emoji.name}`) - .addField("My choice", `${me}`); - await msg.edit("", result); - } - }) - .catch(r => { - console.log(r); - message.inlineReply( - "Your game has lost since you didn't response in time" - ); - }); - }, -}; diff --git a/commands/Fun/say.js b/commands/Fun/say.js deleted file mode 100644 index 25cbdf5..0000000 --- a/commands/Fun/say.js +++ /dev/null @@ -1,12 +0,0 @@ -const { Client, Message, Util } = require("discord.js"); -module.exports = { - name: "say", - description: "Pretend a bot to say", - usage: "(Words)", - category: "Fun", - run: async (client, message, args) => { - if (!args.length) return; - message.delete(); - return message.channel.send(Util.cleanContent(args.join(" "), message)); - }, -}; diff --git a/commands/Fun/ship.js b/commands/Fun/ship.js deleted file mode 100644 index 7c13d12..0000000 --- a/commands/Fun/ship.js +++ /dev/null @@ -1,31 +0,0 @@ -const block = "⬛"; -const heart = "🟥"; -const { MessageEmbed } = require("discord.js"); - -module.exports = { - name: "ship", - aliases: ["love", "loverate", "shipping"], - description: "Ship to you an user", - usage: "(Text) (Text)", - category: "Fun", - run: async (client, message, args) => { - const msg = await message.channel.send("Shipping..."); - const user1 = args[0]; - const user2 = args[1]; - if (!user1) return client.err(message, "Fun", "ship", 12); - if (!user2) return client.err(message, "Fun", "ship", 12); - let loveEmbed = new MessageEmbed() - .setColor("dd2e44") - .setFooter(`Shipped by ${message.author.tag}`) - .setTimestamp() - .setTitle(`💘 | Shipping ${user1} and ${user2} | 💘`) - .setDescription(`🔻 | ${user1} \n${ship()}\n🔺 | ${user2}`); - msg.edit("", loveEmbed); - }, -}; -function ship() { - const hearts = Math.floor(Math.random() * 100); - const hearte = hearts / 10; - const str = `${heart.repeat(hearte)}${block.repeat(10 - hearte)} ${hearts}%`; - return str; -} diff --git a/commands/Fun/simprate.js b/commands/Fun/simprate.js deleted file mode 100644 index 15beff2..0000000 --- a/commands/Fun/simprate.js +++ /dev/null @@ -1,26 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "simprate", - aliases: ["simp"], - description: "Check how simp is the user", - usage: "(@User)", - category: "Fun", - run: async (client, message, args) => { - let simp = Math.floor(Math.random() * 100); - if (message.mentions.users.first()) { - let target = message.mentions.users.first(); - message.reply( - new MessageEmbed() - .setTitle(`${target.username}'s simp rate`) - .setDescription(`${target.username} is a ${simp}% simp`) - ); - } else { - const target = message.author; - message.reply( - new MessageEmbed() - .setTitle(`${target.username}'s simp rate`) - .setDescription(`You are a ${simp}% simp`) - ); - } - }, -}; diff --git a/commands/Fun/sr.js b/commands/Fun/sr.js deleted file mode 100644 index c3ecf50..0000000 --- a/commands/Fun/sr.js +++ /dev/null @@ -1,15 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -const supr = require("superscript-text"); -module.exports = { - name: "superscript", - aliases: ["sr"], - description: "Superscript your text", - usage: "(text)", - category: "Fun", - run: async (client, message, args) => { - const text = args.join(" "); - if (!text) return client.err(message, "Fun", "sr", 12); - if (text.includes("@")) return client.err(message, "Fun", "sr", 101); - message.inlineReply(supr(text)); - }, -}; diff --git a/commands/Fun/triggered.js b/commands/Fun/triggered.js deleted file mode 100644 index fa897b9..0000000 --- a/commands/Fun/triggered.js +++ /dev/null @@ -1,18 +0,0 @@ -const { Canvas } = require("canvacord"); -const { Client, Message, MessageAttachment } = require("discord.js"); -module.exports = { - name: "trigger", - aliases: ["triggered"], - usage: "{User}", - description: "Have a trigger effect on a user's avatar", - category: "Fun", - run: async (client, message, args) => { - const user = - message.mentions.users.first() || - message.guild.members.cache.get(args[0]) || - message.author; - const ava = user.displayAvatarURL({ format: "png" }); - const imga = await Canvas.trigger(ava); - message.inlineReply(new MessageAttachment(imga, "imgae.gif")); - }, -}; diff --git a/commands/Giveaway/giveaway.js b/commands/Giveaway/giveaway.js index d287a26..b10fd75 100644 --- a/commands/Giveaway/giveaway.js +++ b/commands/Giveaway/giveaway.js @@ -1,12 +1,10 @@ -const ms = require("ms"); -const { Client, Message, MessageEmbed } = require("discord.js"); module.exports = { name: "giveaway", aliases: ["gstart"], description: "Start a giveaway", usage: "(Channel) (Time) (Winners(Number)) (Prize)", UserPerm: "MANAGE_MESSAGES", - run: async (client, message, args) => { + run: async (client, message, args, utils) => { const channel = message.mentions.channels.first(); if (!channel) return client.err(message, "Giveaway", "giveaway", 28); const duration = args[1]; @@ -17,7 +15,7 @@ module.exports = { const prize = args.slice(3).join(" "); if (!prize) return client.err(message, "Giveaway", "giveaway", 32); client.giveaways.start(channel, { - time: ms(duration), + time: utils.ms(duration), prize: prize, winnerCount: winners, hostedBy: message.author, diff --git a/commands/Moderation/mute.js b/commands/Moderation/mute.js index 45616c2..aa1fcd1 100644 --- a/commands/Moderation/mute.js +++ b/commands/Moderation/mute.js @@ -1,5 +1,4 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -const ms = require("ms"); +const { MessageEmbed } = require("discord.js"); module.exports = { name: "mute", description: "Mute an user.", @@ -7,7 +6,7 @@ module.exports = { UserPerm: "MANAGE_MESSAGES", BotPerm: "MANAGE_ROLES", category: "Moderation", - run: async (client, message, args) => { + run: async (client, message, args, utils) => { let Member = message.mentions.members.first(); const time = args[1]; if (!Member) return client.err(message, "Moderation", "mute", 1); @@ -51,7 +50,7 @@ module.exports = { .setTimestamp(); message.reply(embed); } - if (!ms(time)) { + if (!utils.ms(time)) { let reason = args.slice(1).join(" ") || "No reason provided"; const role = message.guild.roles.cache.find(x => x.name === "Muted"); if (!role) { @@ -71,7 +70,7 @@ module.exports = { }); }); } catch (e) { - console.log(err); + console.log(e); return client.err(message, "Moderation", "mute", 999); } } @@ -90,9 +89,6 @@ module.exports = { .setColor(client.color) .setTimestamp(); message.reply(embed); - setTimeout(async () => { - await Member.roles.remove(role2); - }, ms(time)); } else { let reason = args.slice(2).join(" ") || "No reason provided"; const role = message.guild.roles.cache.find(x => x.name === "Muted"); @@ -135,7 +131,7 @@ module.exports = { message.reply(embed); setTimeout(async () => { await Member.roles.remove(role2); - }, ms(time)); + }, utils.ms(time)); } }, }; diff --git a/commands/Moderation/pin.js b/commands/Moderation/pin.js deleted file mode 100644 index f41438e..0000000 --- a/commands/Moderation/pin.js +++ /dev/null @@ -1,21 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); - -module.exports = { - name: "pin", - usage: "(Message ID)", - description: "Pin a message in the server", - BotPerm: "MANAGE_MESSAGES", - UserPerm: "MANAGE_MESSAGES", - run: async (client, message, args) => { - if (!args[0]) return client.err(message, "Moderation", "pin", 27); - try { - const ch = message.guild.channels.cache.get(message.channel.id); - const msgs = await ch.messages.fetch(args[0]); - if (!msgs) return client.err(message, "Moderation", "pin", 52); - await msgs.pin(); - } catch (e) { - console.log(e); - return client.err(message, "Moderation", "pin", 999); - } - }, -}; diff --git a/commands/Moderation/slowmode.js b/commands/Moderation/slowmode.js deleted file mode 100644 index 62c0a3d..0000000 --- a/commands/Moderation/slowmode.js +++ /dev/null @@ -1,57 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -const ms = require("ms"); -module.exports = { - name: "slowmode", - UserPerm: "MANAGE_CHANNELS", - description: "Set slowmode at a specific channel", - BotPerm: "MANAGE_CHANNELS", - usage: "(Time)", - category: "Moderation", - run: async (client, message, args) => { - try { - if (!args[0]) { - message.channel.setRateLimitPerUser(0); - const embed = new MessageEmbed() - .setTitle("Slowmode Removed") - .addField("**Moderator**", message.author.tag, true) - .addField("**Channel**", `<#${message.channel.id}>`, true) - .setFooter( - message.member.displayName || message.author.username, - message.author.displayAvatarURL({ dynamic: true }) - ) - .setThumbnail(client.user.displayAvatarURL()) - .setColor(client.color) - .setTimestamp(); - message.reply(embed); - } - const milliseconds = ms(args[0]); - if (isNaN(milliseconds)) - return client.err(message, "Moderation", "slowmode", 101); - if (milliseconds < 1000) - return client.err(message, "Moderation", "slowmode", 16); - message.channel.setRateLimitPerUser(milliseconds / 1000); - const embed = new MessageEmbed() - .setTitle("Slowmode Added") - .addField("**Moderator**", message.author.tag, true) - .addField("**Channel**", `<#${message.channel.id}>`, true) - .addField( - "**Rate**", - ms(milliseconds, { - long: true, - }), - true - ) - .setFooter( - message.member.displayName || message.author.username, - message.author.displayAvatarURL({ dynamic: true }) - ) - .setThumbnail(client.user.displayAvatarURL()) - .setColor(client.color) - .setTimestamp(); - message.reply(embed); - } catch (e) { - console.log(e); - return client.err(message, "Moderation", "slowmode", 999); - } - }, -}; diff --git a/commands/Moderation/warns.js b/commands/Moderation/warns.js index 66c8cd3..8db5f55 100644 --- a/commands/Moderation/warns.js +++ b/commands/Moderation/warns.js @@ -33,7 +33,7 @@ module.exports = { ) ) .setTimestamp() - .setColor("client.color") + .setColor(client.color) ); } else { return client.err(message, "Moderation", "warns", 10); diff --git a/commands/Owner/eval.js b/commands/Owner/eval.js deleted file mode 100644 index 1e0fe46..0000000 --- a/commands/Owner/eval.js +++ /dev/null @@ -1,111 +0,0 @@ -const Discord = require("discord.js"); -module.exports = { - name: "eval", - category: "Owner", - aliases: ["e"], - usage: "(Code)", - Owner: true, - run: async (client, message, args) => { - let code = args.join(" "); - if (!code) return client.err(message, "Owner", "eval", 53); - function CheckFilter(object) { - if (typeof object === "string") { - object = object.replace( - new RegExp(client.token || process.env.TOKEN, "gi"), - "Cannot eval Token" - ); - } else if (typeof object === "object") { - if (Array.isArray(object)) { - for (let i = 0; i < object.length; i++) { - object[i] = CheckFilter(object[i]); - } - } else { - for (let key in object) { - object[key] = CheckFilter(object[key]); - } - } - } - return object; - } - let oldSend = Discord.TextChannel.prototype.send; - Discord.TextChannel.prototype.send = async function send(content, options) { - return oldSend.bind(this)(CheckFilter(content), CheckFilter(options)); - }; - let evaled; - try { - evaled = eval(code); - if (evaled instanceof Promise) evaled = await evaled; - } catch (err) { - evaled = err; - } - if (typeof evaled !== "string") evaled = require("util").inspect(evaled); - evaled = new (require("string-toolkit"))().toChunks(evaled, 750); - let reactions = ["❌", "⏪", "◀️", "⏹️", "▶️", "⏩"], - page = 0, - evaledEmbed = new Discord.MessageEmbed() - .setColor(client.color) - .setDescription(`\`\`\`js\n${evaled[0]}\n\`\`\``) - .addField(`Type of`, `\`\`\`js\n${typeof evaled[0]}\n\`\`\``); - let mainMessage = await message.channel.send(evaledEmbed); - Discord.TextChannel.prototype.send = oldSend; - await Promise.all( - (evaled.length === 1 ? ["❌", "⏹️"] : reactions).map(r => - mainMessage.react(r) - ) - ); - let filter = (reaction, user) => - (evaled.length === 1 ? ["❌", "⏹️"] : reactions).some( - e => e === reaction.emoji.name - ) && user.id === message.author.id; - let collector = mainMessage.createReactionCollector(filter, { - time: 300000, - }); - collector.on("collect", async (reaction, user) => { - switch (reaction.emoji.name) { - case "❌": - await collector.stop(); - return mainMessage.delete(); - break; - case "⏪": - if (evaled.length === 1 || page === 0) return; - page = 0; - break; - case "◀️": - if (evaled.length === 1) return; - if (page === 0) { - page = evaled.length - 1; - } else { - page -= 1; - } - break; - case "⏹️": - await collector.stop(); - for (let reaction of mainMessage.reactions.cache.array()) { - await reaction.users.remove(client.user.id); - } - return; - break; - case "▶️": - if (evaled.length === 1) return; - if (page === evaled.length - 1) { - page = 0; - } else { - page += 1; - } - break; - case "⏩": - if (evaled.length === 1 || page === evaled.length - 1) return; - page = evaled.length - 1; - break; - } - evaledEmbed = new Discord.MessageEmbed() - .setColor(message.guild.me.displayColor) - .setDescription(`\`\`\`js\n${evaled[page]}\n\`\`\``) - .addField(`Type of`, `\`\`\`js\n${typeof evaled[page]}\n\`\`\``); - - await mainMessage.edit({ - embed: evaledEmbed, - }); - }); - }, -}; diff --git a/commands/Owner/guilds.js b/commands/Owner/guilds.js deleted file mode 100644 index 4ab8dee..0000000 --- a/commands/Owner/guilds.js +++ /dev/null @@ -1,24 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "guilds", - category: "Owner", - description: "Check top 10 guilds of the bot", - Owner: true, - run: async (client, message, args) => { - const guilds = client.guilds.cache - .sort((a, b) => b.memberCount - a.memberCount) - .first(10); - const description = guilds - .map((guild, index) => { - return `${index + 1}) ${guild.name} -> ${guild.memberCount}members`; - }) - .join("\n"); - let embed = new MessageEmbed() - .setTitle("Guilds") - .setDescription(description) - .setColor(client.color) - .setFooter(`Made by ${client.author}`) - .setTimestamp(); - message.channel.send(embed); - }, -}; diff --git a/commands/Owner/restart.js b/commands/Owner/restart.js deleted file mode 100644 index 175df47..0000000 --- a/commands/Owner/restart.js +++ /dev/null @@ -1,13 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "restart", - category: "Owner", - description: "Restart the bot", - Owner: true, - run: async (client, message, args) => { - const msg = await message.channel.send("Restarting..."); - await client.destroy(); - await client.login(process.env.TOKEN); - await msg.delete().then(msg => message.channel.send("Restarted")); - }, -}; diff --git a/commands/Owner/spider.js b/commands/Owner/spider.js deleted file mode 100644 index 51de354..0000000 --- a/commands/Owner/spider.js +++ /dev/null @@ -1,19 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); - -module.exports = { - name: "spider", - Owner: true, - /** - * @param {Client} client - * @param {Message} message - * @param {String[]} args - */ - run: async (client, message, args) => { - for (var i = 0; i < 10; i++) { - client.function.sleep(5000); - message.channel.send( - "https://media.discordapp.net/attachments/838006493361471508/864730147545284618/image0.gif" - ); - } - }, -}; diff --git a/commands/Owner/test.js b/commands/Owner/test.js deleted file mode 100644 index dfbc8bb..0000000 --- a/commands/Owner/test.js +++ /dev/null @@ -1,32 +0,0 @@ -// const { Client, Message, MessageEmbed } = require("discord.js"); -// const db = require("../../models/bot"); -// module.exports = { -// name: "test", -// Owner: true, -// /** -// * @param {Client} client -// * @param {Message} message -// * @param {String[]} args -// */ -// run: async (client, message, args) => { -// db.findOne({ Bot: client.user.id }, async (err, data) => { -// let cmdstatus; -// if (!data) { -// return; -// } else { -// data.Commands.map(x => { -// const arr = Object.values(x.commands); -// const finded = arr.find(a => a.name == args[0].toLowerCase()); -// if (!finded) return; -// else cmdstatus = finded.status; -// }); -// data.Commands.commands.status = false; - -// if (cmdstatus === true) { -// cmdstatus = false; -// await db.findOneAndUpdate({ Bot: client.user.id }, data); -// } -// } -// }); -// }, -// }; diff --git a/commands/Utilities/afk.js b/commands/Utilities/afk.js deleted file mode 100644 index f75f9cb..0000000 --- a/commands/Utilities/afk.js +++ /dev/null @@ -1,26 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "afk", - description: "Tell someone you are AFK.", - usage: "{Status}", - category: "Utilities", - run: async (client, message, args) => { - let uuser = message.guild.members.cache.get(message.author.id); - const content = args.join(" ") || "No status provided."; - uuser.setNickname(`[AFK]${message.author.username}`); - await client.data.AFK(message.author.id, content); - const embed = new MessageEmbed() - .setDescription( - `${message.author.username} is set into AFK.\nStatus : ${content}` - ) - .setTimestamp() - .setFooter(`Made by ${client.author}`) - .setColor(client.color) - .setAuthor( - message.author.tag, - message.author.displayAvatarURL({ dynamic: true }) - ) - .setURL(client.web); - message.channel.send(embed); - }, -}; diff --git a/commands/Utilities/avatar.js b/commands/Utilities/avatar.js deleted file mode 100644 index 6aa71e8..0000000 --- a/commands/Utilities/avatar.js +++ /dev/null @@ -1,49 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "avatar", - description: "Show user's avatar in different formats", - aliases: ["av"], - usage: "{User}", - category: "Utilities", - run: async (client, message, args) => { - const member = - message.mentions.members.first() || - message.guild.members.cache.get(args[0]) || - message.guild.members.cache.find( - r => - r.user.username.toLowerCase() === args.join(" ").toLocaleLowerCase() - ) || - message.guild.members.cache.find( - r => r.displayName.toLowerCase() === args.join(" ").toLocaleLowerCase() - ) || - message.member; - const embed = new MessageEmbed() - .setAuthor( - member.user.tag, - member.user.displayAvatarURL({ dynamic: true, size: 1024 }) - ) - .setColor(client.color) - .setTitle(`**Avatar**`) - .setDescription( - `\`Links:\` **[png](${member.user.displayAvatarURL({ - format: "png", - size: 1024, - })}) | [jpg](${member.user.displayAvatarURL({ - format: "jpg", - size: 1024, - })}) | [gif](${member.user.displayAvatarURL({ - format: "gif", - size: 1024, - dynamic: true, - })}) | [webp](${member.user.displayAvatarURL({ - format: "webp", - size: 1024, - })})**` - ) - .setImage(member.user.displayAvatarURL({ dynamic: true, size: 1024 })) - .setFooter(`Made by ${client.author}`) - .setURL(client.web) - .setTimestamp(); - return message.inlineReply(embed); - }, -}; diff --git a/commands/Utilities/botinfo.js b/commands/Utilities/botinfo.js deleted file mode 100644 index 7530c30..0000000 --- a/commands/Utilities/botinfo.js +++ /dev/null @@ -1,49 +0,0 @@ -const { - Client, - Message, - MessageEmbed, - version: djsversion, -} = require("discord.js"); -const version = require("../../package.json").version; -const { utc } = require("moment"); -const os = require("os"); -const ms = require("ms"); -module.exports = { - name: "botinfo", - description: "Check the info of the bot", - category: "Utilities", - run: async (client, message, args) => { - const core = os.cpus()[0]; - const embed = new MessageEmbed() - .setURL(client.web) - .setThumbnail(client.user.displayAvatarURL()) - .setColor(message.guild.me.displayHexColor || client.color) - .addField("General", [ - `**❯ Client:** ${client.user.tag} (${client.user.id})`, - `**❯ Commands:** ${client.commands.size}`, - `**❯ Servers:** ${client.guilds.cache.size.toLocaleString()} `, - `**❯ Users:** ${client.guilds.cache - .reduce((a, b) => a + b.memberCount, 0) - .toLocaleString()}`, - `**❯ Channels:** ${client.channels.cache.size.toLocaleString()}`, - `**❯ Creation Date:** ${utc(client.user.createdTimestamp).format( - "Do MMMM YYYY HH:mm:ss" - )}`, - `**❯ Node.js:** ${process.version}`, - `**❯ Version:** v${version}`, - `**❯ Discord.js:** v${djsversion}`, - "\u200b", - ]) - .setColor(client.color) - .addField("System", [ - `**❯ Platform:** ${process.platform}`, - `**❯ Uptime:** ${ms(os.uptime() * 1000, { long: true })}`, - `**❯ CPU:**`, - `\u3000 Cores: ${os.cpus().length}`, - `\u3000 Model: ${core.model}`, - `\u3000 Speed: ${core.speed}MHz`, - ]) - .setTimestamp(); - message.inlineReply(embed); - }, -}; diff --git a/commands/Utilities/choose.js b/commands/Utilities/choose.js deleted file mode 100644 index fd6083b..0000000 --- a/commands/Utilities/choose.js +++ /dev/null @@ -1,15 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "choose", - aliases: ["random", "8ball"], - description: "Choose random things", - usage: "(Choices)", - category: "Utilities", - run: async (client, message, args) => { - const split = args.join(" ").split(" "); - if (!split) return client.err(message, "Utilities", "choose", 0); - if (!split[1]) return client.err(message, "Utilities", "choose", 101); - let choices = split[Math.floor(Math.random() * split.length)]; - message.channel.send(`I will choose - \`${choices}\``); - }, -}; diff --git a/commands/Utilities/docs.js b/commands/Utilities/docs.js deleted file mode 100644 index 597def2..0000000 --- a/commands/Utilities/docs.js +++ /dev/null @@ -1,19 +0,0 @@ -const fetch = require("node-fetch"); -module.exports = { - name: "docs", - usage: "(Query)", - description: "Search the discord.js docs for something!", - run: async (client, message, args) => { - const query = args.join(" "); - if (!query) return client.err(message, "Utilities", "docs", 51); - fetch( - `https://djsdocs.sorta.moe/v2/embed?src=stable&q=${encodeURIComponent( - query - )}` - ) - .then(res => res.json()) - .then(data => { - message.inlineReply({ embed: data }); - }); - }, -}; diff --git a/commands/Utilities/emoji.js b/commands/Utilities/emoji.js deleted file mode 100644 index dace54e..0000000 --- a/commands/Utilities/emoji.js +++ /dev/null @@ -1,21 +0,0 @@ -const { Client, Message, MessageEmbed, Util } = require("discord.js"); -module.exports = { - name: "emoji", - aliases: ["se", "stealemoji"], - usage: "(Emoji)", - description: "Show an emoji URL", - category: "Utilities", - run: async (client, message, args) => { - if (!args.length) return client.err(message, "Utilities", "emoji", 11); - for (const rawEmoji of args) { - const parsedEmoji = Util.parseEmoji(rawEmoji); - if (parsedEmoji.id) { - const extension = parsedEmoji.animated ? ".gif" : ".png"; - const url = `https://cdn.discordapp.com/emojis/${ - parsedEmoji.id + extension - }`; - message.channel.send(`Emoji URL:\n${url}`); - } - } - }, -}; diff --git a/commands/Utilities/help.js b/commands/Utilities/help.js index d74beff..1d1a3df 100644 --- a/commands/Utilities/help.js +++ b/commands/Utilities/help.js @@ -1,6 +1,5 @@ -const { MessageEmbed } = require("discord.js"); +const Discord = require("discord.js"); const { readdirSync } = require("fs"); -const ms = require("ms"); module.exports = { name: "help", @@ -15,29 +14,39 @@ module.exports = { Config: "<:staff:840231971526803467>", Economy: client.currency, Fun: "", - Moderation: ":tools:", - Utilities: ":gear:", + Moderation: "🔨", + Utilities: "⚙", Music: "", Giveaway: "", + Information: "ℹ", }; if (!args[0]) { - let categories = []; - readdirSync("./commands/").forEach(dir => { - const category = ["Owner"]; - if (category.includes(dir)) return; - const edited = `${emoji[dir]} ${dir}`; - let data = new Object(); - data = { - name: edited, - value: `\`${p}help ${dir.toLowerCase()}\``, - inline: true, + const directories = [ + ...new Set(client.commands.map(cmd => cmd.directory)), + ]; + const categories = directories.map(dir => { + if (dir == "Owner") return; + const getCmds = client.commands + .filter(c => c.directory == dir) + .map(cmd => { + return { + name: cmd.name || "No command name", + }; + }); + return { + directory: dir, + commands: getCmds, }; - categories.push(data); }); - const embed = new MessageEmbed() + const embed = new Discord.MessageEmbed() .setTitle(`**${client.user.username} commands**`) - .addFields(categories) - + .setDescription(`Please choose a category in the dropdown menu`) + .setColor(client.color) + .setTimestamp() + .setAuthor( + `Requested by ${message.author.tag}`, + message.author.displayAvatarURL({ dynamic: true }) + ) .addField( "**Invite Link**", `**Invite me to your server by clicking [here](https://discord.com/api/oauth2/authorize?client_id=${client.user.id}&permissions=4231314550&scope=bot%20applications.commands)**` @@ -54,144 +63,61 @@ module.exports = { .setFooter( `Requested by ${message.author.tag}`, message.author.displayAvatarURL({ dynamic: true }) - ) - .setTimestamp() - .setColor(client.color); - return message.channel.send(embed); - } else if (args[0] === "moderation") { - const commandList = []; - readdirSync(`./commands/Moderation`).forEach(file => { - const pull = require(`../../commands/Moderation/${file}`); - const name = `\`${pull.name}\``; - commandList.push(name); + ); + const components = state => [ + new Discord.MessageActionRow().addComponents( + new Discord.MessageSelectMenu() + .setCustomId("help-menu") + .setPlaceholder(`Please select a category`) + .setDisabled(state) + .addOptions( + categories.map(cmd => { + return { + label: cmd.directory, + value: cmd.directory, + description: `Commands from ${cmd.directory} category`, + emoji: emoji[cmd.directory] || null, + }; + }) + ) + ), + ]; + + const msg = await message.channel.send({ + embeds: [embed], + components: components(false), }); - return message.reply( - new MessageEmbed() - .setDescription(commandList.map(data => `${data}`).join(", ")) - .setTimestamp() - .setURL(client.web) - .setColor(client.color) - .setTitle(":tools:**Moderation Commands**:tools:") - ); - } else if (args[0] === "utilities") { - const commandList = []; - readdirSync(`./commands/Utilities`).forEach(file => { - const pull = require(`../../commands/Utilities/${file}`); - const name = `\`${pull.name}\``; - commandList.push(name); + const filter = m => m.user.id === message.author.id; + const collector = message.channel.createMessageComponentCollector({ + filter, + componentType: "SELECT_MENU", + time: 60000, }); - return message.reply( - new MessageEmbed() - .setDescription(commandList.map(data => `${data}`).join(", ")) - .setTimestamp() - .setURL(client.web) - .setColor(client.color) - .setTitle(":gear:**Utiltiies Commands**:gear:") - ); - } else if (args[0] === "codm") { - const commandList = []; - readdirSync(`./commands/CODM`).forEach(file => { - const command = readdirSync(`./commands/CODM`); - const pull = require(`../../commands/CODM/${file}`); - const name = `\`${pull.name}\``; - commandList.push(name); - }); - return message.reply( - new MessageEmbed() - .setDescription(commandList.map(data => `${data}`).join(", ")) - .setTimestamp() - .setURL(client.web) - .setColor(client.color) + collector.on("collect", async interaction => { + const [directory] = interaction.values; + const category = categories.find(u => u.directory === directory); + const newembed = new Discord.MessageEmbed() .setTitle( - "**CODM Commands**" + `${emoji[directory]}${directory} Commands${emoji[directory]}` + ) + .setAuthor( + `Requested by ${message.author.tag}`, + message.author.displayAvatarURL({ dynamic: true }) ) - ); - } else if (args[0] === "config") { - const commandList = []; - readdirSync(`./commands/Config`).forEach(file => { - const pull = require(`../../commands/Config/${file}`); - const name = `\`${pull.name}\``; - commandList.push(name); - }); - return message.reply( - new MessageEmbed() - .setDescription(commandList.map(data => `${data}`).join(", ")) .setTimestamp() .setURL(client.web) .setColor(client.color) - .setTitle( - "<:staff:829718501224480788>**Config Commands**<:staff:829718501224480788>" - ) - ); - } else if (args[0] === "economy") { - const commandList = []; - readdirSync(`./commands/Economy`).forEach(file => { - const pull = require(`../../commands/Economy/${file}`); - const name = `\`${pull.name}\``; - commandList.push(name); + .setFooter(`Please use /help (Command Name) for more details`) + .setDescription( + category.commands + .map(cmd => { + return [`\`${cmd.name}\``]; + }) + .join(", ") + ); + interaction.reply({ embeds: [newembed] }); }); - return message.reply( - new MessageEmbed() - .setDescription(commandList.map(data => `${data}`).join(", ")) - .setTimestamp() - .setURL(client.web) - .setColor(client.color) - .setTitle(`${client.currency}**Economy Commands**${client.currency}`) - ); - } else if (args[0] === "fun") { - const commandList = []; - readdirSync(`./commands/Fun`).forEach(file => { - const pull = require(`../../commands/Fun/${file}`); - if (pull.hidden) return; - const name = `\`${pull.name}\``; - commandList.push(name); - }); - return message.reply( - new MessageEmbed() - .setDescription(commandList.map(data => `${data}`).join(", ")) - .setTimestamp() - .setURL(client.web) - .setColor(client.color) - .setTitle( - "**Fun Commands**" - ) - ); - } else if (args[0] === "music") { - const commandList = []; - readdirSync(`./commands/Music`).forEach(file => { - const pull = require(`../../commands/Music/${file}`); - if (pull.hidden) return; - const name = `\`${pull.name}\``; - commandList.push(name); - }); - return message.reply( - new MessageEmbed() - .setDescription(commandList.map(data => `${data}`).join(", ")) - .setTimestamp() - .setURL(client.web) - .setColor(client.color) - .setTitle( - "**Music Commands**" - ) - ); - } else if (args[0] === "giveaway") { - const commandList = []; - readdirSync(`./commands/Giveaway`).forEach(file => { - const pull = require(`../../commands/Giveaway/${file}`); - if (pull.hidden) return; - const name = `\`${pull.name}\``; - commandList.push(name); - }); - return message.reply( - new MessageEmbed() - .setDescription(commandList.map(data => `${data}`).join(", ")) - .setTimestamp() - .setURL(client.web) - .setColor(client.color) - .setTitle( - "**Giveaway Commands**" - ) - ); + collector.on("end", () => msg.edit({ components: components(true) })); } else { const command = client.commands.get(args[0].toLowerCase()) || @@ -199,9 +125,9 @@ module.exports = { c => c.aliases && c.aliases.includes(args[0].toLowerCase()) ); if (!command) { - message.channel.send( - `There isn't any command or category named "${args[0]}"` - ); + message.channel.send({ + content: `There isn't any command named "${args[0]}"`, + }); } else { if (command.UserPerm && Array.isArray(command.UserPerm)) { UserPermissions = command.UserPerm; @@ -221,7 +147,7 @@ module.exports = { .map(y => y[0] + y.substring(1, y.length).toLowerCase()) .join(" ") ).join(", "); - const embed = new MessageEmbed() + const embed = new Discord.MessageEmbed() .setTitle(`"${command.name}" command details`) .addField( "**Command**:", @@ -242,7 +168,10 @@ module.exports = { embed.addField("**Description**:", command.description); } if (command.timeout) { - embed.addField("**Cooldown**:", ms(command.timeout, { long: true })); + embed.addField( + "**Cooldown**:", + utils.ms(command.timeout, { long: true }) + ); } if (command.UserPerm) { embed.addField("**Required User Permission**:", UserPerms); @@ -258,7 +187,7 @@ module.exports = { .setTimestamp() .setURL(client.web) .setColor(client.color); - message.reply(embed); + message.reply({ embeds: [embed] }); } } }, diff --git a/commands/Utilities/invite.js b/commands/Utilities/invite.js deleted file mode 100644 index 36e4383..0000000 --- a/commands/Utilities/invite.js +++ /dev/null @@ -1,29 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); - -module.exports = { - name: "invite", - aliases: ["support", "bot", "server"], - description: "Get bot invite link", - category: "Utilities", - run: async (client, message, args) => { - var embed = new MessageEmbed() - .setFooter(`Made by ${client.author}`) - .setColor(client.color) - .setTimestamp() - .setAuthor(message.author.tag, message.author.displayAvatarURL) - .setTitle(`Support/Invite`) - .addField( - "**Invite Link**", - `**Invite me to your server by clicking [here](https://discord.com/api/oauth2/authorize?client_id=${client.user.id}&permissions=4231314550&scope=bot%20applications.commands)**` - ) - .addField( - "**Support Server Invite**", - "**Join the support server by clicking [here](https://discord.gg/SbQHChmGcp)**" - ) - .addField( - "**Premium**", - "**You can either boost support server or gift a nitro to one of the Developer of Cath Team to be premium user**" - ); - message.inlineReply(embed); - }, -}; diff --git a/commands/Utilities/messageinfo.js b/commands/Utilities/messageinfo.js deleted file mode 100644 index 12196dc..0000000 --- a/commands/Utilities/messageinfo.js +++ /dev/null @@ -1,30 +0,0 @@ -const { MessageEmbed } = require("discord.js"); -module.exports = { - name: "messageinfo", - run: async (client, message, args) => { - try { - if (!args[0]) return client.err(message, "Utilities", "Fun", 27); - await message.channel.messages.fetch(args[0]).catch(err => { - return message.inlineReply("Message not found in this channel.."); - }); - const msg = await message.channel.messages.cache.get(args[0]); - console.log(msg); - const hasImage = msg.attachments.size && msg.attachments.first().width; - const embed = new MessageEmbed() - .setColor(msg.member ? msg.member.displayHexColor : client.color) - .setImage(hasImage ? msg.attachments.first().url : null) - .setAuthor( - msg.author.tag, - msg.author.displayAvatarURL({ format: "png", dynamic: true }) - ) - .addField("Content", msg.content) - .setTimestamp(msg.createdAt) - .addField("ID", msg.id) - .setFooter(`Made by ${client.author}`) - .addField("Jump", `[Click Here to Jump](${msg.url})`); - return message.inlineReply(embed); - } catch (err) { - console.log(err); - } - }, -}; diff --git a/commands/Utilities/modmail.js b/commands/Utilities/modmail.js deleted file mode 100644 index a806a9a..0000000 --- a/commands/Utilities/modmail.js +++ /dev/null @@ -1,138 +0,0 @@ -const schema = require("../../models/modmail"); -const { MessageEmbed, MessageAttachment } = require("discord.js"); -const fs = require("fs"); -module.exports = { - name: "modmail", - BotPerm: "MANAGE_CHANNELS", - description: "Create a modmail thread with moderators in a server", - usage: "(Emoji) (Text)", - category: "Utilities", - run: async (client, message, args) => { - const data = await schema.findOne({ Guild: message.guild.id }); - if ( - !data || - !data.Role || - !data.Category || - !data.Choices || - !Object.entries(data.Choices).length || - !message.guild.roles.cache.has(data.Role) || - !message.guild.channels.cache.find( - value => value.type == "category" && value.id === data.Category - ) - ) - return message.channel.send( - `This server isn't setup properly. Please find an administrator or a moderator to specify a category, role and choices for users to create thread. The issue may be caused by invalid role/category.` - ); - const embed = new MessageEmbed(); - const choices = Object.entries(data.Choices); - embed.setDescription( - choices.map(value => `${value[1].emoji} - ${value[1].text}`).join("\n") - ); - try { - const msg = await message.author.send(embed); - choices.map(async value => { - await msg.react(value[1].emoji); - }); - const reactionCollector = await msg.createReactionCollector( - async (reaction, user) => - choices.map(value => value[1].emoji).includes(reaction.emoji.name) && - user.id == message.author.id, - { time: 30000 } - ); - let type; - reactionCollector.on("collect", async reaction => { - type = choices.find(value => value[1].emoji == reaction.emoji.name); - await msg.delete(); - reactionCollector.stop("done"); - }); - reactionCollector.on("end", async (collected, reason) => { - if (reason.toLowerCase() == "time") { - return ( - message.channel.send( - "You didn't provide a reaction in-time. Cancelled." - ), - message.author.send( - "You didn't provide a reaction in-time. Cancelled" - ) - ); - } else { - const channel = await message.guild.channels.create( - `${message.author.username}-${message.author.discriminator}`, - { - reason: "Modmail thread", - parent: data.Category, - topic: `${type[1].text}`, - type: "text", - } - ); - const transcript = []; - channel.createOverwrite(data.Role, { - VIEW_CHANNEL: true, - SEND_MESSAGES: true, - }); - channel.createOverwrite(message.guild.id, { - VIEW_CHANNEL: false, - }); - channel.send( - `A modmail thread has been started by ${message.author.tag} with type: ${type[1].text}\nUse \`close\` to close the thread.` - ); - message.author.send( - "Thread created. Use `close` to close the thread." - ); - const channelCollector = channel.createMessageCollector( - m => !m.author.bot - ); - const dmCollector = message.author.dmChannel.createMessageCollector( - m => !m.author.bot - ); - channelCollector.on("collect", async m => { - if (m.content.toLowerCase().startsWith("close")) { - message.author.send("Closing.."); - channel.send("Closing.."); - dmCollector.stop("done"); - channelCollector.stop("done"); - fs.writeFileSync( - `./transcript.${message.author.id}.txt`, - transcript.join("\n") - ); - const attachment = new MessageAttachment( - fs.createReadStream(`./transcript.${message.author.id}.txt`) - ); - await channel.send(attachment); - fs.unlinkSync(`./transcript.${message.author.id}.txt`); - setTimeout(() => { - channel.delete(); - }, 1000 * 10); - } - message.author.send(`**Admin**: ${m.content}`); - transcript.push(`**Admin**: ${m.content}`); - }); - dmCollector.on("collect", async m => { - if (m.content.toLowerCase().startsWith("close")) { - message.author.send("Closing.."); - channel.send("Closing.."); - dmCollector.stop("done"); - channelCollector.stop("done"); - fs.writeFileSync( - `./transcript.${message.author.id}.txt`, - transcript.join("\n") - ); - const attachment = new MessageAttachment( - fs.createReadStream(`./transcript.${message.author.id}.txt`) - ); - await channel.send(attachment); - fs.unlinkSync(`./transcript.${message.author.id}.txt`); - setTimeout(() => { - channel.delete(); - }, 1000 * 10); - } - channel.send(`**${message.author.tag}**: ${m.content}`); - transcript.push(`**${message.author.tag}**: ${m.content}`); - }); - } - }); - } catch { - return message.reply("please let me send DM to you."); - } - }, -}; diff --git a/commands/Utilities/permission.js b/commands/Utilities/permission.js deleted file mode 100644 index f4ef0f4..0000000 --- a/commands/Utilities/permission.js +++ /dev/null @@ -1,105 +0,0 @@ -const Discord = require("discord.js"); -module.exports = { - name: "permission", - aliases: ["perms", "permsfor"], - usage: "(User)", - description: "Show user's permission in server/channel", - category: "Utilities", - run: async (client, message, args) => { - const yes = "✔️"; - const no = "❌"; - const x = "```"; - const s = "📛"; - const c = "♨️"; - - const permissions = [ - "CREATE_INSTANT_INVITE", - "KICK_MEMBERS", - "BAN_MEMBERS", - "ADMINISTRATOR", - "MANAGE_CHANNELS", - "MANAGE_GUILD", - "ADD_REACTIONS", - "VIEW_AUDIT_LOG", - "PRIORITY_SPEAKER", - "STREAM", - "VIEW_CHANNEL", - "SEND_MESSAGES", - "SEND_TTS_MESSAGES", - "MANAGE_MESSAGES", - "EMBED_LINKS", - "ATTACH_FILES", - "READ_MESSAGE_HISTORY", - "MENTION_EVERYONE", - "USE_EXTERNAL_EMOJIS", - "VIEW_GUILD_INSIGHTS", - "CONNECT", - "SPEAK", - "MUTE_MEMBERS", - "DEAFEN_MEMBERS", - "MOVE_MEMBERS", - "USE_VAD", - "CHANGE_NICKNAME", - "MANAGE_NICKNAMES", - "MANAGE_ROLES", - "MANAGE_WEBHOOKS", - "MANAGE_EMOJIS", - ]; - - let user = - message.mentions.members.first() || - message.guild.members.cache.get(args[0]) || - message.guild.members.cache.find( - r => - r.user.username.toLowerCase() === args.join(" ").toLocaleLowerCase() - ) || - message.guild.members.cache.find( - r => r.displayName.toLowerCase() === args.join(" ").toLocaleLowerCase() - ) || - message.member; - let userId = user.user.id; - let description = `Server - ${s}\nCurrent channel - ${c}\n\n${s} | ${c}\n`; - let embed = new Discord.MessageEmbed() - .setTitle(`${user.user.username} Permissions`) - .setColor(user.displayColor) - .setURL(client.web); - permissions.forEach(perm => { - description += `${user.permissions.has(perm) ? yes : no} | ${ - message.channel.permissionsFor(userId).has(perm) ? yes : no - } - ${perm - .replace("CREATE_INSTANT_INVITE", "Create Invite") - .replace("KICK_MEMBERS", "Kick Members") - .replace("BAN_MEMBERS", "Ban Members") - .replace("ADMINISTRATOR", "Administrator") - .replace("MANAGE_CHANNELS", "Manage Channels") - .replace("MANAGE_GUILD", "Manage Guild") - .replace("ADD_REACTIONS", "Add Reactions") - .replace("VIEW_AUDIT_LOG", "View Audit Log") - .replace("PRIORITY_SPEAKER", "Priority Speaker") - .replace("STREAM", "Stream") - .replace("VIEW_CHANNEL", "View Channel") - .replace("SEND_MESSAGES", "Send Messages") - .replace("SEND_TTS_MESSAGES", "Send TTS Messages") - .replace("MANAGE_MESSAGES", "Manage Messages") - .replace("EMBED_LINKS", "Embed Links") - .replace("ATTACH_FILES", "Attach Files") - .replace("READ_MESSAGE_HISTORY", "Read Message History") - .replace("MENTION_EVERYONE", "Mention Everyone") - .replace("USE_EXTERNAL_EMOJIS", "Use External Emojis") - .replace("VIEW_GUILD_INSIGHTS", "View Guild Insights") - .replace("CONNECT", "Connect") - .replace("SPEAK", "Speak") - .replace("MUTE_MEMBERS", "Mute Members") - .replace("DEAFEN_MEMBERS", "Defean Members") - .replace("MOVE_MEMBERS", "Move Members") - .replace("USE_VAD", "Use VAD") - .replace("CHANGE_NICKNAME", "Change Nickname") - .replace("MANAGE_NICKNAMES", "Manage Nicknames") - .replace("MANAGE_ROLES", "Manage Roles") - .replace("MANAGE_WEBHOOKS", "Manage Webhooks") - .replace("MANAGE_EMOJIS", "Manage Emojis")}\n`; - }); - embed.setDescription(x + description + x); - message.channel.send(embed); - }, -}; diff --git a/commands/Utilities/ping.js b/commands/Utilities/ping.js deleted file mode 100644 index ec3126a..0000000 --- a/commands/Utilities/ping.js +++ /dev/null @@ -1,28 +0,0 @@ -const { MessageEmbed } = require("discord.js"); -module.exports = { - name: "ping", - description: "Check bot latency to Discord API", - run: async (client, message, args) => { - const msg = await message.channel.send("Pinging..."); - const messageping = msg.createdTimestamp - message.createdTimestamp; - const Embed = new MessageEmbed() - .setTitle("🏓 Pong!") - .setAuthor( - `${message.author.username}`, - message.author.displayAvatarURL() - ) - .setDescription( - `📨 • **Message Latency** \`${Math.floor( - messageping - )}ms\`\n🛰️ • **Bot Latency** \`${Math.round(client.ws.ping)}ms\`` - ) - .setColor( - messageping < 350 - ? "GREEN" - : messageping < 500 && messageping > 350 - ? "YELLOW" - : "RED" - ); - msg.edit("", Embed); - }, -}; diff --git a/commands/Utilities/poll.js b/commands/Utilities/poll.js deleted file mode 100644 index 27a8d19..0000000 --- a/commands/Utilities/poll.js +++ /dev/null @@ -1,24 +0,0 @@ -const { MessageEmbed } = require("discord.js"); -module.exports = { - name: "poll", - description: "Start a poll in a channel", - category: "Utilities", - Owner: true, - run: async (client, message, args) => { - let pollDescription = ` - ${message.author} asks: ${args.slice(1).join(" ")} - `; - const channel = message.mentions.channels.first(); - if (!channel) return client.err(message, "Utilities", "poll", 28); - if (!pollDescription) return client.err(message, "Utilities", "poll", 12); - let embedPoll = new MessageEmbed() - .setTitle(`${message.author.username} made a poll`) - .setDescription(pollDescription) - .setFooter(`Made by ${client.author}`) - .setTimestamp() - .setColor("GREEN"); - let msgEmbed = await channel.send(embedPoll); - await msgEmbed.react("👍"); - await msgEmbed.react("👎"); - }, -}; diff --git a/commands/Utilities/rank.js b/commands/Utilities/rank.js deleted file mode 100644 index 04225e5..0000000 --- a/commands/Utilities/rank.js +++ /dev/null @@ -1,42 +0,0 @@ -const { MessageAttachment } = require("discord.js"); -const Levels = require("discord-xp"); -const canvacord = require("canvacord"); -module.exports = { - name: "rank", - description: "Shows the current level and rank of the user!", - usage: "{User}", - timeout: 5000, - category: "Utilities", - Level: true, - run: async (client, message, args) => { - if (!message.guild) return; - if (message.author.bot) return; - const target = - message.mentions.users.first() || - message.guild.members.cache.find( - r => r.user.username.toLowerCase() === args[0].toLocaleLowerCase() - ) || - message.guild.members.cache.find( - r => r.displayName.toLowerCase() === args[0].toLocaleLowerCase() - ) || - message.guild.members.cache.get(args[0]) || - message.author; - const user = await Levels.fetch(target.id, message.guild.id, true); - if (!user) return client.err(message, "Utilities", "rank", 10); - const neededXp = Levels.xpFor(parseInt(user.level) + 1); - const Rank = new canvacord.Rank() - .setAvatar(target.displayAvatarURL({ dynamic: false, format: "png" })) - .setCurrentXP(user.xp) - .setRank(parseInt(user.position)) - .setLevel(user.level) - .setRequiredXP(neededXp) - .setStatus(target.presence.status) - .setProgressBar("BLACK", "COLOR") - .setUsername(target.username) - .setDiscriminator(target.discriminator); - Rank.build().then(data => { - const attachment = new MessageAttachment(data, "RankCard.png"); - message.reply(attachment); - }); - }, -}; diff --git a/commands/Utilities/report.js b/commands/Utilities/report.js deleted file mode 100644 index a01c4ce..0000000 --- a/commands/Utilities/report.js +++ /dev/null @@ -1,78 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); - -module.exports = { - name: "report", - description: "Report a bug of the bot", - category: "Utilities", - run: async (client, message, args) => { - const questions = [ - "Describe the bug", - //"question 2" - ]; - - let collectCounter = 0; - let endCounter = 0; - - const filter = m => m.author.id === message.author.id; - message.inlineReply("Check your dm."); - const appStart = await message.author.send( - new MessageEmbed() - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setDescription(questions[collectCounter++]) - .setFooter(client.user.username) - .setTimestamp() - ); - const channel = appStart.channel; - - const collector = channel.createMessageCollector(filter); - - collector.on("collect", () => { - if (collectCounter < questions.length) { - channel.send( - new MessageEmbed() - .setAuthor( - message.author.username, - message.author.displayAvatarURL() - ) - .setDescription(questions[collectCounter++]) - .setFooter(client.user.username) - .setTimestamp() - ); - } else { - channel.send( - new MessageEmbed() - .setTitle("SUCCESS!") - .setDescription( - "You have reported a bug.\nPlease wait for us to solve it" - ) - .setColor("GREEN") - ); - collector.stop("fulfilled"); - } - }); - - const appsChannel = client.channels.cache.get(client.ReportLog); - collector.on("end", (collected, reason) => { - if (reason === "fulfilled") { - let index = 1; - const mapedResponses = collected - .map(msg => { - return `${questions[endCounter++]}**\n->** ${msg.content}`; - }) - .join("\n\n"); - - appsChannel.send( - new MessageEmbed() - .setAuthor( - message.author.tag, - message.author.displayAvatarURL({ dynamic: true }) - ) - .setTitle("New Bug") - .setDescription(mapedResponses) - .setColor("ORANGE") - .setTimestamp() - ); - } - }); - }, -}; diff --git a/commands/Utilities/roleinfo.js b/commands/Utilities/roleinfo.js deleted file mode 100644 index 7410ebf..0000000 --- a/commands/Utilities/roleinfo.js +++ /dev/null @@ -1,90 +0,0 @@ -const moment = require("moment"); -const { MessageEmbed } = require("discord.js"); -module.exports = { - name: "roleinfo", - aliases: ["role"], - category: "Utilities", - run: async (client, message, args) => { - const role = - message.mentions.roles.first() || - message.guild.roles.cache.get(args[0]) || - message.guild.roles.cache.find(r => r.name == args[0]) || - message.member.roles.cache.highest; - const permissions = { - ADMINISTRATOR: "Administrator", - VIEW_AUDIT_LOG: "View Audit Log", - VIEW_GUILD_INSIGHTS: "View Server Insights", - MANAGE_GUILD: "Manage Server", - MANAGE_ROLES: "Manage Roles", - MANAGE_CHANNELS: "Manage Channels", - KICK_MEMBERS: "Kick Members", - BAN_MEMBERS: "Ban Members", - CREATE_INSTANT_INVITE: "Create Invite", - CHANGE_NICKNAME: "Change Nickname", - MANAGE_NICKNAMES: "Manage Nicknames", - MANAGE_EMOJIS: "Manage Emojis", - MANAGE_WEBHOOKS: "Manage Webhooks", - VIEW_CHANNEL: "Read Text Channels & See Voice Channels", - SEND_MESSAGES: "Send Messages", - SEND_TTS_MESSAGES: "Send TTS Messages", - MANAGE_MESSAGES: "Manage Messages", - EMBED_LINKS: "Embed Links", - ATTACH_FILES: "Attach Files", - READ_MESSAGE_HISTORY: "Read Message History", - MENTION_EVERYONE: "Mention @everyone, @here, and All Roles", - USE_EXTERNAL_EMOJIS: "Use External Emojis", - ADD_REACTIONS: "Add Reactions", - CONNECT: "Connect", - SPEAK: "Speak", - STREAM: "Video", - MUTE_MEMBERS: "Mute Members", - DEAFEN_MEMBERS: "Deafen Members", - MOVE_MEMBERS: "Move Members", - USE_VAD: "Use Voice Activity", - PRIORITY_SPEAKER: "Priority Speaker", - }; - const yesno = { - true: "`Yes", - false: "`No`", - }; - if (!role) return client.err(message, "Utilities", "roleinfo", 3); - const rolePermissions = role.permissions.toArray(); - const finalPermissions = []; - for (const permission in permissions) { - if (rolePermissions.includes(permission)) - finalPermissions.push(`✔️ ${permissions[permission]}`); - else finalPermissions.push(`❌ ${permissions[permission]}`); - } - - const position = `\`${message.guild.roles.cache.size - role.position}\`/\`${ - message.guild.roles.cache.size - }\``; - - const embed = new MessageEmbed() - .setURL(client.web) - .setColor(client.color) - .setTimestamp() - .setAuthor( - message.author.tag, - message.author.displayAvatarURL({ dynamic: true }) - ) - .setTitle(`Role Info`) - .addField("Name", role, true) - .addField("ID", `\`${role.id}\``, true) - .addField("Position", position, true) - .addField("Mentionable", yesno[role.mentionable], true) - .addField("Bot Role", yesno[role.managed], true) - .addField("Visible", yesno[role.hoist], true) - .addField("Color", `\`${role.hexColor.toUpperCase()}\``, true) - .addField( - "Creation Date", - `\`${moment(role.createdAt).format("DD/MMM/YYYY")}\``, - true - ) - .addField( - "Permissions", - `\`\`\`diff\n${finalPermissions.join("\n")}\`\`\`` - ); - message.inlineReply(embed); - }, -}; diff --git a/commands/Utilities/servericon.js b/commands/Utilities/servericon.js deleted file mode 100644 index a2fcdc0..0000000 --- a/commands/Utilities/servericon.js +++ /dev/null @@ -1,16 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); - -module.exports = { - name: "servericon", - description: "View the icon of the server", - category: "Utilities", - run: async (client, message, args) => { - const Embed = new MessageEmbed() - .setTitle(`Icon of ${message.guild.name}`) - .setURL(client.web) - .setTimestamp() - .setFooter(`Requested by ${message.author.tag}`) - .setImage(message.guild.iconURL({ dynamic: true, size: 2048 })); - message.inlineReply(Embed); - }, -}; diff --git a/commands/Utilities/serverinfo.js b/commands/Utilities/serverinfo.js deleted file mode 100644 index 5d36ff3..0000000 --- a/commands/Utilities/serverinfo.js +++ /dev/null @@ -1,118 +0,0 @@ -const { MessageEmbed } = require("discord.js"); -const moment = require("moment"); - -const filterLevels = { - DISABLED: "Off", - MEMBERS_WITHOUT_ROLES: "No Role", - ALL_MEMBERS: "Everyone", -}; - -const verificationLevels = { - NONE: "None", - LOW: "Low", - MEDIUM: "Medium", - HIGH: "High", - VERY_HIGH: "Very High", -}; - -const regions = { - brazil: "Brazil", - europe: "Europe", - hongkong: "Hong Kong", - india: "India", - japan: "Japan", - russia: "Russia", - singapore: "Singapore", - southafrica: "South Africa", - sydeny: "Sydeny", - "us-central": "US Central", - "us-east": "US East", - "us-west": "US West", - "us-south": "US South", -}; - -module.exports = { - name: "serverinfo", - description: "Check the info of the server", - category: "Utilities", - run: async (client, message, args) => { - const roles = message.guild.roles.cache - .sort((a, b) => b.position - a.position) - .map(role => role.toString()) - .slice(0, -1); - const members = message.guild.members.cache; - const channels = message.guild.channels.cache; - const emojis = message.guild.emojis.cache; - - const embed = new MessageEmbed() - .setDescription(`**Guild information for __${message.guild.name}__**`) - .setColor(client.color) - .setThumbnail(message.guild.iconURL({ dynamic: true })) - .addField("General", [ - `**❯ Name:** ${message.guild.name}`, - `**❯ ID:** ${message.guild.id}`, - `**❯ Owner:** ${message.guild.owner.user.tag} (${message.guild.ownerID})`, - `**❯ Region:** ${regions[message.guild.region]}`, - `**❯ Boost Tier:** ${ - message.guild.premiumTier - ? `Tier ${message.guild.premiumTier}` - : "None" - }`, - `**❯ Explicit Filter:** ${ - filterLevels[message.guild.explicitContentFilter] - }`, - `**❯ Verification Level:** ${ - verificationLevels[message.guild.verificationLevel] - }`, - `**❯ Time Created:** ${moment(message.guild.createdTimestamp).format( - "LT" - )} ${moment(message.guild.createdTimestamp).format("LL")} ${moment( - message.guild.createdTimestamp - ).fromNow()}`, - `**❯ Community Features:** ${ - message.guild.features.join(", ") || "No Community Features!" - }`, - "\u200b", - ]) - .addField("Statistics", [ - `**❯ Role Count:** ${roles.length}`, - `**❯ Emoji Count:** ${emojis.size}`, - `**❯ Regular Emoji Count:** ${ - emojis.filter(emoji => !emoji.animated).size - }`, - `**❯ Animated Emoji Count:** ${ - emojis.filter(emoji => emoji.animated).size - }`, - `**❯ Member Count:** ${message.guild.memberCount}`, - `**❯ Humans:** ${members.filter(member => !member.user.bot).size}`, - `**❯ Bots:** ${members.filter(member => member.user.bot).size}`, - `**❯ Text Channels:** ${ - channels.filter(channel => channel.type === "text").size - }`, - `**❯ Voice Channels:** ${ - channels.filter(channel => channel.type === "voice").size - }`, - `**❯ Boost Count:** ${message.guild.premiumSubscriptionCount || "0"}`, - "\u200b", - ]) - .addField("Presence", [ - `**❯ Online:** ${ - members.filter(member => member.presence.status === "online").size - }`, - `**❯ Idle:** ${ - members.filter(member => member.presence.status === "idle").size - }`, - `**❯ Do Not Disturb:** ${ - members.filter(member => member.presence.status === "dnd").size - }`, - `**❯ Offline:** ${ - members.filter(member => member.presence.status === "offline").size - }`, - "\u200b", - ]) - .setURL(client.web) - //.addField(`Roles [${roles.length - 1}]`, roles.length < 10 ? roles.join(' **|** ') : roles.length > 10 ? roles.join(' **|** ') : 'None') - .setTimestamp(); - message.channel.send(embed); - }, -}; diff --git a/commands/Utilities/snipe.js b/commands/Utilities/snipe.js deleted file mode 100644 index 1e17254..0000000 --- a/commands/Utilities/snipe.js +++ /dev/null @@ -1,73 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -const moment = require("moment"); -module.exports = { - name: "snipe", - description: "Snipes a deleted message.", - category: "Utilities", - run: async (client, message, args) => { - var i = 0; - var description = ""; - const embed = new MessageEmbed() - .setAuthor( - `Sniped by ${message.author.tag}`, - message.author.displayAvatarURL({ dynamic: true }) - ) - .setColor(client.color) - .setFooter(`Made by ${client.author}`) - .setURL(client.web); - client.snipes.reverse().forEach(msg => { - if (msg.channel.id != message.channel.id) return; - if (i >= 5) return; - if (msg.attachment) { - if (msg.attachment.length == 1) { - description = - description + - `\n\n**Author:** ${msg.author.username}#${ - msg.author.discriminator - } (Deleted ${moment(msg.date).fromNow()})\n**ID:** ${ - msg.author.id - }\n**Content:** ${ - msg.content - }\n**Attachment URL:** [Click to view](${msg.attachment})`; - i++; - } else if (msg.attachment.length > 1) { - const map = msg.attachment.map( - (s, i) => `**${i + 1}:** [Click to view](${s})` - ); - description = - description + - `\n\n**Author:** ${msg.author.username}#${ - msg.author.discriminator - } (Deleted ${moment(msg.date).fromNow()})\n**ID:** ${ - msg.author.id - }\n**Content:** ${msg.content}\n**Attachment URLs:** \n${map.join( - "\n" - )}`; - i++; - } else { - description = - description + - `\n\n**Author:** ${msg.author.username}#${ - msg.author.discriminator - } (Deleted ${moment(msg.date).fromNow()})\n**ID:** ${ - msg.author.id - }\n**Content:** ${msg.content}`; - i++; - } - } else { - description = - description + - `\n\n**Author:** ${msg.author.username}#${ - msg.author.discriminator - } (Deleted ${moment(msg.date).fromNow()})\n**ID:** ${ - msg.author.id - }\n**Content:** ${msg.content}`; - i++; - } - }); - if (i == 0) return client.err(message, "Utilities", "snipe", 10); - embed.setDescription(description); - embed.setTimestamp(); - return message.inlineReply(embed); - }, -}; diff --git a/commands/Utilities/suggest.js b/commands/Utilities/suggest.js deleted file mode 100644 index 6c539ec..0000000 --- a/commands/Utilities/suggest.js +++ /dev/null @@ -1,77 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -module.exports = { - name: "suggest", - description: "Make a suggestion of the bot", - category: "Utilities", - run: async (client, message, args) => { - const questions = [ - "Describe the suggestion", - //"question 2" - ]; - - let collectCounter = 0; - let endCounter = 0; - - const filter = m => m.author.id === message.author.id; - message.inlineReply("Check your dm."); - const appStart = await message.author.send( - new MessageEmbed() - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setDescription(questions[collectCounter++]) - .setFooter(client.user.username) - .setTimestamp() - ); - const channel = appStart.channel; - - const collector = channel.createMessageCollector(filter); - - collector.on("collect", () => { - if (collectCounter < questions.length) { - channel.send( - new MessageEmbed() - .setAuthor( - message.author.username, - message.author.displayAvatarURL() - ) - .setDescription(questions[collectCounter++]) - .setFooter(client.user.username) - .setTimestamp() - ); - } else { - channel.send( - new MessageEmbed() - .setTitle("SUCCESS!") - .setDescription( - "You have sent a suggestion.\nPlease wait for us to review it" - ) - .setColor("GREEN") - ); - collector.stop("fulfilled"); - } - }); - - const appsChannel = client.channels.cache.get(client.ReportLog); - collector.on("end", (collected, reason) => { - if (reason === "fulfilled") { - let index = 1; - const mapedResponses = collected - .map(msg => { - return `${questions[endCounter++]}**\n->** ${msg.content}`; - }) - .join("\n\n"); - - appsChannel.send( - new MessageEmbed() - .setAuthor( - message.author.tag, - message.author.displayAvatarURL({ dynamic: true }) - ) - .setTitle("New Suggestion") - .setDescription(mapedResponses) - .setColor("ORANGE") - .setTimestamp() - ); - } - }); - }, -}; diff --git a/commands/Utilities/timer.js b/commands/Utilities/timer.js deleted file mode 100644 index a61adc8..0000000 --- a/commands/Utilities/timer.js +++ /dev/null @@ -1,61 +0,0 @@ -const ms = require("ms"); -const { MessageEmbed } = require("discord.js"); -module.exports = { - name: "timer", - description: "Set a timer for yourself", - usage: "(Time)", - category: "Utilities", - run: async (client, message, args) => { - if (!args[0]) { - return client.err(message, "Utilities", "timer", 19); - } - if (!args[0].endsWith("d")) { - if (!args[0].endsWith("h")) { - if (!args[0].endsWith("m")) { - if (!args[0].endsWith("s")) { - return client.err(message, "Utilities", "timer", 101); - } - } - } - } - if (isNaN(args[0][0])) { - return client.err(message, "Utilities", "timer", 101); - } - client.Timers.set(message.author.id + " G " + message.guild.name, { - Guild: message.guild.name, - Author: { - Tag: message.author.tag, - ID: message.author.id, - }, - Time: ms(args[0]), - }); - message.channel.send( - `${message.author} you have set a timer for ${ms(ms(args[0]), { - long: true, - })}.` - ); - setTimeout(() => { - let Embed = new MessageEmbed() - .setTitle(`Timer finished in ${message.guild.name}.`) - .setDescription( - `Your timer for ${ms(ms(args[0]), { - long: true, - })} has finished.` - ) - .setURL(client.web) - .setColor(`GREEN`); - let embe = new MessageEmbed() - .setTitle(`Timer finished.`) - .setDescription( - `Your timer for ${ms(ms(args[0]), { - long: true, - })} has finished.` - ) - .setURL(client.web) - .setColor(`GREEN`); - message.channel.send(`${message.author}`, embe); - message.author.send(Embed); - client.Timers.delete(message.author.id + " G " + message.guild.name); - }, ms(args[0])); - }, -}; diff --git a/commands/Utilities/userinfo.js b/commands/Utilities/userinfo.js deleted file mode 100644 index b478120..0000000 --- a/commands/Utilities/userinfo.js +++ /dev/null @@ -1,118 +0,0 @@ -const { MessageEmbed } = require("discord.js"); -const moment = require("moment"); -module.exports = { - name: "userinfo", - aliases: ["whois"], - description: "Check the info of a user", - usage: "{User}", - category: "Utilities", - run: async (client, message, args) => { - const member = - message.mentions.members.first() || - message.guild.members.cache.get(args[0]) || - message.guild.members.cache.find( - r => - r.user.username.toLowerCase() === args.join(" ").toLocaleLowerCase() - ) || - message.guild.members.cache.find( - r => r.displayName.toLowerCase() === args.join(" ").toLocaleLowerCase() - ) || - message.member; - const flags = { - DISCORD_EMPLOYEE: "Discord Staff<:staff:840231971526803467>", - DISCORD_PARTNER: "Partnered Server Owner<:partner:840231939944480829>", - BUGHUNTER_LEVEL_1: "Discord Bug Hunter<:bughunter:840231967600803920>", - BUGHUNTER_LEVEL_2: "Discord Bug Hunter<:bughunterlv2:840231970017771571>", - HYPESQUAD_EVENTS: "HypeSquad Events<:HypeSquad:840231908599922721>", - HOUSE_BRAVERY: "HypeSquad Bravery<:bravery:840231941974655007>", - HOUSE_BRILLIANCE: "HypeSquad Brilliance<:brilliance:840231943764443136>", - HOUSE_BALANCE: "HypeSquad Balance<:balance:840231925876523018>", - EARLY_SUPPORTER: "Early Supporter<:earlysupporter:840231983216984085>", - TEAM_USER: "Team User", - SYSTEM: "System", - VERIFIED_BOT: "Verified Bot<:VerifiedBot:840231982054375425>", - VERIFIED_DEVELOPER: - "Early Verified Bot Developer<:discord_bot_dev:840231906200387666>", - }; - let status; - switch (member.user.presence.status) { - case "online": - status = "<:online:840231921123721237>Online"; - break; - case "dnd": - status = "<:do_not_disturb:840231907715448842>Do Not Disturb"; - break; - case "idle": - status = "<:idle:840231935485149184>Idle"; - break; - case "offline": - status = "<:offline:840231954897305620>Offline"; - break; - } - let x = Date.now() - member.user.createdAt; - let y = Date.now() - message.guild.members.cache.get(member.id).joinedAt; - let created = Math.floor(x / 86400000); - let joined = Math.floor(y / 86400000); - const members = message.guild.member(member); - let nickname = - members.nickname !== undefined && members.nickname !== null - ? members.nickname - : "None"; - const roles = member.roles.cache - .sort((a, b) => b.position - a.position) - .map(role => role.toString()) - .slice(0, -1); - const userFlags = member.user.flags.toArray(); - let createdate = moment - .utc(member.user.createdAt) - .format("dddd, MMMM Do YYYY, HH:mm:ss"); - let joindate = moment - .utc(member.joinedAt) - .format("dddd, MMMM Do YYYY, HH:mm:ss"); - - const infoembed = new MessageEmbed() - .setAuthor( - member.user.tag, - member.user.displayAvatarURL({ dynamic: true, size: 2048 }) - ) - .setTimestamp() - .setColor(client.color) - .setThumbnail(member.user.displayAvatarURL({ dynamic: true, size: 512 })) - .setColor(member.displayHexColor || "BLUE") - .addField("User", [ - `**❯ Username:** ${member.user.username}`, - `**❯ Discriminator:** ${member.user.discriminator}`, - `**❯ Nickname:** ${nickname}`, - `**❯ ID:** ${member.id}`, - `**❯ Flags:** ${ - userFlags.length - ? userFlags.map(flag => flags[flag]).join(" **|** ") - : "None" - }`, - `**❯ Avatar:** [Link to avatar](${member.user.displayAvatarURL({ - dynamic: true, - size: 2048, - })})`, - `**❯ Time Created:** ${createdate} \nsince ${created} day(s) ago`, - `**❯ Status:** ${status}`, - `**❯ Game:** ${ - member.presence.activities[0] - ? member.presence.activities[0].name - : "None" - }`, - `\u200b`, - ]) - .addField("Member", [ - `**❯ Highest Role:** ${ - member.roles.highest.id === message.guild.id - ? "None" - : member.roles.highest.name - }`, - `**❯ Server Join Date:** ${joindate} \nsince ${joined} day(s) ago`, - //`**❯ Roles [${roles.length}]:** ${roles.length < 10 ? roles.join(" **|** ") : roles.length > 10 ? roles.join(" **|** ") : "None"}`, - - `\u200b`, - ]); - message.inlineReply(infoembed); - }, -}; diff --git a/config.json b/config.json index 0ba6811..0d2cfdf 100644 --- a/config.json +++ b/config.json @@ -3,12 +3,11 @@ "URL": "https://cath.gq/", "color": "02023a", "ca": "**[Invite](https://discord.com/api/oauth2/authorize?client_id=800966959268364288&permissions=mongodb+srv://cath_exe:SKS_2021@cath-exe.iolb7.mongodb.net/Data4231314550&scope=bot%20applications.commands) | [Support](https://discord.gg/SbQHChmGcp) | [YouTube](https://youtube.com/Kirito01) | [Website](https://www.cath.gq)**", - "Suggestion":"", - "Report": "", - "Welcome": "", - "DMLog": "", - "CMDLog": "", - "ReadyLog": "", - "ErrorLog": "", - "ServerLog": "" + "Suggestion": "853319776034226186", + "Report": "853319776034226186", + "Welcome": "837913442228371456", + "DMLog": "850434924536135690", + "CMDLog": "848613827226239046", + "ErrorLog": "848613745486856233", + "ServerLog": "848613714537873518" } diff --git a/events/afk.js b/events/afk.js index 92b0dc9..c5af82a 100644 --- a/events/afk.js +++ b/events/afk.js @@ -25,13 +25,7 @@ client.on("messageCreate", async message => { message.reply( `${message.mentions.members.first().user.tag}is in afk (${data1.AFK})` ); - } else { - return; } - } else { - return; } - } else { - return; } }); diff --git a/events/card.js b/events/card.js deleted file mode 100644 index dc79254..0000000 --- a/events/card.js +++ /dev/null @@ -1,64 +0,0 @@ -const { MessageAttachment } = require("discord.js"); -const client = require("../bot"); -const schema = require("../models/guilds"); -const canvas = require("discord-canvas"); - -client.on("guildMemberAdd", async member => { - schema.findOne({ Guild: member.guild.id }, async (e, data) => { - if (!data) return; - const user = member.user; - const image = await new canvas.Welcome() - .setUsername(user.username) - .setDiscriminator(user.discriminator) - .setMemberCount(member.guild.memberCount) - .setGuildName(member.guild.name) - .setAvatar(user.displayAvatarURL({ dynamic: false, format: "png" })) - .setColor("border", client.color) - .setColor("username-box", client.color) - .setColor("discriminator-box", client.color) - .setColor("message-box", client.color) - .setColor("title", "#89FB23") - .setColor("avatar", client.color) - .setBackground( - "https://cdn.discordapp.com/attachments/815622126526005268/819116213925052436/image0.png" - ) - .toAttachment(); - const attachment = new MessageAttachment( - image.toBuffer(), - "goodbye-image.png" - ); - const channel = member.guild.channels.cache.get(data.WelcomeChannel); - if (!channel) return; - channel.send(attachment); - }); -}); - -client.on("guildMemberRemove", async member => { - schema.findOne({ Guild: member.guild.id }, async (e, data) => { - if (!data) return; - const user = member.user; - const image = await new canvas.Goodbye() - .setUsername(user.username) - .setDiscriminator(user.discriminator) - .setMemberCount(member.guild.memberCount) - .setGuildName(member.guild.name) - .setAvatar(user.displayAvatarURL({ dynamic: false, format: "png" })) - .setColor("border", client.color) - .setColor("username-box", client.color) - .setColor("discriminator-box", client.color) - .setColor("message-box", client.color) - .setColor("title", "#89FB23") - .setColor("avatar", client.color) - .setBackground( - "https://cdn.discordapp.com/attachments/815622126526005268/819116213925052436/image0.png" - ) - .toAttachment(); - const attachment = new MessageAttachment( - image.toBuffer(), - "goodbye-image.png" - ); - const channel = member.guild.channels.cache.get(data.GoodbyeChannel); - if (!channel) return; - channel.send(attachment); - }); -}); diff --git a/events/emoji.js b/events/emoji.js index 448c22a..b63c45b 100644 --- a/events/emoji.js +++ b/events/emoji.js @@ -4,11 +4,9 @@ client.on("messageCreate", async message => { if ( client.emojis.cache.find(emoji => emoji.name === str) || message.guild.emojis.cache.find(emoji => emoji.name === str) - ) { + ) return true; - } else { - return false; - } + else return false; } if (message.content.startsWith(":") && message.content.endsWith(":")) { let EmojiName = message.content.slice(1, -1); diff --git a/events/goodBye.js b/events/goodBye.js deleted file mode 100644 index 0c3aeab..0000000 --- a/events/goodBye.js +++ /dev/null @@ -1,68 +0,0 @@ -const { MessageAttachment } = require("discord.js"); -const client = require("../bot"); -const schema = require("../models/guilds"); -const canvas = require("discord-canvas"); - -client.on("guildMemberAdd", async member => { - schema.findOne({ Guild: member.guild.id }, async (e, data) => { - if (!data) return; - const user = member.user; - const image = await new canvas.Welcome() - .setUsername(user.username) - .setDiscriminator(user.discriminator) - .setMemberCount(member.guild.memberCount) - .setGuildName(member.guild.name) - .setAvatar(user.displayAvatarURL({ dynamic: false, format: "png" })) - .setColor("border", client.color) - .setColor("username-box", client.color) - .setColor("discriminator-box", client.color) - .setColor("message-box", client.color) - .setColor("title", "#89FB23") - .setColor("avatar", client.color) - .setBackground( - "https://cdn.discordapp.com/attachments/815622126526005268/819116213925052436/image0.png" - ) - .toAttachment(); - - const attachment = new MessageAttachment( - image.toBuffer(), - "goodbye-image.png" - ); - - const channel = member.guild.channels.cache.get(data.WelcomeChannel); - if (!channel) return; - channel.send(attachment); - }); -}); - -client.on("guildMemberRemove", async member => { - schema.findOne({ Guild: member.guild.id }, async (e, data) => { - if (!data) return; - const user = member.user; - const image = await new canvas.Goodbye() - .setUsername(user.username) - .setDiscriminator(user.discriminator) - .setMemberCount(member.guild.memberCount) - .setGuildName(member.guild.name) - .setAvatar(user.displayAvatarURL({ dynamic: false, format: "png" })) - .setColor("border", client.color) - .setColor("username-box", client.color) - .setColor("discriminator-box", client.color) - .setColor("message-box", client.color) - .setColor("title", "#89FB23") - .setColor("avatar", client.color) - .setBackground( - "https://cdn.discordapp.com/attachments/815622126526005268/819116213925052436/image0.png" - ) - .toAttachment(); - - const attachment = new MessageAttachment( - image.toBuffer(), - "goodbye-image.png" - ); - - const channel = member.guild.channels.cache.get(data.GoodbyeChannel); - if (!channel) return; - channel.send(attachment); - }); -}); diff --git a/events/guild.js b/events/guild.js index 738e9d8..e0ad15f 100644 --- a/events/guild.js +++ b/events/guild.js @@ -1,46 +1,63 @@ const client = require("../bot"); const { MessageEmbed } = require("discord.js"); -const { Welcome } = require("../config.json"); -client.on("guildMemberAdd", async member => { - const channel = member.guild.channels.cache.find( - channel => channel.id === Welcome - ); - if (!channel) return; - const embed = new MessageEmbed() - .setTitle( - `<:YouTube:841186450497339412> ${member},welcome to Night\'s official Discord server! <:YouTube:841186450497339412>` - ) - .setThumbnail(member.guild.iconURL({ dynamic: true })) - .addField( - "Read the rules at <#799074874513555496> channel, and enjoy your stay~", - `We now have ${member.guild.memberCount} members!` - ) - .setFooter( - `${member.user.tag} joined the server!`, - member.user.displayAvatarURL({ dynamic: true }) - ) - .setColor(client.color) - .setTimestamp(); - - channel.send(embed); +const db = require("../models/guilds"); +const config = require("../config.json"); +client.on("guildCreate", guild => { + client.channels.cache.get(client.ServerLog).send({ + embeds: [ + new MessageEmbed() + .setTitle("New Server") + .addField( + "Server Info", + `**>Server Name**: \n${guild.name} + **>Server ID**: \n${guild.id} + **>Server Member Count**: \n${guild.memberCount}` + ) + .setFooter( + `${client.user.username} Currently in ${client.guilds.cache.size} servers`, + client.user.displayAvatarURL() + ) + .setTimestamp() + .setThumbnail(guild.iconURL({ dynamic: true })) + .setColor("GREEN"), + ], + }); + const newdb = new db({ + Guild: guild.id, + Prefix: config.prefix, + }); + newdb.save(); }); -client.on("guildMemberRemove", async member => { - const channel = member.guild.channels.cache.find( - channel => channel.id === Welcome - ); - if (!channel) return; - const embed = new MessageEmbed() - .setTitle( - `<:YouTube:841186450497339412> ${member} can\'t handle being cool! <:YouTube:841186450497339412>` - ) - .setThumbnail(member.guild.iconURL({ dynamic: true })) - .setDescription(`We now only have ${member.guild.memberCount} members`) - .setFooter( - `${member.user.tag} leaved the server!`, - member.user.displayAvatarURL({ dynamic: true }) - ) - .setColor(client.color) - .setTimestamp(); - channel.send(embed); +client.on("guildDelete", async guild => { + client.data.DelGuild(guild.id); + client.channels.cache.get(client.ServerLog).send({ + embeds: [ + new MessageEmbed() + .setTitle("Deleted Server") + .addField( + "Server Info", + `**>Server Name**: \n${guild.name} + **>Server ID**: \n${guild.id} + **>Server Member Count**: \n${guild.memberCount}` + ) + .setFooter( + `${client.user.username} Currently in ${client.guilds.cache.size} servers`, + client.user.displayAvatarURL() + ) + .setTimestamp() + .setThumbnail(guild.iconURL({ dynamic: true })) + .setColor("RED"), + ], + }); }); +client.prefix = async function (message) { + let custom; + if (!message.guild) return; + const data = await db + .findOne({ Guild: message.guild.id }) + .catch(err => console.log(err)); + if (data) custom = data.Prefix; + else custom = client.configprefix; + return custom; +}; diff --git a/events/guildCreate.js b/events/guildCreate.js deleted file mode 100644 index 2ec21ee..0000000 --- a/events/guildCreate.js +++ /dev/null @@ -1,33 +0,0 @@ -const client = require("../bot"); -const { MessageEmbed } = require("discord.js"); -const db = require("../models/guilds"); -const config = require("../config.json"); -client.on("guildCreate", guild => { - client.channels.cache.get(client.ServerLog).send({ - embeds: [ - new MessageEmbed() - .setTitle("New Server") - .addField("Server Info", [ - `**>Server Name**: \n${guild.name}`, - `**>Server ID**: \n${guild.id}`, - `**>Server Member Count**: \n${guild.memberCount}`, - ]) - .addField("Owner Info", [ - `**>Owner Tag**: \n${guild.owner.user.tag}`, - `**>Owner ID**: \n${guild.owner.id}`, - ]) - .setFooter( - `${client.user.username} Currently in ${client.guilds.cache.size} servers`, - client.user.displayAvatarURL() - ) - .setTimestamp() - .setThumbnail(guild.iconURL({ dynamic: true })) - .setColor("GREEN"), - ], - }); - const newdb = new db({ - Guild: guild.id, - Prefix: config.prefix, - }); - newdb.save(); -}); diff --git a/events/guildDelete.js b/events/guildDelete.js deleted file mode 100644 index af52ef3..0000000 --- a/events/guildDelete.js +++ /dev/null @@ -1,47 +0,0 @@ -const client = require("../bot"); -const db = require("../models/guilds"); -const { prefix } = require("../config.json"); -const { MessageEmbed } = require("discord.js"); - -client.on("guildDelete", async guild => { - client.data.DelGuild(guild.id); - client.channels.cache.get(client.ServerLog).send({ - embeds: [ - new MessageEmbed() - .setTitle("Deleted Server") - .addField("Server Info", [ - `**>Server Name**: \n${guild.name}`, - `**>Server ID**: \n${guild.id}`, - `**>Server Member Count**: \n${guild.memberCount}`, - ]) - .addField("Owner Info", [ - `**>Owner Tag**: \n${guild.owner.user.tag}`, - `**>Owner ID**: \n${guild.owner.id}`, - ]) - .setFooter( - `${client.user.username} Currently in ${client.guilds.cache.size} servers`, - client.user.displayAvatarURL() - ) - .setTimestamp() - .setThumbnail(guild.iconURL({ dynamic: true })) - .setColor("RED"), - ], - }); -}); - -/** - * @param {Client} client - */ -client.prefix = async function (message) { - let custom; - if (!message.guild) return; - const data = await db - .findOne({ Guild: message.guild.id }) - .catch(err => console.log(err)); - if (data) { - custom = data.Prefix; - } else { - custom = prefix; - } - return custom; -}; diff --git a/events/log.js b/events/log.js deleted file mode 100644 index 279b480..0000000 --- a/events/log.js +++ /dev/null @@ -1,447 +0,0 @@ -// const Discord = require("discord.js"); -// const Guild = require("../models/guilds"); -// const client = require("../bot"); -// let types = { -// text: "Text Channel", -// voice: "Voice Channel", -// null: "No Type", -// news: "News Channel", -// store: "Store Channel", -// category: "Category", -// }; -// client.on("channelCreate", async channel => { -// send_log( -// client, -// channel.guild, -// "GREEN", -// "Channel Created", -// `Channel Name: \`${channel.name}\`\nChannel ID: \`${ -// channel.id -// }\`\nChannel Type: \`${types[channel.type]}\`\nChannel Position: \`${ -// channel.rawPosition -// }\`` -// ); -// }); -// client.on("channelDelete", async channel => { -// send_log( -// client, -// channel.guild, -// "RED", -// "Channel Deleted", -// `Channel Name: \`${channel.name}\`\nChannel ID: \`${ -// channel.id -// }\`\nChannel Type: \`${types[channel.type]}\`\nChannel Position: \`${ -// channel.rawPosition -// }\`` -// ); -// }); -// client.on("channelPinsUpdate", async (channel, time) => { -// send_log( -// client, -// channel.guild, -// "YELLOW", -// "Channel Pins Update", -// `Channel Name: \`${channel.name}\`\nChannel ID: \`${ -// channel.id -// }\`\nPinned at \`${time.toLocaleString()}\``, -// "https://i.stack.imgur.com/d1JEp.png" -// ); -// }); -// client.on("channelUpdate", function (oldChannel, newChannel) { -// let newCat = newChannel.parent ? newChannel.parent.name : "NO PARENT"; -// let guildChannel = newChannel.guild; -// if (!guildChannel || !guildChannel.available) return; -// if (oldChannel.name != newChannel.name) { -// send_log( -// client, -// oldChannel.guild, -// "YELLOW", -// "Channel Updated - Name", -// `Channel Name: \`${oldChannel.name}\`\nChannel Id: \`${oldChannel.id}\`\n\n` + -// `Channel Name: \`${newChannel.name}\`\nChannel Id: \`${newChannel.id}\`` -// ); -// } else if (oldChannel.type != newChannel.type) { -// send_log( -// client, -// oldChannel.guild, -// "YELLOW", -// "Channel Updated - Type", -// `Channel Name: \`${oldChannel.name}\`\nChannel Id: \`${ -// oldChannel.id -// }\`\nChannelTYPE: \`${types[oldChannel.type]}\`\n\n` + -// `Channel Name: \`${newChannel.name}\`\nChannel Id: \`${ -// newChannel.id -// }\`\nChannelTYPE: \`${types[newChannel.type]}\`` -// ); -// } else if (oldChannel.topic != newChannel.topic) { -// send_log( -// client, -// oldChannel.guild, -// "YELLOW", -// "Channel UPDATED - TOPIC", -// `Channel Name: \`${oldChannel.name}\`\nChannel Id: \`${oldChannel.id}\`\nChannelTOPIC: \`${oldChannel.topic}\`\n\n` + -// `Channel Name: \`${newChannel.name}\`\nChannel Id: \`${newChannel.id}\`\nChannelTOPIC: \`${newChannel.topic}\`` -// ); -// } -// }); -// client.on("emojiCreate", function (emoji) { -// send_log( -// client, -// emoji.guild, -// "GREEN", -// "EMOJI CREATED", -// `EMOJI: ${emoji}\nEMOJINAME: ${emoji.name}\nEMOJIID: ${emoji.id}\nEMOJIURL: ${emoji.url}` -// ); -// }); -// client.on("emojiDelete", function (emoji) { -// send_log( -// client, -// emoji.guild, -// "RED", -// "EMOJI DELETED", -// `EMOJI: ${emoji}\nEMOJINAME: ${emoji.name}\nEMOJIID: ${emoji.id}\nEMOJIURL: ${emoji.url}` -// ); -// }); - -// client.on("emojiUpdate", function (oldEmoji, newEmoji) { -// if (oldEmoji.name !== newEmoji.name) { -// send_log( -// client, -// oldEmoji.guild, -// "ORANGE", -// "EMOJI NAME CHANGED", -// `__Emoji: ${newEmoji}__ \n\n**Before:** \`${oldEmoji.name}\`\n**After:** \`${newEmoji.name}\`\n**Emoji ID:** \`${newEmoji.id}\`` -// ); -// } -// }); - -// client.on("guildBanAdd", function (guild, user) { -// send_log( -// client, -// guild, -// "RED", -// "USER BANNED", -// `User: ${user} (\`${user.id}\`)\n\`${user.tag}\``, -// user.user.displayAvatarURL({ dynamic: true }) -// ); -// }); - -// client.on("guildBanRemove", function (guild, user) { -// send_log( -// client, -// guild, -// "YELLOW", -// "USER UNBANNED", -// `User: ${user} (\`${user.id}\`)\n\`${user.tag}\``, -// user.user.displayAvatarURL({ dynamic: true }) -// ); -// }); - -// client.on("guildMemberAdd", function (member) { -// send_log( -// member.guild, -// client, -// "GREEN", -// "MEMBER JOINED", -// `Member: ${member.user} (\`${member.user.id}\`)\n\`${member.user.tag}\``, -// member.user.displayAvatarURL({ dynamic: true }) -// ); -// }); - -// client.on("guildMemberRemove", function (member) { -// send_log( -// client, -// member.guild, -// "RED", -// "MEMBER LEFT", -// `Member: ${member.user} (\`${member.user.id}\`)\n\`${member.user.tag}\``, -// member.user.displayAvatarURL({ dynamic: true }) -// ); -// }); - -// client.on("guildMembersChunk", function (members, guild) { -// send_log( -// guild, -// client, -// "RED", -// "MEMBER CHUNK / RAID - " + members.length + " Members", -// members.map( -// (user, index) => `${index}) - ${user} - ${user.tag} - \`${user.id}\`` -// ) -// ); -// }); - -// client.on("guildMemberUpdate", function (oldMember, newMember) { -// let options = {}; - -// if (options[newMember.guild.id]) { -// options = options[newMember.guild.id]; -// } - -// // Add default empty list -// if (typeof options.excludedroles === "undefined") -// options.excludedroles = new Array([]); -// if (typeof options.trackroles === "undefined") options.trackroles = true; -// const oldMemberRoles = oldMember.roles.cache.keyArray(); -// const newMemberRoles = newMember.roles.cache.keyArray(); -// const oldRoles = oldMemberRoles -// .filter(x => !options.excludedroles.includes(x)) -// .filter(x => !newMemberRoles.includes(x)); -// const newRoles = newMemberRoles -// .filter(x => !options.excludedroles.includes(x)) -// .filter(x => !oldMemberRoles.includes(x)); -// const rolechanged = newRoles.length || oldRoles.length; - -// if (rolechanged) { -// let roleadded = ""; -// if (newRoles.length > 0) { -// for (let i = 0; i < newRoles.length; i++) { -// if (i > 0) roleadded += ", "; -// roleadded += `<@&${newRoles[i]}>`; -// } -// } -// let roleremoved = ""; -// if (oldRoles.length > 0) { -// for (let i = 0; i < oldRoles.length; i++) { -// if (i > 0) roleremoved += ", "; -// roleremoved += `<@&${oldRoles[i]}>`; -// } -// } -// let text = `${roleremoved ? `❌ ROLE REMOVED: \n${roleremoved}` : ""}${ -// roleadded ? `✅ ROLE ADDED:\n${roleadded}` : "" -// }`; -// send_log( -// client, -// oldMember.guild, -// `${roleadded ? "GREEN" : "RED"}`, -// "Member Roles Changed", -// `Member: ${newMember.user}\nUser: \`${oldMember.user.tag}\`\n\n${text}` -// ); -// } -// }); - -// client.on("messageDelete", function (message) { -// if (message.channel.type !== "text") return; - -// send_log( -// client, -// message.guild, -// "ORANGE", -// "Message Deleted", -// ` -// **Author : ** <@${message.author.id}> - *${message.author.tag}* -// **Date : ** ${message.createdAt} -// **Channel : ** <#${message.channel.id}> - *${message.channel.name}* -// **Deleted Message : ** -// \`\`\` -// ${message.content.replace(/`/g, "'")} -// \`\`\` -// **Attachment URL : ** -// ${message.attachments.map(x => x.proxyURL)} -// ` -// ); -// }); - -// client.on("messageDeleteBulk", function (message) { -// send_log( -// client, -// message.guild, -// "RED", -// message.length + " Message Deleted BULK", -// `${message.length} Messages delete in: ${message.channel}` -// ); -// }); - -// client.on("messageUpdate", function (oldMessage, newMessage) { -// if (oldMessage.author.bot) return; -// if (oldMessage.channel.type !== "text") return; -// if (newMessage.channel.type !== "text") return; - -// if (oldMessage.content === newMessage.content) return; -// send_log( -// client, -// oldMessage.guild, -// "YELLOW", -// "Message Updated", -// ` -// **Author : ** <@${newMessage.member.user.id}> - *${newMessage.member.user.tag}* -// **Date : ** ${newMessage.createdAt} -// **Channel : ** <#${newMessage.channel.id}> - *${newMessage.channel.name}* -// **Orignal Message : ** -// \`\`\` -// ${oldMessage.content.replace(/`/g, "'")} -// \`\`\` -// **Updated Message : ** -// \`\`\` -// ${newMessage.content.replace(/`/g, "'")} -// \`\`\`` -// ); -// }); - -// client.on("roleCreate", function (role) { -// send_log( -// client, -// role.guild, -// "GREEN", -// "ROLE CREATED"`ROLE: ${role}\nROLENAME: ${role.name}\nROLEID: ${role.id}\nHEXCOLOR: ${role.hexColor}\nPOSITION: ${role.position}` -// ); -// }); - -// client.on("roleDelete", function (role) { -// send_log( -// client, -// role.guild, -// "RED", -// "ROLE DELETED"`ROLE: ${role}\nROLENAME: ${role.name}\nROLEID: ${role.id}\nHEXCOLOR: ${role.hexColor}\nPOSITION: ${role.position}` -// ); -// }); - -// client.on("roleUpdate", function (oldRole, newRole) { -// let perms = { -// 1: "CREATE_INSTANT_INVITE", -// 2: "KICK_MEMBERS", -// 4: "BAN_MEMBERS", -// 8: "ADMINISTRATOR", -// 16: "MANAGE_CHANNELS", -// 32: "MANAGE_GUILD", -// 64: "ADD_REACTIONS", -// 128: "VIEW_AUDIT_LOG", -// 256: "PRIORITY_SPEAKER", -// 1024: "VIEW_CHANNEL", -// 1024: "READ_MESSAGES", -// 2048: "SEND_MESSAGES", -// 4096: "SEND_TTS_MESSAGES", -// 8192: "MANAGE_MESSAGES", -// 16384: "EMBED_LINKS", -// 32768: "ATTACH_FILES", -// 65536: "READ_MESSAGE_HISTORY", -// 131072: "MENTION_EVERYONE", -// 262144: "EXTERNAL_EMOJIS", -// 262144: "USE_EXTERNAL_EMOJIS", -// 1048576: "CONNECT", -// 2097152: "SPEAK", -// 4194304: "MUTE_MEMBERS", -// 8388608: "DEAFEN_MEMBERS", -// 16777216: "MOVE_MEMBERS", -// 33554432: "USE_VAD", -// 67108864: "CHANGE_NICKNAME", -// 134217728: "MANAGE_NICKNAMES", -// 268435456: "MANAGE_ROLES", -// 268435456: "MANAGE_ROLES_OR_PERMISSIONS", -// 536870912: "MANAGE_WEBHOOKS", -// "1073741824 ": "MANAGE_EMOJIS", -// CREATE_INSTANT_INVITE: "CREATE_INSTANT_INVITE", -// KICK_MEMBERS: "KICK_MEMBERS", -// BAN_MEMBERS: "BAN_MEMBERS", -// ADMINISTRATOR: "ADMINISTRATOR", -// MANAGE_CHANNELS: "MANAGE_CHANNELS", -// MANAGE_GUILD: "MANAGE_GUILD", -// ADD_REACTIONS: "ADD_REACTIONS", -// VIEW_AUDIT_LOG: "VIEW_AUDIT_LOG", -// PRIORITY_SPEAKER: "PRIORITY_SPEAKER", -// VIEW_CHANNEL: "VIEW_CHANNEL", -// READ_MESSAGES: "READ_MESSAGES", -// SEND_MESSAGES: "SEND_MESSAGES", -// SEND_TTS_MESSAGES: "SEND_TTS_MESSAGES", -// MANAGE_MESSAGES: "MANAGE_MESSAGES", -// EMBED_LINKS: "EMBED_LINKS", -// ATTACH_FILES: "ATTACH_FILES", -// READ_MESSAGE_HISTORY: "READ_MESSAGE_HISTORY", -// MENTION_EVERYONE: "MENTION_EVERYONE", -// EXTERNAL_EMOJIS: "EXTERNAL_EMOJIS", -// USE_EXTERNAL_EMOJIS: "USE_EXTERNAL_EMOJIS", -// CONNECT: "CONNECT", -// SPEAK: "SPEAK", -// MUTE_MEMBERS: "MUTE_MEMBERS", -// DEAFEN_MEMBERS: "DEAFEN_MEMBERS", -// MOVE_MEMBERS: "MOVE_MEMBERS", -// USE_VAD: "USE_VAD", -// CHANGE_NICKNAME: "CHANGE_NICKNAME", -// MANAGE_NICKNAMES: "MANAGE_NICKNAMES", -// MANAGE_ROLES: "MANAGE_ROLES", -// MANAGE_ROLES_OR_PERMISSIONS: "MANAGE_ROLES_OR_PERMISSIONS", -// MANAGE_WEBHOOKS: "MANAGE_WEBHOOKS", -// MANAGE_EMOJIS: "MANAGE_EMOJIS", -// }; -// if (oldRole.name !== newRole.name) { -// send_log( -// client, -// oldRole.guild, -// "ORANGE", -// "ROLE NAME CHANGED", -// `__ROLE: ${oldRole}__ \n\n**Before:** \`${oldRole.name}\` -// **After:** \`${newRole.name}\` -// **Role ID:** \`${newRole.id}\`` -// ); -// } else if (oldRole.color !== newRole.color) { -// send_log( -// client, -// oldRole.guild, -// "ORANGE", -// "ROLE COLOR CHANGED", -// `__ROLE: ${newRole}__ \n\n**Before:** \`${oldRole.color.toString(16)}\` -// **After:** \`${newRole.color.toString(16)}\` -// **ROLE ID:** \`${newRole.id}\`` -// ); -// } else { -// send_log( -// client, -// oldRole.guild, -// "RED", -// "ROLE PERMISSIONS CHANGED", -// `__ROLE: ${newRole}__ \n**THE PERMISSIONS CHANGED PLEASE CHECK!!!**OLD PERMISSIONS: ${oldRole.permissions.bitfield} -// NEW PERMISSIONS: ${newRole.permissions.bitfield} -// **Role ID:** \`${newRole.id}\`` -// ); -// } -// }); - -// client.on("userUpdate", async (oldUser, newUser) => { -// if (oldUser.username !== newUser.username) { -// send_log( -// client, -// oldUser.guild, -// "BLACK", -// "Member Username Changed", -// `Member: ${newUser}\nOld Username: \`${oldUser.username}\`\nNew Username: \`${newUser.username}\` ` -// ); -// } -// }); -// async function send_log(client, guild, color, title, description, thumb) { -// try { -// const LogEmbed = new Discord.MessageEmbed() -// .setColor(color ? color : client.color) -// .setDescription(description ? description.substr(0, 2048) : "\u200b") -// .setTitle(title ? title.substr(0, 256) : "\u200b") -// .setTimestamp() -// .setThumbnail( -// thumb ? thumb : client.user.displayAvatarURL({ format: "png" }) -// ) -// .setFooter( -// "Made by Cath Team", -// client.user.displayAvatarURL({ format: "png" }) -// ); -// const db = await Guild.findOne({ Guild: guild.id }, (err, guild) => { -// if (err) throw err; -// }); -// if (!db) return; -// const ch = db.Log; -// const logger = await client.channels.fetch(ch); -// if (!logger) throw new Error("Error 404 - Channel Not Found"); -// try { -// const hook = new Discord.WebhookClient( -// db.LogWebhookID, -// db.LogWebhookToken -// ); -// hook.send({ -// username: guild.name, -// avatarURL: client.user.displayAvatarURL({ format: "png" }), -// embeds: [LogEmbed], -// }); -// } catch { -// return; -// } -// } catch (e) { -// console.log(e); -// } -// } diff --git a/events/message.js b/events/message.js deleted file mode 100644 index 4fe191c..0000000 --- a/events/message.js +++ /dev/null @@ -1,427 +0,0 @@ -const client = require("../bot"); -const leven = require("leven"); -const { Collection, MessageEmbed } = require("discord.js"); -const { prefix } = require("../config.json"); -const guilds = require("../models/guilds"); -const ms = require("ms"); -const schema = require("../models/custom-commands"); -const Timeout2 = new Collection(); -const db = require("../models/bot"); -const cooldown = require("../models/cooldown"); -client.on("message", async message => { - const p = await client.prefix(message); - if (message.author.bot) return; - if (message.content.match(new RegExp(`^<@!?${client.user.id}>( |)$`))) { - const _ = new MessageEmbed() - .setTitle(client.user.username) - .addField("Links:", client.cat) - .addField( - "Prefix/Usage", - `My prefix in **${message.guild.name}** is **${p}**\n\nRun \`${p}help\` to start using the bot` - ) - .setThumbnail(client.user.displayAvatarURL()) - .setURL(client.web) - .setFooter(`Made by ${client.author}`) - .setTimestamp() - .setColor(client.color); - return message.inlineReply(_).then(m => m.delete({ timeout: 15000 })); - } - if (!message.guild) return; - if (!message.content.toLowerCase().startsWith(p.toLowerCase())) return; - if (!message.member) { - message.member = await message.guild.fetchMember(message); - } - db.findOne({ Bot: client.user.id }, async (err, data) => { - if (!data) { - new db({ - Bot: client.user.id, - Status: "false", - }); - } else { - if ( - data.Status && - data.Status == "true" && - !client.owners.includes(message.author.id) - ) - return message.inlineReply( - `**${client.user.username}** is currently in maintenance.\nYou can use **cath.exe#9686** or **Cath 2#7414** if it is online\nIf you need help, please contact **Cat drinking a cat#0795** or **Ń1ght#0001**` - ); - } - }); - const data = {}; - let guildDB = await client.data.getGuild(message.guild.id); - if (!guildDB) return; - let userDB = await client.data.getUser(message.author.id); - if (!userDB) return; - let userEconDB = await client.data.getUserEcon(message.author.id); - data.Guild = guildDB; - data.User = userDB; - data.UserEcon = userEconDB; - if (!guildDB) { - await client.data.CreateGuild(message.guild.id); - } - if (!userEconDB) { - await client.createProfile(message.author.id); - } - if (data.User) { - if (data.User.Blacklist) { - return; - } - } - guilds.findOne({ Guild: message.guild.id }, async (err, data) => { - if (data) { - if (!data.Prefix || data.Prefix === null) { - (data.Prefix = prefix), - await guilds.findOneAndUpdate({ Guild: message.guild.id }, data); - } - } - if (!data) { - new guilds({ - Guild: message.guild.id, - Prefix: prefix, - }).save(); - } - }); - const args = message.content.slice(p.length).trim().split(/ +/g); - const cmd = args.shift().toLowerCase(); - if (cmd.length == 0) return; - const cmddata = await schema.findOne({ - Guild: message.guild.id, - Command: cmd, - }); - if (!cmddata) { - let command = - client.commands.get(cmd) || client.commands.get(client.aliases.get(cmd)); - if (!command) { - const best = [ - ...client.commands.map(cmd => cmd.name), - ...client.aliases.keys(), - ].filter(c => leven(cmd.toLowerCase(), c.toLowerCase()) < c.length * 0.4); - const dym = - best.length == 0 - ? "" - : best.length == 1 - ? `Do you mean this?\n**${best[0]}**` - : `Do you mean one of these?\n${best - .slice(0, 3) - .map(value => `**${value}**`) - .join("\n")}`; - if (dym === "") return; - return message - .inlineReply( - new MessageEmbed() - .setDescription(`Couldn't find that command.\n${dym}`) - .setTimestamp() - .setColor(client.color) - ) - .then(msg => msg.delete({ timeout: 10000 })); - } - if (command) { - if (command.Owner == true) { - if (!client.owners.includes(message.author.id)) return; - } - if (command.Premium == true) { - if (data.User.Premium == false) { - return message - .inlineReply( - new MessageEmbed() - .setURL(client.web) - .setAuthor( - message.author.tag, - message.author.displayAvatarURL({ dynamic: true }) - ) - .setColor(client.color) - .setDescription( - `You aren't a premium user. You can either boost support server or gift a nitro to one of the Developer of Cath Team to be premium user` - ) - .setTimestamp() - .setFooter(`Made by ${client.author}`) - ) - .then(m => m.delete({ timeout: 10000 })); - } - } - if (command.Disable == true) { - return message - .inlineReply( - `**${command.name}** command is currently in maintenance.\nYou can use **cath.exe#9686** or **Cath 2#7414** if it is online\nIf you need help, please contact **Cat drinking a cat#0795** or **Ń1ght#0001**` - ) - .then(m => m.delete({ timeout: 10000 })); - } - if (command.Level == true) { - if (data.Guild.Level == false) { - return message - .inlineReply( - `This command is disabled due to levelling system is disabled in this server` - ) - .then(m => m.delete({ timeout: 10000 })); - } - } - if (!message.member.permissions.has(command.UserPerm)) return; - if (!message.guild.me.permissions.has(command.BotPerm)) - return message.inlineReply( - `You can't use this command. I need to have ${command.BotPerm} permission to use this command.` - ); - client.CMDLog.send( - `\`${message.author.tag}(${message.author.id})\`\n has used \n**${command.name}**\n command in \n\`${message.guild.name}(${message.guild.id})\`` - ); - const category = command.category; - if (data.Guild) { - if (data.Guild.Category) { - if (data.Guild.Category.includes(category)) return; - } - if (data.Guild.Commands) { - if (data.Guild.Commands.includes(command.name)) return; - } - } - const check = await guilds.findOne({ - Guild: message.guild.id, - }); - if (check) { - if (!check.Prefix) { - check.Prefix = prefix; - } else; - } - if (command.timeout) { - const current_time = Date.now(); - const cooldown_amount = command.timeout; - cooldown.findOne( - { User: message.author.id, CMD: command.name }, - async (err, dataa) => { - if (dataa) { - if (data.User.Premium == true) { - if (command.timeout > 1000 * 60 * 60) { - const expiration_time = dataa.Time + command.timeout; - if (current_time < expiration_time) { - const time_left = expiration_time - current_time; - const slow = [ - "Keep it slow...", - "Calm down", - "Stop it get some help", - "Too fast", - ]; - const slowed = - slow[Math.floor(Math.random() * slow.length)]; - return message.channel - .send( - new MessageEmbed() - .setColor(client.color) - .setTimestamp() - .setTitle(slowed) - .setDescription( - `Wait **${client.function.timer( - time_left - )}** to use the command again!\nThe default cooldown is **${client.function.timer( - command.timeout - )}**` - ) - ) - .then(m => m.delete({ timeout: 10000 })); - } else { - await cooldown.findOneAndUpdate( - { User: message.author.id, CMD: command.name }, - { Time: current_time } - ); - command.run(client, message, args, data); - client.addcmdsused(message.author.id); - } - } else { - const expiration_time = dataa.Time + command.timeout / 2; - if (current_time < expiration_time) { - const time_left = expiration_time - current_time; - const slow = [ - "Keep it slow...", - "Calm down", - "Stop it get some help", - "Too fast", - ]; - const slowed = - slow[Math.floor(Math.random() * slow.length)]; - return message.channel - .send( - new MessageEmbed() - .setColor(client.color) - .setTimestamp() - .setTitle(slowed) - .setDescription( - `Wait **${client.function.timer( - time_left - )}** to use the command again!\nThe default cooldown is **${client.function.timer( - command.timeout - )}**, since you are **[premium](${ - client.invite - })** users, you only need to wait **${client.function.timer( - command.timeout / 2 - )}**` - ) - ) - .then(m => m.delete({ timeout: 10000 })); - } else { - await cooldown.findOneAndUpdate( - { User: message.author.id, CMD: command.name }, - { Time: current_time } - ); - command.run(client, message, args, data); - client.addcmdsused(message.author.id); - } - } - } else { - const expiration_time = dataa.Time + cooldown_amount; - if (current_time < expiration_time) { - const time_left = expiration_time - current_time; - const slow = [ - "Keep it slow...", - "Calm down", - "Stop it get some help", - "Too fast", - ]; - const slowed = slow[Math.floor(Math.random() * slow.length)]; - return message.channel - .send( - new MessageEmbed() - .setColor(client.color) - .setTimestamp() - .setTitle(slowed) - .setDescription( - `Wait **${client.function.timer( - time_left - )}** to use the command again!\nThe default cooldown is **${client.function.timer( - command.timeout - )}**, but **[premium](${ - client.invite - })** users only need to wait **${client.function.timer( - command.timeout / 2 - )}**` - ) - ) - .then(m => m.delete({ timeout: 10000 })); - } else { - await cooldown.findOneAndUpdate( - { User: message.author.id, CMD: command.name }, - { Time: current_time } - ); - command.run(client, message, args, data); - client.addcmdsused(message.author.id); - } - } - } else { - command.run(client, message, args, data); - client.addcmdsused(message.author.id); - new cooldown({ - User: message.author.id, - CMD: command.name, - Time: current_time, - Cooldown: command.timeout, - }).save(); - } - } - ); - } else { - command.run(client, message, args, data); - client.addcmdsused(message.author.id); - } - } - } else { - if (cmddata.Delete === true && cmddata.Random === false) { - message.delete().then(() => message.channel.send(cmddata.Response)); - } else if (cmddata.Random === true && cmddata.Delete === true) { - const randomed = - cmddata.Response[Math.floor(Math.random() * cmddata.Response.length)]; - message.delete().then(() => message.channel.send(randomed)); - } else if (cmddata.Random === true && cmddata.Delete === false) { - const randomed = - cmddata.Response[Math.floor(Math.random() * cmddata.Response.length)]; - message.channel.send(randomed); - } else { - message.channel.send(cmddata.Response); - } - } -}); -client.on("message", async message => { - const p = await client.prefix(message); - if (message.author.bot) return; - if (!message.content.startsWith(p)) return; - if (!message.guild) return; - if (!message.member) { - message.member = await message.guild.fetchMember(message); - } - const args = message.content.slice(p.length).trim().split(/ +/g); - const cmd = args.shift().toLowerCase(); - if (cmd.length == 0) return; - let path = client.hide.get(cmd); - if (path) { - if (!client.path.includes(message.guild.id)) return; - client.CMDLog.send( - `\`${message.author.tag}(${message.author.id})\`\n has used \n**${path.name}**\n command in \n\`${message.guild.name}(${message.guild.id})\`` - ); - if (path.timeout) { - const slow = [ - "Keep it slow...", - "Calm down", - "Stop it get some help", - "Too fast", - ]; - const slowed = slow[Math.floor(Math.random() * slow.length)]; - if (Timeout2.has(`${path.name}${message.author.id}`)) - return message.channel - .send( - new MessageEmbed() - .setColor(client.color) - .setTimestamp() - .setTitle(slowed) - .setDescription( - `Wait **${client.function.timer( - time_left - )}** to use the command again!\nThe default cooldown is **${client.function.timer( - command.timeout - )}**` - ) - ) - .then(m => m.delete({ timeout: 10000 })); - path.run(client, message, args); - client.addcmdsused(message.author.id); - Timeout2.set( - `${path.name}${message.author.id}`, - Date.now() + path.timeout - ); - setTimeout(() => { - Timeout2.delete(`${path.name}${message.author.id}`); - }, path.timeout); - } else { - path.run(client, message, args); - client.addcmdsused(message.author.id); - } - } -}); -client.on("message", async message => { - const p = await client.prefix(message); - if ( - message.channel.type === "dm" && - !message.content.startsWith(p) && - !message.author.bot - ) { - var attachment = message.attachments.array(); - client.channels.cache - .get(client.DMLog) - .send( - `\`${message.author.tag}(${message.author.id})\`: ` + message.content - ); - if (attachment[0]) client.DMLog.send(attachment); - if (attachment[1]) client.DMLog.send(attachment); - if (attachment[2]) client.DMLog.send(attachment); - if (attachment[3]) client.DMLog.send(attachment); - if (attachment[4]) client.DMLog.send(attachment); - } -}); -/* -client.on("message", async (message) => { - if (message.author.bot) return; - let wordArray = message.content.split(" "); - let filterWords = ["bruh", "Bruh"]; - for (var i = 0; i < filterWords.length; i++) { - if (wordArray.includes(filterWords[i])) { - message.react(""); - break; - } - } -}); -*/ diff --git a/events/messageCreate.js b/events/messageCreate.js index ae06295..6e93715 100644 --- a/events/messageCreate.js +++ b/events/messageCreate.js @@ -1,15 +1,12 @@ const client = require("../bot"); +const codmclient = require("../client/codmclient"); const leven = require("leven"); -const { Collection, MessageEmbed, Permissions } = require("discord.js"); -const { prefix } = require("../config.json"); -const guilds = require("../models/guilds"); -const schema = require("../models/custom-commands"); -const Timeout2 = new Collection(); -const db = require("../models/bot"); +const { MessageEmbed } = require("discord.js"); const cooldown = require("../models/cooldown"); +const utils = require("../util/functions/function"); client.on("messageCreate", async message => { const p = await client.prefix(message); - if (message.author.bot) return; + if (message.author.bot || !message.guild) return; if (message.content.match(new RegExp(`^<@!?${client.user.id}>( |)$`))) { const _ = new MessageEmbed() .setTitle(client.user.username) @@ -26,29 +23,11 @@ client.on("messageCreate", async message => { const m = await message.reply({ embeds: [_] }); setTimeout(() => m.delete(), 15000); } - if (!message.guild) return; - if (!message.content.toLowerCase().startsWith(p.toLowerCase())) return; - - if (!message.member) { - message.member = await message.guild.fetchMember(message); + if (p) { + if (!message.content.toLowerCase().startsWith(p.toLowerCase())) return; } - db.findOne({ Bot: client.user.id }, async (err, data) => { - if (!data) { - new db({ - Bot: client.user.id, - Status: "false", - }); - } else { - if ( - data.Status && - data.Status == "true" && - !client.owners.includes(message.author.id) - ) - return message.reply({ - content: `**${client.user.username}** is currently in maintenance.\nYou can use **cath.exe#9686** or **Cath 2#7414** if it is online\nIf you need help, please contact **Cat drinking a cat#0795** or **Ń1ght#0001**`, - }); - } - }); + if (!message.member) + message.member = await message.guild.fetchMember(message); const data = {}; let guildDB = await client.data.getGuild(message.guild.id); if (!guildDB) return; @@ -61,167 +40,130 @@ client.on("messageCreate", async message => { if (!guildDB) await client.data.CreateGuild(message.guild.id); if (!userEconDB) await client.createProfile(message.author.id); if (data.User) { - if (data.User.Blacklist) { - return; - } + if (data.User.Blacklist) return; } const [cmd, ...args] = message.content.slice(p.length).trim().split(/ +/g); if (cmd.length == 0) return; - const cmddata = await schema.findOne({ - Guild: message.guild.id, - Command: cmd, - }); - if (!cmddata) { - const command = - client.commands.get(cmd.toLowerCase()) || - client.commands.find(c => c.aliases?.includes(cmd.toLowerCase())); - if (!command) { - const best = [ - ...client.commands.map(cmd => cmd.name), - ...client.aliases.keys(), - ].filter(c => leven(cmd.toLowerCase(), c.toLowerCase()) < c.length * 0.4); - const dym = - best.length == 0 - ? "" - : best.length == 1 - ? `Do you mean this?\n**${best[0]}**` - : `Do you mean one of these?\n${best - .slice(0, 3) - .map(value => `**${value}**`) - .join("\n")}`; - if (dym === "") return; - else { - const msg = await message.reply({ - embeds: [ - new MessageEmbed() - .setDescription(`Couldn't find that command.\n${dym}`) - .setTimestamp() - .setColor(client.color), - ], - }); - setTimeout(function () { - msg.delete(); - }, 10000); - } - } - if (command) { - if (command.Owner == true) { - if (!client.owners.includes(message.author.id)) return; - } - if (command.Premium == true) { - if (data.User.Premium == false) { - return message.reply({ - embeds: [ - new MessageEmbed() - .setURL(client.web) - .setAuthor( - message.author.tag, - message.author.displayAvatarURL({ dynamic: true }) - ) - .setColor(client.color) - .setDescription( - `You aren't a premium user. You can either boost support server or gift a nitro to one of the Developer of Cath Team to be premium user` - ) - .setTimestamp() - .setFooter(`Made by ${client.author}`), - ], - }); - } - } - if (!message.guild.me.permissions.has(command.BotPerm || [])) - return message.reply({ - content: `You can't use this command. I need to have ${command.BotPerm} permission to use this command.`, - }); - client.channels.cache.get(client.CMDLog).send({ - content: `\`${message.author.tag}(${message.author.id})\`\n has used \n**${command.name}**\n command in \n\`${message.guild.name}(${message.guild.id})\``, + const command = + client.commands.get(cmd.toLowerCase()) || + client.commands.find(c => c.aliases?.includes(cmd.toLowerCase())); + if (!command) { + const best = [ + ...client.commands.map(cmd => cmd.name), + ...client.aliases.keys(), + ].filter(c => leven(cmd.toLowerCase(), c.toLowerCase()) < c.length * 0.4); + const dym = + best.length == 0 + ? "" + : best.length == 1 + ? `Do you mean this?\n**${best[0]}**` + : `Do you mean one of these?\n${best + .slice(0, 3) + .map(value => `**${value}**`) + .join("\n")}`; + if (dym === "") { + return; + } else { + const msg = await message.reply({ + embeds: [ + new MessageEmbed() + .setDescription(`Couldn't find that command.\n${dym}`) + .setTimestamp() + .setColor(client.color), + ], }); - const category = command.category; - if (data.Guild) { - if (data.Guild.Category) { - if (data.Guild.Category.includes(category)) return; - } - if (data.Guild.Commands) { - if (data.Guild.Commands.includes(command.name)) return; - } - } - const check = await guilds.findOne({ - Guild: message.guild.id, - }); - if (check) { - if (!check.Prefix) { - check.Prefix = prefix; - } else; - } - if (command.timeout) { - const current_time = Date.now(); - const cooldown_amount = command.timeout; - cooldown.findOne( - { User: message.author.id, CMD: command.name }, - async (err, data) => { - if (data) { - const expiration_time = data.Time + cooldown_amount; - if (current_time < expiration_time) { - const time_left = expiration_time - current_time; - const slow = [ - "Keep it slow...", - "Calm down", - "Stop it get some help", - "Too fast", - ]; - const slowed = slow[Math.floor(Math.random() * slow.length)]; - return message.channel.send({ - embeds: [ - new MessageEmbed() - .setColor(client.color) - .setTimestamp() - .setTitle(slowed) - .setDescription( - `You are on a \`${client.function.timer( - time_left - )}\` cooldown.` - ), - ], - }); - } else { - await cooldown.findOneAndUpdate( - { User: message.author.id, CMD: command.name }, - { Time: current_time } - ); - command.run(client, message, args, data); - client.addcmdsused(message.author.id); - } - } else { - command.run(client, message, args, data); - client.addcmdsused(message.author.id); - new cooldown({ - User: message.author.id, - CMD: command.name, - Time: current_time, - Cooldown: command.timeout, - }).save(); - } - } - ); - } else { - command.run(client, message, args, data); - client.addcmdsused(message.author.id); - } + setTimeout(function () { + msg.delete(); + }, 10000); } } else { - if (cmddata.Delete === true && cmddata.Random === false) { - message - .delete() - .then(() => message.channel.send({ content: cmddata.Response })); - } else if (cmddata.Random === true && cmddata.Delete === true) { - const randomed = - cmddata.Response[Math.floor(Math.random() * cmddata.Response.length)]; - message.delete().then(() => message.channel.send({ content: randomed })); - } else if (cmddata.Random === true && cmddata.Delete === false) { - const randomed = - cmddata.Response[Math.floor(Math.random() * cmddata.Response.length)]; - message.channel.send({ content: randomed }); + if (command.Owner) { + if (!client.owners.includes(message.author.id)) return; + } + if (command.Premium) { + if (!data.User.Premium) { + return message.reply({ + embeds: [ + new MessageEmbed() + .setURL(client.web) + .setAuthor( + message.author.tag, + message.author.displayAvatarURL({ dynamic: true }) + ) + .setColor(client.color) + .setDescription( + `You aren't a premium user. You can either boost support server or subscribe to developer's team [Ko-fi](https://ko-fi.com/cathteam) or gift a nitro to one of the developer team to be premium user` + ) + .setTimestamp() + .setFooter(`Made by ${client.author}`), + ], + }); + } + } + if (command.Level) { + if (!data.Guild.Level) return; + } + if (!message.guild.me.permissions.has(command.BotPerm || [])) + return message.reply({ + content: `You can't use this command. I need to have ${command.BotPerm} permission to use this command.`, + }); + client.channels.cache.get(client.CMDLog).send({ + content: `\`${message.author.tag}(${message.author.id})\`\n has used \n**${command.name}**\n command in \n\`${message.guild.name}(${message.guild.id})\``, + }); + if (data.Guild) { + if (data.Guild.Category) { + if (data.Guild.Category.includes(command.directory)) return; + } + if (data.Guild.Commands) { + if (data.Guild.Commands.includes(command.name)) return; + } + } + if (command.timeout) { + const current_time = Date.now(); + const cooldown_amount = command.timeout; + cooldown.findOne( + { User: message.author.id, CMD: command.name }, + async (err, data) => { + if (data) { + const expiration_time = data.Time + cooldown_amount; + if (current_time < expiration_time) { + utils.cooldown(data.Time, cooldown_amount, message); + } else { + await cooldown.findOneAndUpdate( + { User: message.author.id, CMD: command.name }, + { Time: current_time } + ); + command.run(client, message, args, utils, data, codmclient); + client.addcmdsused(message.author.id); + client.channels.cache.get(client.CMDLog).send({ + content: `\`${message.author.tag}(${message.author.id})\`\n has used \n**${command.name}**\n command in \n\`${message.guild.name}(${message.guild.id})\``, + }); + } + } else { + command.run(client, message, args, utils, data, codmclient); + client.channels.cache.get(client.CMDLog).send({ + content: `\`${message.author.tag}(${message.author.id})\`\n has used \n**${command.name}**\n command in \n\`${message.guild.name}(${message.guild.id})\``, + }); + client.addcmdsused(message.author.id); + new cooldown({ + User: message.author.id, + CMD: command.name, + Time: current_time, + Cooldown: command.timeout, + }).save(); + } + } + ); } else { - message.channel.send({ content: cmddata.Response }); + try { + command.run(client, message, args, utils, data, codmclient); + client.channels.cache.get(client.CMDLog).send({ + content: `\`${message.author.tag}(${message.author.id})\`\n has used \n**${command.name}**\n command in \n\`${message.guild.name}(${message.guild.id})\``, + }); + client.addcmdsused(message.author.id); + } catch (e) { + console.log(e); + } } } }); @@ -230,69 +172,26 @@ client.on("messageCreate", async message => { if (message.author.bot) return; if (!message.content.startsWith(p)) return; if (!message.guild) return; - if (!message.member) { + if (!message.member) message.member = await message.guild.fetchMember(message); - } const [cmd, ...args] = message.content.slice(p.length).trim().split(/ +/g); if (cmd.length == 0) return; let path = client.hide.get(cmd); if (path) { if (!client.path.includes(message.guild.id)) return; - client.channels.cache.get(client.CMDLog).send({ - content: `\`${message.author.tag}(${message.author.id})\`\n has used \n**${path.name}**\n command in \n\`${message.guild.name}(${message.guild.id})\``, - }); - if (path.timeout) { - if (Timeout2.has(`${path.name}${message.author.id}`)) { - const slow = [ - "Keep it slow...", - "Calm down", - "Stop it get some help", - "Too fast", - ]; - const slowed = slow[Math.floor(Math.random() * slow.length)]; - const time_left = - Timeout2.get(`${path.name}${message.author.id}`) - Date.now(); - const msg = await message.channel.send({ - embeds: [ - new MessageEmbed() - .setColor(client.color) - .setTimestamp() - .setTitle(slowed) - .setDescription( - `Wait **${client.function.timer( - time_left - )}** to use the command again!\nThe default cooldown is **${client.function.timer( - path.timeout - )}**` - ), - ], - }); - setTimeout(function () { - msg.delete(); - }, 10000); - } - path.run(client, message, args); - client.addcmdsused(message.author.id); - Timeout2.set( - `${path.name}${message.author.id}`, - Date.now() + path.timeout - ); - setTimeout(() => { - Timeout2.delete(`${path.name}${message.author.id}`); - }, path.timeout); - } else { + try { path.run(client, message, args); client.addcmdsused(message.author.id); + client.channels.cache.get(client.CMDLog).send({ + content: `\`${message.author.tag}(${message.author.id})\`\n has used \n**${path.name}**\n command in \n\`${message.guild.name}(${message.guild.id})\``, + }); + } catch (e) { + console.log(e); } } }); client.on("messageCreate", async message => { - const p = await client.prefix(message); - if ( - message.channel.type === "DM" && - !message.content.startsWith(p) && - !message.author.bot - ) { + if (message.channel.type === "DM" && !message.author.bot) { if (message.attachments) { if (message.attachments && message.content) { message.attachments.map(e => diff --git a/events/messsageDelete.js b/events/messsageDelete.js deleted file mode 100644 index 3ac487f..0000000 --- a/events/messsageDelete.js +++ /dev/null @@ -1,31 +0,0 @@ -const client = require("../bot"); -client.on("messageDelete", async message => { - let all = []; - if (message.attachments) { - const mapped = message.attachments.map(a => { - if ( - a.name.endsWith(".png") || - a.name.endsWith(".jpg") || - a.name.endsWith(".jpeg") || - a.name.endsWith(".gif") || - a.name.endsWith(".webp") - ) - return message.attachments.first().proxyURL; - else return message.attachments.first().url; - }); - if (mapped.length == 1) { - all.push(mapped); - } else if (mapped.length > 1) { - message.attachments.map(b => { - all.push(mapped); - }); - } - } - client.snipes.push({ - channel: message.channel, - content: message.content ? message.content : "None", - author: message.author, - attachment: all ? all : null, - date: new Date(), - }); -}); diff --git a/events/reactionroles.js b/events/reactionroles.js deleted file mode 100644 index 97b2607..0000000 --- a/events/reactionroles.js +++ /dev/null @@ -1,30 +0,0 @@ -const client = require("../bot"); -const Schema = require("../models/reaction"); - -client.on("messageReactionAdd", async (reaction, user) => { - if (reaction.message.partial) await reaction.message.fetch(); - if (reaction.partial) await reaction.fetch(); - if (user.bot) return; - if (!reaction.message.guild) return; - Schema.findOne({ Message: reaction.message.id }, async (err, data) => { - if (!data) return; - if (!Object.keys(data.Roles).includes(reaction.emoji.name)) return; - const [roleid] = data.Roles[reaction.emoji.name]; - reaction.message.guild.members.cache.get(user.id).roles.add(roleid); - user.send(`A role has been added`); - }); -}); -client.on("messageReactionRemove", async (reaction, user) => { - if (reaction.message.partial) await reaction.message.fetch(); - if (reaction.partial) await reaction.fetch(); - if (user.bot) return; - if (!reaction.message.guild) return; - Schema.findOne({ Message: reaction.message.id }, async (err, data) => { - if (!data) return; - if (!Object.keys(data.Roles).includes(reaction.emoji.name)) return; - - const [roleid] = data.Roles[reaction.emoji.name]; - reaction.message.guild.members.cache.get(user.id).roles.remove(roleid); - user.send(`A role has been removed`); - }); -}); diff --git a/events/ready.js b/events/ready.js index 6b4bbd8..24f9b05 100644 --- a/events/ready.js +++ b/events/ready.js @@ -1,56 +1,6 @@ const client = require("../bot"); -const config = require("../config.json"); -const prefix = config.prefix; const version = require("../package.json").version; -const { MessageEmbed } = require("discord.js"); -const m = require("../models/bot"); -const test = require("../util/dist/cmds").cmds(); client.on("ready", async () => { client.manager.init(client.user.id); - var users = client.guilds.cache - .reduce((a, b) => a + b.memberCount, 0) - .toLocaleString(); - var guilds = client.guilds.cache.size.toString(); - await client.data.botcache(client.user.id, guilds, users); - await client.data.commands(client.user.id, test); - var playing = [`v${version} | ${prefix}help`, client.web, `${users} users`]; - async function find() { - const statusdb = await m.findOne({ - Status: "true", - }); - if (statusdb && statusdb.Status == "true") { - client.user.setPresence({ - activities: [ - { - name: "Under Maintenance", - type: "STREAMING", - url: "https://twtich.tv/thekiritosgaming", - }, - ], - status: "online", - }); - } else { - setInterval(function () { - var game = Math.floor(Math.random() * playing.length + 0); - client.user.setPresence({ - activities: [ - { - name: playing[game], - type: "STREAMING", - url: "https://twitch.tv/thekiritosgaming", - }, - ], - }); - }, 5000); - } - } - find(); console.log(`${client.user.username} ✅\nVersion: v${version}`); - var embed = new MessageEmbed() - .setColor(client.color) - .setTitle(`${client.user.tag} is online`) - .setDescription(`${client.user.username} ✅\nVersion: v${version}`) - .setTimestamp() - .setFooter(`${client.user.username}`); - client.channels.cache.get(client.ReadyLog).send({ embeds: [embed] }); }); diff --git a/events/slash.js b/events/slash.js deleted file mode 100644 index 1533a2e..0000000 --- a/events/slash.js +++ /dev/null @@ -1,35 +0,0 @@ -const { Client, Message, MessageEmbed } = require("discord.js"); -const client = require("../bot"); -async function createApiMessage(interaction, content) { - const apiMessage = await APIMessage.create( - client.channels.resolve(interaction.channel_id), - content - ) - .resolveData() - .resolveFiles(); - return { ...apiMessage.data, files: apiMessage.files }; -} -client.on("ready", async () => { - const a = client.api.applications(client.user.id); - a.commands.post({ - data: { - name: "help", - description: "Get some support!", - }, - }); -}); -client.ws.on("INTERACTION_CREATE", async interaction => { - let command = interaction.data.name.toLowerCase(); - let args = interaction.data.options; - if (command === "help") { - client.api.interactions(interaction.id, interaction.token).callback.post({ - data: { - type: 4, - data: { - content: - "Website: https://cath.gq/\n Support: https://discord.gg/SbQHChmGcp", - }, - }, - }); - } -}); diff --git a/events/starboard.js b/events/starboard.js new file mode 100644 index 0000000..ea1a592 --- /dev/null +++ b/events/starboard.js @@ -0,0 +1,83 @@ +const client = require("../bot"); +const { MessageEmbed } = require("discord.js"); +client.on("messageReactionAdd", async (reaction, user) => { + const star = async () => { + const starch = reaction.message.guild.channels.cache.find( + n => n.name.toLowerCase() === "starboard" + ); + const msgs = await starch.messages.fetch({ limit: 100 }); + const here = msgs.find(msg => + msg.embeds.length === 1 + ? msg.embeds[0].footer.text.startsWith(reaction.message.id) + ? true + : false + : false + ); + if (here) here.edit(`${reaction.count} - ⭐`); + else { + const embed = new MessageEmbed() + .setColor(client.color) + .setTitle( + `From ${reaction.message.author.tag}`, + reaction.message.author.displayAvatarURL({ dynamic: true }) + ) + .setThumbnail( + reaction.message.author.displayAvatarURL({ dynamic: true }) + ) + .addField(`Message`, `[Jump!](${reaction.message.url})`) + .setDescription( + `Content: ${ + reaction.message.content ? reaction.message.content : "None" + }` + ) + .setImage( + reaction.message.attachments.length + ? reaction.message.attachments.first().url + : null + ) + .setFooter(`${reaction.message.id}`) + .setTimestamp(reaction.message.createdTimestamp); + if (starch) { + starch.send({ content: "1 - ⭐", embeds: [embed] }); + } + } + }; + if (reaction.emoji.name === "⭐") { + if (reaction.message.channel.name.toLowerCase() === "starboard") return; + if (reaction.message.partial) { + await reaction.fetch(); + await reaction.message.fetch(); + star(); + } else star(); + } +}); +client.on("messageReactionRemove", async (reaction, user) => { + const star = async () => { + const starch = reaction.message.guild.channels.cache.find( + n => n.name.toLowerCase() === "starboard" + ); + const msgs = await starch.messages.fetch({ limit: 100 }); + const here = msgs.find(msg => + msg.embeds.length === 1 + ? msg.embeds[0].footer.text.startsWith(reaction.message.id) + ? true + : false + : false + ); + if (here) { + if (reaction.count === 0) { + setTimeout(function () { + here.delete(); + }, 5000); + } else here.edit(`${reaction.count} - ⭐`); + } + }; + if (reaction.emoji.name === "⭐") { + if (reaction.message.channel.name.toLowerCase() === "starboard") return; + if (reaction.message.partial) { + await reaction.fetch(); + await reaction.message.fetch(); + star(); + } else star(); + } +}); diff --git a/events/startTyping.js b/events/startTyping.js deleted file mode 100644 index d9b1e9a..0000000 --- a/events/startTyping.js +++ /dev/null @@ -1,10 +0,0 @@ -const client = require("../bot"); -client.on("typingStart", async (channel, user) => { - if (!user) return; - if (user.bot) return; - if (!channel) return; - if (channel.type != "dm") return; - user.send( - "```DMs is reserved for bug reports/suggestions/feedbacks/queries and is forwarded to the developers. Please refrain from using it as a clipboard or trying to run commands in here [by violating this condition, you agree to let us sell your data]```" - ); -}); diff --git a/events/typingStart.js b/events/typingStart.js deleted file mode 100644 index 1e4855b..0000000 --- a/events/typingStart.js +++ /dev/null @@ -1,10 +0,0 @@ -const client = require("../bot"); -client.on("typingStart", async (channel, user) => { - if (!user) return; - if (user.bot) return; - if (!channel) return; - if (channel.type != "DM") return; - user.send( - "```DMs is reserved for bug reports/suggestions/feedbacks/queries and is forwarded to the developers. Please refrain from using it as a clipboard or trying to run commands in here [by violating this condition, you agree to let us sell your data]```" - ); -}); diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 1e3c93e..0000000 --- a/package-lock.json +++ /dev/null @@ -1,3988 +0,0 @@ -{ - "name": "cath.exe", - "version": "3.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", - "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", - "dev": true - }, - "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/runtime": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", - "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@canvacord/assets": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@canvacord/assets/-/assets-2.0.5.tgz", - "integrity": "sha512-MceWZe5TzOymfvgf8ZU5m1oxWg6rGyH5anCgANARa47+CjVcppe6+Bd1+36pXiDTOyE4uRJk6T5RgOEJOgciug==" - }, - "@canvacord/emoji-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@canvacord/emoji-parser/-/emoji-parser-1.0.1.tgz", - "integrity": "sha512-Lb3xatdd91MR9tU4sicgrxxKg+/rVD1zKTOh55bmVF2Ri5X8vHTV+jNHTvRzkomGpyepGM+7qA4xMvG8ZqtO8g==", - "requires": { - "twemoji-parser": "^13.0.0" - } - }, - "@discordjs/builders": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.5.0.tgz", - "integrity": "sha512-HP5y4Rqw68o61Qv4qM5tVmDbWi4mdTFftqIOGRo33SNPpLJ1Ga3KEIR2ibKofkmsoQhEpLmopD1AZDs3cKpHuw==", - "requires": { - "@sindresorhus/is": "^4.0.1", - "discord-api-types": "^0.22.0", - "ow": "^0.27.0", - "ts-mixer": "^6.0.0", - "tslib": "^2.3.0" - } - }, - "@discordjs/collection": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", - "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" - }, - "@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" - } - }, - "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - } - } - }, - "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", - "dev": true - }, - "@kensingtontech/recacheman": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@kensingtontech/recacheman/-/recacheman-2.2.8.tgz", - "integrity": "sha512-rbh85Pse/iqT+doCauVZWxqaXCJpnjjJKOh3hFE5b7J1SoHp/S4IY94CZ8E8uV/eHUQlPF5YfTuCYjSaMTX9eQ==", - "requires": { - "@kensingtontech/recacheman-redis": "^2.1.6", - "ms": "^2.1.3", - "recacheman-file": "^0.2.5", - "recacheman-memory": "^1.1.0" - } - }, - "@kensingtontech/recacheman-redis": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@kensingtontech/recacheman-redis/-/recacheman-redis-2.1.6.tgz", - "integrity": "sha512-hTB0i3yxjciMF0zjr5U4ui/Qv4OVb/ld2PHKvE4NTpiGUz0kzye1d0verKwBWmenvFnScKTX9KXc7/HE59CdRA==", - "requires": { - "each": "1.2.1", - "parse-redis-url": "0.0.2", - "redis": "^3.0.2" - } - }, - "@mapbox/node-pre-gyp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz", - "integrity": "sha512-4srsKPXWlIxp5Vbqz5uLfBN+du2fJChBoYn/f2h991WLdk7jUvcSk/McVLSv/X+xQIPI8eGD5GjrnygdyHnhPA==", - "requires": { - "detect-libc": "^1.0.3", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.1", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "rimraf": "^3.0.2", - "semver": "^7.3.4", - "tar": "^6.1.0" - } - }, - "@reconlx/discord.js": { - "version": "1.1.101", - "resolved": "https://registry.npmjs.org/@reconlx/discord.js/-/discord.js-1.1.101.tgz", - "integrity": "sha512-YKXJ74zra1tUwtx0p2U1nZWhnBTe2WhZioTMT5+W89QQrheyYus1MUWdJceAsN0eIs0p4zqhrNqWMWNY7B3xyQ==" - }, - "@sapphire/async-queue": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.4.tgz", - "integrity": "sha512-fFrlF/uWpGOX5djw5Mu2Hnnrunao75WGey0sP0J3jnhmrJ5TAPzHYOmytD5iN/+pMxS+f+u/gezqHa9tPhRHEA==" - }, - "@sindresorhus/is": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.1.tgz", - "integrity": "sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g==" - }, - "@sourcebin/linguist": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@sourcebin/linguist/-/linguist-0.0.3.tgz", - "integrity": "sha512-VVkb/34pISdK+1tyqmwBac6crn8UhviKCRV5w/wc8iZyTCOoTrOu0Cgbqfh0bfMGxNlQuhaRy6cMmEmHxa5R3g==" - }, - "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" - }, - "@types/bson": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz", - "integrity": "sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg==", - "requires": { - "@types/node": "*" - } - }, - "@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" - }, - "@types/keyv": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", - "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", - "requires": { - "@types/node": "*" - } - }, - "@types/mongodb": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz", - "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==", - "requires": { - "@types/bson": "*", - "@types/node": "*" - } - }, - "@types/node": { - "version": "16.7.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.10.tgz", - "integrity": "sha512-S63Dlv4zIPb8x6MMTgDq5WWRJQe56iBEY0O3SOFA9JrRienkOVDXSXBjjJw6HTNQYSE2JI6GMCR6LVbIMHJVvA==" - }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "requires": { - "@types/node": "*" - } - }, - "@types/ws": { - "version": "7.4.7", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", - "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", - "requires": { - "@types/node": "*" - } - }, - "@weky/inlinereply": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/@weky/inlinereply/-/inlinereply-0.0.0.tgz", - "integrity": "sha512-wUecLX4CR87PiFbH9d264zcfnyXxZbhr30NIJBjJ96U5tHdQzyOpMPInQmU8mq2hOuC6keEM3pFiXa2B75tYDA==", - "requires": { - "discord.js": "^12.5.3" - }, - "dependencies": { - "discord.js": { - "version": "12.5.3", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.3.tgz", - "integrity": "sha512-D3nkOa/pCkNyn6jLZnAiJApw2N9XrIsXUAdThf01i7yrEuqUmDGc7/CexVWwEcgbQR97XQ+mcnqJpmJ/92B4Aw==", - "requires": { - "@discordjs/collection": "^0.1.6", - "@discordjs/form-data": "^3.0.1", - "abort-controller": "^3.0.0", - "node-fetch": "^2.6.1", - "prism-media": "^1.2.9", - "setimmediate": "^1.0.5", - "tweetnacl": "^1.0.3", - "ws": "^7.4.4" - } - } - } - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "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" - } - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==" - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - } - } - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "better-sqlite3": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.4.3.tgz", - "integrity": "sha512-07bKjClZg/f4KMVRkzWtoIvazVPcF1gsvVKVIXlxwleC2DxuIhnra3KCMlUT1rFeRYXXckot2a46UciF2d9KLw==", - "requires": { - "bindings": "^1.5.0", - "prebuild-install": "^6.0.1", - "tar": "^6.1.0" - } - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" - }, - "bson": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", - "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" - }, - "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "canvacord": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/canvacord/-/canvacord-5.2.3.tgz", - "integrity": "sha512-aYxGA7tVQi3NCa7Qxg2b9u+wAeek2xE5q+nJjiReZofeUx0d1Xq731UerKf+iVIPBrCAcjbv/yflJL0qVwPuMQ==", - "requires": { - "@canvacord/assets": "^2.0.5", - "@canvacord/emoji-parser": "^1.0.1", - "canvas": "^2.8.0", - "gifencoder": "^2.0.1", - "moment": "^2.29.1", - "moment-duration-format": "^2.3.2" - } - }, - "canvas": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.8.0.tgz", - "integrity": "sha512-gLTi17X8WY9Cf5GZ2Yns8T5lfBOcGgFehDFb+JQwDqdOoBOcECS9ZWMEAqMSVcMYwXD659J8NyzjRY/2aE+C2Q==", - "requires": { - "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.14.0", - "simple-get": "^3.0.3" - } - }, - "cath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cath/-/cath-1.1.0.tgz", - "integrity": "sha512-5QK9b7LQMb44fFXTt8IEXEVGyAk9OJEIsF8F0zTtila1ELvf603kuH1RDQRG2/Z84m3c1XcqaLl6j3zJGvTScA==", - "requires": { - "axios": "^0.21.4", - "discord.js": "^13.1.0" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" - }, - "cheerio": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", - "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", - "requires": { - "cheerio-select": "^1.5.0", - "dom-serializer": "^1.3.2", - "domhandler": "^4.2.0", - "htmlparser2": "^6.1.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "tslib": "^2.2.0" - }, - "dependencies": { - "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" - }, - "domhandler": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", - "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - } - } - }, - "cheerio-select": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", - "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", - "requires": { - "css-select": "^4.1.3", - "css-what": "^5.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0", - "domutils": "^2.7.0" - }, - "dependencies": { - "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" - }, - "domhandler": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", - "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - } - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", - "dev": true, - "requires": { - "exit": "0.1.2", - "glob": "^7.1.1" - } - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "requires": { - "mimic-response": "^1.0.0" - }, - "dependencies": { - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "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==" - }, - "complex.js": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.0.15.tgz", - "integrity": "sha512-gDBvQU8IG139ZBQTSo2qvDFP+lANMGluM779csXOr6ny1NUtA3wkUnCFjlDNH/moAVfXtvClYt6G0zarFbtz5w==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" - }, - "css-select": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", - "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" - }, - "dependencies": { - "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" - }, - "domhandler": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", - "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - } - } - }, - "css-what": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", - "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==" - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - } - } - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "decancer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/decancer/-/decancer-1.0.4.tgz", - "integrity": "sha512-nMEKK18OTTrKhWbKkqSkV6hur4KoE3njJiygKRC58I9lmQszwbiBhVE7gKSRcMaEEW7lIKJBFtO0vpTDtK7Urg==" - }, - "decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" - }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "requires": { - "mimic-response": "^2.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" - }, - "discord-api-types": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.22.0.tgz", - "integrity": "sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg==" - }, - "discord-buttons": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/discord-buttons/-/discord-buttons-4.0.0.tgz", - "integrity": "sha512-E/eQX4Ktj7nKwNDsTfCezBNCu73FtPWJfQcpKohfl0jct/ucMUO+7uhL2MhGsZr4SCfojk7OzccAznuntB564w==" - }, - "discord-canvas": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/discord-canvas/-/discord-canvas-1.4.1.tgz", - "integrity": "sha512-0Ee1mvmalw1Nz60MwU6SxUdFNUDrJwx8II4JxaDFqw/2nEPav7PB8giQxDPaCgcyFOAvReQJFSQ66FCr+m1O8g==", - "requires": { - "canvas": "^2.6.1", - "fortnite": "^4.3.2", - "fortnite-9812": "^1.0.4", - "fs": "^0.0.1-security" - } - }, - "discord-giveaways": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/discord-giveaways/-/discord-giveaways-5.0.1.tgz", - "integrity": "sha512-ZuZz0X/AbFIoU/T580B3o5fdmVZS/AHzzL5mCSzBkRwEEI6hmp8wkbbAtw+CTocPdGNfydwJmlycgbQTSrpE6g==", - "requires": { - "deepmerge": "^4.2.2", - "discord.js": "^13.1.0", - "serialize-javascript": "^6.0.0" - } - }, - "discord-xp": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/discord-xp/-/discord-xp-1.1.16.tgz", - "integrity": "sha512-A5g6utg+0fCLEUl6sS5J5mpr8DAXe5KxBFQnJf89KpQ71Itt0Hdv5/seOBCc6p239nuxEfW9n29peMlLCuvlrg==", - "requires": { - "mongoose": "^5.11.11" - } - }, - "discord.js": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.1.0.tgz", - "integrity": "sha512-gxO4CXKdHpqA+WKG+f5RNnd3srTDj5uFJHgOathksDE90YNq/Qijkd2WlMgTTMS6AJoEnHxI7G9eDQHCuZ+xDA==", - "requires": { - "@discordjs/builders": "^0.5.0", - "@discordjs/collection": "^0.2.1", - "@discordjs/form-data": "^3.0.1", - "@sapphire/async-queue": "^1.1.4", - "@types/ws": "^7.4.7", - "discord-api-types": "^0.22.0", - "node-fetch": "^2.6.1", - "ws": "^7.5.1" - }, - "dependencies": { - "@discordjs/collection": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.2.1.tgz", - "integrity": "sha512-vhxqzzM8gkomw0TYRF3tgx7SwElzUlXT/Aa41O7mOcyN6wIJfj5JmDWaO5XGKsGSsNx7F3i5oIlrucCCWV1Nog==" - } - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" - } - } - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" - }, - "each": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/each/-/each-1.2.1.tgz", - "integrity": "sha512-POUbnWaseHgI8I+icHo3jAMrCqoLgVWaI7yqcQ0nat4q2f2BFUVGAndMOvr2UZoHAGAnQqotaM9RI4kZcjtAcg==" - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "erela.js": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/erela.js/-/erela.js-2.3.3.tgz", - "integrity": "sha512-tzowGHLSodZr2j311csFSqm9lwE6plqeULTAwPwuRX9PQbXg4Ohdy/3MTMWrltiFAMSIG/5r9GQtTUt9Mqzhhw==", - "requires": { - "@discordjs/collection": "^0.1.6", - "petitio": "^1.1.0", - "ws": "^7.3.1" - } - }, - "erela.js-spotify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/erela.js-spotify/-/erela.js-spotify-1.2.0.tgz", - "integrity": "sha512-FbkdVK7OquVzyNVl4aZ3AU6RHRrHzBpORGorK5q+L26y3hB/7ze9mQ7uiOa5PsskskELRWepoluqke3U8edbmQ==", - "requires": { - "axios": "^0.20.0", - "erela.js": "^2.2.0" - }, - "dependencies": { - "axios": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.20.0.tgz", - "integrity": "sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA==", - "requires": { - "follow-redirects": "^1.10.0" - } - } - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-latex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", - "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - } - } - }, - "eslint-config-google": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", - "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", - "dev": true - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "dependencies": { - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "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==" - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "express-session": { - "version": "1.17.2", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.2.tgz", - "integrity": "sha512-mPcYcLA0lvh7D4Oqr5aNJFMtBMKPLl++OKKxkHzZ0U0oDq1rpKBnkR5f5vCHR26VeArlTOEF9td4x5IjICksRQ==", - "requires": { - "cookie": "0.4.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-headers": "~1.0.2", - "parseurl": "~1.3.3", - "safe-buffer": "5.2.1", - "uid-safe": "~2.1.5" - }, - "dependencies": { - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "figlet": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.5.2.tgz", - "integrity": "sha512-WOn21V8AhyE1QqVfPIVxe3tupJacq1xGkPTB4iagT6o+P2cAgEOOwIxMftr4+ZCTI6d551ij9j61DFr0nsP2uQ==" - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", - "dev": true - }, - "follow-redirects": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.3.tgz", - "integrity": "sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw==" - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fortnite": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/fortnite/-/fortnite-4.3.2.tgz", - "integrity": "sha512-6BReElBAwP/3Gq6zEBn9gdQzrzWpMlumY9IF0suZgDshbzsS8dCDuV8JszDl1l1PVJwtzm2uexfUo9YtUqUV6Q==", - "requires": { - "node-fetch": "^2.3.0" - } - }, - "fortnite-9812": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fortnite-9812/-/fortnite-9812-1.0.4.tgz", - "integrity": "sha512-TkdbPT1oTQ/GncnC5Sf4dVo6CLo4NJAtiU17rOUetcZ59nLAgNhceNkSqgMCYdYx6gCEB1A/9pYzm/JKOmgRcA==", - "requires": { - "node-fetch": "^2.3.0" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fraction.js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz", - "integrity": "sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", - "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-extra": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", - "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "gifencoder": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/gifencoder/-/gifencoder-2.0.1.tgz", - "integrity": "sha512-x19DcyWY10SkshBpokqFOo/HBht9GB75evRYvaLMbez9p+yB/o+kt0fK9AwW59nFiAMs2UUQsjv1lX/hvu9Ong==", - "requires": { - "canvas": "^2.2.0" - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - }, - "dependencies": { - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "goosecache": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/goosecache/-/goosecache-9.0.14.tgz", - "integrity": "sha512-EWUYpaUnRBVFabApU/tKqFTq2VPdXqU75UeCUcv6cYgPtNxErVkYyBpguwOQtvI8FLELhraK/AU6E7nyeFIqpw==", - "requires": { - "@kensingtontech/recacheman": "^2.2.8", - "loglevel": "^1.7.1", - "sha1": "^1.1.1" - } - }, - "got": { - "version": "11.8.2", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.2.tgz", - "integrity": "sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==", - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.1", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "dependencies": { - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "requires": { - "mimic-response": "^3.1.0" - } - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - } - } - }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-entities": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", - "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==" - }, - "html-to-text": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-5.1.1.tgz", - "integrity": "sha512-Bci6bD/JIfZSvG4s0gW/9mMKwBRoe/1RWLxUME/d6WUSZCdY7T60bssf/jFf7EYXRyqU4P5xdClVqiYU0/ypdA==", - "requires": { - "he": "^1.2.0", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.11", - "minimist": "^1.2.0" - } - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "imageapi.js": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/imageapi.js/-/imageapi.js-1.7.0.tgz", - "integrity": "sha512-0OCfIWDQxCwqP5XjiumobcNbmv0rwatIOrhkQTikkJ8VjgohvaUh4yBHSKTlGHLyvPuKKNVfz4epR6Mm0xrHWQ==", - "requires": { - "node-fetch": "^2.6.1" - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "javascript-natural-sort": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", - "integrity": "sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k=" - }, - "javascript-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", - "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - } - }, - "jshint": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.1.tgz", - "integrity": "sha512-vymzfR3OysF5P774x6zYv0bD4EpH6NWRxpq54wO9mA9RuY49yb1teKSICkLx2Ryx+mfzlVVNNbTBtsRtg78t7g==", - "dev": true, - "requires": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "~4.17.21", - "minimatch": "~3.0.2", - "shelljs": "0.3.x", - "strip-json-comments": "1.0.x" - }, - "dependencies": { - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true - }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dev": true, - "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true - } - } - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "kareem": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", - "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" - }, - "keyv": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz", - "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==", - "requires": { - "json-buffer": "3.0.1" - } - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "leven": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-4.0.0.tgz", - "integrity": "sha512-puehA3YKku3osqPlNuzGDUHq8WpwXupUg1V6NXdV38G+gr+gkBwFC8g1b/+YcIvp8gnqVIus+eJCH/eGsRmJNw==" - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, - "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "lyrics-finder": { - "version": "21.7.0", - "resolved": "https://registry.npmjs.org/lyrics-finder/-/lyrics-finder-21.7.0.tgz", - "integrity": "sha512-AMaJ+MdbdemYOWM1Kxd/vzn23OD66/fdemaJWN9dU0qsxK6d09rODSphygAvaGka6mgfHaFlHN+ETHv/d60ftw==", - "requires": { - "encoding": "^0.1.13", - "html-to-text": "^5.1.1", - "node-fetch": "^2.6.0" - } - }, - "m3u8stream": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.8.4.tgz", - "integrity": "sha512-sco80Db+30RvcaIOndenX6E6oQNgTiBKeJbFPc+yDXwPQIkryfboEbCvXPlBRq3mQTCVPQO93TDVlfRwqpD35w==", - "requires": { - "miniget": "^4.0.0", - "sax": "^1.2.4" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "mathjs": { - "version": "9.4.4", - "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-9.4.4.tgz", - "integrity": "sha512-5EEJXnWOzLDgMHSFyw623nH+MTBZxquWwXtrzTsingOouJJ6UZG2VNO1lwH31IMt9aMno1axO6TYleIP4YSDaQ==", - "requires": { - "@babel/runtime": "^7.14.6", - "complex.js": "^2.0.15", - "decimal.js": "^10.3.1", - "escape-latex": "^1.2.0", - "fraction.js": "^4.1.1", - "javascript-natural-sort": "^0.7.1", - "seedrandom": "^3.0.5", - "tiny-emitter": "^2.1.0", - "typed-function": "^2.0.0" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" - }, - "mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", - "requires": { - "mime-db": "1.49.0" - } - }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" - }, - "miniget": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/miniget/-/miniget-4.2.1.tgz", - "integrity": "sha512-O/DduzDR6f+oDtVype9S/Qu5hhnx73EDYGyZKwU/qN82lehFZdfhoa4DT51SpsO+8epYrB3gcRmws56ROfTIoQ==" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" - }, - "moment-duration-format": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/moment-duration-format/-/moment-duration-format-2.3.2.tgz", - "integrity": "sha512-cBMXjSW+fjOb4tyaVHuaVE/A5TqkukDWiOfxxAjY+PEqmmBQlLwn+8OzwPiG3brouXKY5Un4pBjAeB6UToXHaQ==" - }, - "mongodb": { - "version": "3.6.11", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.11.tgz", - "integrity": "sha512-4Y4lTFHDHZZdgMaHmojtNAlqkvddX2QQBEN0K//GzxhGwlI9tZ9R0vhbjr1Decw+TF7qK0ZLjQT292XgHRRQgw==", - "requires": { - "bl": "^2.2.1", - "bson": "^1.1.4", - "denque": "^1.4.1", - "optional-require": "^1.0.3", - "safe-buffer": "^5.1.2", - "saslprep": "^1.0.0" - } - }, - "mongoose": { - "version": "5.13.9", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.9.tgz", - "integrity": "sha512-JbLw5ie0LJxm7V9LoNxRY//6cyFJf0cOpON2TWUWvF9pabil6ArfECL3xHV2N+mwwO4gXiIa+c0pwTzDUVTgqw==", - "requires": { - "@types/bson": "1.x || 4.0.x", - "@types/mongodb": "^3.5.27", - "bson": "^1.1.4", - "kareem": "2.3.2", - "mongodb": "3.6.11", - "mongoose-legacy-pluralize": "1.0.2", - "mpath": "0.8.4", - "mquery": "3.2.5", - "ms": "2.1.2", - "optional-require": "1.0.x", - "regexp-clone": "1.0.0", - "safe-buffer": "5.2.1", - "sift": "13.5.2", - "sliced": "1.0.1" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "mongoose-legacy-pluralize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", - "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" - }, - "mpath": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz", - "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==" - }, - "mquery": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz", - "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==", - "requires": { - "bluebird": "3.5.1", - "debug": "3.1.0", - "regexp-clone": "^1.0.0", - "safe-buffer": "5.1.2", - "sliced": "1.0.1" - }, - "dependencies": { - "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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" - }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "node": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/node/-/node-16.6.1.tgz", - "integrity": "sha512-qlIQ5vkAAMP+T1bYivwngIqZlUzerPSeaeAQVUvyQ2XZ8WN86ZUdzcpkW/iuEnP9paNcpAsA4p9yCsfrdjG7YQ==", - "dev": true, - "requires": { - "node-bin-setup": "^1.0.0" - } - }, - "node-abi": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz", - "integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==", - "requires": { - "semver": "^5.4.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "node-bin-setup": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.0.6.tgz", - "integrity": "sha512-uPIxXNis1CRbv1DwqAxkgBk5NFV3s7cMN/Gf556jSw6jBvV7ca4F9lRL/8cALcZecRibeqU+5dFYqFFmzv5a0Q==", - "dev": true - }, - "node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-aLoxToI6RfZ+0NOjmWAgn9+LEd30YCkJKFSyWacNZdEKTit/ZMcKjGkTRo8uWEsnIb/hfKecNPEbln02PdWbcA==" - }, - "node-superfetch": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/node-superfetch/-/node-superfetch-0.2.3.tgz", - "integrity": "sha512-xOqifvw/3N+tIeeC80/TNJXkoxDZm8JWc7/0VBkJ86ttQTlJvoicuVaeJlKKHYRlmC2O6ygNIhNPwLYX4bxqdA==", - "requires": { - "form-data": "^4.0.0", - "node-fetch": "^2.6.1" - }, - "dependencies": { - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - } - } - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "requires": { - "abbrev": "1" - } - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", - "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", - "requires": { - "boolbase": "^1.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "optional-require": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", - "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==" - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "ow": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/ow/-/ow-0.27.0.tgz", - "integrity": "sha512-SGnrGUbhn4VaUGdU0EJLMwZWSupPmF46hnTRII7aCLCrqixTAC5eKo8kI4/XXf1eaaI8YEVT+3FeGNJI9himAQ==", - "requires": { - "@sindresorhus/is": "^4.0.1", - "callsites": "^3.1.0", - "dot-prop": "^6.0.1", - "lodash.isequal": "^4.5.0", - "type-fest": "^1.2.1", - "vali-date": "^1.0.0" - } - }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-redis-url": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/parse-redis-url/-/parse-redis-url-0.0.2.tgz", - "integrity": "sha1-E8kqCrvm8lEgBqjEnebLe43Usnc=" - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "requires": { - "parse5": "^6.0.1" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "petitio": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/petitio/-/petitio-1.3.2.tgz", - "integrity": "sha512-hbbT+rOvovz39ZneGW+C8B4YsKH20KLXYVDT/IzSUxaY8H7al/TO+vFCm+H5cnYe62gIqF9ak5p8OJktV/I0Ig==" - }, - "prebuild-install": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz", - "integrity": "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==", - "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.21.0", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "prettier": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.0.tgz", - "integrity": "sha512-DsEPLY1dE5HF3BxCRBmD4uYZ+5DCbvatnolqTqcxEgKVZnL2kUfyu7b8pPQ5+hTBkdhU9SLUmK0/pHb07RE4WQ==", - "dev": 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==" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" - }, - "quick.db": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/quick.db/-/quick.db-7.1.3.tgz", - "integrity": "sha512-0S1fVb9OAZGhkI4ZIc5Oe4yWMwhz20xSsziwd6+yGWKKMsPt+XOfj/gD5CesGxd2WdqBkZFBiP8ZqWDu55HLHA==", - "requires": { - "better-sqlite3": "^7.1.1", - "lodash": "^4.17.20" - } - }, - "quickchart-js": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/quickchart-js/-/quickchart-js-1.4.1.tgz", - "integrity": "sha512-LLfHUqFmygKMQKh3e4sMInx31htEVkNMnBwHFYnS7ogBuRmsVx4tE1VU1wPay2/FRDUZTNohyvEbm5EKFzHD0g==", - "requires": { - "axios": "^0.21.1", - "javascript-stringify": "^2.0.1" - } - }, - "random-bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "recacheman-file": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/recacheman-file/-/recacheman-file-0.2.5.tgz", - "integrity": "sha512-wG3NrjR/+QTGVjV+omK8n81LPHNzhfHNiMGx25upFUX3FBmGBbtPZCLFlwc2wUDt4HIReKQ3sIjOQVBUE8/T5Q==", - "requires": { - "fs-extra": "~0.26.2", - "sanitize-filename": "^1.5.3" - } - }, - "recacheman-memory": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/recacheman-memory/-/recacheman-memory-1.1.2.tgz", - "integrity": "sha512-FqaAJ0Rn0yZaGPPKI6aAb6z5PbPLKGhlZnCWRB2vYzBtPOx3c/PhCT3B1jt1zjkVjDNLs06+NGRoK3GY/A0qsw==", - "requires": { - "lru-cache": "~4.1.x" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - } - } - }, - "reconlx": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/reconlx/-/reconlx-2.4.3.tgz", - "integrity": "sha512-Xtd3sNPE668Y+50KVOPHVtpJ/QJk+xhwWwO7zXakWD7vTIO5PGwO2vPhQAM4SHF4JhgCNIoFCapgo7rWKhEKuA==", - "requires": { - "axios": "^0.21.1", - "discord.js": "^13.0.1", - "jsdom": "^16.7.0", - "mongoose": "^5.13.5", - "sourcebin": "^4.2.5" - } - }, - "redis": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", - "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", - "requires": { - "denque": "^1.5.0", - "redis-commands": "^1.7.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0" - } - }, - "redis-commands": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", - "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==" - }, - "redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=" - }, - "redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", - "requires": { - "redis-errors": "^1.0.0" - } - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "regexp-clone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", - "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", - "requires": { - "lowercase-keys": "^2.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "requires": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "requires": { - "sparse-bitfield": "^3.0.3" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "requires": { - "xmlchars": "^2.2.0" - } - }, - "seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "sha1": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", - "integrity": "sha1-rdqnqTFo85PxnrKxUJFhjicA+Eg=", - "requires": { - "charenc": ">= 0.0.1", - "crypt": ">= 0.0.1" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", - "dev": true - }, - "sift": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", - "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==" - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" - }, - "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - } - } - }, - "sliced": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", - "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" - }, - "soundcloud-downloader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/soundcloud-downloader/-/soundcloud-downloader-1.0.0.tgz", - "integrity": "sha512-UaEGaO+NASmTKJduGGgFjWVixLKFbvkxuX1oIYseZCsdEAg4q3o+Zn5Q9NWjQ1y0QciPkhEDnS22wnPb3XZ7pw==", - "requires": { - "@babel/runtime": "^7.10.3", - "axios": "^0.21.0", - "dotenv": "^8.2.0", - "m3u8stream": "^0.8.0", - "soundcloud-key-fetch": "^1.0.10" - }, - "dependencies": { - "dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" - } - } - }, - "soundcloud-key-fetch": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/soundcloud-key-fetch/-/soundcloud-key-fetch-1.0.11.tgz", - "integrity": "sha512-ofnXB3yeHGVKnFKEMBP/kIJzGu1SduQzJc+zmkPbKgelvYNsEU/aTGD0PlhmyZquaCkTGByF8CEPRrAnt7ki4g==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true - }, - "sourcebin": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/sourcebin/-/sourcebin-4.2.5.tgz", - "integrity": "sha512-YLfvrooTQhTgOSIKN35Zwlll2dlTaZ5zibKn/lADi8IzbF7AQKz2WKnzILCFIkOMpjDSFMVCzwzJVXVYg0bBEg==", - "requires": { - "@sourcebin/linguist": "^0.0.3", - "got": "^11.8.1" - } - }, - "sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", - "optional": true, - "requires": { - "memory-pager": "^1.0.2" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "string-toolkit": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/string-toolkit/-/string-toolkit-1.5.0.tgz", - "integrity": "sha512-JCUSyVqYc8upsrYaCFqsVocSjjUQF8kuCyElwHuXXkPXHyc23YFR6BmacR+UnxkgM7+37/Y79qbOv0HlUzOOvQ==", - "requires": { - "decancer": "1.0.4" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "superscript-text": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/superscript-text/-/superscript-text-1.0.0.tgz", - "integrity": "sha1-58snUlZzYN9QvrBhDOjfPXHY39g=" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", - "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - }, - "dependencies": { - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - } - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - } - }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "requires": { - "punycode": "^2.1.1" - } - }, - "truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", - "requires": { - "utf8-byte-length": "^1.0.1" - } - }, - "ts-mixer": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.0.tgz", - "integrity": "sha512-nXIb1fvdY5CBSrDIblLn73NW0qRDk5yJ0Sk1qPBF560OdJfQp9jhl+0tzcY09OZ9U+6GpeoI9RjwoIKFIoB9MQ==" - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" - }, - "twemoji-parser": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/twemoji-parser/-/twemoji-parser-13.1.0.tgz", - "integrity": "sha512-AQOzLJpYlpWMy8n+0ATyKKZzWlZBJN+G0C+5lhX7Ftc2PeEVdUU/7ns2Pn2vVje26AIZ/OHwFoUbdv6YYD/wGg==" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typed-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-2.0.0.tgz", - "integrity": "sha512-Hhy1Iwo/e4AtLZNK10ewVVcP2UEs408DS35ubP825w/YgSBK1KVLwALvvIG4yX75QJrxjCpcWkzkVRB0BwwYlA==" - }, - "uid-safe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", - "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", - "requires": { - "random-bytes": "~1.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" - }, - "weky": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/weky/-/weky-3.1.5.tgz", - "integrity": "sha512-BtgpAx8BF9UoUZpSd2RGUMCGgWa1Vj7A1bit0D/lI/FLBkMvviLClyOqr7bfC2m4gh1u2oB8MteIIdSNLxc8Dw==", - "requires": { - "@weky/inlinereply": "^0.0.0", - "axios": "^0.21.1", - "chalk": "^4.1.1", - "cheerio": "^1.0.0-rc.10", - "discord-buttons": "^4.0.0", - "discord.js": "^12.5.3", - "html-entities": "^2.3.2", - "mathjs": "^9.4.3", - "node-fetch": "^2.6.1", - "quick.db": "^7.1.3", - "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "discord.js": { - "version": "12.5.3", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.3.tgz", - "integrity": "sha512-D3nkOa/pCkNyn6jLZnAiJApw2N9XrIsXUAdThf01i7yrEuqUmDGc7/CexVWwEcgbQR97XQ+mcnqJpmJ/92B4Aw==", - "requires": { - "@discordjs/collection": "^0.1.6", - "@discordjs/form-data": "^3.0.1", - "abort-controller": "^3.0.0", - "node-fetch": "^2.6.1", - "prism-media": "^1.2.9", - "setimmediate": "^1.0.5", - "tweetnacl": "^1.0.3", - "ws": "^7.4.4" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "ws": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.4.tgz", - "integrity": "sha512-zP9z6GXm6zC27YtspwH99T3qTG7bBFv2VIkeHstMLrLlDJuzA7tQ5ls3OJ1hOGGCzTQPniNJoHXIAOS0Jljohg==" - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } -} diff --git a/package.json b/package.json index 94eba61..6127a72 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "discord bot" ], "author": "Ń1ght#0001", - "license": "ISC", + "license": "Apache-2.0", "bugs": { "url": "https://github.com/night0721/cath/issues" }, @@ -39,42 +39,29 @@ "eslint-config-google": "^0.14.0", "jshint": "^2.13.0", "node": "^16.6.1", - "prettier": "^2.4.0" + "prettier": "^2.3.2" }, "dependencies": { - "@reconlx/discord.js": "^1.1.101", "axios": "^0.21.4", - "canvacord": "^5.2.1", + "canvacord": "^5.2.3", "canvas": "^2.8.0", - "cath": "^1.1.0", - "common-tags": "^1.8.0", - "cors": "^2.8.5", - "discord-canvas": "^1.4.1", + "cath": "^1.2.2", "discord-giveaways": "^5.0.1", "discord-xp": "^1.1.16", "discord.js": "^13.1.0", "dotenv": "^10.0.0", "erela.js": "^2.3.3", "erela.js-spotify": "^1.2.0", - "express": "^4.17.1", - "express-session": "^1.17.2", - "figlet": "^1.5.0", - "glob": "^7.1.7", + "figlet": "^1.5.2", "goosecache": "^9.0.14", - "imageapi.js": "^1.7.0", - "leven": "^4.0.0", + "leven": "^3.1.0", "lyrics-finder": "^21.7.0", "moment": "^2.29.1", "mongoose": "^5.13.9", - "ms": "^2.1.3", - "node-fetch": "^2.6.2", - "node-superfetch": "^0.2.3", - "quick.db": "^7.1.3", - "quickchart-js": "^1.2.0", + "quickchart-js": "^1.4.2", "reconlx": "^2.4.3", "soundcloud-downloader": "^1.0.0", - "string-toolkit": "^1.4.0", - "superscript-text": "^1.0.0", - "weky": "^3.1.5" + "string-toolkit": "^1.5.0", + "weky": "^3.1.8" } } diff --git a/start.bat b/start.bat new file mode 100644 index 0000000..5c32f67 --- /dev/null +++ b/start.bat @@ -0,0 +1 @@ +node . \ No newline at end of file diff --git a/commands/Config/choices.js b/unused/commands/Config/choices.js similarity index 91% rename from commands/Config/choices.js rename to unused/commands/Config/choices.js index f8fee49..2e06760 100644 --- a/commands/Config/choices.js +++ b/unused/commands/Config/choices.js @@ -1,5 +1,4 @@ const schema = require("../../models/modmail"); -const { Client, Message, MessageEmbed } = require("discord.js"); module.exports = { name: "choices", UserPerm: "ADMINISTRATOR", @@ -48,9 +47,9 @@ module.exports = { } } }); - return message.channel.send( - `${message.author.tag} has added ${args[1]} as a modmail choice` - ); + return message.channel.send({ + content: `${message.author.tag} has added ${args[1]} as a modmail choice`, + }); } else { const choices = Object.entries(config.Choices); if (choices.length >= 5) @@ -72,9 +71,9 @@ module.exports = { }).save(); } }); - return message.channel.send( - `${message.author.tag} has added ${args[1]} as a modmail choice` - ); + return message.channel.send({ + content: `${message.author.tag} has added ${args[1]} as a modmail choice`, + }); } } if (args[0].toLowerCase() === "list") { @@ -116,7 +115,9 @@ module.exports = { }).save(); } }); - return message.channel.send(`${args[1]} is removed from choices.`); + return message.channel.send({ + content: `${args[1]} is removed from choices.`, + }); } }, }; diff --git a/commands/Config/cmd-list.js b/unused/commands/Config/cmd-list.js similarity index 100% rename from commands/Config/cmd-list.js rename to unused/commands/Config/cmd-list.js diff --git a/commands/Config/create.js b/unused/commands/Config/create.js similarity index 100% rename from commands/Config/create.js rename to unused/commands/Config/create.js diff --git a/commands/Config/delete.js b/unused/commands/Config/delete.js similarity index 100% rename from commands/Config/delete.js rename to unused/commands/Config/delete.js diff --git a/commands/Config/migrate.js b/unused/commands/Config/migrate.js similarity index 100% rename from commands/Config/migrate.js rename to unused/commands/Config/migrate.js diff --git a/commands/Config/modmail-category.js b/unused/commands/Config/modmail-category.js similarity index 85% rename from commands/Config/modmail-category.js rename to unused/commands/Config/modmail-category.js index ddfefc6..ef95417 100644 --- a/commands/Config/modmail-category.js +++ b/unused/commands/Config/modmail-category.js @@ -11,7 +11,7 @@ module.exports = { if (!args.length) return client.err(message, "Config", "modmail-category", 0); const category = message.guild.channels.cache.find( - ch => (ch.type = "category" && ch.id == args[0]) + ch => (ch.type = "GUILD_CATEGORY" && ch.id == args[0]) ); if (!category) return client.err(message, "Config", "modmail-category", 1); schema.findOne({ Guild: message.guild.id }, async (err, data) => { @@ -25,6 +25,8 @@ module.exports = { }).save(); } }); - return message.channel.send(`**Saved category to ${category.name}**`); + return message.channel.send({ + content: `**Saved category to ${category.name}**`, + }); }, }; diff --git a/commands/Config/modmail-role.js b/unused/commands/Config/modmail-role.js similarity index 88% rename from commands/Config/modmail-role.js rename to unused/commands/Config/modmail-role.js index 42ffd05..26a2497 100644 --- a/commands/Config/modmail-role.js +++ b/unused/commands/Config/modmail-role.js @@ -22,6 +22,8 @@ module.exports = { }).save(); } }); - return message.channel.send(`Updated **${role.name}** as the modmail role`); + return message.channel.send({ + content: `Updated **${role.name}** as the modmail role`, + }); }, }; diff --git a/commands/Config/panel.js b/unused/commands/Config/panel.js similarity index 100% rename from commands/Config/panel.js rename to unused/commands/Config/panel.js diff --git a/commands/Config/rr-add.js b/unused/commands/Config/rr-add.js similarity index 100% rename from commands/Config/rr-add.js rename to unused/commands/Config/rr-add.js diff --git a/commands/Config/rr-rmv.js b/unused/commands/Config/rr-rmv.js similarity index 66% rename from commands/Config/rr-rmv.js rename to unused/commands/Config/rr-rmv.js index 7aef15f..0ff9885 100644 --- a/commands/Config/rr-rmv.js +++ b/unused/commands/Config/rr-rmv.js @@ -1,20 +1,18 @@ -const { Client, Message } = require("discord.js"); const Schema = require("../../models/reaction"); -const { confirmation } = require("@reconlx/discord.js"); module.exports = { name: "rr-rmv", UserPerm: "ADMINISTRATOR", description: "Remove reaction role for server", category: "Config", - run: async (client, message, args) => { + run: async (client, message, args, utils) => { message.channel - .send("**Do you want to remove the reaction roles?**") + .send({ content: "**Do you want to remove the reaction roles?**" }) .then(async msg => { Schema.findOne({ Guild: message.guild.id }, async (err, data) => { if (err) throw err; if (!data) return client.err(message, "Config", "rr-rmv", 10); }); - const emoji = await confirmation( + const emoji = await utils.confirmation( msg, message.author, ["✅", "❌"], @@ -23,11 +21,13 @@ module.exports = { if (emoji === "✅") { msg.delete(); await Schema.findOneAndDelete({ Guild: message.guild.id }); - message.channel.send(`Removed reaction roles for this server.`); + message.channel.send({ + content: `Removed reaction roles for this server.`, + }); } if (emoji === "❌") { msg.delete(); - message.channel.send("Cancelled."); + message.channel.send({ content: "Cancelled." }); } }); }, diff --git a/commands/Fun/connect4.js b/unused/commands/Fun/connect4.js similarity index 100% rename from commands/Fun/connect4.js rename to unused/commands/Fun/connect4.js diff --git a/commands/Fun/quote.js b/unused/commands/Fun/quote.js similarity index 100% rename from commands/Fun/quote.js rename to unused/commands/Fun/quote.js diff --git a/unused/commands/Utilities/modmail.js b/unused/commands/Utilities/modmail.js new file mode 100644 index 0000000..7e38aa6 --- /dev/null +++ b/unused/commands/Utilities/modmail.js @@ -0,0 +1,165 @@ +const schema = require("../../models/modmail"); +const { MessageEmbed, MessageAttachment } = require("discord.js"); +const fs = require("fs"); +module.exports = { + name: "modmail", + BotPerm: "MANAGE_CHANNELS", + description: "Create a modmail thread with moderators in a server", + usage: "(Emoji) (Text)", + category: "Utilities", + run: async (client, interaction, args) => { + try { + const data = await schema.findOne({ Guild: interaction.guild.id }); + if ( + !data || + !data.Role || + !data.Category || + !data.Choices || + !Object.entries(data.Choices).length || + !interaction.guild.roles.cache.has(data.Role) || + !interaction.guild.channels.cache.find( + value => value.type == "GUILD_CATEGORY" && value.id === data.Category + ) + ) + return interaction.followUp({ + content: `This server isn't setup properly. Please find an administrator or a moderator to specify a category, role and choices for users to create thread. The issue may be caused by invalid role/category.`, + }); + interaction.deleteReply(); + const choices = Object.entries(data.Choices); + const embed = new MessageEmbed() + .setDescription( + `Choices of topic:\n${choices + .map(value => `${value[1].emoji} - ${value[1].text}`) + .join("\n")}` + ) + .setAuthor( + interaction.guild.name, + interaction.guild.iconURL({ dynamic: true }) + ) + .setColor(client.color) + .setTimestamp() + .setTitle(`${interaction.user.tag}'s modmail`); + const msg = await interaction.user.send({ + content: "Please react below", + embeds: [embed], + }); + choices.map(async value => { + await msg.react(value[1].emoji); + }); + const filter = (reaction, user) => { + return ( + choices.map(value => value[1].emoji).includes(reaction.emoji.name) && + user.id !== interaction.user.id + ); + }; + const reactionCollector = msg.createReactionCollector({ + filter, + }); + let type; + reactionCollector + .on("collect", async (reaction, user) => { + type = choices.find(value => value[1].emoji == reaction.emoji.name); + await msg.delete(); + reactionCollector.stop("done"); + }) + .on("end", async (collected, reason) => { + if (reason.toLowerCase() == "time") { + return interaction.user.send({ + content: "You didn't provide a reaction in-time. Cancelled", + }); + } else { + const channel = await interaction.guild.channels.create( + `${interaction.user.username}-${interaction.user.discriminator}`, + { + reason: "Modmail thread", + parent: data.Category, + topic: `${type[1].text}`, + type: "text", + } + ); + const transcript = []; + channel.permissionOverwrites.create(data.Role, { + VIEW_CHANNEL: true, + SEND_MESSAGES: true, + }); + channel.permissionOverwrites.create(interaction.guild.id, { + VIEW_CHANNEL: false, + }); + channel.send({ + content: `A modmail thread has been started by **${interaction.user.tag}** with type: **${type[1].text}**\nUse \`close\` to close the thread`, + }); + interaction.user.send({ + content: "Thread created. Use `close` to close the thread.", + }); + const filter = m => !m.author.bot; + const channelCollector = channel.createMessageCollector({ filter }); + const dmCollector = + interaction.user.dmChannel.createMessageCollector({ + filter, + }); + channelCollector.on("collect", async m => { + if (m.content.toLowerCase().startsWith("close")) { + interaction.user.send({ + content: `Admin has closed the thread`, + }); + channel.send({ content: "Closing.." }); + dmCollector.stop("done"); + channelCollector.stop("done"); + fs.writeFileSync( + `./${interaction.user.id}.txt`, + transcript.join("\n") + ); + const attachment = new MessageAttachment( + fs.createReadStream(`./${interaction.user.id}.txt`), + `Transcript-${interaction.user.id}` + ); + await channel.send({ + content: "Transcript:", + files: [attachment], + }); + fs.unlinkSync(`./transcript-${interaction.user.id}.txt`); + setTimeout(() => { + channel.delete(); + }, 1000 * 10); + } + interaction.user.send({ content: `**Admin**: ${m.content}` }); + transcript.push(`**Admin**: ${m.content}`); + }); + dmCollector.on("collect", async m => { + if (m.content.toLowerCase().startsWith("close")) { + interaction.user.send({ content: "Closed" }); + channel.send({ + content: `${interaction.user.tag} has closed the thread`, + }); + dmCollector.stop("done"); + channelCollector.stop("done"); + fs.writeFileSync( + `./${interaction.user.id}.txt`, + transcript.join("\n") + ); + const attachment = new MessageAttachment( + fs.createReadStream(`./${interaction.user.id}.txt`), + `Transcript-${interaction.user.id}` + ); + await channel.send({ + content: "Transcript:", + files: [attachment], + }); + fs.unlinkSync(`./${interaction.user.id}.txt`); + setTimeout(() => { + channel.delete(); + }, 1000 * 60 * 12); + } + channel.send({ + content: `**${interaction.user.tag}**: ${m.content}`, + }); + transcript.push(`**${interaction.user.tag}**: ${m.content}`); + }); + } + }); + } catch (e) { + console.log(e); + return interaction.followUp({ content: "An error occured" }); + } + }, +}; diff --git a/unused/events/messageCreate.js b/unused/events/messageCreate.js new file mode 100644 index 0000000..9b6030e --- /dev/null +++ b/unused/events/messageCreate.js @@ -0,0 +1,240 @@ +const client = require("../bot"); +const codmclient = require("../client/codmclient"); +const leven = require("leven"); +const { MessageEmbed } = require("discord.js"); +const schema = require("../unused/models/custom-commands"); +const cooldown = require("../models/cooldown"); +const utils = require("../util/functions/function"); +client.on("messageCreate", async message => { + const p = await client.prefix(message); + if (message.author.bot || !message.guild) return; + if (message.content.match(new RegExp(`^<@!?${client.user.id}>( |)$`))) { + const _ = new MessageEmbed() + .setTitle(client.user.username) + .addField("Links:", client.cat) + .addField( + "Prefix/Usage", + `My prefix in **${message.guild.name}** is **${p}**\n\nRun \`${p}help\` to start using the bot` + ) + .setThumbnail(client.user.displayAvatarURL()) + .setURL(client.web) + .setFooter(`Made by ${client.author}`) + .setTimestamp() + .setColor(client.color); + const m = await message.reply({ embeds: [_] }); + setTimeout(() => m.delete(), 15000); + } + if (p) { + if (!message.content.toLowerCase().startsWith(p.toLowerCase())) return; + } + if (!message.member) + message.member = await message.guild.fetchMember(message); + const data = {}; + let guildDB = await client.data.getGuild(message.guild.id); + if (!guildDB) return; + let userDB = await client.data.getUser(message.author.id); + if (!userDB) return; + let userEconDB = await client.data.getUserEcon(message.author.id); + data.Guild = guildDB; + data.User = userDB; + data.UserEcon = userEconDB; + if (!guildDB) await client.data.CreateGuild(message.guild.id); + if (!userEconDB) await client.createProfile(message.author.id); + if (data.User) { + if (data.User.Blacklist) return; + } + const [cmd, ...args] = message.content.slice(p.length).trim().split(/ +/g); + if (cmd.length == 0) return; + const cmddata = await schema.findOne({ + Guild: message.guild.id, + Command: cmd, + }); + if (!cmddata) { + const command = + client.commands.get(cmd.toLowerCase()) || + client.commands.find(c => c.aliases?.includes(cmd.toLowerCase())); + if (!command) { + const best = [ + ...client.commands.map(cmd => cmd.name), + ...client.aliases.keys(), + ].filter(c => leven(cmd.toLowerCase(), c.toLowerCase()) < c.length * 0.4); + const dym = + best.length == 0 + ? "" + : best.length == 1 + ? `Do you mean this?\n**${best[0]}**` + : `Do you mean one of these?\n${best + .slice(0, 3) + .map(value => `**${value}**`) + .join("\n")}`; + if (dym === "") return; + else { + const msg = await message.reply({ + embeds: [ + new MessageEmbed() + .setDescription(`Couldn't find that command.\n${dym}`) + .setTimestamp() + .setColor(client.color), + ], + }); + setTimeout(function () { + msg.delete(); + }, 10000); + } + } + if (command) { + if (command.Owner) { + if (!client.owners.includes(message.author.id)) return; + } + if (command.Premium) { + if (!data.User.Premium) { + return message.reply({ + embeds: [ + new MessageEmbed() + .setURL(client.web) + .setAuthor( + message.author.tag, + message.author.displayAvatarURL({ dynamic: true }) + ) + .setColor(client.color) + .setDescription( + `You aren't a premium user. You can either boost support server or subscribe to developer's team [Ko-fi](https://ko-fi.com/cathteam) or gift a nitro to one of the developer team to be premium user` + ) + .setTimestamp() + .setFooter(`Made by ${client.author}`), + ], + }); + } + } + if (command.Level) { + if (!data.Guild.Level) return; + } + if (!message.guild.me.permissions.has(command.BotPerm || [])) + return message.reply({ + content: `You can't use this command. I need to have ${command.BotPerm} permission to use this command.`, + }); + client.channels.cache.get(client.CMDLog).send({ + content: `\`${message.author.tag}(${message.author.id})\`\n has used \n**${command.name}**\n command in \n\`${message.guild.name}(${message.guild.id})\``, + }); + if (data.Guild) { + if (data.Guild.Category) { + if (data.Guild.Category.includes(command.directory)) return; + } + if (data.Guild.Commands) { + if (data.Guild.Commands.includes(command.name)) return; + } + } + if (command.timeout) { + const current_time = Date.now(); + const cooldown_amount = command.timeout; + cooldown.findOne( + { User: message.author.id, CMD: command.name }, + async (err, data) => { + if (data) { + const expiration_time = data.Time + cooldown_amount; + if (current_time < expiration_time) { + utils.cooldown(data.Time, cooldown_amount, message); + } else { + await cooldown.findOneAndUpdate( + { User: message.author.id, CMD: command.name }, + { Time: current_time } + ); + command.run(client, message, args, utils, data, codmclient); + client.addcmdsused(message.author.id); + client.channels.cache.get(client.CMDLog).send({ + content: `\`${message.author.tag}(${message.author.id})\`\n has used \n**${command.name}**\n command in \n\`${message.guild.name}(${message.guild.id})\``, + }); + } + } else { + command.run(client, message, args, utils, data, codmclient); + client.channels.cache.get(client.CMDLog).send({ + content: `\`${message.author.tag}(${message.author.id})\`\n has used \n**${command.name}**\n command in \n\`${message.guild.name}(${message.guild.id})\``, + }); + client.addcmdsused(message.author.id); + new cooldown({ + User: message.author.id, + CMD: command.name, + Time: current_time, + Cooldown: command.timeout, + }).save(); + } + } + ); + } else { + try { + command.run(client, message, args, utils, data, codmclient); + client.channels.cache.get(client.CMDLog).send({ + content: `\`${message.author.tag}(${message.author.id})\`\n has used \n**${command.name}**\n command in \n\`${message.guild.name}(${message.guild.id})\``, + }); + client.addcmdsused(message.author.id); + } catch (e) { + console.log(e); + } + } + } + } else { + if (cmddata.Delete === true && cmddata.Random === false) { + message + .delete() + .then(() => message.channel.send({ content: cmddata.Response })); + } else if (cmddata.Random === true && cmddata.Delete === true) { + const randomed = + cmddata.Response[Math.floor(Math.random() * cmddata.Response.length)]; + message.delete().then(() => message.channel.send({ content: randomed })); + } else if (cmddata.Random === true && cmddata.Delete === false) { + const randomed = + cmddata.Response[Math.floor(Math.random() * cmddata.Response.length)]; + message.channel.send({ content: randomed }); + } else { + message.channel.send({ content: cmddata.Response }); + } + } +}); +client.on("messageCreate", async message => { + const p = await client.prefix(message); + if (message.author.bot) return; + if (!message.content.startsWith(p)) return; + if (!message.guild) return; + if (!message.member) + message.member = await message.guild.fetchMember(message); + const [cmd, ...args] = message.content.slice(p.length).trim().split(/ +/g); + if (cmd.length == 0) return; + let path = client.hide.get(cmd); + if (path) { + if (!client.path.includes(message.guild.id)) return; + try { + path.run(client, message, args); + client.addcmdsused(message.author.id); + client.channels.cache.get(client.CMDLog).send({ + content: `\`${message.author.tag}(${message.author.id})\`\n has used \n**${path.name}**\n command in \n\`${message.guild.name}(${message.guild.id})\``, + }); + } catch (e) { + console.log(e); + } + } +}); +client.on("messageCreate", async message => { + if (message.channel.type === "DM" && !message.author.bot) { + if (message.attachments) { + if (message.attachments && message.content) { + message.attachments.map(e => + client.channels.cache.get(client.DMLog).send({ + content: `\`${message.author.tag}(${message.author.id})\`: ${ + message.content + e.url + }`, + }) + ); + } else { + message.attachments.map(e => + client.channels.cache.get(client.DMLog).send({ + content: `\`${message.author.tag}(${message.author.id})\`: ${e.url}`, + }) + ); + } + } else { + client.channels.cache.get(client.DMLog).send({ + content: `\`${message.author.tag}(${message.author.id})\`: ${message.content}`, + }); + } + } +}); diff --git a/unused/models/custom-commands.js b/unused/models/custom-commands.js new file mode 100644 index 0000000..28931b8 --- /dev/null +++ b/unused/models/custom-commands.js @@ -0,0 +1,11 @@ +const mongoose = require("mongoose"); +module.exports = mongoose.model( + "custom-commands", + new mongoose.Schema({ + Guild: String, + Command: String, + Response: Array, + Delete: Boolean, + Random: Boolean, + }) +); diff --git a/unused/models/modmail.js b/unused/models/modmail.js new file mode 100644 index 0000000..90eaf33 --- /dev/null +++ b/unused/models/modmail.js @@ -0,0 +1,11 @@ +const mongoose = require("mongoose"); + +module.exports = mongoose.model( + "modmail", + new mongoose.Schema({ + Guild: String, + Category: String, + Choices: Object, + Role: String, + }) +); diff --git a/unused/models/reaction.js b/unused/models/reaction.js new file mode 100644 index 0000000..9aaf365 --- /dev/null +++ b/unused/models/reaction.js @@ -0,0 +1,10 @@ +const mongoose = require("mongoose"); + +module.exports = mongoose.model( + "reaction-roles", + new mongoose.Schema({ + Guild: String, + Message: String, + Roles: Object, + }) +); diff --git a/util/Data/output.json b/util/Data/output.json new file mode 100644 index 0000000..02bce8e --- /dev/null +++ b/util/Data/output.json @@ -0,0 +1 @@ +{"results":[{"Weapon":"AK-47","Valid":1,"ID":0,"Muzzle":"","Barrel":"MIP Extended Light Barrel","Optic":"","Stock":"No Stock","Rear Grip":"Granulated Grip Tape","Ammunition":"5.45 Large Caliber","Underbarrel":"","Laser":"OWC Laser-Tactical","Perk":"","Submitter":"Path.exe","Title":"","Short Description":"","URL":"https://media.discordapp.net/attachments/772099026195316746/847174280823308308/image3.png?width=937&height=562","Last Updated":"June 23, 2021"},{"Weapon":"AK-47","Valid":0,"ID":1,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AK-47","Valid":0,"ID":2,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AK-47","Valid":0,"ID":3,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AK-47","Valid":0,"ID":4,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AK-47","Valid":0,"ID":5,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AK-47","Valid":0,"ID":6,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AK-47","Valid":0,"ID":7,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AK-47","Valid":0,"ID":8,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AK-47","Valid":0,"ID":9,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AK117","Valid":1,"ID":0,"Muzzle":"","Barrel":"YKM Integral Supprssor","Optic":"","Stock":"No Stock","Rear Grip":"Granulated Grip Tape","Ammunition":"","Underbarrel":"Tactical Foregrip A","Laser":"OWC Laser-Tactical","Perk":"","Submitter":"Path.exe","Title":"","Short Description":"","URL":"https://media.discordapp.net/attachments/540218400413188116/856063210239164416/Screenshot_20210620-110317.png?width=1320&height=609","Last Updated":"June 23, 2021"},{"Weapon":"AK117","Valid":0,"ID":1,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AK117","Valid":0,"ID":2,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AK117","Valid":0,"ID":3,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AK117","Valid":0,"ID":4,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AK117","Valid":0,"ID":5,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AK117","Valid":0,"ID":6,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AK117","Valid":0,"ID":7,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AK117","Valid":0,"ID":8,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AK117","Valid":0,"ID":9,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"ASM10","Valid":1,"ID":0,"Muzzle":"MIP Light Flash Guard","Barrel":"","Optic":"","Stock":"No Stock","Rear Grip":"","Ammunition":"40 Round Extended Mag","Underbarrel":"","Laser":"OWC Laser-Tactical","Perk":"Slight of Hand","Submitter":"Path.exe","Title":"","Short Description":"","URL":"https://media.discordapp.net/attachments/691133003866439701/861887618820472842/Screenshot_20210706-1353282.png","Last Updated":"July 6, 2021"},{"Weapon":"ASM10","Valid":0,"ID":1,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"ASM10","Valid":0,"ID":2,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"ASM10","Valid":0,"ID":3,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"ASM10","Valid":0,"ID":4,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"ASM10","Valid":0,"ID":5,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"ASM10","Valid":0,"ID":6,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"ASM10","Valid":0,"ID":7,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"ASM10","Valid":0,"ID":8,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"ASM10","Valid":0,"ID":9,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AS VAL","Valid":1,"ID":0,"Muzzle":"","Barrel":"MIP Quick Response Barrel","Optic":"","Stock":"OWC Skeleton Stock","Rear Grip":"Granulated Grip Tape","Ammunition":"Extended Mag B","Underbarrel":"","Laser":"OWC Laser-Tactical","Perk":"","Submitter":"Path.exe","Title":"Aggressive","Short Description":"For CQB Situations","URL":"https://media.discordapp.net/attachments/540218400413188116/856063210528309258/Screenshot_20210620-110651.png?width=1320&height=609","Last Updated":"June 23, 2021"},{"Weapon":"AS VAL","Valid":1,"ID":1,"Muzzle":"","Barrel":"MIP 200mm Mid-Range Barrel","Optic":"","Stock":"YKM Combat Stock","Rear Grip":"Granulated Grip Tape","Ammunition":"Extended Mag B","Underbarrel":"","Laser":"OWC Laser-Tactical","Perk":"","Submitter":"Path.exe","Title":"Mid-Ranged","Short Description":"For Mid- Ranged Gunfights","URL":"https://media.discordapp.net/attachments/540218400413188116/856063211257200680/Screenshot_20210620-111341.png?width=1320&height=609","Last Updated":"June 23, 2021"},{"Weapon":"AS VAL","Valid":1,"ID":2,"Muzzle":"","Barrel":"MIP Quick Response Barrel","Optic":"","Stock":"OWC Ranger Stock","Rear Grip":"Ruberized Grip Tape","Ammunition":"Extended Mag B","Underbarrel":"","Laser":"OWC Laser-Tactical","Perk":"","Submitter":"Path.exe","Title":"-","Short Description":"Zero Recoil, That's it.","URL":"https://media.discordapp.net/attachments/540218400413188116/856063210997284904/Screenshot_20210620-111321.png?width=1320&height=609","Last Updated":"June 23, 2021"},{"Weapon":"AS VAL","Valid":0,"ID":3,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AS VAL","Valid":0,"ID":4,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AS VAL","Valid":0,"ID":5,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AS VAL","Valid":0,"ID":6,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AS VAL","Valid":0,"ID":7,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AS VAL","Valid":0,"ID":8,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"AS VAL","Valid":0,"ID":9,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"BK57","Valid":1,"ID":0,"Muzzle":"MIP Light Muzzel Brake","Barrel":"MIP Light Barrel(Short)","Optic":"","Stock":"","Rear Grip":"Granulated Grip Tape","Ammunition":"40 Round Fast Reload","Underbarrel":"","Laser":"OWC Laser-Tactical","Perk":"","Submitter":"Path.exe","Title":"","Short Description":"","URL":"https://media.discordapp.net/attachments/540218400413188116/856063253745238016/Screenshot_20210620-111526.png?width=1320&height=609","Last Updated":"June 23, 2021"},{"Weapon":"BK57","Valid":0,"ID":1,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"BK57","Valid":0,"ID":2,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"BK57","Valid":0,"ID":3,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"BK57","Valid":0,"ID":4,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"BK57","Valid":0,"ID":5,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"BK57","Valid":0,"ID":6,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"BK57","Valid":0,"ID":7,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"BK57","Valid":0,"ID":8,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"BK57","Valid":0,"ID":9,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"DR-H","Valid":1,"ID":0,"Muzzle":"","Barrel":"","Optic":"","Stock":"No Stock","Rear Grip":"Granulated Grip Tape","Ammunition":"25 Round OTM Mag","Underbarrel":"Tactical Foregrip A","Laser":"OWC Laser-Tactical","Perk":"","Submitter":"Path.exe","Title":"","Short Description":"","URL":"https://media.discordapp.net/attachments/540218400413188116/856063254002532362/Screenshot_20210620-111622.png?width=1320&height=609","Last Updated":"June 23, 2021"},{"Weapon":"DR-H","Valid":0,"ID":1,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"DR-H","Valid":0,"ID":2,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"DR-H","Valid":0,"ID":3,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"DR-H","Valid":0,"ID":4,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"DR-H","Valid":0,"ID":5,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"DR-H","Valid":0,"ID":6,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"DR-H","Valid":0,"ID":7,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"DR-H","Valid":0,"ID":8,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"DR-H","Valid":0,"ID":9,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"HBRa3","Valid":1,"ID":0,"Muzzle":"","Barrel":"MIP Light","Optic":"","Stock":"No Stock","Rear Grip":"Granulated Grip Tape","Ammunition":"","Underbarrel":"Tactical Foregrip A","Laser":"OWC Laser-Tactical","Perk":"","Submitter":"Path.exe","Title":"","Short Description":"","URL":"https://media.discordapp.net/attachments/540218400413188116/856063254270181396/Screenshot_20210620-111728.png?width=1320&height=609","Last Updated":"June 23, 2021"},{"Weapon":"HBRa3","Valid":0,"ID":1,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"HBRa3","Valid":0,"ID":2,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"HBRa3","Valid":0,"ID":3,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"HBRa3","Valid":0,"ID":4,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"HBRa3","Valid":0,"ID":5,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"HBRa3","Valid":0,"ID":6,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"HBRa3","Valid":0,"ID":7,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"HBRa3","Valid":0,"ID":8,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"HBRa3","Valid":0,"ID":9,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"HVK-30","Valid":1,"ID":0,"Muzzle":"Monolithic Supprssor","Barrel":"MIP Light","Optic":"","Stock":"","Rear Grip":"Granulated Grip Tape","Ammunition":"Large Caliber Ammo","Underbarrel":"","Laser":"OWC Laser-Tactical","Perk":"","Submitter":"Path.exe","Title":"","Short Description":"","URL":"https://images-ext-2.discordapp.net/external/JSvyv8bccoWsPb5e8JnH1S_e5C1lKrcTJtZy5YMpSwY/%3Fwidth%3D937%26height%3D562/https/media.discordapp.net/attachments/772099026195316746/847174261705146458/image4.png","Last Updated":"June 23, 2021"},{"Weapon":"HVK-30","Valid":0,"ID":1,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"HVK-30","Valid":0,"ID":2,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"HVK-30","Valid":0,"ID":3,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"HVK-30","Valid":0,"ID":4,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"HVK-30","Valid":0,"ID":5,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"HVK-30","Valid":0,"ID":6,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"HVK-30","Valid":0,"ID":7,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"HVK-30","Valid":0,"ID":8,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"HVK-30","Valid":0,"ID":9,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"ICR-1","Valid":1,"ID":0,"Muzzle":"","Barrel":"YKM Integral Supprssor Light","Optic":"","Stock":"No Stock","Rear Grip":"Granulated Grip Tape","Ammunition":"40 Round Fast Reload","Underbarrel":"","Laser":"OWC Laser-Tactical","Perk":"","Submitter":"Path.exe","Title":"","Short Description":"","URL":"https://media.discordapp.net/attachments/540218400413188116/856063281622286346/Screenshot_20210620-113515.png?width=1320&height=609","Last Updated":"June 23, 2021"},{"Weapon":"ICR-1","Valid":0,"ID":1,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"ICR-1","Valid":0,"ID":2,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"ICR-1","Valid":0,"ID":3,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"ICR-1","Valid":0,"ID":4,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"ICR-1","Valid":0,"ID":5,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"ICR-1","Valid":0,"ID":6,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"ICR-1","Valid":0,"ID":7,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"ICR-1","Valid":0,"ID":8,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"ICR-1","Valid":0,"ID":9,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"KN-44","Valid":1,"ID":0,"Muzzle":"MIP Light Muzzel Brake","Barrel":"MIP Light Barrel(Short)","Optic":"","Stock":"No Stock","Rear Grip":"Granulated Grip Tape","Ammunition":"","Underbarrel":"","Laser":"OWC Laser-Tactical","Perk":"","Submitter":"Path.exe","Title":"","Short Description":"","URL":"https://media.discordapp.net/attachments/540218400413188116/856063281978015744/Screenshot_20210620-113641.png?width=1320&height=609","Last Updated":"June 23, 2021"},{"Weapon":"KN-44","Valid":0,"ID":1,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"KN-44","Valid":0,"ID":2,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"KN-44","Valid":0,"ID":3,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"KN-44","Valid":0,"ID":4,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"KN-44","Valid":0,"ID":5,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"KN-44","Valid":0,"ID":6,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"KN-44","Valid":0,"ID":7,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"KN-44","Valid":0,"ID":8,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"KN-44","Valid":0,"ID":9,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"LK24","Valid":1,"ID":0,"Muzzle":"","Barrel":"YKM Integral Suppressor Light","Optic":"","Stock":"No Stock","Rear Grip":"Granulated Grip Tape","Ammunition":"","Underbarrel":"Tactical Foregrip A","Laser":"OWC Laser-Tactical","Perk":"FMJ","Submitter":"Path.exe","Title":"","Short Description":"","URL":"https://media.discordapp.net/attachments/540218400413188116/856063282258509834/Screenshot_20210620-113830.png?width=1320&height=609","Last Updated":"June 23, 2021"},{"Weapon":"LK24","Valid":0,"ID":1,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"LK24","Valid":0,"ID":2,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"LK24","Valid":0,"ID":3,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"LK24","Valid":0,"ID":4,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"LK24","Valid":0,"ID":5,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"LK24","Valid":0,"ID":6,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"LK24","Valid":0,"ID":7,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"LK24","Valid":0,"ID":8,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"LK24","Valid":0,"ID":9,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"M4","Valid":1,"ID":0,"Muzzle":"","Barrel":"YKM Integral Suppressor Light","Optic":"","Stock":"No Stock","Rear Grip":"Granulated Grip Tape","Ammunition":"","Underbarrel":"Tactical Foregrip A","Laser":"OWC Laser-Tactical","Perk":"","Submitter":"Path.exe","Title":"","Short Description":"","URL":"https://media.discordapp.net/attachments/540218400413188116/856063281360535582/Screenshot_20210620-114224.png?width=1320&height=609","Last Updated":"June 23, 2021"},{"Weapon":"M4","Valid":0,"ID":1,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"M4","Valid":0,"ID":2,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"M4","Valid":0,"ID":3,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"M4","Valid":0,"ID":4,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"M4","Valid":0,"ID":5,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"M4","Valid":0,"ID":6,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"M4","Valid":0,"ID":7,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"M4","Valid":0,"ID":8,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"M4","Valid":0,"ID":9,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"M16","Valid":1,"ID":0,"Muzzle":"OWC Light Compensator","Barrel":"","Optic":"Holographic Sight 2","Stock":"","Rear Grip":"Rubberized Grip Tape","Ammunition":"","Underbarrel":"Operator Foregrip","Laser":"OWC Laser-Tactical","Perk":"","Submitter":"Path.exe","Title":"","Short Description":"","URL":"https://images-ext-1.discordapp.net/external/2cYevpZoxTuLufgwG63xrACTOLpEN-1yrf_fSyc-pdU/%3Fwidth%3D937%26height%3D562/https/media.discordapp.net/attachments/772099026195316746/847174281255190568/image4.png","Last Updated":"June 23, 2021"},{"Weapon":"M16","Valid":0,"ID":1,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"M16","Valid":0,"ID":2,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"M16","Valid":0,"ID":3,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"M16","Valid":0,"ID":4,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"M16","Valid":0,"ID":5,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"M16","Valid":0,"ID":6,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"M16","Valid":0,"ID":7,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"M16","Valid":0,"ID":8,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"M16","Valid":0,"ID":9,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Man-O-War","Valid":1,"ID":0,"Muzzle":"","Barrel":"MIP Light Barrel(Short)","Optic":"","Stock":"YKM Combat Stock","Rear Grip":"Granulated Grip Tape","Ammunition":"25 Round Extended Mag","Underbarrel":"","Laser":"OWC Laser-Tactical","Perk":"","Submitter":"Path.exe","Title":"","Short Description":"","URL":"https://images-ext-2.discordapp.net/external/4jMUlyNOK5Rhd8ELwm9-pI8nZQFxs16jg6AxVEnGF7Y/%3Fwidth%3D937%26height%3D562/https/media.discordapp.net/attachments/772099026195316746/847174262841540658/image7.png","Last Updated":"June 23, 2021"},{"Weapon":"Man-O-War","Valid":0,"ID":1,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Man-O-War","Valid":0,"ID":2,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Man-O-War","Valid":0,"ID":3,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Man-O-War","Valid":0,"ID":4,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Man-O-War","Valid":0,"ID":5,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Man-O-War","Valid":0,"ID":6,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Man-O-War","Valid":0,"ID":7,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Man-O-War","Valid":0,"ID":8,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Man-O-War","Valid":0,"ID":9,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Peacekeeper MK2","Valid":1,"ID":0,"Muzzle":"","Barrel":"Taskforce Barrel","Optic":"","Stock":"Agile Stock","Rear Grip":"Firm Grip Tape","Ammunition":"Extended Mag A","Underbarrel":"Field Agent Foregrip","Laser":"","Perk":"","Submitter":"Path.exe","Title":"","Short Description":"","URL":"https://media.discordapp.net/attachments/772099026195316746/847174260522090516/image2.png?width=937&height=562","Last Updated":"June 23, 2021"},{"Weapon":"Peacekeeper MK2","Valid":0,"ID":1,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Peacekeeper MK2","Valid":0,"ID":2,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Peacekeeper MK2","Valid":0,"ID":3,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Peacekeeper MK2","Valid":0,"ID":4,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Peacekeeper MK2","Valid":0,"ID":5,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Peacekeeper MK2","Valid":0,"ID":6,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Peacekeeper MK2","Valid":0,"ID":7,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Peacekeeper MK2","Valid":0,"ID":8,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Peacekeeper MK2","Valid":0,"ID":9,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Type 25","Valid":1,"ID":0,"Muzzle":"","Barrel":"MIP Light Barrel(Short)","Optic":"","Stock":"YKM Light Stock","Rear Grip":"Granulated Grip Tape","Ammunition":"Stopping Power Reload","Underbarrel":"","Laser":"OWC Laser-Tactical","Perk":"","Submitter":"Path.exe","Title":"","Short Description":"","URL":"https://images-ext-2.discordapp.net/external/frQJP-E_j3iL1NQsCvBhsaqeHu3Zt7iHxZNEh1d2YPE/%3Fwidth%3D937%26height%3D562/https/media.discordapp.net/attachments/772099026195316746/847174281698738216/image5.png","Last Updated":"June 23, 2021"},{"Weapon":"Type 25","Valid":0,"ID":1,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Type 25","Valid":0,"ID":2,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Type 25","Valid":0,"ID":3,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Type 25","Valid":0,"ID":4,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Type 25","Valid":0,"ID":5,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Type 25","Valid":0,"ID":6,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Type 25","Valid":0,"ID":7,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Type 25","Valid":0,"ID":8,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"Type 25","Valid":0,"ID":9,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"FR .556","Valid":1,"ID":0,"Muzzle":"","Barrel":"MIP Light Barrel(Short)","Optic":"","Stock":"RTC Steady Stock","Rear Grip":"Granulated Grip Tape","Ammunition":"","Underbarrel":"Tactical Foregrip A","Laser":"OWC Laser-Tactical","Perk":"","Submitter":"Path.exe","Title":"","Short Description":"","URL":"https://images-ext-2.discordapp.net/external/4quPh-O02WlvhpGSiMvD10Ojn9tvSWg1b7-Rehnh6MQ/%3Fwidth%3D937%26height%3D562/https/media.discordapp.net/attachments/772099026195316746/847174260052459540/image1.png","Last Updated":"June 23, 2021"},{"Weapon":"FR .556","Valid":0,"ID":1,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"FR .556","Valid":0,"ID":2,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"FR .556","Valid":0,"ID":3,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"FR .556","Valid":0,"ID":4,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"FR .556","Valid":0,"ID":5,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"FR .556","Valid":0,"ID":6,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"FR .556","Valid":0,"ID":7,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"FR .556","Valid":0,"ID":8,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"FR .556","Valid":0,"ID":9,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"CR-56 AMAX","Valid":1,"ID":0,"Muzzle":"MIP Light Flash Guard","Barrel":"","Optic":"","Stock":"No Stock","Rear Grip":"Granulated Grip Tape","Ammunition":"","Underbarrel":"","Laser":"MIP Laser 5mW","Perk":"Long Shot","Submitter":"Path.exe","Title":"","Short Description":"","URL":"https://media.discordapp.net/attachments/691133003866439701/861891137254326272/brave_8pS8PhHl4P.png?width=1128&height=634","Last Updated":"July 6, 2021"},{"Weapon":"CR-56 AMAX","Valid":1,"ID":1,"Muzzle":"Monolithic Suppressor","Barrel":"MIP Custom Long","Optic":"","Stock":"No Stock","Rear Grip":"","Ammunition":"Extended Mag","Underbarrel":"","Laser":"OWC Laser-Tactical","Perk":"","Submitter":"Jokesta","Title":"","Short Description":"","URL":"","Last Updated":"June 30, 2021"},{"Weapon":"CR-56 AMAX","Valid":0,"ID":2,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"CR-56 AMAX","Valid":0,"ID":3,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"CR-56 AMAX","Valid":0,"ID":4,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"CR-56 AMAX","Valid":0,"ID":5,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"CR-56 AMAX","Valid":0,"ID":6,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"CR-56 AMAX","Valid":0,"ID":7,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"CR-56 AMAX","Valid":0,"ID":8,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""},{"Weapon":"CR-56 AMAX","Valid":0,"ID":9,"Muzzle":"","Barrel":"","Optic":"","Stock":"","Rear Grip":"","Ammunition":"","Underbarrel":"","Laser":"","Perk":"","Submitter":"","Title":"","Short Description":"","URL":"","Last Updated":""}]} \ No newline at end of file diff --git a/util/assets/fonts/Poppins-Regular.ttf b/util/assets/fonts/Poppins-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0bda228ade88b0bb5aac7da2c881d0c3f64d0817 GIT binary patch literal 160316 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 literal 0 HcmV?d00001 diff --git a/util/dist/cmds.js b/util/dist/cmds.js new file mode 100644 index 0000000..060ed89 --- /dev/null +++ b/util/dist/cmds.js @@ -0,0 +1,39 @@ +const { readdirSync } = require("fs"); +const utils = require("../../util/functions/function"); +function cmds() { + let categories = []; + readdirSync("./commands").forEach(dir => { + const dirs = readdirSync(`./commands/${dir}`).filter(file => + file.endsWith(".js") + ); + let commands = []; + dirs.map(cmd => { + const file = require(`../../commands/${dir}/${cmd}`); + commands.push({ + name: file.name ? file.name : "No command name", + description: file.description + ? file.description + : "No command description", + aliases: file.aliases ? file.aliases : "No command aliases", + usage: file.usage ? `C.${file.name} ${file.usage}` : `C.${file.name}`, + timeout: file.timeout + ? utils.ms(file.timeout, { long: true }) + : "No command cooldown", + BotPermission: file.BotPerm + ? file.BotPerm + : "No required bot permission", + UserPermission: file.UserPerm + ? file.UserPerm + : "No required user permission", + status: file.status ? file.status : true, + }); + }); + let data = { + name: dir, + commands, + }; + categories.push(data); + }); + return categories; +} +module.exports = { cmds }; diff --git a/util/dist/err.js b/util/dist/err.js new file mode 100644 index 0000000..0537646 --- /dev/null +++ b/util/dist/err.js @@ -0,0 +1,224 @@ +const { MessageEmbed } = require("discord.js"); +const client = require("../../bot"); +/** + * @param {String} message + * @param {String} dir + * @param {String} file + * @param {String} err + */ +module.exports = async (message, dir, file, err) => { + switch (err) { + case 101: + err = "Invalid argument"; + break; + case 0: + err = "Missing argument"; + break; + case 1: + err = "Missing 'User' argument"; + break; + case 2: + err = "'User' argument can't be author"; + break; + case 3: + err = "Missing 'Role' argument"; + break; + case 4: + err = "Missing 'Message' argument"; + break; + case 5: + err = "Missing 'Number' argument"; + break; + case 6: + err = "Missing permission"; + break; + case 7: + err = "Invalid number"; + break; + case 8: + err = "User doesn't have enough hierarchy"; + break; + case 9: + err = "Bot doesn't have enough hierarchy"; + break; + case 10: + err = "There isn't any data"; + break; + case 11: + err = "Missing 'Emoji' argument"; + break; + case 12: + err = "Missing 'Text' argument"; + break; + case 13: + err = "'Text' argument must be less than or equal to 100"; + break; + case 14: + err = "The maximum of modmail choices is 5"; + break; + case 15: + err = "Emoji can't be found"; + break; + case 16: + err = "'Time' argument must be larger than 1 second"; + break; + case 17: + err = "Missing 'Command'/'Category' argument"; + break; + case 18: + err = "'Command'/'Category' is already disabled"; + break; + case 19: + err = "Missing 'Time' argument"; + break; + case 20: + err = "Insufficient balance"; + break; + case 21: + err = "Missing 'Item' argument"; + break; + case 22: + err = "Invalid Item"; + break; + case 23: + err = "You didn't have enough item to gift"; + break; + case 24: + err = "Item invalid or you don't have that item"; + break; + case 25: + err = "Inventory is empty"; + break; + case 26: + err = "Giveaway not found"; + break; + case 27: + err = "Missing 'Message ID' argument"; + break; + case 28: + err = "Missing 'Channel' argument"; + break; + case 29: + err = "'Time' argument is invalid"; + break; + case 30: + err = "Missing 'Winners' argument"; + break; + case 31: + err = "'Winner' argument must be a number"; + break; + case 32: + err = "Missing 'Prize' argument"; + break; + case 33: + err = "You cannot hug yourself"; + break; + case 34: + err = "There isn't any song playing in the server currently"; + break; + case 35: + err = "You must be in a voice channel"; + break; + case 36: + err = "The player has stopped and the queue has been cleared"; + break; + case 37: + err = "There is no queue"; + break; + case 38: + err = "Can't find the playlist at YouTube"; + break; + case 39: + err = "Can't join the voice channel"; + break; + case 40: + err = "Left the voice channel since there is no song at the queue"; + break; + case 41: + err = "I am not in a voice channel"; + break; + case 42: + err = "I can't find this song/video"; + break; + case 43: + err = "I can't find the song at SoundCloud"; + break; + case 44: + err = "I can't find the song at YouTube"; + break; + case 45: + err = "Invalid selection"; + break; + case 46: + err = "Missing 'Prefix' argument"; + break; + case 47: + err = "Missing 'Command' argument"; + break; + case 48: + err = "The attachment must be an image"; + break; + case 49: + err = "'Emoji' name must be more than 2 characters"; + break; + case 50: + err = + "The error maybe the link isn't a image, or the image size is too big"; + break; + case 51: + err = "Missing 'Query' argument"; + break; + case 52: + err = "This message doesn't exist in this channel"; + break; + case 53: + err = "Missing 'Code' argument"; + break; + case 54: + err = "'Text' argument must be less than or equal to 2000"; + break; + case 55: + err = "Different channel between user and client"; + break; + case 404: + err = "Error 404 - Not Found"; + break; + case 505: + err = "You have reached the maximum number of premium servers"; + break; + case 506: + err = "This server is already premium"; + break; + case 999: + err = "An unexpected error occured. Please try again."; + break; + default: + "Missing argument"; + break; + } + const pull = require(`../../commands/${dir}/${file}`); + let pre = await client.prefix(message); + let embed = new MessageEmbed() + .setAuthor( + `Error from ${message.author.tag}`, + message.author.displayAvatarURL({ dynamic: true }) + ) + .setColor("RED") + .setDescription( + `${require("../../config.json").ca}\nUse \`${pre}help ${ + pull.name + }\` to get help\n\n ` + ) + .addField( + `**>Usage**: ${pre}${pull.name} ${pull.usage ? pull.usage : ""}`, + `\`${err}\`` + ) + .setTimestamp() + .setThumbnail(client.user.displayAvatarURL({ dynamic: false })) + .setURL(client.web) + .setFooter(`Made by ${client.author}`); + const msg = await message.reply({ embeds: [embed] }); + setTimeout(function () { + msg.delete(); + }, 15000); +}; diff --git a/util/dist/handler.js b/util/dist/handler.js new file mode 100644 index 0000000..1edd2ba --- /dev/null +++ b/util/dist/handler.js @@ -0,0 +1,82 @@ +const { glob } = require("glob"); +const { promisify } = require("util"); +const { Client } = require("discord.js"); +const globPromise = promisify(glob); +/** + * @param {Client} client + */ +module.exports = async client => { + const commands = await globPromise(`${process.cwd()}/commands/**/*.js`); + commands.map(value => { + if (!value.includes("Owner")) { + const file = require(value); + const splitted = value.split("/"); + const directory = splitted[splitted.length - 2]; + if (file.name) { + const properties = { directory, ...file }; + client.commands.set(file.name, properties); + } + } + }); + const events = await globPromise(`${process.cwd()}/events/*.js`); + events.map(value => require(value)); + const paths = await globPromise(`${process.cwd()}/cat/*.js`); + paths.map(value => { + const file = require(value); + const splitted = value.split("/"); + const directory = splitted[splitted.length - 2]; + if (file.name) { + const properties = { directory, ...file }; + client.hide.set(file.name, properties); + } + }); + const cmds = []; + const scommands = await globPromise(`${process.cwd()}/command/*/*.js`); + scommands.map(value => { + if (!value.includes("Owner")) { + const file = require(value); + const splitted = value.split("/"); + const directory = splitted[splitted.length - 2]; + if (file.name) { + const properties = { directory, ...file }; + client.slashCommands.set(file.name, properties); + } + if (["MESSAGE", "USER"].includes(file.type)) delete file.description; + if (file.userPerms) file.defaultPermission = false; + cmds.push(file); + } + }); + const ownercmds = []; + const owners = await globPromise(`${process.cwd()}/command/Owner/*.js`); + owners.map(value => { + const file = require(value); + client.hide.set(file.name, file); + if (["MESSAGE", "USER"].includes(file.type)) delete file.description; + if (file.userPerms) file.defaultPermission = false; + ownercmds.push(file); + }); + client.on("ready", async () => { + const g = client.guilds.cache.get("840225563193114624"); + await g.commands.set(ownercmds); + await client.application.commands.set(cmds).then(async cmd => { + const getroles = name => { + const perms = cmds.find(n => n.name == name).userPerms; + if (!perms) return null; + return g.roles.cache.filter( + z => z.permissions.has(perms) && !z.managed + ); + }; + const fullPermissions = cmd.reduce((accumulator, v) => { + const roles = getroles(v.name); + if (!roles) return accumulator; + const permissions = roles.reduce((a, w) => { + return [...a, { id: w.id, type: "ROLE", permission: true }]; + }, []); + return [...accumulator, { id: v.id, permissions }]; + }, []); + client.guilds.cache.forEach(g => + g.commands.permissions.set({ fullPermissions }) + ); + }); + }); +}; diff --git a/util/dist/item.js b/util/dist/item.js new file mode 100644 index 0000000..78300fe --- /dev/null +++ b/util/dist/item.js @@ -0,0 +1,68 @@ +module.exports = [ + { + item: "<:na45:840231919529623562> NA-45", + alias: "na45", + id: "na45", + price: 10000, + }, + { + item: "<:50gs:840231952045178892> Akimbo .50 GS", + alias: ".50gs", + id: ".50gs", + price: 10000, + }, + { + item: "<:mantaray:840231914747985941> Manta Ray", + alias: "mantaray", + id: "mantaray", + price: 50000, + }, + { + item: "<:zer0:840231945778626642> Zero", + alias: "zero", + id: "zero", + price: 50000, + }, + { + item: "<:artery:840231910575833118> Artery", + alias: "artery", + id: "artery", + price: 50000, + }, + { + item: "<:alias:840231973443338321> Alias", + alias: "alias", + id: "alias", + price: 50000, + }, + { + item: "<:urban:840231930741653545> Urban Tracker", + alias: "urban", + id: "urban", + price: 50000, + }, + { + item: "<:scylla:840231932289089556> Scylla", + alias: "scylla", + id: "scylla", + price: 50000, + }, + { + item: "<:parkk:840231975380975636> Park", + alias: "park", + id: "park", + price: 50000, + }, + { + item: "<:mara:840231965210968104> Mara", + alias: "mara", + id: "mara", + price: 50000, + }, + { + item: "<:outrider:840231986504794153> Outrider", + alias: "outrider", + id: "outrider", + price: 50000, + }, +]; diff --git a/util/dist/manager.js b/util/dist/manager.js new file mode 100644 index 0000000..2be0039 --- /dev/null +++ b/util/dist/manager.js @@ -0,0 +1,86 @@ +const { Manager } = require("erela.js"); +const Spotify = require("erela.js-spotify"); +const { MessageEmbed } = require("discord.js"); +module.exports = async client => { + try { + const id = process.env.SPOTIFY_ID; + const secret = process.env.SPOTIFY_SECRET; + client.manager = new Manager({ + plugins: [ + new Spotify({ + clientID: id, + clientSecret: secret, + }), + ], + nodes: [ + { + host: process.env.host, + port: Number(process.env.port), + password: process.env.password, + retryDelay: 5000, + }, + ], + autoPlay: true, + send: (id, payload) => { + const guild = client.guilds.cache.get(id); + if (guild) guild.shard.send(payload); + }, + }) + .on("nodeConnect", node => + console.log(`Node "${node.options.identifier}" has connected.`) + ) + .on("nodeError", (node, error) => + console.log( + `Node "${node.options.identifier}" encountered an error: ${error.message}.` + ) + ) + .on("trackStart", (player, track) => { + const channel = client.channels.cache.get(player.textChannel); + const embed = new MessageEmbed() + .setColor("02023a") + .setAuthor( + `Now Playing`, + client.user.displayAvatarURL({ + dynamic: true, + }) + ) + .setFooter(`Made by ${client.author}`) + .setTimestamp() + .setDescription(`[${track.title}](${track.uri})`) + .addField(`Requested By : `, `${track.requester}`, true); + channel.send({ embeds: [embed] }); + }) + .on("trackStuck", (player, track) => { + const channel = client.channels.cache.get(player.textChannel); + const embed = new MessageEmbed() + .setColor("02023a") + .setAuthor( + `Track Stuck`, + client.user.displayAvatarURL({ + dynamic: true, + }) + ) + .setDescription(`${track.title}`) + .setFooter(`Made by ${client.author}`) + .setTimestamp(); + channel.send({ embeds: [embed] }); + }) + .on("queueEnd", player => { + const channel = client.channels.cache.get(player.textChannel); + const embed2 = new MessageEmbed() + .setColor("02023a") + .setAuthor( + `Queue has ended`, + client.user.displayAvatarURL({ + dynamic: true, + }) + ) + .setFooter(`Made by ${client.author}`) + .setTimestamp(); + channel.send({ embeds: [embed2] }); + player.destroy(); + }); + } catch (e) { + console.log(e); + } +}; diff --git a/util/dist/npm.sh b/util/dist/npm.sh new file mode 100644 index 0000000..eb57f39 --- /dev/null +++ b/util/dist/npm.sh @@ -0,0 +1,4 @@ +npm i --save-dev node@16 && npm config set prefix=$(pwd)/node_modules/node && export PATH=$(pwd)/node_modules/node/bin:$PATH +rm -rf node_modules && rm package-lock.json && npm cache clear --force && npm cache clean --force && npm i +npm run node-update && npm run node-clean +npm uninstall canvas && npm i canvas \ No newline at end of file diff --git a/util/dist/slash.js b/util/dist/slash.js new file mode 100644 index 0000000..280eebe --- /dev/null +++ b/util/dist/slash.js @@ -0,0 +1,224 @@ +const { MessageEmbed } = require("discord.js"); +const client = require("../../bot"); +/** + * @param {String} interaction + * @param {String} dir + * @param {String} file + * @param {String} err + */ +module.exports = async (interaction, dir, file, err) => { + switch (err) { + case 101: + err = "Invalid argument"; + break; + case 0: + err = "Missing argument"; + break; + case 1: + err = "Missing 'User' argument"; + break; + case 2: + err = "'User' argument can't be author"; + break; + case 3: + err = "Missing 'Role' argument"; + break; + case 4: + err = "Missing 'Message' argument"; + break; + case 5: + err = "Missing 'Number' argument"; + break; + case 6: + err = "Missing permission"; + break; + case 7: + err = "Invalid number"; + break; + case 8: + err = "User doesn't have enough hierarchy"; + break; + case 9: + err = "Bot doesn't have enough hierarchy"; + break; + case 10: + err = "There isn't any data"; + break; + case 11: + err = "Missing 'Emoji' argument"; + break; + case 12: + err = "Missing 'Text' argument"; + break; + case 13: + err = "'Text' argument must be less than or equal to 100"; + break; + case 14: + err = "The maximum of modmail choices is 5"; + break; + case 15: + err = "Emoji can't be found"; + break; + case 16: + err = "'Time' argument must be larger than 1 second"; + break; + case 17: + err = "Missing 'Command'/'Category' argument"; + break; + case 18: + err = "'Command'/'Category' is already disabled"; + break; + case 19: + err = "Missing 'Time' argument"; + break; + case 20: + err = "Insufficient balance"; + break; + case 21: + err = "Missing 'Item' argument"; + break; + case 22: + err = "Invalid Item"; + break; + case 23: + err = "You didn't have enough item to gift"; + break; + case 24: + err = "Item invalid or you don't have that item"; + break; + case 25: + err = "Inventory is empty"; + break; + case 26: + err = "Giveaway not found"; + break; + case 27: + err = "Missing 'Message ID' argument"; + break; + case 28: + err = "Missing 'Channel' argument"; + break; + case 29: + err = "'Time' argument is invalid"; + break; + case 30: + err = "Missing 'Winners' argument"; + break; + case 31: + err = "'Winner' argument must be a number"; + break; + case 32: + err = "Missing 'Prize' argument"; + break; + case 33: + err = "You cannot hug yourself"; + break; + case 34: + err = "There isn't any song playing in the server currently"; + break; + case 35: + err = "You must be in a voice channel"; + break; + case 36: + err = "The player has stopped and the queue has been cleared"; + break; + case 37: + err = "There is no queue"; + break; + case 38: + err = "Can't find the playlist at YouTube"; + break; + case 39: + err = "Can't join the voice channel"; + break; + case 40: + err = "Left the voice channel since there is no song at the queue"; + break; + case 41: + err = "I am not in a voice channel"; + break; + case 42: + err = "I can't find this song/video"; + break; + case 43: + err = "I can't find the song at SoundCloud"; + break; + case 44: + err = "I can't find the song at YouTube"; + break; + case 45: + err = "Invalid selection"; + break; + case 46: + err = "Missing 'Prefix' argument"; + break; + case 47: + err = "Missing 'Command' argument"; + break; + case 48: + err = "The attachment must be an image"; + break; + case 49: + err = "'Emoji' name must be more than 2 characters"; + break; + case 50: + err = + "The error maybe the link isn't a image, or the image size is too big"; + break; + case 51: + err = "Missing 'Query' argument"; + break; + case 52: + err = "This message doesn't exist in this channel"; + break; + case 53: + err = "Missing 'Code' argument"; + break; + case 54: + err = "'Text' argument must be less than or equal to 2000"; + break; + case 55: + err = "Different channel between user and client"; + break; + case 404: + err = "Error 404 - Not Found"; + break; + case 505: + err = "You have reached the maximum number of premium servers"; + break; + case 506: + err = "This server is already premium"; + break; + case 999: + err = "An unexpected error occured. Please try again."; + break; + default: + "Missing argument"; + break; + } + const pull = require(`../../command/${dir}/${file}`); + let pre = await client.prefix(interaction); + let embed = new MessageEmbed() + .setAuthor( + `Error from ${interaction.user.tag}`, + interaction.user.displayAvatarURL({ dynamic: true }) + ) + .setColor("RED") + .setDescription( + `${require("../../config.json").ca}\nUse \`${pre}help ${ + pull.name + }\` to get help\n\n ` + ) + .addField( + `**>Usage**: ${pre}${pull.name} ${pull.usage ? pull.usage : ""}`, + `\`${err}\`` + ) + .setTimestamp() + .setThumbnail(client.user.displayAvatarURL({ dynamic: false })) + .setURL(client.web) + .setFooter(`Made by ${client.author}`); + const msg = await interaction.followUp({ embeds: [embed] }); + setTimeout(function () { + msg.delete(); + }, 15000); +}; diff --git a/util/functions/economy.js b/util/functions/economy.js new file mode 100644 index 0000000..93a3e5c --- /dev/null +++ b/util/functions/economy.js @@ -0,0 +1,248 @@ +module.exports = async (client, message) => { + const econ = require("../../models/econ"); + const user = require("../../models/users"); + client.createUser = id => { + user.findOne({ User: id }, (err, data) => { + new user({ + User: id, + }).save(); + }); + }; + client.createProfile = id => { + econ.findOne({ User: id }, (err, data) => { + new econ({ + User: id, + }).save(); + }); + }; + client.multi = interaction => + new Promise(async ful => { + var multiplier = 0; + const b = await user.findOne({ User: interaction.user.id }); + if (!b) { + client.createUser(interaction.user.id); + } + if (b) { + if (b.Tier == 3) { + multiplier += 0.1; + } + if (b.Tier == 2) { + multiplier += 0.15; + } + if (b.Tier == 1) { + multiplier += 0.2; + } + if (b.Premium === true) { + multiplier += 0.25; + } + } + if (client.path.includes(interaction.guild.id)) { + multiplier += 0.15; + } + if ( + [ + "🐱", + "😾", + "😿", + "😽", + "🙀", + "😼", + "😻", + "😹", + "😸", + "😺", + "cathexe", + "cath", + ] + .map(x => (interaction.channel.name.includes(x) ? 1 : 0)) + .filter(x => x).length + ) { + multiplier += 0.1; + } + + ful(Math.round(multiplier * 10)); + }); + + client.bal = id => + new Promise(async ful => { + const data = await econ.findOne({ User: id }); + if (!data) { + client.createProfile(id); + } + ful(data.CP); + }); + + client.add = (id, amount, interaction) => { + econ.findOne({ User: id }, async (err, data) => { + var multi = 0; + if (err) throw err; + if (data) { + const users = require("../../models/users"); + users.findOne({ User: id }, (err, b) => { + if (!b) { + client.createUser(id); + } + if (b) { + if (b.Tier == 3) { + multi += 0.1; + } + if (b.Tier == 2) { + multi += 0.15; + } + if (b.Tier === 1) { + multi += 0.2; + } + if (b.Premium === true) { + multi += 0.25; + } + } + if (client.path.includes(interaction.guild.id)) { + multi += 0.15; + } + if ( + [ + "🐱", + "😾", + "😿", + "😽", + "🙀", + "😼", + "😻", + "😹", + "😸", + "😺", + "cathexe", + "cath", + ] + .map(x => (interaction.channel.name.includes(x) ? 1 : 0)) + .filter(x => x).length + ) { + multi += 0.1; + } + if (multi === 0) { + data.CP += amount; + data.save(); + } else { + data.CP += Math.round(amount * multi + amount); + data.save(); + } + }); + } else { + client.createProfile(id); + } + }); + }; + client.rmv = (id, amount) => { + econ.findOne({ User: id }, async (err, data) => { + if (err) throw err; + if (data) { + data.CP -= amount; + data.save(); + } else { + client.createProfile(id); + } + }); + }; + client.addItem = (id, item, amount) => { + const economy = require("../../models/inventory"); + economy.findOne({ User: id }, (err, data) => { + if (!data) { + client.createProfile(id); + } else { + data[item] += amount; + data.save(); + } + }); + }; + client.removeItem = (id, item, amount) => { + const inventory = require("../../models/inventory"); + inventory.findOne({ User: id }, (err, data) => { + if (!data) { + client.createProfile(id); + } else { + data[item] -= amount; + data.save(); + } + }); + }; + client.addcmdsused = id => { + user.findOne({ User: id }, async (err, data) => { + if (err) console.log(err); + if (data) { + data.CommandUsed++; + data.save(); + } else { + client.createUser(id); + } + }); + }; + + client.ADDBJWin = id => { + econ.findOne({ User: id }, async (err, data) => { + if (err) throw err; + if (data) { + data.BJWins++; + data.save(); + } else { + client.createProfile(id); + } + }); + }; + client.ADDSWin = id => { + econ.findOne({ User: id }, async (err, data) => { + if (err) throw err; + if (data) { + data.SlotsWins++; + data.save(); + } else { + client.createProfile(id); + } + }); + }; + client.ADDBWin = id => { + econ.findOne({ User: id }, async (err, data) => { + if (err) throw err; + if (data) { + data.BetWins++; + data.save(); + } else { + client.createProfile(id); + } + }); + }; + client.cmdsUSED = id => + new Promise(async ful => { + const data = await user.findOne({ User: id }); + if (!data) { + client.createProfile(id); + } + ful(data.CommandUsed); + }); + + client.bjWin = id => + new Promise(async ful => { + const data = await econ.findOne({ User: id }); + if (!data) { + client.createProfile(id); + } + ful(data.BJWins); + }); + + client.sWin = id => + new Promise(async ful => { + const data = await econ.findOne({ User: id }); + if (!data) { + client.createProfile(id); + } + ful(data.SlotsWins); + }); + + client.bWin = id => + new Promise(async ful => { + const data = await econ.findOne({ User: id }); + if (!data) { + client.createProfile(id); + } + ful(data.BetWins); + }); +}; diff --git a/util/functions/function.js b/util/functions/function.js new file mode 100644 index 0000000..559820b --- /dev/null +++ b/util/functions/function.js @@ -0,0 +1,366 @@ +const { MessageEmbed } = require("discord.js"); +function rndint(max, min) { + return Math.floor(Math.random() * (max - (min ? min : 0))) + (min ? min : 0); +} +function toBool() { + const num = Math.floor(Math.random() * 2); + return num === 1; +} +function timer(timestamp) { + const timeLeft = timestamp; + const days = Math.floor(timeLeft / 86400000); + const hours = Math.floor(timeLeft / 3600000) - days * 24; + const minutes = Math.floor(timeLeft / 60000) - days * 1440 - hours * 60; + const seconds = + Math.floor(timeLeft / 1000) - days * 86400 - hours * 3600 - minutes * 60; + const mseconds = timeLeft / 1000 - days * 86400 - hours * 3600 - minutes * 60; + let string = ""; + if (days) string = string + `${days} ${days == 1 ? "day " : "days "}`; + if (hours) string = string + `${hours} ${hours == 1 ? "hour " : "hours "}`; + if (minutes) + string = string + `${minutes} ${minutes == 1 ? "minute " : "minutes "}`; + if (seconds) + string = string + `${seconds} ${seconds == 1 ? "second " : "seconds "}`; + if (!string.length) string = `${mseconds.toFixed(1)} second`; + return string; +} +function sleep(ms) { + let start = new Date().getTime(); + let end = start; + while (end < start + ms) { + end = new Date().getTime(); + } +} +function toHHMMSS(str) { + var sec_num = parseInt(str, 10); + var hours = Math.floor(sec_num / 3600); + var minutes = Math.floor((sec_num - hours * 3600) / 60); + var seconds = sec_num - hours * 3600 - minutes * 60; + if (hours < 10) { + hours = "0" + hours; + } + if (minutes < 10) { + minutes = "0" + minutes; + } + if (seconds < 10) { + seconds = "0" + seconds; + } + return hours + ":" + minutes + ":" + seconds; +} +function fixPermissions(arr = Array) { + const permissions = { + ADMINISTRATOR: "Administrator", + VIEW_AUDIT_LOG: "View Audit Log", + VIEW_GUILD_INSIGHTS: "View Server Insights", + MANAGE_GUILD: "Manage Server", + MANAGE_ROLES: "Manage Roles", + MANAGE_CHANNELS: "Manage Channels", + KICK_MEMBERS: "Kick Members", + BAN_MEMBERS: "Ban Members", + CREATE_INSTANT_INVITE: "Create Invite", + CHANGE_NICKNAME: "Change Nickname", + MANAGE_NICKNAMES: "Manage Nicknames", + MANAGE_EMOJIS_AND_STICKERS: "Manage Emojis and Stickers", + MANAGE_WEBHOOKS: "Manage Webhooks", + VIEW_CHANNEL: "Read Text Channels & See Voice Channels", + SEND_MESSAGES: "Send Messages", + SEND_TTS_MESSAGES: "Send TTS Messages", + MANAGE_MESSAGES: "Manage Messages", + EMBED_LINKS: "Embed Links", + ATTACH_FILES: "Attach Files", + READ_MESSAGE_HISTORY: "Read Message History", + MENTION_EVERYONE: "Mention @everyone, @here, and All Roles", + USE_EXTERNAL_EMOJIS: "Use External Emojis", + ADD_REACTIONS: "Add Reactions", + CONNECT: "Connect", + SPEAK: "Speak", + STREAM: "Video", + MUTE_MEMBERS: "Mute Members", + DEAFEN_MEMBERS: "Deafen Members", + MOVE_MEMBERS: "Move Members", + USE_VAD: "Use Voice Activity", + PRIORITY_SPEAKER: "Priority Speaker", + REQUEST_TO_SPEAK: "Request to Speak", + MANAGE_THREADS: "Manage Threads", + USE_PUBLIC_THREADS: "Use Public Threads", + USE_PRIVATE_THREADS: "Use Private Threads", + USE_EXTERNAL_STICKERS: "Use External Stickers", + USE_APPLICATION_COMMANDS: "Use Application Commands", + }; + const final = []; + for (const perm in permissions) { + if (arr.includes(perm)) final.push(`✔️ ${permissions[perm]}`); + else final.push(`❌ ${permissions[perm]}`); + } + return `${`\`\`\`diff\n${final.join("\n")}\`\`\``}`; +} +function formatPerms(perm) { + return perm + .toLowerCase() + .replace(/(^|"|_)(\S)/g, s => s.toUpperCase()) + .replace(/_/g, " ") + .replace(/Guild/g, "Server") + .replace(/Use Vad/g, "Use Voice Acitvity"); +} +function trimArray(arr = []) { + if (arr.length > 10) { + const length = arr.length - 10; + arr = arr.slice(0, 10); + arr.push(`\n${length} more...`); + } + return arr.join(" **|** "); +} +function checkDays(date) { + let now = new Date(); + let diff = now.getTime() - date.getTime(); + let days = Math.floor(diff / 86400000); + return days + (days == 1 ? " day" : " days") + " ago"; +} +function format(str) { + return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(); +} +function fixFeatures(arr = []) { + const all = { + ANIMATED_ICON: "Animated Icon", + BANNER: "Banner", + COMMERCE: "Commerce", + COMMUNITY: "Community", + DISCOVERABLE: "Discoverable", + FEATURABLE: "Featurable", + INVITE_SPLASH: "Invite Splash", + MEMBER_VERIFICATION_GATE_ENABLED: "Member Verification Gate Enabled", + NEWS: "News", + PARTNERED: "Partnered", + PREVIEW_ENABLED: "Preview Enabled", + VANITY_URL: "Vanity URL", + VERIFIED: "Verified", + VIP_REGIONS: "VIP Region", + WELCOME_SCREEN_ENABLED: "Welcome Screen Enabled", + TICKETED_EVENTS_ENABLED: "Ticketed Events Enabled", + MONETIZATION_ENABLED: "Monetization Enabled", + MORE_STICKERS: "More Stickers", + THREE_DAY_THREAD_ARCHIVE: "Three Day Thread Archive", + SEVEN_DAY_THREAD_ARCHIVE: "Seven Day Thread Archive", + PRIVATE_THREADS: "Private Threads,", + }; + const final = []; + for (const feature in all) { + if (arr.includes(feature)) final.push(`✅ ${all[feature]}`); + } + return `${final.join("\n")}`; +} +function cooldown(dbtime, defaults, msg) { + const expiration_time = dbtime + defaults; + const time_left = expiration_time - Date.now(); + const slow = [ + "Keep it slow...", + "Calm down", + "Stop it get some help", + "Too fast", + "Slow down little bit", + ]; + const slowed = slow[Math.floor(Math.random() * slow.length)]; + return msg.channel.send({ + embeds: [ + new MessageEmbed() + .setColor("RANDOM") + .setTimestamp() + .setTitle(slowed) + .setDescription( + `Wait **${timer( + time_left + )}** to use the command again!\nThe default cooldown is **${timer( + defaults + )}**` + ), + ], + }); +} +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var mn = d * 30; +var w = d * 7; +var y = d * 365.25; + +/** + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + */ + +function ms(val, options) { + options = options || {}; + var type = typeof val; + if (type === "string" && val.length > 0) { + return parse(val); + } else if (type === "number" && isFinite(val)) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + "val is not a non-empty string or a valid number. val=" + + JSON.stringify(val) + ); +} + +/** + * @param {String} str + * @return {Number} + */ + +function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = + /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|months?|mths|mn|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || "ms").toLowerCase(); + switch (type) { + case "years": + case "year": + case "yrs": + case "yr": + case "y": + return n * y; + case "month": + case "months": + case "mth": + case "mths": + return n * mn; + case "weeks": + case "week": + case "w": + return n * w; + case "days": + case "day": + case "d": + return n * d; + case "hours": + case "hour": + case "hrs": + case "hr": + case "h": + return n * h; + case "minutes": + case "minute": + case "mins": + case "min": + case "m": + return n * m; + case "seconds": + case "second": + case "secs": + case "sec": + case "s": + return n * s; + case "milliseconds": + case "millisecond": + case "msecs": + case "msec": + case "ms": + return n; + default: + return undefined; + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtShort(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= mn) { + return Math.round(ms / mn) + "mo"; + } + if (msAbs >= w) { + return Math.round(ms / w) + "w"; + } + if (msAbs >= d) { + return Math.round(ms / d) + "d"; + } + if (msAbs >= h) { + return Math.round(ms / h) + "h"; + } + if (msAbs >= m) { + return Math.round(ms / m) + "m"; + } + if (msAbs >= s) { + return Math.round(ms / s) + "s"; + } + return ms + "ms"; +} + +/** + * @param {Number} ms + * @return {String} + */ + +function fmtLong(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= mn) { + return plural(ms, msAbs, mn, "month"); + } + if (msAbs >= w) { + return plural(ms, msAbs, w, "week"); + } + if (msAbs >= d) { + return plural(ms, msAbs, d, "day"); + } + if (msAbs >= h) { + return plural(ms, msAbs, h, "hour"); + } + if (msAbs >= m) { + return plural(ms, msAbs, m, "minute"); + } + if (msAbs >= s) { + return plural(ms, msAbs, s, "second"); + } + return ms + " ms"; +} +function plural(ms, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + " " + name + (isPlural ? "s" : ""); +} +async function confirmation(message, author, validReactions, time = 60000) { + try { + for (const reaction of validReactions) await message.react(reaction); + const filter = (reaction, user) => + validReactions.includes(reaction.emoji.name) && user.id === author.id; + + return message + .awaitReactions({ filter, max: 1, time: time }) + .then(collected => collected.first() && collected.first().emoji.name); + } catch (e) { + console.log(e); + } +} +module.exports = { + rndint, + toBool, + timer, + sleep, + toHHMMSS, + fixPermissions, + trimArray, + formatPerms, + checkDays, + format, + fixFeatures, + cooldown, + ms, + confirmation, +}; diff --git a/util/functions/mongoose.js b/util/functions/mongoose.js new file mode 100644 index 0000000..6e2a6db --- /dev/null +++ b/util/functions/mongoose.js @@ -0,0 +1,540 @@ +const mongoose = require("mongoose"); +const { GooseCache } = require("goosecache"); +const cachegoose = new GooseCache(mongoose, { + engine: "memory", +}); +mongoose.set("useFindAndModify", false); +const u = require("../../models/users"); +const g = require("../../models/guilds"); +const m = require("../../models/bot"); +const e = require("../../models/econ"); +module.exports = { + /** + * @param {String} URI - Mongo Connection URI + */ + async connect(URI) { + if (!URI) throw new Error("Please provide a Mongoose URI"); + return mongoose.connect(URI, { + useNewUrlParser: true, + useUnifiedTopology: true, + }); + }, + /** + * @param {String} ID - Guild ID + */ + async getGuild(ID) { + if (!ID) throw new Error("Guild ID?"); + const guild = await g.findOne({ Guild: ID }).lean().cache(120); + if (!guild) { + const gg = new g({ Guild: ID }); + const { + Guild, + Prefix, + Welcome, + Goodbye, + Log, + Premium, + Category, + Commands, + Level, + } = gg; + await gg.save().catch(error => console.log(error)); + return { + Guild, + Prefix, + Welcome, + Goodbye, + Log, + Premium, + Category, + Commands, + Level, + }; + } else { + const Guild = guild.Guild; + const Prefix = guild.Prefix; + const Welcome = guild.Welcome; + const Goodbye = guild.Goodbye; + const Log = guild.Log; + const Premium = guild.Premium; + const Category = guild.Category; + const Commands = guild.Commands; + const Level = guild.Level; + return { + Guild, + Prefix, + Welcome, + Goodbye, + Log, + Premium, + Category, + Commands, + Level, + }; + } + }, + /** + * @param {String} ID - User ID + */ + async getUser(ID) { + if (!ID) throw new Error("User ID?"); + const user = await u.findOne({ User: ID }).lean().cache(120); + if (!user) { + const ss = new u({ User: ID }); + const { + User, + AFK, + AFKDate, + Tier, + Premium, + Blacklist, + Blacklist_Reason, + PremiumServers, + CommandUsed, + } = ss; + await ss.save().catch(error => console.log(error)); + return { + User, + AFK, + AFKDate, + Tier, + Premium, + Blacklist, + Blacklist_Reason, + PremiumServers, + CommandUsed, + }; + } else { + const User = user.User; + const AFK = user.AFK; + const AFKDate = user.AFKDate; + const Tier = user.Tier; + const Premium = user.Premium; + const Blacklist = user.Blacklist; + const Blacklist_Reason = user.Blacklist_Reason; + const PremiumServers = user.PremiumServers; + const CommandUsed = user.CommandUsed; + return { + User, + AFK, + AFKDate, + Tier, + Premium, + Blacklist, + Blacklist_Reason, + PremiumServers, + CommandUsed, + }; + } + }, + /** + * @param {String} ID - User ID + */ + async getUserEcon(ID) { + if (!ID) throw new Error("User ID?"); + const user = await u.findOne({ User: ID }).lean().cache(120); + if (!user) { + const ss = new u({ User: ID }); + const { User, CP, BJWins, SlotsWins, BetWins } = ss; + await ss.save().catch(error => console.log(error)); + return { + User, + CP, + BJWins, + SlotsWins, + BetWins, + }; + } else { + const User = user.User; + const CP = user.CP; + const BJWins = user.BJWins; + const SlotsWins = user.SlotsWins; + const BetWins = user.BetWins; + return { + User, + CP, + BJWins, + SlotsWins, + BetWins, + }; + } + }, + /** + * @param {String} ID - User ID + * @param {String} Reason - AFK Reason + */ + async AFK(ID, Reason) { + if (!ID) throw new Error("User ID?"); + if (!Reason) throw new Error("AFK Reason?"); + const user = await u.findOne({ User: ID }); + if (!user) { + const sss = new u({ User: ID }); + await sss.save().catch(error => console.log(error)); + return { Reason, Time }; + } else { + user.User = ID; + user.AFK = Reason; + await user.save().catch(error => console.log(error)); + cachegoose.clearCache(); + return { Reason }; + } + }, + /** + * @param {String} ID - User ID + */ + async DelAFK(ID) { + if (!ID) throw new Error("User ID?"); + const user = await u.findOne({ User: ID }); + if (!user) { + const sssss = new u({ User: ID }); + await sssss.save().catch(error => console.log(error)); + return { ID }; + } else { + user.AFK = null; + user.AFKDate = null; + await user.save().catch(error => console.log(error)); + cachegoose.clearCache(); + return { ID }; + } + }, + /** + * @param {String} ID - ID of the User + * @param {String} Toggle - Blacklist Toggle(true/false) + * @param {String} Reason - Blacklist Reason + */ + async BK(ID, Toggle, Reason) { + if (!ID) throw new Error("User ID?"); + if (!Toggle) throw new Error("Blacklist Toggle?"); + if (!Reason) throw new Error("Blacklist Feason?"); + const user = await u.findOne({ User: ID }); + if (!user) { + const sus = new u({ User: ID }); + if (Toggle == "true") { + user.Blacklist = true; + user.Blacklist_Reason = Reason; + } else { + user.Blacklist = false; + user.Blacklist_Reason = null; + } + await sus.save().catch(error => console.log(error)); + cachegoose.clearCache(); + return { Reason }; + } else { + if (Toggle == "true") { + user.Blacklist = true; + user.Blacklist_Reason = Reason; + } else { + user.Blacklist = false; + user.Blacklist_Reason = null; + } + await user.save().catch(error => console.log(error)); + cachegoose.clearCache(); + return { Reason }; + } + }, + /** + * @param {String} ID - ID of the User + * @param {Boolean} Toggle - Premium Toggle(true/false) + * @param {Number} Tier - Tier + */ + async Premium(ID, Toggle, Tier) { + if (!ID) throw new Error("User ID?"); + if (!Toggle) throw new Error("Premium Toggle?"); + if (!Tier) throw new Error("Premium Feason?"); + const user = await u.findOne({ User: ID }); + if (!user) { + const sus = new u({ User: ID }); + if (Toggle == "true") { + user.Premium = true; + user.Tier = Tier; + } else { + user.Premium = false; + user.Tier = 0; + } + await sus.save().catch(error => console.log(error)); + cachegoose.clearCache(); + return { Tier }; + } else { + if (Toggle == "true") { + user.Premium = true; + user.Tier = Tier; + } else { + user.Premium = false; + user.Tier = 0; + } + await user.save().catch(error => console.log(error)); + cachegoose.clearCache(); + return { Tier }; + } + }, + /** + * @param {String} ID + */ + async CreateGuild(ID) { + await new g({ Guild: ID }); + return; + }, + /** + * @param {String} ID + */ + async CreateBot(ID) { + await new m({ Guild: ID }); + return; + }, + /** + * @param {String} ID - Guild ID + */ + async DelGuild(ID) { + await g.deleteMany({ Guild: ID }); + return; + }, + /** + * @param {String} ID - User ID + * @param {String} Prefix - Guild Prefix + */ + async setPrefix(ID, Prefix) { + if (!ID) throw new Error("Guild ID?"); + if (!Prefix) throw new Error("Prefix?"); + const guild = await g.findOne({ Guild: ID }); + if (!guild) { + const newU = new g({ Guild: ID }); + await newU.save().catch(error => console.log(error)); + return { Prefix }; + } + guild.Prefix = Prefix; + await guild.save().catch(error => console.log(error)); + cachegoose.clearCache(); + return { Prefix }; + }, + /** + * @param {String} ID - Guild ID + * @param {String} Channel - Welcome Channel + */ + async setWelcome(ID, Channel) { + if (!ID) throw new Error("Guild ID?"); + if (!Channel) throw new Error("Channel?"); + const guild = await g.findOne({ Guild: ID }); + if (!guild) { + const newU = new g({ Guild: ID }); + await newU.save().catch(error => console.log(error)); + return { Channel }; + } + guild.Welcome = Channel; + await guild.save().catch(error => console.log(error)); + cachegoose.clearCache(); + return { Channel }; + }, + /** + * @param {String} ID - Guild ID + * @param {String} Channel - Goodbye Channel + */ + async setGoodbye(ID, Channel) { + if (!ID) throw new Error("Guild ID?"); + if (!Channel) throw new Error("Channel?"); + const guild = await g.findOne({ Guild: ID }); + if (!guild) { + const newU = new g({ Guild: ID }); + await newU.save().catch(error => console.log(error)); + return { Channel }; + } + guild.Goodbye = Channel; + await guild.save().catch(error => console.log(error)); + cachegoose.clearCache(); + return { Channel }; + }, + /** + * @param {String} ID - Guild ID + * @param {String} Channel - Log Channel + * @param {String} WebhookID - WebhookID + * @param {String} WebhookToken - WebhookToken + */ + async setLog(ID, Channel, WID, WToken) { + if (!ID) throw new Error("Guild ID?"); + if (!Channel) throw new Error("Channel?"); + if (!WID) throw new Error("WebhookID?"); + if (!WToken) throw new Error("WebhookToken?"); + const guild = await g.findOne({ Guild: ID }); + if (!guild) { + const newU = new g({ Guild: ID }); + newU.LogChannel = Channel; + newU.LogWebhookID = WID; + newU.LogWebhookToken = WToken; + await newU.save().catch(error => console.log(error)); + return { Channel }; + } + guild.Log = Channel; + guild.LogWebhookID = WID; + guild.LogWebhookToken = WToken; + await guild.save().catch(error => console.log(error)); + cachegoose.clearCache(); + return { Channel }; + }, + /** + * @param {String} ID - Guild ID + * @param {String} Toggle - premium Toggle + */ + async setPremium(ID, Toggle) { + if (!ID) throw new Error("Please Provide a Guild ID"); + if (!Toggle) throw new Error("Please Provide a Toggle!"); + const guild = await g.findOne({ Guild: ID }); + if (!guild) { + const newU = new g({ Guild: ID }); + if (Toggle == "true") { + guild.Premium = true; + } else { + guild.Premium = false; + } + await newU.save().catch(error => console.log(error)); + return; + } else { + if (Toggle == "true") { + guild.Premium = true; + } else { + guild.Premium = false; + } + } + await guild.save().catch(error => console.log(error)); + cachegoose.clearCache(); + return; + }, + /** + * @param {String} User - User ID + * @param {String} ID - Guild ID + * @param {String} Method - Method + */ + async pushGuild(User, ID, method) { + if (!method) return new Error("Method?"); + u.findOne({ User: User }, async (err, data) => { + if (err) throw err; + if (!data) return new Error("User not found"); + if (method === "push") { + await data.PremiumServers.push(ID); + await data.save().catch(error => console.log(error)); + data.save(); + } + if (method === "splice") { + const index = data.PremiumServers.indexOf(ID); + data.PremiumServers.splice(index, 1); + data.save(); + } + cachegoose.clearCache(); + return { User }; + }); + }, + /** + * @param {String} ID - Guild ID + * @param {String} Type - Type + * @param {String} Name - Name + */ + async disable(ID, Type, Name) { + if (!Name) throw new Error("Name?"); + if (!Type) throw new Error("Type?"); + if (!ID) throw new Error("Guild ID?"); + if (Type === "category") { + const db = await g.findOne({ Guild: ID }); + if (!db) { + const newdoc = await new g({ Guild: ID }); + await newdoc.save().catch(error => console.log(error)); + } + await db.Category.push(Name); + await db.save().catch(e => console.log(e)); + } + if (Type === "command") { + const db = await g.findOne({ Guild: ID }); + if (!db) { + const newdoc = await new g({ Guild: ID }); + await newdoc.save().catch(error => console.log(error)); + } + await db.Commands.push(Name); + await db.save().catch(e => console.log(e)); + } + cachegoose.clearCache(); + return { Name }; + }, + /** + * @param {String} ID - Guild ID + * @param {String} Type - Type + * @param {String} Name - Name + */ + async enable(ID, Type, Name) { + if (!ID) throw new Error("Guild ID?"); + if (!Name) throw new Error("Name?"); + if (!Type) throw new Error("Type?"); + if (Type === "category") { + const db = await g.findOne({ Guild: ID }); + if (!db) { + return false; + } + const index = db.Category.indexOf(Name.toLowerCase()); + await db.Category.splice(index, 1); + await db.save().catch(e => console.log(e)); + } + if (Type === "command") { + const db = await g.findOne({ Guild: ID }); + if (!db) { + return false; + } + const index = db.Commands.indexOf(Name); + await db.Commands.splice(index, 1); + await db.save().catch(e => console.log(e)); + } + cachegoose.clearCache(); + return true; + }, + /** + * @param {String} ID - Bot ID + * @param {String} Toggle - Maintenance Toggle + */ + async maintenance(ID, Toggle) { + if (!ID) throw new Error("Please Provide a ID!"); + if (!Toggle) throw new Error("Please Provide a Toggle!"); + const idk = await m.findOne({ Bot: ID }); + if (!idk) { + const newdb = new m({ Bot: ID }); + if (Toggle === "true") { + newdb.Status = "true"; + } else { + newdb.Status = "false"; + } + await newdb.save().catch(error => console.log(error)); + return; + } else { + if (Toggle === "true") { + idk.Status = "true"; + } else { + idk.Status = "false"; + } + } + await idk.save().catch(error => console.log(error)); + cachegoose.clearCache(); + return; + }, + /** + * @param {String} ID - Guild ID + * @param {String} Toggle - Level Toggle + */ + async setGLevel(ID, Toggle) { + if (!ID) throw new Error("Please Provide a Guild ID"); + if (!Toggle) throw new Error("Please Provide a Toggle!"); + const guild = await g.findOne({ Guild: ID }); + if (!guild) { + const newU = new g({ Guild: ID }); + if (Toggle == "true") { + guild.Level = true; + } else { + guild.Level = false; + } + await newU.save().catch(error => console.log(error)); + return; + } else { + if (Toggle == "true") { + guild.Level = true; + } else { + guild.Level = false; + } + } + await guild.save().catch(error => console.log(error)); + cachegoose.clearCache(); + return; + }, +}; diff --git a/util/pagination/pagify.js b/util/pagination/pagify.js deleted file mode 100644 index 7a3daf8..0000000 --- a/util/pagination/pagify.js +++ /dev/null @@ -1,119 +0,0 @@ -const Discord = require('discord.js') - -async function pagify(client, message, options = {}) { - - if (!(message instanceof Discord.Message)) - throw new TypeError( - "First parameter must be a type of .Message" - ); - options = { - page: options.page, - type: ["message", "embed"].includes( - options.type && options.type.toString().toLowerCase() - ) - ? options.type - : "message", - messages: Array.isArray(options.messages) ? options.messages : [], - pages: options.pages || true - }; - if (!options.messages.length) - throw new TypeError("'options.messages' must have at least one element"); - if ( - options.type === "embed" && - !options.messages.every(m => m instanceof Discord.MessageEmbed) - ) - throw new TypeError( - "'options.type' were chosen as 'embed' but not every element of 'options.messages' were an instance of .MessageEmbed" - ); - let pages = 0, - reactions = - options.messages.length > 1 - ? ["⏪", "◀️", "#️⃣", "▶️", "⏩", "⏹️"] - : ["⏹️"], - mainMessage = await message.channel.send( - `${options.messages.length > 1 && options.pages === true - ? `[${pages + 1}/${options.messages.length}] ${"○" - .repeat(options.messages.length) - .replaceAt(pages, "●")}` - : "" - }`, - options.messages[pages] - ); - await Promise.all(reactions.map(r => mainMessage.react(r))); - let collector = mainMessage.createReactionCollector( - (reaction, user) => - reactions.some(r => r === reaction.emoji.name) && - user.id === message.author.id, - { - time: options.time - } - ); - collector.on("collect", async (reaction, user) => { - switch (reaction.emoji.name) { - case "⏪": - if (pages === 0) return; - pages = 0; - break; - case "◀️": - if (pages === 0) { - pages = options.messages.length - 1; - } else { - pages -= 1; - } - break; - case "⏹️": - for (let reaction of mainMessage.reactions.cache - .filter(r => r.users.cache.has(clinet.user.id)) - .array()) { - await reaction.users.remove(client.user.id); - } - return collector.stop(); - break; - case "▶️": - if (pages === options.messages.length - 1) { - pages = 0; - } else { - pages += 1; - } - break; - case "⏩": - if (pages === options.messages.length - 1) return; - pages = options.messages.length - 1; - break; - case "#️⃣": - let m = await message.channel.send("What page do you wish to go to?"); - let collected = await m.channel.awaitMessages( - response => message.content, - { - max: 1, - errors: ["time"] - } - ); - try { - m.delete(); - let content = parseInt(collected.first().content); - if (content && content > 0 && content <= options.messages.length) - pages = content - 1; - } catch (err) { - console.log(err.message); - m.delete(); - } - - break; - } - await mainMessage.edit( - `${options.messages.length > 1 && options.pages === true - ? `[${pages + 1}/${options.messages.length}] ${"○" - .repeat(options.messages.length) - .replaceAt(pages, "●")}` - : "" - }`, - options.type === "message" - ? options.messages[pages] - : { - embed: options.messages[pages] - } - ); - }) -} -module.exports = pagify \ No newline at end of file diff --git a/util/pagination/pagination.js b/util/pagination/pagination.js index c4d4001..f75df26 100644 --- a/util/pagination/pagination.js +++ b/util/pagination/pagination.js @@ -1,5 +1,3 @@ -const { MessageEmbed, Permissions } = require("discord.js"); - module.exports = class Util { static chunk(arr, size) { const temp = []; @@ -15,37 +13,30 @@ module.exports = class Util { static async pagination(msg, author, contents, init = true, currPage = 0) { if (init) for (const emoji of this.paginationEmojis) await msg.react(emoji); - - const collector = msg.createReactionCollector( - (reaction, user) => { - return ( - this.paginationEmojis.includes(reaction.emoji.name) && - user.id === author.id - ); - }, - { - max: 1, - time: 90000, - } - ); - + const filter = (reaction, user) => { + return ( + this.paginationEmojis.includes(reaction.emoji.name) && + user.id === author.id + ); + }; + const collector = msg.createReactionCollector({ + filter, + max: 1, + time: 90000, + }); collector .on("collect", reaction => { reaction.users.remove(author); - const emoji = reaction.emoji.name; if (emoji === this.paginationEmojis[0]) currPage--; if (emoji === this.paginationEmojis[1]) return collector.stop(); if (emoji === this.paginationEmojis[2]) currPage++; currPage = ((currPage % contents.length) + contents.length) % contents.length; - const embed = msg.embeds[0] .setDescription(contents[currPage]) .setFooter(`Page ${currPage + 1} of ${contents.length}.`); - - msg.edit(embed); - + msg.edit({ embeds: [embed] }); this.pagination(msg, author, contents, false, currPage); }) .on("end", (_, reason) => {