Repository: AdityaTD/PenguBot Branch: master Commit: be75addea7b2 Files: 240 Total size: 670.3 KB Directory structure: gitextract_nufrysfo/ ├── .eslintrc.js ├── .github/ │ ├── CONTRIBUTING.md │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── Bug_report.md │ │ └── Feature_request.md │ ├── PULL_REQUEST_TEMPLATE.md │ └── workflows/ │ └── test.yml ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── docker-compose.yml ├── package.json └── src/ ├── PenguBot.js ├── arguments/ │ ├── channelname.js │ ├── membername.js │ ├── rolename.js │ └── username.js ├── commands/ │ ├── Developer/ │ │ ├── eval.js │ │ ├── exec.js │ │ ├── setgame.js │ │ └── togglepatronguild.js │ ├── Game Statistics/ │ │ ├── clashofclans.js │ │ ├── csgo.js │ │ ├── fortnite.js │ │ └── osu.js │ ├── Games/ │ │ ├── 8ball.js │ │ ├── rps.js │ │ └── slots.js │ ├── General/ │ │ └── Chat Bot Info/ │ │ ├── donate.js │ │ ├── help.js │ │ ├── info.js │ │ ├── nodeinfo.js │ │ ├── settings.js │ │ ├── stats.js │ │ ├── support.js │ │ └── upvote.js │ ├── Images/ │ │ ├── cat.js │ │ ├── cookie.js │ │ ├── cuddle.js │ │ ├── dog.js │ │ ├── feed.js │ │ ├── fox.js │ │ ├── hug.js │ │ ├── kiss.js │ │ ├── meme.js │ │ ├── pat.js │ │ ├── pengu.js │ │ ├── poke.js │ │ ├── punch.js │ │ ├── randomcomic.js │ │ ├── slap.js │ │ ├── tickle.js │ │ └── wholesome.js │ ├── Jokes and Stuff/ │ │ ├── chucknorris.js │ │ ├── compliment.js │ │ ├── dadjoke.js │ │ ├── dice.js │ │ ├── fml.js │ │ ├── insult.js │ │ ├── randomfact.js │ │ ├── trump.js │ │ └── yomomma.js │ ├── Management/ │ │ ├── Automod/ │ │ │ ├── manageautomod.js │ │ │ └── toggleinvites.js │ │ ├── Autoroles/ │ │ │ ├── addautoroles.js │ │ │ └── toggleautoroles.js │ │ ├── Custom Commands/ │ │ │ ├── createcmd.js │ │ │ ├── deletecmd.js │ │ │ ├── listcmds.js │ │ │ ├── togglecustomcmds.js │ │ │ └── updatecmd.js │ │ ├── Level Roles/ │ │ │ ├── listlevelroles.js │ │ │ ├── managelevelroles.js │ │ │ └── togglelevelroles.js │ │ ├── Logging/ │ │ │ ├── log.js │ │ │ ├── loggingchannel.js │ │ │ └── modlogs.js │ │ ├── Self Roles/ │ │ │ ├── manageselfroles.js │ │ │ ├── selfroles.js │ │ │ └── toggleselfroles.js │ │ ├── Starboard/ │ │ │ ├── starboard.js │ │ │ ├── starboardchannel.js │ │ │ ├── starsrequired.js │ │ │ └── togglestarboard.js │ │ └── Welcome & Leave/ │ │ ├── setleavechannel.js │ │ ├── setleavemsg.js │ │ ├── setwelcomechannel.js │ │ ├── setwelcomemsg.js │ │ ├── toggleleave.js │ │ └── togglewelcome.js │ ├── Manipulation/ │ │ ├── achievement.js │ │ ├── approved.js │ │ ├── batslap.js │ │ ├── beautiful.js │ │ ├── changemymind.js │ │ ├── facepalm.js │ │ ├── garbage.js │ │ ├── illegal.js │ │ ├── lio.js │ │ ├── missing.js │ │ ├── rejected.js │ │ ├── respect.js │ │ ├── snap.js │ │ ├── superpunch.js │ │ ├── tattoo.js │ │ ├── tinder.js │ │ ├── triggered.js │ │ ├── vault.js │ │ └── wanted.js │ ├── Moderation/ │ │ ├── ban.js │ │ ├── case.js │ │ ├── history.js │ │ ├── kick.js │ │ ├── mute.js │ │ ├── prune.js │ │ ├── reason.js │ │ ├── softban.js │ │ └── warn.js │ ├── Music/ │ │ └── music.js │ ├── Profiles/ │ │ ├── backgrounds.js │ │ ├── daily.js │ │ ├── leaderboard.js │ │ ├── levelup.js │ │ ├── managexp.js │ │ ├── profile.js │ │ ├── rank.js │ │ ├── rep.js │ │ ├── snowflakes.js │ │ └── title.js │ ├── Settings/ │ │ ├── disablecmd.js │ │ ├── manageadmin.js │ │ ├── managedj.js │ │ ├── managemod.js │ │ ├── managestaff.js │ │ ├── prefix.js │ │ ├── setlanguage.js │ │ └── togglecategory.js │ └── Utilities/ │ ├── afk.js │ ├── avatar.js │ ├── choose.js │ ├── covid.js │ ├── emote.js │ ├── guild.js │ ├── lmgtfy.js │ ├── poll.js │ ├── quote.js │ ├── reddit.js │ ├── remind.js │ ├── roleinfo.js │ ├── say.js │ ├── shorten.js │ ├── translate.js │ ├── twstats.js │ ├── urban.js │ ├── userinfo.js │ ├── weather.js │ └── ytstats.js ├── events/ │ ├── channelCreate.js │ ├── channelDelete.js │ ├── commandError.js │ ├── commandUnknown.js │ ├── debug.js │ ├── disconnect.js │ ├── eventError.js │ ├── guildBanAdd.js │ ├── guildBanRemove.js │ ├── guildCreate.js │ ├── guildDelete.js │ ├── guildMemberAdd.js │ ├── guildMemberRemove.js │ ├── klasaReady.js │ ├── messageDelete.js │ ├── messageDeleteBulk.js │ ├── messageReactionAdd.js │ ├── messageReactionRemove.js │ ├── messageUpdate.js │ ├── reconnecting.js │ ├── resumed.js │ ├── roleCreate.js │ ├── roleDelete.js │ └── shardError.js ├── extendables/ │ ├── fetchURL.js │ └── prompt.js ├── finalizers/ │ └── commandCounter.js ├── functions/ │ ├── friendlyDuration.js │ ├── images.js │ ├── isPatron.js │ ├── isUpvoter.js │ ├── randomNumber.js │ └── scrapeSubreddit.js ├── index.js ├── inhibitors/ │ ├── disabledGroup.js │ ├── patronOnly.js │ ├── requireDJ.js │ ├── requireMusic.js │ └── upvoterOnly.js ├── languages/ │ ├── en-US.js │ ├── es-ES.js │ ├── fr-FR.js │ ├── it-IT.js │ └── sar-IT.js ├── lib/ │ ├── constants/ │ │ ├── facts.json │ │ ├── nsfw/ │ │ │ └── subreddits.json │ │ └── yomomma.json │ ├── structures/ │ │ ├── KlasaCommand.js │ │ ├── ModLog.js │ │ ├── PenguClient.js │ │ ├── PenguGuild.js │ │ ├── PenguMember.js │ │ ├── PenguMemberManager.js │ │ ├── ServerLog.js │ │ ├── permissionLevels.js │ │ └── schemas/ │ │ ├── defaultClientSchema.js │ │ ├── defaultGuildSchema.js │ │ ├── defaultMemberSchema.js │ │ └── defaultUserSchema.js │ ├── tags/ │ │ ├── getjson.js │ │ └── sendchannel.js │ └── util/ │ └── Util.js ├── main.js ├── middlewares/ │ ├── headers.js │ └── json.js ├── monitors/ │ ├── afk.js │ ├── antiinvites.js │ ├── memberProfiles.js │ ├── perspectivemod.js │ └── profiles.js ├── providers/ │ └── rethinkdb.js ├── routes/ │ ├── application.js │ ├── dblHook.js │ ├── kdhGuild.js │ ├── pieces.js │ └── syncdb.js └── tasks/ ├── datadog.js ├── memorySweeper.js ├── reminder.js ├── stats.js ├── tempMute.js └── timedBan.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .eslintrc.js ================================================ module.exports = { extends: "eslint:recommended", env: { node: true, es6: true }, parserOptions: { ecmaVersion: 9, sourceType: "module" }, plugins: [ "promise", "node" ], rules: { "require-atomic-updates": "off", "no-extra-parens": [ "warn", "all", { nestedBinaryExpressions: false } ], "valid-jsdoc": [ "warn", { requireReturn: false, requireReturnDescription: false, preferType: { String: "string", Number: "number", Boolean: "boolean", Symbol: "symbol", function: "Function", object: "Object", Date: "date", error: "Error" } } ], "accessor-pairs": "warn", "array-callback-return": "error", complexity: "warn", curly: [ "error", "multi-line", "consistent" ], "dot-location": [ "error", "property" ], "dot-notation": "error", eqeqeq: "error", "no-console": [ "error", { allow: [ "log", "warn", "error" ] } ], "no-empty-function": "error", "no-floating-decimal": "error", "no-implied-eval": "error", "no-invalid-this": "error", "no-lone-blocks": "error", "no-multi-spaces": "error", "no-new-func": "error", "no-new-wrappers": "error", "no-new": "error", "no-octal-escape": "error", "no-return-assign": "error", "no-self-compare": "error", "no-sequences": "error", "no-unmodified-loop-condition": "error", "no-unused-expressions": "error", "no-useless-call": "error", "no-useless-escape": "error", "no-useless-concat": "error", "no-void": "error", "no-warning-comments": "warn", "wrap-iife": "error", yoda: "error", "no-label-var": "error", "no-shadow": "error", "no-undef-init": "error", "callback-return": "error", "handle-callback-err": "error", "no-mixed-requires": "error", "no-new-require": "error", "no-path-concat": "error", "no-process-env": "error", "array-bracket-spacing": "error", "block-spacing": "error", "brace-style": [ "error", "1tbs", { allowSingleLine: true } ], "comma-dangle": "error", "comma-spacing": "error", "comma-style": "error", "computed-property-spacing": "error", "consistent-this": "error", "eol-last": "error", "func-names": "error", "func-style": [ "error", "declaration", { allowArrowFunctions: true } ], indent: [ "error", 4, { SwitchCase: 1 } ], "key-spacing": "error", "keyword-spacing": [ "error", { overrides: { if: { after: true }, for: { after: true }, while: { after: true }, catch: { after: true }, switch: { after: true } } } ], "max-depth": "error", "max-len": [ "error", 1500, 2 ], "max-nested-callbacks": [ "error", { max: 4 } ], "max-statements-per-line": [ "error", { max: 2 } ], "new-cap": "error", "newline-per-chained-call": [ "error", { ignoreChainWithDepth: 6 } ], "no-array-constructor": "error", "no-bitwise": "warn", "no-inline-comments": "error", "no-lonely-if": "error", "no-mixed-operators": "error", "no-multiple-empty-lines": [ "error", { max: 2, maxEOF: 1, maxBOF: 0 } ], "no-new-object": "error", "no-spaced-func": "error", "no-trailing-spaces": "error", "no-unneeded-ternary": "error", "no-whitespace-before-property": "error", "object-curly-newline": "error", "object-curly-spacing": [ "error", "always" ], "operator-assignment": "error", "operator-linebreak": [ "error", "after" ], "padded-blocks": [ "error", { classes: "always", blocks: "never", switches: "never" } ], "quote-props": [ "error", "as-needed" ], quotes: [ "error", "double", { avoidEscape: true, allowTemplateLiterals: true } ], "semi-spacing": "error", semi: "error", "space-before-blocks": "error", "space-before-function-paren": [ "error", { anonymous: "always", named: "never", asyncArrow: "always" } ], "space-in-parens": "error", "space-infix-ops": "error", "space-unary-ops": "error", "spaced-comment": "error", "unicode-bom": "error", "arrow-body-style": "error", "arrow-spacing": "error", "no-duplicate-imports": "error", "no-useless-computed-key": "error", "no-useless-constructor": "error", "prefer-arrow-callback": "error", "prefer-const": "error", "prefer-destructuring": [ "error", { VariableDeclarator: { array: false, object: true }, AssignmentExpression: { array: true, object: true } }, { enforceForRenamedProperties: false } ], "prefer-rest-params": "error", "prefer-spread": "error", "prefer-template": "error", "rest-spread-spacing": "error", "template-curly-spacing": "error", "yield-star-spacing": "error", "promise/no-return-wrap": "error", "promise/catch-or-return": "error", "promise/no-native": "off", "promise/no-nesting": "warn", "promise/no-promise-in-callback": "warn", "promise/no-callback-in-promise": "warn", "promise/no-return-in-finally": "warn", "node/no-missing-require": "off", "node/no-unpublished-bin": "error", "node/no-deprecated-api": "error", "node/exports-style": [ "error", "module.exports" ], "no-var": "error", "arrow-parens": [ "error", "as-needed" ] } }; ================================================ FILE: .github/CONTRIBUTING.md ================================================ ## Contribute We love contributors because they make this project even better with their unique talent and skills. If you want to contribute you must know the following this at an intermediate or master level: - JavaScript (NodeJS) - Discord.JS (Discord API Wrapper for NodeJS) - Klasa (Framework we use to create commands, manage settings, etc.) - Knowledge of how to use Git ## Steps to Start Contributing 1. To start contributing, firstly create a fork of this project and clone it to your computer, you can read more about it here: [How to Fork a Repo](https://help.github.com/articles/fork-a-repo/) 2. Open a console in the repository where you cloned the repository and run `npm install` to install all the required packages to run the bot. 3. Now you would need a few external dependencies to actually run the bot, those dependencies are: RethinkDB Server (Guilds, User, Client Settings) and Lavalink Server (Music Node). You can read how to install RethinkDB [here](https://rethinkdb.com/docs/install/) and Lavalink Server [here](https://github.com/Frederikam/Lavalink#server-configuration). 4. Now you can simply create a `config.json` file by following this empty template [here](https://github.com/AdityaTD/PenguBot/wiki/Default-Config-File). 5. You're now good to go, just run `node start` and the bot should boot up. 6. To start adding new code or manipulating existing one just go through different folders and files and edit them, once you're done just push the changes to your forked repository and create a new pull request from GitHub, if the code is sensible and works then it is most likely that it'll be accepted but it's upto the developers to accept or deny your pull request for any reason. ### Useful Resources [**Discord.JS Docs**](https://discord.js.org/#/docs/main/master/general/welcome) [**Klasa Docs**](https://klasa.js.org/#/docs/main/master/Getting%20Started/GettingStarted) ### Basic Empty Klasa Command Example ```js const { Command } = require('klasa'); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ['text', 'dm', 'group'], // Text = Guild Channel, DM = DM Channel and Group = Group Channel (For Selfbots) cooldown: 0, // Command Throttling in Seconds aliases: [], // Other than the filename, what other words should trigger the command permissionLevel: 0, // Adding Information On This Soon requiredPermissions: [], // What permissions should the bot have to be able to use this command. description: '', // Command Description, will be visible in help command and website. usage: '', // Define the required, option or semi-required arguments here. extendedHelp: 'No extended help available.' // Extended help on how to use the command. }); } async run(msg, [...params]) { // This is where you place the code you want to run for your command } }; ``` ================================================ FILE: .github/FUNDING.yml ================================================ # These are supported funding model platforms github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: PenguBot open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel custom: # Replace with a single custom sponsorship URL ================================================ FILE: .github/ISSUE_TEMPLATE/Bug_report.md ================================================ --- name: Bug report about: Create a report to help us improve --- **Describe the bug** A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' 2. Type command '....' 3. Do something '....' 4. See error **Expected behavior** A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. **Versions** - NodeJS: [e.g. 8, 10] - Klasa [e.g. 0.5.0-dev] - Discord.JS [e.g. 12] **Additional context** Add any other context about the problem here. ================================================ FILE: .github/ISSUE_TEMPLATE/Feature_request.md ================================================ --- name: Feature request about: Suggest an idea for this project --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. ================================================ FILE: .github/PULL_REQUEST_TEMPLATE.md ================================================ ### Description of Your Pull Request What does your pull request specifically does by adding/modifying or removing code? ### Changes Proposed and or Files Changed - Example Change ### Label Your Pull Request - [ ] This PR modifies existing code to enhance the bot - [ ] This PR fixes a bug within the bot - [ ] This PR removes/renames methods or properties - [ ] This PR adds methods, features, commands or properties ================================================ FILE: .github/workflows/test.yml ================================================ name: CI on: push: branches: - master pull_request: jobs: test: name: Node v${{ matrix.node_version }} - ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: matrix: node_version: [14] os: [ubuntu-latest] steps: - name: Checkout Project uses: actions/checkout@v1 - name: Use Node.js ${{ matrix.node_version }} uses: actions/setup-node@v1 with: node-version: ${{ matrix.node_version }} - name: Restore CI Cache uses: actions/cache@v1 with: path: node_modules key: ${{ runner.os }}-${{ matrix.node_version }}-${{ hashFiles(matrix.os == 'windows-latest' && '**\yarn.lock' || '**/yarn.lock') }} - name: Install Dependencies run: | yarn add https://{{secrets.TOKEN}}:x-oauth-basic@github.com/PenguBot/music.git#build yarn - name: Test run: yarn test ================================================ FILE: .gitignore ================================================ # Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* # Runtime data pids *.pid *.seed *.pid.lock # Directory for instrumented libs generated by jscoverage/JSCover lib-cov # Coverage directory used by tools like istanbul coverage # nyc test coverage .nyc_output # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) .grunt # Bower dependency directory (https://bower.io/) bower_components # node-waf configuration .lock-wscript # Compiled binary addons (http://nodejs.org/api/addons.html) build/Release # Dependency directories node_modules/ jspm_packages/ # Typescript v1 declaration files typings/ # Optional npm cache directory .npm # Optional eslint cache .eslintcache # Optional REPL history .node_repl_history # Output of 'npm pack' *.tgz # Yarn Integrity file .yarn-integrity # dotenv environment variables file .env # config file config.js # npm lock file package-lock.json # VSCode User Data .vscode # yarn lock yarn-error.log dist .yarn .yarnrc .yarnrc.yml ================================================ FILE: Dockerfile ================================================ FROM node:14.9.0-alpine RUN mkdir -p /home/pengubot/ WORKDIR /home/pengubot/ RUN apk add --no-cache \ build-base \ cairo-dev \ freetype-dev \ g++ \ gcc \ giflib-dev \ git \ jpeg-dev \ libjpeg-turbo-dev \ musl-dev \ pango-dev \ pangomm-dev \ pixman-dev \ pkgconfig \ python COPY package.json /home/pengubot/ COPY yarn.lock /home/pengubot/ ARG PAT RUN sed -i "s|github:pengubot/music#build|git+https://AdityaTD:${PAT}@github.com/PenguBot/music.git#build|g" ./package.json RUN yarn install --link-duplicates --build-links --production COPY /src /home/pengubot/src COPY /assets /home/pengubot/assets COPY config.js /home/pengubot/config.js COPY .git /home/pengubot/.git WORKDIR /home/pengubot/src CMD ["node", "main.js"] ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2018-2020 Aditya N. Tripathi Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================


PenguBot is mutli-purpose Discord Bot with over 45,500 guilds and 4,000,000 users.
Join Discord for Support and Development Discussions

## Hosting Get Instant Free €20 Credit on [Hetzner](https://bit.ly/HetznerCloudServers) with No Credit Card! Affordable and High Quality Hosting Services. [![Hetzner](https://i.imgur.com/YvwLdyZ.png)](https://bit.ly/HetznerCloudServers) ## Contributors [Vlad](https://github.com/KingDGrizzle) - Help with Migration Script for Database [QuantumlyTangled](https://github.com/QuantumlyTangled) - Translate Command and Music Rewrite [Ice](https://github.com/iceeMC/) - SoundCloud Playback Support and YouTube RegEx Modification [Kashall](https://github.com/Kashalls/) - Leaderboard and other help [Jacz](https://github.com/MrJacz) - Code reviews, Music rewrite, refactoring help. General/Advanced code help and questions. [Stitch](https://github.com/Soumil07) - Emote Command and Modified Quote Command ## Translators [RexShardane](https://github.com/alearegis) - IT, SAR [Rudolfet](https://github.com/Rudolfet) - FR ## Acknowledgement [Klasa Pieces](https://github.com/dirigeants/klasa-pieces/) [Dragonfire535](https://github.com/dragonfire535) [WeebDev](https://github.com/WeebDev/Commando) [Kyra](https://github.com/kyranet) [random-puppy](https://github.com/dylang/random-puppy/) [Jacz](https://github.com/MrJacz) ## Vote on Bot Lists to Support [![Discord Bots](https://discordbots.org/api/widget/303181184718995457.svg)](https://discordbots.org/bot/303181184718995457/vote) [![Discord Bot List](https://discordbotlist.com/bots/303181184718995457/widget)](https://discordbotlist.com/bots/303181184718995457/upvote) [![Discord Boats](https://discord.boats/api/widget/303181184718995457)](https://discord.boats/bot/303181184718995457/vote) ================================================ FILE: docker-compose.yml ================================================ version: '3.8' services: pengubot: container_name: pengubot image: pengubot build: context: . args: PAT: ${PAT} restart: always network_mode: host ================================================ FILE: package.json ================================================ { "name": "pengubot", "version": "2.0.8", "description": "PenguBot Rewrite for Performance and Stability.", "main": "src/main.js", "scripts": { "start": "node src/main", "test": "eslint .", "lint": "eslint --fix ." }, "repository": { "type": "git", "url": "git+https://github.com/AdityaTD/PenguBot.git" }, "keywords": [ "pengubot", "pengu", "bot", "discord", "bot", "discord" ], "author": "Aditya Nath Tripathi", "license": "MIT", "bugs": { "url": "https://github.com/AdityaTD/PenguBot/issues" }, "homepage": "https://github.com/AdityaTD/PenguBot#readme", "dependencies": { "@k3rn31p4nic/google-translate-api": "^1.1.1", "@kcp/functions": "github:pengubot/functions#build", "@lavacord/discord.js": "^0.0.7", "@pengubot/music": "github:pengubot/music#build", "breadtags": "github:PenguBot/bread-tags", "bufferutil": "^4.0.3", "canvas": "^2.6.0", "canvas-constructor": "3.0.3", "discord.js": "^12.5.1", "hot-shots": "^8.3.0", "klasa": "github:pengubot/klasa#stable", "klasa-api": "github:PenguBot/klasa-api#v1-alpha", "kurasuta": "^2.2.0", "node-fetch": "^2.6.0", "node-html-parser": "^2.0.2", "raven": "^2.6.4", "rethinkdbdash": "^2.3.31", "utf-8-validate": "^5.0.4", "zlib-sync": "^0.1.6" }, "devDependencies": { "eslint": "7.17.0", "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^4.2.1" } } ================================================ FILE: src/PenguBot.js ================================================ const { BaseCluster } = require("kurasuta"); const Raven = require("raven"); const config = require("../config.js"); const { execSync } = require("child_process"); Raven.config(config.apis.sentry, { captureUnhandledRejections: true, environment: config.production ? "production" : "development", release: execSync("git rev-parse HEAD").toString() }).install(); module.exports = class extends BaseCluster { launch() { return this.client.login(this.manager.token); } }; process.on("uncaughtException", err => Raven.captureException(err)); process.on("unhandledRejection", err => Raven.captureException(err)); ================================================ FILE: src/arguments/channelname.js ================================================ const { Argument } = require("../index"); const regex = Argument.regex.channel; module.exports = class extends Argument { async run(arg, possible, msg) { if (!msg.guild) throw "This command can only be used in a server."; const resChannel = this.resolveChannel(arg, msg.guild); if (resChannel) return resChannel; throw "That channel could not be found, please try another one."; } resolveChannel(arg, guild) { const channelID = regex.exec(arg); return (channelID !== null && guild.channels.cache.get(channelID[1])) || null; } }; ================================================ FILE: src/arguments/membername.js ================================================ const { Argument, klasaUtil: { regExpEsc }, GuildMember, User } = require("../index"); const USER_REGEXP = Argument.regex.userOrMember; module.exports = class extends Argument { async run(arg, possible, msg) { if (!msg.guild) throw "This command can only be used in guilds."; const resUser = await this.resolveMember(arg, msg.guild); if (resUser) return resUser; const results = []; const reg = new RegExp(regExpEsc(arg), "i"); for (const member of msg.guild.members.cache.values()) { if (member.user && reg.test(member.user.username)) results.push(member); if (member.nickname && reg.test(member.nickname)) results.push(member); } let querySearch; if (results.length > 0) { const regWord = new RegExp(`\\b${regExpEsc(arg)}\\b`, "i"); const filtered = results.filter(member => (member.user && regWord.test(member.user.username)) || (member.nickname && regWord.test(member.nickname))); querySearch = filtered.length > 0 ? filtered : results; } else { querySearch = results; } switch (querySearch.length) { case 0: throw `${possible.name} Must be a valid name, id or user mention`; case 1: return querySearch[0]; default: throw `Found multiple matches: \`${querySearch.map(member => member.user.tag).join("`, `")}\``; } } resolveMember(query, guild) { if (query instanceof GuildMember) return query; if (query instanceof User) return guild.members.fetch(query); if (typeof query === "string") { if (USER_REGEXP.test(query)) return guild.members.fetch(USER_REGEXP.exec(query)[1]).catch(() => null); if (/\w{1,32}#\d{4}/.test(query)) { const res = guild.members.cache.find(member => member.user.tag.toLowerCase() === query.toLowerCase()); return res || null; } return null; } return null; } }; ================================================ FILE: src/arguments/rolename.js ================================================ // Copyright (c) 2017-2019 dirigeants. All rights reserved. MIT license. const { Argument, klasaUtil: { regExpEsc }, Role } = require("../index"); const ROLE_REGEXP = Argument.regex.role; module.exports = class extends Argument { async run(arg, possible, msg) { if (!msg.guild) return this.role(arg, possible, msg); const resRole = this.resolveRole(arg, msg.guild); if (resRole) return resRole; const results = []; const reg = new RegExp(regExpEsc(arg), "i"); for (const role of msg.guild.roles.cache.values()) if (reg.test(role.name)) results.push(role); let querySearch; if (results.length > 0) { const regWord = new RegExp(`\\b${regExpEsc(arg)}\\b`, "i"); const filtered = results.filter(role => regWord.test(role.name)); querySearch = filtered.length > 0 ? filtered : results; } else { querySearch = results; } switch (querySearch.length) { case 0: throw `${possible.name} Must be a valid name, id or role mention`; case 1: return querySearch[0]; default: throw `**Found multiple matches:** \`${querySearch.map(role => role.name).join("`, `")}\``; } } resolveRole(query, guild) { if (query instanceof Role) return guild.roles.cache.has(query.id) ? query : null; if (typeof query === "string" && ROLE_REGEXP.test(query)) return guild.roles.cache.get(ROLE_REGEXP.exec(query)[1]); return null; } }; ================================================ FILE: src/arguments/username.js ================================================ const { Argument, klasaUtil: { regExpEsc }, GuildMember, User } = require("../index"); const USER_REGEXP = Argument.regex.userOrMember; module.exports = class extends Argument { async run(arg, possible, msg) { if (!msg.guild) return this.store.get("user").run(arg, possible, msg); const resUser = await this.resolveUser(arg, msg.guild); if (resUser) return resUser; const results = []; const reg = new RegExp(regExpEsc(arg), "i"); for (const member of msg.guild.members.cache.values()) if (reg.test(member.user.username)) results.push(member.user); let querySearch; if (results.length > 0) { const regWord = new RegExp(`\\b${regExpEsc(arg)}\\b`, "i"); const filtered = results.filter(user => regWord.test(user.username)); querySearch = filtered.length > 0 ? filtered : results; } else { querySearch = results; } switch (querySearch.length) { case 0: throw `${possible.name} Must be a valid name, id or user mention`; case 1: return querySearch[0]; default: throw `Found multiple matches: \`${querySearch.map(user => user.tag).join("`, `")}\``; } } resolveUser(query, guild) { if (query instanceof GuildMember) return query.user; if (query instanceof User) return query; if (typeof query === "string") { if (USER_REGEXP.test(query)) return guild.client.users.fetch(USER_REGEXP.exec(query)[1]).catch(() => null); if (/\w{1,32}#\d{4}/.test(query)) { const res = guild.members.cache.find(member => member.user.tag === query); return res ? res.user : null; } } return null; } }; ================================================ FILE: src/commands/Developer/eval.js ================================================ const { Command, Stopwatch, Type, klasaUtil: util, util: { haste } } = require("../../index"); const { inspect } = require("util"); module.exports = class extends Command { constructor(...args) { super(...args, { aliases: ["ev"], description: language => language.get("COMMAND_EVAL_DESCRIPTION"), extendedHelp: language => language.get("COMMAND_EVAL_EXTENDED"), guarded: true, hidden: true, permissionLevel: 10, usage: "" }); } async run(msg, [code]) { const flagTime = "wait" in msg.flagArgs ? Number(msg.flagArgs.wait) : 30000; const { success, result, time, type } = await this.timedEval(msg, code, flagTime); if (msg.flagArgs.silent) { if (!success && result && result.stack) this.client.emit("error", result.stack); return null; } const footer = util.codeBlock("ts", type); const sendAs = msg.flagArgs.output || msg.flagArgs["output-to"] || (msg.flagArgs.log ? "log" : null); return this.handleMessage(msg, { sendAs, hastebinUnavailable: false, url: null }, { success, result, time, footer }); } async handleMessage(msg, options, { success, result, time, footer }) { switch (options.sendAs) { case "file": { if (msg.channel.attachable) return msg.send(`**Type:**${footer}\n\n${time}`, { files: [{ attachment: Buffer.from(result), name: "output.txt" }] }); await this.getTypeOutput(msg, options); return this.handleMessage(msg, options, { success, result, time, footer }); } case "haste": case "hastebin": { if (!options.url) options.url = await haste(result).catch(() => null); if (options.url) return msg.sendMessage(`**Output:**\n${options.url}\n\n**Type:**${footer}\n${time}`); options.hastebinUnavailable = true; await this.getTypeOutput(msg, options); return this.handleMessage(msg, options, { success, result, time, footer }); } case "console": case "log": { this.client.emit("log", result); return msg.sendMessage(`${footer}\n${time}`); } case "none": return null; default: { if (result.length > 2000) { await this.getTypeOutput(msg, options); return this.handleMessage(msg, options, { success, result, time, footer }); } return msg.sendMessage(msg.language.get(success ? "COMMAND_EVAL_OUTPUT" : "COMMAND_EVAL_ERROR", time, util.codeBlock("js", result), footer)); } } } async getTypeOutput(msg, options) { const _options = ["log"]; if (msg.channel.attachable) _options.push("file"); if (!options.hastebinUnavailable) _options.push("hastebin"); let _choice; do { _choice = await msg.prompt(`Choose one of the following options: ${_options.join(", ")}`).catch(() => ({ content: "none" })); } while (!["file", "haste", "hastebin", "console", "log", "default", "none", null].includes(_choice.content)); options.sendAs = _choice.content; } timedEval(msg, code, flagTime) { return Promise.race([ util.sleep(flagTime).then(() => ({ success: false, result: msg.language.get("COMMAND_EVAL_TIMEOUT", flagTime / 1000), time: "⏱ ...", type: "EvalTimeoutError" })), this.eval(msg, code) ]); } // Eval the input async eval(msg, code) { const stopwatch = new Stopwatch(); let success, syncTime, asyncTime, result; let thenable = false; let type; try { if (msg.flagArgs.async) code = `(async () => {\n${code}\n})();`; result = eval(code); syncTime = stopwatch.toString(); type = new Type(result); if (util.isThenable(result)) { thenable = true; stopwatch.restart(); result = await result; asyncTime = stopwatch.toString(); } success = true; } catch (error) { if (!syncTime) syncTime = stopwatch.toString(); if (thenable && !asyncTime) asyncTime = stopwatch.toString(); if (!type) type = new Type(error); result = error; success = false; } stopwatch.stop(); if (typeof result !== "string") { result = result instanceof Error ? result.stack : inspect(result, { depth: msg.flagArgs.depth ? parseInt(msg.flagArgs.depth) || 0 : 0, showHidden: Boolean(msg.flagArgs.showHidden) }); } return { success, type, time: this.formatTime(syncTime, asyncTime), result: util.clean(result) }; } formatTime(syncTime, asyncTime) { return asyncTime ? `⏱ ${asyncTime}<${syncTime}>` : `⏱ ${syncTime}`; } }; ================================================ FILE: src/commands/Developer/exec.js ================================================ const { Command, util: { exec, codeBlock } } = require("klasa"); module.exports = class extends Command { constructor(...args) { super(...args, { aliases: ["execute"], description: "-BOT OWNER ONLY-", guarded: true, hidden: true, permissionLevel: 10, usage: "" }); } async run(msg, [input]) { const result = await exec(input, { timeout: "timeout" in msg.flagArgs ? Number(msg.flagArgs.timeout) : 60000 }) .catch(error => ({ stdout: null, stderr: error })); const output = result.stdout ? `**\`OUTPUT\`**${codeBlock("prolog", result.stdout)}` : ""; const outerr = result.stderr ? `**\`ERROR\`**${codeBlock("prolog", result.stderr)}` : ""; return msg.sendMessage([output, outerr].join("\n")); } }; ================================================ FILE: src/commands/Developer/setgame.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { usageDelim: " ", subcommands: true, hidden: true, aliases: ["sg"], permissionLevel: 10, usage: " [...]", description: language => language.get("COMMAND_SG_DESCRIPTION") }); } async text(msg, [...game]) { await this.client.shard.broadcastEval(`this.user.setPresence({ activity: { name: '${game.join(" ")}', status: "online" }})`); return msg.sendMessage(`**Playing status has been changed to:** ${game.join(" ")}`); } async stream(msg, [...game]) { await this.client.shard.broadcastEval(`this.user.setPresence({ activity: { name: '${game.join(" ")}', type: "STREAMING", status: "online", url: "https://twitch.tv/AdityaTD" }})`); return msg.sendMessage(`**Playing status has been changed to:** ${game.join(" ")}`); } }; ================================================ FILE: src/commands/Developer/togglepatronguild.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { aliases: ["tpg"], hidden: true, permissionLevel: 10, usage: "", description: language => language.get("COMMAND_TPG_DESCRIPTION") }); } async run(msg, [guild]) { const exists = this.client.settings.get("pGuilds").includes(guild); await this.client.settings.update("pGuilds", guild); return msg.sendMessage(`${exists ? "**Removed Guild:**" : "**Added Guild:**"} ${guild}`); } }; ================================================ FILE: src/commands/Game Statistics/clashofclans.js ================================================ const { Command, MessageEmbed, config } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 15, aliases: ["cocstats", "coc"], requiredPermissions: ["EMBED_LINKS"], description: language => language.get("COMMAND_COCSTATS_DESCRIPTION"), usage: "", extendedHelp: "No extended help available." }); } async run(msg, [tag]) { const playerData = await this.fetchURL(`https://api.clashofclans.com/v1/players/${encodeURIComponent(tag.toUpperCase())}`, { headers: { Accept: "application/json", Authorization: `Bearer ${config.apis.cocapi}` } }).catch(e => { console.error(e); throw `${this.client.emotes.cross} ***${msg.language.get("CMD_COC_TAG")}***`; }); if (!playerData) return msg.reply(msg.language.get("CMD_COC_DATA")); const embed = new MessageEmbed() .setColor("#FCCF6E") .setAuthor(playerData.name, playerData.league ? playerData.league.iconUrls.small : null) .setThumbnail(`https://coc.guide/static/imgs/other/town-hall-${playerData.townHallLevel}.png`) .addField("❯ League", playerData.league ? playerData.league.name : "N/A", true) .addField("❯ Trophies", playerData.trophies, true) .addField("❯ War Stars", playerData.warStars, true) .addField("❯ Best Trophies", playerData.bestTrophies, true); if (playerData.clan) embed.setFooter(`${playerData.role} of ${playerData.clan.name}\u200e ${playerData.clan.tag}`, playerData.clan.badgeUrls.small); let troopLevels = "", spellLevels = "", heroLevels = ""; for (const troop of playerData.troops) troopLevels += `${troop.name}: ${troop.level} ${troop.level === troop.maxLevel ? "🔥\n" : "\n"}`; for (const spell of playerData.spells) spellLevels += `${spell.name}: ${spell.level} ${spell.level === spell.maxLevel ? "🔥\n" : "\n"}`; for (const hero of playerData.heroes) heroLevels += `${hero.name}: ${hero.level} ${hero.level === hero.maxLevel ? "🔥\n" : "\n"}`; if (troopLevels) embed.addField("❯ Troop Levels", troopLevels, true); if (spellLevels) embed.addField("❯ Spell Levels", spellLevels, true); if (heroLevels) embed.addField("❯ Hero Levels", heroLevels, true); return msg.sendMessage(embed); } }; ================================================ FILE: src/commands/Game Statistics/csgo.js ================================================ const { Command, MessageEmbed, config } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 15, aliases: ["counterstrike"], requiredPermissions: ["EMBED_LINKS", "ATTACH_FILES"], description: language => language.get("COMMAND_CSGO_DESCRIPTION"), usage: "", extendedHelp: "No extended help available." }); } async run(msg, [username]) { try { const userData = await this.fetchURL(`http://api.steampowered.com/ISteamUser/ResolveVanityURL/v0001/`, { query: { key: config.apis.csgo, vanityurl: username } }); if (userData.response.success !== 1) throw `${this.client.emotes.cross} ***${msg.language.get("CMD_CSGO_NF")}***`; const steamID = userData.response.steamid; const userStats = await this.fetchURL(`http://api.steampowered.com/ISteamUserStats/GetUserStatsForGame/v0002/`, { query: { key: config.apis.csgo, appid: 730, steamid: steamID } }); const { stats } = userStats.playerstats; return msg.sendMessage(new MessageEmbed() .setAuthor("Counter Strike : Global Offensive - PenguBot", "https://i.imgur.com/0S2t2qQ.png") .setFooter("© PenguBot.com") .setThumbnail("https://i.imgur.com/0S2t2qQ.png") .setColor("#FB9E01") .setTimestamp() .addField("❯ Steam Username", username, true) .addField("❯ KDR", (stats ? stats.find(a => a.name === "total_kills").value / stats.find(a => a.name === "total_deaths").value : 0).toFixed(2), true) .addField("❯ Total Kills", stats.find(a => a.name === "total_kills") ? stats.find(a => a.name === "total_kills").value.toLocaleString() : 0, true) .addField("❯ Total Deaths", stats.find(a => a.name === "total_deaths") ? stats.find(a => a.name === "total_deaths").value.toLocaleString() : 0, true) .addField("❯ Total Wins", stats.find(a => a.name === "total_wins") ? stats.find(a => a.name === "total_wins").value.toLocaleString() : 0, true) .addField("❯ Total MVPs", stats.find(a => a.name === "total_mvps") ? stats.find(a => a.name === "total_mvps").value.toLocaleString() : 0, true) .addField("❯ Time Played (Not Idle)", `${stats ? (stats.find(a => a.name === "total_time_played").value / 60 / 60).toFixed(2) : 0} Hour(s)`, true) .addField("❯ Knife Kills", stats.find(a => a.name === "total_kills_knife") ? stats.find(a => a.name === "total_kills_knife").value.toLocaleString() : 0, true)); } catch (e) { return msg.reply("Oopsie! I came across an error, please try again or contact us!"); } } }; ================================================ FILE: src/commands/Game Statistics/fortnite.js ================================================ const { Command, MessageEmbed, config } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 15, aliases: ["fnbr", "fnbrstats", "fortnitestats"], permissionLevel: 0, requiredPermissions: ["EMBED_LINKS", "ATTACH_FILES"], description: language => language.get("COMMAND_FORTNITE_DESCRIPTION"), usage: " ", usageDelim: " ", extendedHelp: "No extended help available." }); } async run(msg, [platform, username]) { const data = await this.fetchURL(`https://api.fortnitetracker.com/v1/profile/${platform}/${encodeURIComponent(username)}`, { headers: { "TRN-Api-Key": config.apis.fortnite } }); if (!data) throw `${this.client.emotes.cross} ***${msg.language.get("CMD_FORT_PLAT")}***`; if (data.error) throw `${this.client.emotes.cross} ***${msg.language.get("CMD_FORT_ERR")}***`; return msg.sendEmbed(new MessageEmbed() .setAuthor("Fortnite Battle Royale Statistics - PenguBot", "https://i.imgur.com/EER1jFB.png") .setFooter("© PenguBot.com") .setThumbnail("https://i.imgur.com/EER1jFB.png") .setColor("#151842") .setTimestamp() .setDescription([`❯ **Epic Username:** ${data.epicUserHandle}`, `❯ **Score:** ${data.lifeTimeStats.find(a => a.key === "Score") ? data.lifeTimeStats.find(a => a.key === "Score").value.toLocaleString() : "N/A"}`, `❯ **Matches Played:** ${data.lifeTimeStats.find(a => a.key === "Matches Played") ? data.lifeTimeStats.find(a => a.key === "Matches Played").value.toLocaleString() : "N/A"}`, `❯ **Kills:** ${data.lifeTimeStats.find(a => a.key === "Kills") ? data.lifeTimeStats.find(a => a.key === "Kills").value.toLocaleString() : "N/A"}`, `❯ **Wins:** ${data.lifeTimeStats.find(a => a.key === "Wins") ? data.lifeTimeStats.find(a => a.key === "Wins").value.toLocaleString() : "N/A"}`, `❯ **K/D:** ${data.lifeTimeStats.find(a => a.key === "K/d") ? data.lifeTimeStats.find(a => a.key === "K/d").value : "N/A"}`, `❯ **Top 3s:** ${data.lifeTimeStats.find(a => a.key === "Top 3s") ? data.lifeTimeStats.find(a => a.key === "Top 3s").value.toLocaleString() : "N/A"}`, `❯ **Platform:** ${data.platformNameLong}`])); } }; ================================================ FILE: src/commands/Game Statistics/osu.js ================================================ const { Command, config, MessageEmbed, Duration } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["osustats"], requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_OSU_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [username]) { const data = await this.fetchURL(`https://osu.ppy.sh/api/get_user`, { type: "json", query: { k: config.apis.osu, u: encodeURIComponent(username) } }).then(a => a[0]).catch(() => null); if (!data) return msg.reply(msg.language.get("CMD_OSU_ERR")); const embed = new MessageEmbed() .setThumbnail(`https://a.ppy.sh/${data.user_id}`) .setColor("#EF5E9F") .setAuthor(data.username, `https://a.ppy.sh/${data.user_id}`, "https://pengubot.com") .addField("Total Score", Number(data.total_score).toLocaleString(), true) .addField("Ranked Score", Number(data.ranked_score).toLocaleString(), true) .addField("Level", Number(data.level).toFixed(0).toLocaleString(), true) .addField("Count 50", Number(data.count50).toLocaleString(), true) .addField("Count 100", Number(data.count100).toLocaleString(), true) .addField("Count 300", Number(data.count300).toLocaleString(), true) .addField("Global Rank", Number(data.pp_rank).toLocaleString(), true) .addField("SS Rank", Number(data.count_rank_ss).toLocaleString(), true) .addField("SSH Rank", Number(data.count_rank_ssh).toLocaleString(), true) .addField("S Rank", Number(data.count_rank_s).toLocaleString(), true) .addField("A Rank", Number(data.count_rank_a).toLocaleString(), true) .addField("Accuracy", `${Number(data.accuracy).toFixed(2)}%`, true) .addField("Time Played", Duration.toNow(Date.now() - (data.total_seconds_played * 1000)), true) .setFooter("© PenguBot.com"); return msg.channel.send({ embed }); } }; ================================================ FILE: src/commands/Games/8ball.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); 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 = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["yesorno"], description: language => language.get("COMMAND_8BALL_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg) { return msg.reply(`🎱 ${answers[Math.floor(Math.random() * answers.length)]}`); } }; ================================================ FILE: src/commands/Games/rps.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); const choices = ["rock", "paper", "scissors"]; module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["rockpaperscissors", "rpsgame"], requiredPermissions: ["ATTACH_FILES", "EMBED_LINKS"], description: language => language.get("COMMAND_RPS_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [move]) { if (!move.match(/Rock|Paper|Scissors/i)) return msg.reply(`${msg.language.get("CMD_RPS_INVALID")} \`rock\`. \`paper\` or \`scissors\`.`); const outcome = choices[Math.floor(Math.random() * choices.length)]; const choice = move.toLowerCase(); if (choice === "rock") { if (outcome === "rock") return msg.reply("***Rock! That's a tie!***"); if (outcome === "paper") return msg.reply("***Paper! I win, you lose!***"); if (outcome === "scissors") return msg.reply("***Scissors! No! You won...***"); } if (choice === "paper") { if (outcome === "rock") return msg.reply("***Rock! No! You won...***"); if (outcome === "paper") return msg.reply("***Paper! Yeah! That's a tie!***"); if (outcome === "scissors") return msg.reply("***Scissors! I win, you lose!***"); } if (choice === "scissors") { if (outcome === "rock") return msg.reply("***Rock! I win, you lose!***"); if (outcome === "paper") return msg.reply("***Paper! No! You won...***"); if (outcome === "scissors") return msg.reply("***Scissors! Yeah! That's a tie!***"); } } }; ================================================ FILE: src/commands/Games/slots.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); const slots = ["🍔", "🍟", "🌭", "🍕", "🌮", "🍘", "🍫", "🍿", "🍩"]; const { MessageEmbed } = require("discord.js"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["slotsroll"], requiredPermissions: ["USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_SLOTS_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "[Snowflakes:integer]" }); } async run(msg, [Snowflakes = 1]) { if (Snowflakes < 1) return msg.reply(`${msg.language.get("CMD_SLOTS_INVALID")}`); await msg.author.settings.sync(true); if (msg.author.settings.get("snowflakes") < Snowflakes) return msg.reply(`❄ You don't have \`${Snowflakes}\` Snowflakes to use slots, use \`${msg.guild.settings.prefix}daily\` command to get some for free!`); const Mone = slots[Math.floor(Math.random() * slots.length)]; const Mtwo = slots[Math.floor(Math.random() * slots.length)]; const Mthree = slots[Math.floor(Math.random() * slots.length)]; const Tone = slots[Math.floor(Math.random() * slots.length)]; const Ttwo = slots[Math.floor(Math.random() * slots.length)]; const Tthree = slots[Math.floor(Math.random() * slots.length)]; const Bone = slots[Math.floor(Math.random() * slots.length)]; const Btwo = slots[Math.floor(Math.random() * slots.length)]; const Bthree = slots[Math.floor(Math.random() * slots.length)]; if (Mone === Mtwo || Mone === Mthree || Mthree === Mtwo) { const flakesPercent = Math.round(Snowflakes * 60 / 100) >= 1 ? Math.round(Snowflakes * 50 / 100) : 1; const winFlakes = msg.author.settings.get("snowflakes") + Snowflakes + flakesPercent; const embed = new MessageEmbed() .setFooter("© PenguBot.com") .setTimestamp() .setDescription(`${Tone} | ${Ttwo} | ${Tthree}\n${Mone} | ${Mtwo} | ${Mthree}\n${Bone} | ${Btwo} | ${Bthree}`) .setColor("#43A047"); await msg.author.settings.update("snowflakes", winFlakes); return msg.sendMessage(`***${msg.author} You just won ❄ \`${flakesPercent}\`, you now have ❄ \`${msg.author.settings.get("snowflakes")}\`! Good job!***`, { embed: embed }); } const embed = new MessageEmbed() .setFooter("© PenguBot.com") .setTimestamp() .setDescription(`${Tone} | ${Ttwo} | ${Tthree}\n${Mone} | ${Mtwo} | ${Mthree}\n${Bone} | ${Btwo} | ${Bthree}`) .setColor("#d32f2f"); await msg.author.settings.update("snowflakes", msg.author.settings.get("snowflakes") - Snowflakes); return msg.sendMessage(`***${msg.author} You lost ❄ \`${Snowflakes}\`, you now have ❄ \`${msg.author.settings.get("snowflakes")}\`! Better luck next time!***`, { embed: embed }); } }; ================================================ FILE: src/commands/General/Chat Bot Info/donate.js ================================================ const Command = require("../../../lib/structures/KlasaCommand"); const { MessageEmbed } = require("discord.js"); module.exports = class extends Command { constructor(...args) { super(...args, { aliases: ["patreon", "patron", "premium"], guarded: true, requiredPermissions: ["EMBED_LINKS", "ATTACH_FILES"], description: language => language.get("COMMAND_DONATE_DESCRIPTION") }); } async run(msg) { const embed = new MessageEmbed() .setDescription(msg.language.get("COMMAND_DONATE")) .setAuthor("PenguBot - Premium", this.client.user.displayAvatarURL(), "https://www.pengubot.com") .setThumbnail("https://i.imgur.com/bSOBK4s.png") .setColor("RANDOM"); return msg.sendEmbed(embed); } }; ================================================ FILE: src/commands/General/Chat Bot Info/help.js ================================================ const { Command, klasaUtil: { isFunction }, MessageEmbed } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { aliases: ["commands"], guarded: true, requiredPermissions: ["EMBED_LINKS"], description: language => language.get("COMMAND_HELP_DESCRIPTION"), usage: "(Command:cmd)" }); this.createCustomResolver("cmd", (arg, possible, msg) => { if (!arg || arg === "") return undefined; return this.client.arguments.get("cmd").run(arg, possible, msg); }); } async run(msg, [cmd]) { if (cmd) { const cmdEmbed = new MessageEmbed() .setDescription([`❯ **Command:** ${cmd.name}`, `❯ **Description:** ${isFunction(cmd.description) ? cmd.description(msg.language) : cmd.description}`, `❯ **Usage:** ${cmd.usage.fullUsage(msg)}`, `❯ **Extended Help:** ${isFunction(cmd.extendedHelp) ? cmd.extendedHelp(msg.language) : cmd.extendedHelp}`]); return msg.sendEmbed(cmdEmbed); } let prefixHelp; if (msg.guild) prefixHelp = `PenguBot's Prefix ${msg.guild ? `in ${msg.guild.name} is \`${msg.guild.settings.get("prefix")}\`. i.e. \`${msg.guild.settings.get("prefix")}dog\`` : `is \`p!\`. i.e. \`p!dog\``}`; const embed = new MessageEmbed() .setAuthor("PenguBot - Help", this.client.user.displayAvatarURL(), "https://www.pengubot.com") .setDescription([prefixHelp, "", `❯ **List of Commands:** [PenguBot.com/commands](https://www.pengubot.com/commands)`, `❯ **Official Discord Server:** [PenguBot.com/support](https://www.pengubot.com/support)`, `❯ **Add PenguBot to Your Server:** [PenguBot.com/invite](https://www.pengubot.com/invite)`, `❯ **PenguBot Premium:** [PenguBot.com/premium](https://pengubot.com/premium)`]) .setTimestamp() .setColor("RANDOM") .setFooter("PenguBot.com"); return msg.sendEmbed(embed); } }; ================================================ FILE: src/commands/General/Chat Bot Info/info.js ================================================ const Command = require("../../../lib/structures/KlasaCommand"); const { MessageEmbed } = require("discord.js"); module.exports = class extends Command { constructor(...args) { super(...args, { aliases: ["details", "what"], guarded: true, requiredPermissions: ["EMBED_LINKS"], description: language => language.get("COMMAND_INFO_DESCRIPTION") }); } async run(msg) { const embed = new MessageEmbed() .setDescription(msg.language.get("COMMAND_INFO")) .setAuthor("PenguBot - Information", this.client.user.displayAvatarURL(), "https://www.pengubot.com") .setColor("RANDOM"); return msg.sendEmbed(embed); } }; ================================================ FILE: src/commands/General/Chat Bot Info/nodeinfo.js ================================================ const Command = require("../../../lib/structures/KlasaCommand"); const { MessageEmbed } = require("discord.js"); module.exports = class extends Command { constructor(...args) { super(...args, { requiredPermissions: [], aliases: ["nodesinfo"], cooldown: 5, description: "", extendedHelp: "No extended help available." }); } async run(msg) { const embed = new MessageEmbed() .setAuthor("PenguBot's Music Nodes Information", this.client.user.displayAvatarURL(), "https://www.pengubot.com") .setTimestamp() .setFooter("© PenguBot.com"); for (const node of this.client.lavalink.nodes.values()) { embed.addField(node.id, `**Players:** ${node.stats.playingPlayers} / ${node.stats.players} **Memory:** ${(node.stats.memory.used / 1024 / 1024).toFixed(2)} / ${(node.stats.memory.allocated / 1024 / 1024).toFixed(2)} **CPU:** ${node.stats.cpu.systemLoad.toFixed(2) * 100}%`, true); } return msg.sendEmbed(embed); } }; ================================================ FILE: src/commands/General/Chat Bot Info/settings.js ================================================ const { Command, RichDisplay, MessageEmbed } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 5, aliases: ["configure", "setup"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: "Configure PenguBot on your server.", extendedHelp: "No extended help available.", usage: "[general|music|autoroles|levelroles|selfroles|automod|logs|moderation|starboard|customcommands|greetings] [setting:string] [value:string] [...]", usageDelim: " ", guarded: true, subCommands: true }); } async run(msg, [type, ...params]) { if (type) return this[type](msg, params); const prefix = msg.guild.settings.get("prefix") || "p!"; const embed = new MessageEmbed() .setAuthor("Server Settings", msg.guild.iconURL(), "https://pengubot.com") .setDescription(`Configure PenguBot to your liking on **${msg.guild.name}** and recieve helpful tips per category.`) .addField("⚙️ General", `\`\`\`${prefix}settings general\`\`\``, true) .addField("🎵 Music", `\`\`\`${prefix}settings music\`\`\``, true) .addField("🧑‍🦱 Auto Join Roles", `\`\`\`${prefix}settings autoroles\`\`\``, true) .addField("⬆️ Level Based Roles", `\`\`\`${prefix}settings levelroles\`\`\``, true) .addField("🙇 Self Assignable Roles", `\`\`\`${prefix}settings selfroles\`\`\``, true) .addField("🗨️ Logging", `\`\`\`${prefix}settings logs\`\`\``, true) .addField("🤖 AI Moderation", `\`\`\`${prefix}settings automod\`\`\``, true) .addField("⚔️ Moderation", `\`\`\`${prefix}settings moderation\`\`\``, true) .addField("⭐ Starboard", `\`\`\`${prefix}settings starboard\`\`\``, true) .addField("🛠️ Custom Commands", `\`\`\`${prefix}settings customcommands\`\`\``, true) .addField("💁 Welcome and Leave Messages", `\`\`\`${prefix}settings greetings\`\`\``, true) .setFooter("PenguBot.com") .setTimestamp(); return msg.sendEmbed(embed); } // --- GENERAL SETTINGS --- async general(msg, [setting, value]) { if (!setting) { const prefix = msg.guild.settings.get("prefix") || "p!"; const embed = new MessageEmbed() .setTitle("⚙️ General - Settings") .addField("Prefix", `\`\`\`${prefix}settings general prefix \`\`\``) .addField("Toggle a Command", `\`\`\`${prefix}settings general togglecmd \`\`\``) .addField("Toggle a Command Category", `\`\`\`${prefix}settings general togglecategory \`\`\``) .addField("Change Language", `\`\`\`${prefix}settings general language \`\`\``) .addField("Toggle Levelup Messages", `\`\`\`${prefix}settings general togglelevelup\`\`\``) .addField("Change Levelup Type", `\`\`\`${prefix}settings general leveluptype \`\`\``) .setFooter("PenguBot.com") .setTimestamp(); return msg.sendEmbed(embed); } setting = setting.toLowerCase(); switch (setting) { case "prefix": { await this.client.commands.get("prefix").run(msg, [value]); break; } case "togglecmd": { if (!value) return msg.reply("You must specify a command to toggle."); const arg = await this.client.arguments.get("command").run(value); if (arg.guarded) return msg.reply("This command can not be disabled as it's required by PenguBot for configuration."); await this.client.commands.get("disablecmd").run(msg, [arg]); break; } case "togglecategory": { if (!value) return msg.reply("You must specify a command category to toggle."); await this.client.commands.get("togglecategory").run(msg, [value]); break; } case "language": { if (!value) return msg.reply("You must specify a language to use this command."); await this.client.commands.get("setlanguage").run(msg, [value]); break; } case "togglelevelup": { await this.client.commands.get("levelup").toggle(msg); break; } case "leveluptype": { if (!value) return msg.reply("You must specify a type for level up messages from `guild` or `global`."); await this.client.commands.get("levelup").type(msg, [value]); break; } default: { await msg.reply("That setting is not a valid option, please select a valid setting to update."); } } } // --- MUSIC SETTINGS --- async music(msg, [setting, ...value]) { if (!setting) { const prefix = msg.guild.settings.get("prefix") || "p!"; const embed = new MessageEmbed() .setTitle("🎵 Music - Settings") .addField("Volume", `\`\`\`${prefix}settings music volume [volume]\`\`\``) .addField("Toggle DJ Mode", `\`\`\`${prefix}settings music toggledj\`\`\``) .addField("Add DJ Member/Role", `\`\`\`${prefix}managedj add \`\`\``) .addField("Remove DJ Member/Role", `\`\`\`${prefix}managedj remove \`\`\``) .addField("List DJ Members/Roles", `\`\`\`${prefix}managedj list\`\`\``) .setFooter("PenguBot.com") .setTimestamp(); return msg.sendEmbed(embed); } setting = setting.toLowerCase(); switch (setting) { case "volume": { await this.client.commands.get("volume").run(msg, [value.length ? value[0] : ""]); break; } case "toggledj": { await this.client.commands.get("toggledj").run(msg); break; } default: { await msg.reply("That setting is not a valid option, please select a valid setting to update."); } } } // --- AUTOROLES SETTINGS --- async autoroles(msg, [setting]) { if (!setting) { const prefix = msg.guild.settings.get("prefix") || "p!"; const embed = new MessageEmbed() .setTitle("🧑‍🦱 Auto Join Roles - Settings") .setDescription("**Info:** These roles get added to a user as soon as they join the server.") .addField("Add Auto Role", `\`\`\`${prefix}addautorole \`\`\``) .addField("Remove Auto Role", `\`\`\`${prefix}removeautorole \`\`\``) .addField("Toggle Auto Roles", `\`\`\`${prefix}settings autoroles toggle\`\`\``) .addField("List Auto Roles", `\`\`\`${prefix}settings autoroles list\`\`\``) .setFooter("PenguBot.com") .setTimestamp(); return msg.sendEmbed(embed); } setting = setting.toLowerCase(); switch (setting) { case "toggle": { await this.client.commands.get("toggleautoroles").run(msg); break; } case "list": { const roles = msg.guild.settings.get("roles.autorole"); if (!roles.length) return msg.sendMessage(`${this.client.emotes.cross} There are currently no auto join roles set for this server.`); const pages = new RichDisplay(new MessageEmbed() .setTitle("Use the reactions to change pages, select a page, or stop viewing the roles") .setAuthor("List of Auto Join Roles", msg.guild.iconURL()) .setDescription("Scroll between pages to see the self assignable roles.") .setColor("#428bca") ); pages.addPage(t => t.setDescription(roles.map(role => `\`-\` ${msg.guild.roles.cache.get(role) || "Role Removed"}`).join("\n"))); pages.run(await msg.sendMessage(`${this.client.emotes.loading} ***Loading Roles...***`), { time: 120000, filter: (reaction, user) => user === msg.author }); break; } default: { await msg.reply("That setting is not a valid option, please select a valid setting to update."); } } } // --- LEVEL ROLES SETTINGS --- async levelroles(msg, [setting]) { if (!setting) { const prefix = msg.guild.settings.get("prefix") || "p!"; const embed = new MessageEmbed() .setTitle("⬆️ Level Roles - Settings") .setDescription("**Info:** These roles get added to a user as soon as they level up to a particular level on the server.") .addField("Add Level Role", `\`\`\`${prefix}managelevelrole add \`\`\``) .addField("Remove Level Role", `\`\`\`${prefix}managelevelrole remove \`\`\``) .addField("Toggle Level Roles", `\`\`\`${prefix}settings levelroles toggle\`\`\``) .addField("List Level Roles", `\`\`\`${prefix}settings levelroles list\`\`\``) .setFooter("PenguBot.com") .setTimestamp(); return msg.sendEmbed(embed); } setting = setting.toLowerCase(); switch (setting) { case "toggle": { await this.client.commands.get("togglelevelroles").run(msg); break; } case "list": { await this.client.commands.get("listlevelroles").run(msg); break; } default: { await msg.reply("That setting is not a valid option, please select a valid setting to update."); } } } // --- SELF ROLES SETTINGS --- async selfroles(msg, [setting]) { if (!setting) { const prefix = msg.guild.settings.get("prefix") || "p!"; const embed = new MessageEmbed() .setTitle("🙇 Self Assignable Roles - Settings") .setDescription("**Info:** These roles can be self assigned or removed by a user on themselves.") .addField("Add/Remove Self Role", `\`\`\`${prefix}manageselfrole \`\`\``) .addField("Toggle Self Roles", `\`\`\`${prefix}settings selfroles toggle\`\`\``) .addField("List Self Roles", `\`\`\`${prefix}settings selfroles list\`\`\``) .setFooter("PenguBot.com") .setTimestamp(); return msg.sendEmbed(embed); } setting = setting.toLowerCase(); switch (setting) { case "toggle": { await this.client.commands.get("toggleselfroles").run(msg); break; } case "list": { await this.client.commands.get("selfroles").list(msg); break; } default: { await msg.reply("That setting is not a valid option, please select a valid setting to update."); } } } // --- AUTO MODERATION SETTINGS --- async automod(msg, [setting]) { if (!setting) { const prefix = msg.guild.settings.get("prefix") || "p!"; const embed = new MessageEmbed() .setTitle("🤖 AI and Auto Moderation - Settings") .setDescription([ "**Info:** AI Moderation system reads the message a user has sent and according to the defined threshold it will filter out the messages to keep your server clean.", "By using AI moderation, you agree to [PenguBot's Privacy Policy](https://pengubot.com/privacy)." ].join("\n")) .addField("Toggle Invites Deletion", `\`\`\`${prefix}settings automod invites\`\`\``) .addField("Toggle AI Moderation Filter", `\`\`\`${prefix}automod toggle [filter]\`\`\``) .addField("Change AI Filter Threshold", `\`\`\`${prefix}automod \`\`\``) .setFooter("PenguBot.com") .setTimestamp(); return msg.sendEmbed(embed); } setting = setting.toLowerCase(); switch (setting) { case "invites": { await this.client.commands.get("toggleinvites").run(msg); break; } default: { await msg.reply("That setting is not a valid option, please select a valid setting to update."); } } } // --- LOGGING SETTINGS --- async logs(msg, [setting, ...value]) { if (!setting) { const prefix = msg.guild.settings.get("prefix") || "p!"; const embed = new MessageEmbed() .setTitle("🗨️ Logs - Settings") .setDescription("**Info:** Server logs are general user activity based and mod logs are based on moderative actions.") .addField("Server Logs Channel", `\`\`\`${prefix}settings logs serverchannel \`\`\``) .addField("Toggle Server Logs", `\`\`\`${prefix}settings logs servertoggle [type]\`\`\``) .addField("Moderation Logs Channel", `\`\`\`${prefix}settings logs modchannel \`\`\``) .addField("Toggle Moderation Logs", `\`\`\`${prefix}settings logs modtoggle\`\`\``) .setFooter("PenguBot.com") .setTimestamp(); return msg.sendEmbed(embed); } setting = setting.toLowerCase(); switch (setting) { case "serverchannel": { if (!value.length) return msg.reply("You must provide a channel to use this setting."); const arg = await this.client.arguments.get("channelname").run(value[0], null, msg); await this.client.commands.get("loggingchannel").run(msg, [arg]); break; } case "servertoggle": { await this.client.commands.get("log").run(msg, [value.length ? value[0] : null]); break; } case "modchannel": { if (!value.length) return msg.reply("You must provide a channel to use this setting."); const arg = await this.client.arguments.get("channelname").run(value[0], null, msg); await this.client.commands.get("modlogs").channel(msg, [arg]); break; } case "modtoggle": { await this.client.commands.get("modlogs").toggle(msg); break; } default: { await msg.reply("That setting is not a valid option, please select a valid setting to update."); } } } // --- MODERATION SETTINGS --- async moderation(msg) { const prefix = msg.guild.settings.get("prefix") || "p!"; const embed = new MessageEmbed() .setTitle("⚔️ Moderation - Settings") .addField("Add Pengu Admin User/Role", `\`\`\`${prefix}manageadmin add \`\`\``) .addField("Remove Pengu Admin User/Role", `\`\`\`${prefix}manageadmin remove \`\`\``) .addField("List Pengu Admin Users/Roles", `\`\`\`${prefix}manageadmin list\`\`\``) .addField("Add Pengu Moderator User/Role", `\`\`\`${prefix}managemod add \`\`\``) .addField("Remove Pengu Moderator User/Role", `\`\`\`${prefix}managemod remove \`\`\``) .addField("List Pengu Moderator Users/Roles", `\`\`\`${prefix}managemod list\`\`\``) .setFooter("PenguBot.com") .setTimestamp(); return msg.sendEmbed(embed); } // --- STARBOARD SETTINGS --- async starboard(msg, [setting, ...value]) { if (!setting) { const prefix = msg.guild.settings.get("prefix") || "p!"; const embed = new MessageEmbed() .setTitle("⭐ Starboad - Settings") .addField("Toggle Starboard", `\`\`\`${prefix}settings starboard toggle\`\`\``) .addField("Stars Requirement", `\`\`\`${prefix}settings starboard required \`\`\``) .addField("Starboard Channel", `\`\`\`${prefix}settings starboard channel \`\`\``) .setFooter("PenguBot.com") .setTimestamp(); return msg.sendEmbed(embed); } setting = setting.toLowerCase(); switch (setting) { case "toggle": { await this.client.commands.get("togglestarboard").run(msg); break; } case "required": { if (!value.length) return msg.reply("You must specify a number."); let num; try { num = Number.parseInt(value[0]); } catch (e) { return msg.reply("Not a valid number."); } if (!Number.isInteger(num)) return msg.reply("That is not a valid number."); await this.client.commands.get("starsrequired").run(msg, [num]); break; } case "channel": { if (!value.length) return msg.reply("You must provide a channel to use this setting."); const arg = await this.client.arguments.get("channelname").run(value[0], null, msg); await this.client.commands.get("starboardchannel").run(msg, [arg]); break; } default: { await msg.reply("That setting is not a valid option, please select a valid setting to update."); } } } // --- CUSTOM COMMANDS SETTINGS --- async customcommands(msg, [setting]) { if (!setting) { const prefix = msg.guild.settings.get("prefix") || "p!"; const embed = new MessageEmbed() .setTitle("🛠️ Custom Commands - Settings") .setDescription("**Tip:** You can make the custom commands highly advance and make them perform certain actions, replace text with tags, etc. [Learn More](https://blog.pengubot.com/guide-custom-commands/)") .addField("Toggle Custom Commands", `\`\`\`${prefix}settings customcommands toggle\`\`\``) .addField("Add Custom Command", `\`\`\`${prefix}createcmd \`\`\``) .addField("Remove Custom Command", `\`\`\`${prefix}deletecmd \`\`\``) .addField("Update Existing Custom Command", `\`\`\`${prefix}updatecmd \`\`\``) .addField("List Custom Commands", `\`\`\`${prefix}listcmds\`\`\``) .setFooter("PenguBot.com") .setTimestamp(); return msg.sendEmbed(embed); } setting = setting.toLowerCase(); switch (setting) { case "toggle": { await this.client.commands.get("togglecustomcmds").run(msg); break; } default: { await msg.reply("That setting is not a valid option, please select a valid setting to update."); } } } // --- WELCOME AND LEAVE MESSAGE SETTINGS --- async greetings(msg, [setting, ...value]) { if (!setting) { const prefix = msg.guild.settings.get("prefix") || "p!"; const embed = new MessageEmbed() .setTitle("💁 Welcome and Leave Messages - Settings") .setDescription("**Tip:** You can use the following in your Welcome and Leave messages and they'll be replaced with the value automatically: `{mention}`, `{server}`, `{username}`, `{user.tag}`, `{user.id}` and `{members}`.") .addField("Toggle Welcome Messages", `\`\`\`${prefix}settings greetings togglewelcome\`\`\``) .addField("Toggle Leave Messages", `\`\`\`${prefix}settings greetings toggleleave\`\`\``) .addField("Welcome Message", `\`\`\`${prefix}settings greetings welcomemsg \`\`\``) .addField("Leave Message", `\`\`\`${prefix}settings greetings leavemsg \`\`\``) .addField("Welcome Channel", `\`\`\`${prefix}settings greetings welcomechannel \`\`\``) .addField("Leave Channel", `\`\`\`${prefix}settings greetings leavechannel \`\`\``) .setFooter("PenguBot.com") .setTimestamp(); return msg.sendEmbed(embed); } setting = setting.toLowerCase(); switch (setting) { case "togglewelcome": { await this.client.commands.get("togglewelcome").run(msg); break; } case "toggleleave": { await this.client.commands.get("toggleleave").run(msg); break; } case "welcomemsg": { await this.client.commands.get("setwelcomemsg").run(msg, [value.join(" ")]); break; } case "leavemsg": { await this.client.commands.get("setleavemsg").run(msg, [value.join(" ")]); break; } case "welcomechannel": { if (!value.length) return msg.reply("You must provide a channel to use this setting."); const arg = await this.client.arguments.get("channelname").run(value[0], null, msg); await this.client.commands.get("setwelcomechannel").run(msg, [arg]); break; } case "leavechannel": { if (!value.length) return msg.reply("You must provide a channel to use this setting."); const arg = await this.client.arguments.get("channelname").run(value[0], null, msg); await this.client.commands.get("setleavechannel").run(msg, [arg]); break; } default: { await msg.reply("That setting is not a valid option, please select a valid setting to update."); } } } }; ================================================ FILE: src/commands/General/Chat Bot Info/stats.js ================================================ const { Command, Duration } = require("klasa"); const { MessageEmbed } = require("discord.js"); module.exports = class extends Command { constructor(...args) { super(...args, { guarded: true, aliases: ["status"], description: language => language.get("COMMAND_STATS_DESCRIPTION") }); } async run(msg) { let [users, guilds, channels, memory, vc, cpm, listeners] = [0, 0, 0, 0, 0, 0, 0]; const results = await this.client.shard.broadcastEval(`[this.guilds.cache.reduce((prev, val) => val.memberCount + prev, 0), this.guilds.cache.size, this.channels.cache.size, (process.memoryUsage().heapUsed / 1024 / 1024), this.music.filter(music => music.playing).size, this.health.commands.cmdCount[59].count, this.music.filter(music => music.playing).map(music => music.voiceChannel && music.voiceChannel.members.filter(mem => !mem.user.bot).size).reduce((prev, val) => prev + val, 0)]`).catch(() => null); if (!results) return msg.reply("Oops! There appears to be a glitch in the matrix. Please try again later."); for (const result of results) { users += result[0]; guilds += result[1]; channels += result[2]; memory += result[3]; vc += result[4]; cpm += result[5]; listeners += result[6]; } const shardID = msg.guild ? msg.guild.shardID + 1 : 1; const embed = new MessageEmbed() .setColor("RANDOM") .setTimestamp() .setThumbnail("https://i.imgur.com/HE0ZOSA.png") .addField("❯ Memory Usage", `${memory.toFixed(2)} MB`, true) .addField("❯ Uptime", Duration.toNow(Date.now() - (process.uptime() * 1000)), true) .addField("❯ Users", users.toLocaleString(), true) .addField("❯ Guilds", guilds.toLocaleString(), true) .addField("❯ Channels", channels.toLocaleString(), true) .addField("❯ Voice Streams", vc.toLocaleString(), true) .addField("❯ Total Commands Ran", this.client.settings.get("counter.total").toLocaleString(), true) .addField("❯ CPM", cpm, true) .addField("❯ Listeners", listeners, true) .addField("❯ Sharding", `**Cluster:** ${this.client.shard.id + 1} / ${this.client.shard.clusterCount} | **Shard:** ${shardID} / ${this.client.shard.shardCount}`, true) .setAuthor("PenguBot - Statistics", this.client.user.displayAvatarURL(), "https://www.pengubot.com"); return msg.sendMessage({ embed }); } }; ================================================ FILE: src/commands/General/Chat Bot Info/support.js ================================================ const Command = require("../../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { guarded: true, requiredPermissions: ["EMBED_LINKS"], description: language => language.get("COMMAND_SUPPORT_DESCRIPTION") }); } async run(msg) { return msg.send(msg.language.get("COMMAND_SUPPORT")); } }; ================================================ FILE: src/commands/General/Chat Bot Info/upvote.js ================================================ const Command = require("../../../lib/structures/KlasaCommand"); const { MessageEmbed } = require("discord.js"); module.exports = class extends Command { constructor(...args) { super(...args, { guarded: true, requiredPermissions: ["EMBED_LINKS", "ATTACH_FILES"], description: language => language.get("COMMAND_UPVOTE_DESCRIPTION") }); } async run(msg) { const embed = new MessageEmbed() .setDescription(msg.language.get("COMMAND_UPVOTE")) .setAuthor("PenguBot - Upvote", this.client.user.displayAvatarURL(), "https://top.gg/bot/PenguBot/vote") .setThumbnail("https://i.imgur.com/YxmvOHj.png") .setColor("RANDOM"); return msg.sendEmbed(embed); } }; ================================================ FILE: src/commands/Images/cat.js ================================================ const { Command, MessageEmbed } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["cats", "catfact"], requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_CAT_DESCRIPTION"), extendedHelp: "No extended help available." }); } async run(msg) { const { fact } = await this.fetchURL("https://catfact.ninja/fact"); if (!fact) throw msg.language.get("ERR_TRY_AGAIN"); return msg.sendEmbed(new MessageEmbed() .setFooter("© PenguBot.com") .setTimestamp() .setColor("RANDOM") .setDescription(`**Cat Image & Fact**\n${fact}`) .setImage(`http://thecatapi.com/api/images/get?format=src&type=jpg&size=med&${Date.now()}`)); } }; ================================================ FILE: src/commands/Images/cookie.js ================================================ const { Command, MessageEmbed } = require("../../index"); const cookies = ["http://i.imgur.com/SLwEY66.gif", "http://i.imgur.com/K6VoNp3.gif", "http://i.imgur.com/knVM6Lb.gif", "http://i.imgur.com/P1BMly5.gif", "http://i.imgur.com/I8CrTUT.gif", "https://i.imgur.com/0XTueQR.png", "https://i.imgur.com/u9k8x4J.png", "https://i.imgur.com/AUtfHnK.png", "https://i.imgur.com/XjTbrKc.png", "https://i.imgur.com/A3mgqEh.png", "https://i.imgur.com/YnkdGZd.png", "https://i.imgur.com/FJsOnOE.png", "https://i.imgur.com/RQFPwDg.png", "https://i.imgur.com/vyCTGr0.png", "https://i.imgur.com/kkXToc8.png", "https://i.imgur.com/ctHwqVL.png", "https://i.imgur.com/yUaCPvC.png", "https://i.imgur.com/IUM6Z8F.png" ]; module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["sendcookie"], description: language => language.get("COMMAND_COOKIE_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [user]) { const embed = new MessageEmbed() .setFooter("© PenguBot.com") .setTimestamp() .setImage(cookies[Math.floor(Math.random() * cookies.length)]) .setColor("RANDOM"); return msg.sendMessage(`***<@${user.id}>, ${msg.language.get("CMD_FUN_COOKIE")} ${msg.author}!***`, { embed: embed }); } }; ================================================ FILE: src/commands/Images/cuddle.js ================================================ const { Command, MessageEmbed } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["sendcuddle"], requiredPermissions: ["ATTACH_FILES", "EMBED_LINKS"], description: language => language.get("COMMAND_CUDDLE_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [user]) { const { url } = await this.fetchURL("https://nekos.life/api/v2/img/cuddle"); if (!url) throw msg.language.get("ERR_TRY_AGAIN"); const embed = new MessageEmbed() .setFooter("© PenguBot.com") .setTimestamp() .setImage(url) .setColor("RANDOM"); return msg.sendMessage(`🤗 | ***${user}, ${msg.language.get("CMD_FUN_CUDDLE")} ${msg.author}!***`, { embed }); } }; ================================================ FILE: src/commands/Images/dog.js ================================================ const { Command, MessageEmbed } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["doggos", "dogpic"], requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_DOG_DESCRIPTION"), extendedHelp: "No extended help available." }); } async run(msg) { const data = await this.fetchURL("http://shibe.online/api/shibes?count=1&urls=true&httpsUrls=false"); if (!data || !data.length) throw msg.language.get("ERR_TRY_AGAIN"); return msg.sendEmbed(new MessageEmbed() .setFooter("© PenguBot.com") .setTimestamp() .setColor("RANDOM") .setDescription(`**Dog Picture**`) .setImage(data[0])); } }; ================================================ FILE: src/commands/Images/feed.js ================================================ const { Command, MessageEmbed } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["sendfood"], requiredPermissions: ["ATTACH_FILES", "EMBED_LINKS"], description: language => language.get("COMMAND_FEED_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [user]) { const { url } = await this.fetchURL("https://nekos.life/api/v2/img/feed"); if (!url) throw msg.language.get("ERR_TRY_AGAIN"); const embed = new MessageEmbed() .setFooter("© PenguBot.com") .setTimestamp() .setImage(url) .setColor("RANDOM"); return msg.sendMessage(`🥘 | ***${user}, ${msg.language.get("CMD_FUN_FED")} ${msg.author}!***`, { embed }); } }; ================================================ FILE: src/commands/Images/fox.js ================================================ const { Command, MessageEmbed } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["foxy", "foxes"], requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_FOX_DESCRIPTION"), extendedHelp: "No extended help available." }); } async run(msg) { const { image } = await this.fetchURL("https://randomfox.ca/floof/"); if (!image) throw msg.language.get("ERR_TRY_AGAIN"); return msg.sendEmbed(new MessageEmbed() .setFooter("© PenguBot.com") .setTimestamp() .setColor("RANDOM") .setDescription(`**Fox Picture**`) .setImage(image)); } }; ================================================ FILE: src/commands/Images/hug.js ================================================ const { Command, MessageEmbed } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["sendhug"], requiredPermissions: ["ATTACH_FILES", "EMBED_LINKS"], description: language => language.get("COMMAND_HUG_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [user]) { const { url } = await this.fetchURL("https://nekos.life/api/v2/img/hug"); if (!url) throw msg.language.get("ERR_TRY_AGAIN"); const embed = new MessageEmbed() .setFooter("© PenguBot.com") .setTimestamp() .setImage(url) .setColor("RANDOM"); return msg.sendMessage(`🤗 | ***${user}, ${msg.language.get("CMD_FUN_HUG")} ${msg.author}!***`, { embed }); } }; ================================================ FILE: src/commands/Images/kiss.js ================================================ const { Command, MessageEmbed } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["sendkiss"], requiredPermissions: ["ATTACH_FILES", "EMBED_LINKS"], description: language => language.get("COMMAND_KISS_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [user]) { const { url } = await this.fetchURL("https://nekos.life/api/v2/img/kiss"); if (!url) throw msg.language.get("ERR_TRY_AGAIN"); const embed = new MessageEmbed() .setFooter("© PenguBot.com") .setTimestamp() .setImage(url) .setColor("RANDOM"); return msg.sendMessage(`💋 | ***${user}, ${msg.language.get("CMD_FUN_KISS")} ${msg.author}!***`, { embed }); } }; ================================================ FILE: src/commands/Images/meme.js ================================================ const { Command } = require("../../index"); const subReddits = ["AdviceAnimals", "MemeEconomy", "ComedyCemetery", "memes", "dankmemes", "PrequelMemes", "terriblefacebookmemes", "PewdiepieSubmissions", "funny", "wholesomememes", "fffffffuuuuuuuuuuuu", "BikiniBottomTwitter", "2meirl4meirl", "DeepFriedMemes", "surrealmemes", "firstworldanarchists"]; module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 5, aliases: ["memes", "randommeme"], requiredPermissions: ["ATTACH_FILES", "EMBED_LINKS"], description: language => language.get("COMMAND_MEME_DESCRIPTION"), extendedHelp: "No extended help available." }); } async run(msg) { const subReddit = subReddits[Math.floor(Math.random() * subReddits.length)]; const data = await this.client.funcs.scrapeSubreddit(subReddit, { type: "hot" }); if (data.over_18 && !msg.channel.nsfw) return msg.sendMessage(`${this.client.emotes.cross} ***This channel is not NSFW so I can't send it here...***`); return msg.channel.send(data.url); } }; ================================================ FILE: src/commands/Images/pat.js ================================================ const { Command, MessageEmbed } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["sendpat"], requiredPermissions: ["ATTACH_FILES", "EMBED_LINKS"], description: language => language.get("COMMAND_PAT_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [user]) { const { url } = await this.fetchURL("https://nekos.life/api/v2/img/pat"); if (!url) throw msg.language.get("ERR_TRY_AGAIN"); const embed = new MessageEmbed() .setFooter("© PenguBot.com") .setTimestamp() .setImage(url) .setColor("RANDOM"); return msg.sendMessage(`✋ | ***${user}, ${msg.language.get("CMD_FUN_PAT")} ${msg.author}!***`, { embed }); } }; ================================================ FILE: src/commands/Images/pengu.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); const { MessageEmbed } = require("discord.js"); const pics = ["http://i.imgur.com/Urfp335.png", "http://i.imgur.com/gC8v9fp.jpg", "http://i.imgur.com/DZ6YtvT.jpg", "http://i.imgur.com/LdWARAL.jpg", "http://i.imgur.com/7uF0u9Q.jpg", "http://i.imgur.com/0vgVnpr.png", "http://i.imgur.com/1GKlyH2.png", "http://i.imgur.com/jlzSELQ.png", "https://i.imgur.com/Vm98hJq.png", "https://i.imgur.com/RF4JeC8.png", "https://i.imgur.com/Co26qmr.png", "https://i.imgur.com/ixSGy7V.jpg", "https://i.imgur.com/WzsIIzN.png", "https://i.imgur.com/v8oxfHW.jpg", "https://i.imgur.com/RPxPRXV.png", "https://i.imgur.com/UVnwRMk.gif", "https://i.imgur.com/vfKwurE.gif", "https://i.imgur.com/XKukgBG.gif", "https://i.imgur.com/KohkQvr.gif", "https://i.imgur.com/uwdMmng.gif", "https://i.imgur.com/EOln62Q.gif", "https://i.imgur.com/8fcKsh1.gif" ]; module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["pingu", "penguin"], requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_PENGU_DESCRIPTION"), extendedHelp: "No extended help available." }); } async run(msg) { const embed = new MessageEmbed() .setFooter("© PenguBot.com") .setTimestamp() .setImage(pics[Math.floor(Math.random() * pics.length)]) .setColor("RANDOM"); return msg.sendMessage(`<:pengu:383632112323919872> | ***${msg.author}, ${msg.language.get("CMD_FUN_PENGU")}!***`, { embed: embed }); } }; ================================================ FILE: src/commands/Images/poke.js ================================================ const { Command, MessageEmbed } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["sendpoke"], requiredPermissions: ["ATTACH_FILES", "EMBED_LINKS"], description: language => language.get("COMMAND_POKE_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [user]) { const { url } = await this.fetchURL("https://nekos.life/api/v2/img/poke"); if (!url) throw msg.language.get("ERR_TRY_AGAIN"); const embed = new MessageEmbed() .setFooter("© PenguBot.com") .setTimestamp() .setImage(url) .setColor("RANDOM"); return msg.sendMessage(`👈 | ***${user}, ${msg.language.get("CMD_FUN_POKE")} ${msg.author}!***`, { embed }); } }; ================================================ FILE: src/commands/Images/punch.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); const { MessageEmbed } = require("discord.js"); const punches = ["http://i.imgur.com/aGPHQ3E.gif", "http://i.imgur.com/FxFfdOZ.gif", "http://i.imgur.com/XA7PPiy.gif", "http://i.imgur.com/5hcVtGf.gif", "http://i.imgur.com/nwGsg12.gif", "http://i.imgur.com/GZX1COH.gif", "https://i.imgur.com/UcycckQ.gif", "https://i.imgur.com/VmdBxgq.gif", "https://i.imgur.com/IputsOi.gif", "https://i.imgur.com/UY3sTpj.gif", "https://i.imgur.com/VdwTwRo.gif", "https://i.imgur.com/VIKEo7q.gif", "https://i.imgur.com/XPq1P4F.gif", "https://i.imgur.com/X0uIstL.gif", "https://i.imgur.com/Of2BTLu.gif", "https://i.imgur.com/tSjlgKs.gif", "https://i.imgur.com/hEDcADi.gif" ]; module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["sendpunch"], requiredPermissions: ["ATTACH_FILES", "EMBED_LINKS"], description: language => language.get("COMMAND_PUNCH_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [user]) { const embed = new MessageEmbed() .setFooter("© PenguBot.com") .setTimestamp() .setImage(punches[Math.floor(Math.random() * punches.length)]) .setColor("RANDOM"); return msg.sendMessage(`👊 | ***${user}, ${msg.language.get("CMD_FUN_PUNCH")} ${msg.author}!***`, { embed: embed }); } }; ================================================ FILE: src/commands/Images/randomcomic.js ================================================ const { Command, MessageEmbed } = require("../../index"); const { parse } = require("node-html-parser"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["comic", "comics"], requiredPermissions: ["ATTACH_FILES", "EMBED_LINKS"], description: language => language.get("COMMAND_COMIC_DESCRIPTION"), extendedHelp: "No extended help available." }); } async run(msg) { const res = await this.fetchURL(`https://c.xkcd.com/random/comic/`, { type: "text" }) .catch(() => null); if (!res) throw `${this.client.emotes.cross} ***${msg.language.get("ER_CATS_DOGS")}***`; const root = parse(res); const img = root.querySelector("#comic").querySelector("img").getAttribute("src"); console.log(img); return msg.sendEmbed(new MessageEmbed() .setFooter("© PenguBot.com - Comic by xkcd.com") .setTimestamp() .setColor("RANDOM") .setImage(`https:${img}`)); } }; ================================================ FILE: src/commands/Images/slap.js ================================================ const { Command, MessageEmbed } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["sendslap"], requiredPermissions: ["ATTACH_FILES", "EMBED_LINKS"], description: language => language.get("COMMAND_SLAP_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [user]) { const { url } = await this.fetchURL("https://nekos.life/api/v2/img/slap"); if (!url) throw msg.language.get("ERR_TRY_AGAIN"); const embed = new MessageEmbed() .setFooter("© PenguBot.com") .setTimestamp() .setImage(url) .setColor("RANDOM"); return msg.sendMessage(`🖐 | ***${user}, ${msg.language.get("CMD_FUN_SLAP")} ${msg.author}!***`, { embed }); } }; ================================================ FILE: src/commands/Images/tickle.js ================================================ const { Command, MessageEmbed } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["sendtickle"], requiredPermissions: ["ATTACH_FILES", "EMBED_LINKS"], description: language => language.get("COMMAND_TICKLE_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [user]) { const { url } = await this.fetchURL("https://nekos.life/api/v2/img/tickle"); if (!url) throw msg.language.get("ERR_TRY_AGAIN"); const embed = new MessageEmbed() .setFooter("© PenguBot.com") .setTimestamp() .setImage(url) .setColor("RANDOM"); return msg.sendMessage(`🤣 | ***${user}, ${msg.language.get("CMD_FUN_TICKLE")} ${msg.author}!***`, { embed }); } }; ================================================ FILE: src/commands/Images/wholesome.js ================================================ const { Command } = require("../../index"); const SUB_REDDITS = ["wholesome", "aww", "AnimalsBeingBros"]; module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 10, bucket: 2, aliases: ["wholesome", "aww"], requiredPermissions: ["EMBED_LINKS"], description: language => language.get("COMMAND_WHOLESOME_DESCRIPTION"), extendedHelp: "No extended help available." }); } async run(msg) { const subReddit = SUB_REDDITS[Math.floor(Math.random() * SUB_REDDITS.length)]; const data = await this.client.funcs.scrapeSubreddit(subReddit, { type: "top" }); return msg.channel.send(data.url); } }; ================================================ FILE: src/commands/Jokes and Stuff/chucknorris.js ================================================ const { Command, MessageEmbed } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_CHUCK_DESCRIPTION"), extendedHelp: "No extended help available." }); } async run(msg) { const { value } = await this.fetchURL("http://api.chucknorris.io/jokes/random"); return msg.sendEmbed(new MessageEmbed() .setColor("RANDOM") .setDescription(`**Chuck Norris Joke**\n\n${value}`) .setThumbnail("https://i.imgur.com/3wIvF42.png")); } }; ================================================ FILE: src/commands/Jokes and Stuff/compliment.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); const Compliments = [ "You're my kind of weird.", "I love you more than tea.", "You're a Michelin Star human.", "You're a chocolate Hobnob in a jar of Rich Teas.", "You've really nailed being a human. Good job.", "You are wonderfully odd.", "You are the last minute goal in the cup final.", "You're tougher than my wifi password.", "You are a walking high-five.", "You’d win the Saturday Kitchen omelette challenge.", "You could be a part-time model.", "I like your face.", "You're wise and all knowing, like a mighty owl.", "You're an awesome friend.", "You're a gift to those around you.", "You're a smart cookie.", "You are awesome!", "You have impeccable manners.", "I like your style.", "You have the best laugh.", "I appreciate you.", "You are the most perfect you there is.", "You are enough.", "You're strong.", "Your perspective is refreshing.", "I'm grateful to know you.", "You light up the room.", "You deserve a hug right now.", "You should be proud of yourself.", "You're more helpful than you realize.", "You have a great sense of humor.", "You've got an awesome sense of humor!", "You are really courageous.", "Your kindness is a balm to all who encounter it.", "You're all that and a super-size bag of chips.", "On a scale from 1 to 10, you're an 11.", "You are strong.", "You're even more beautiful on the inside than you are on the outside.", "You have the courage of your convictions.", "I'm inspired by you.", "You're like a ray of sunshine on a really dreary day.", "You are making a difference.", "Thank you for being there for me.", "You bring out the best in other people." ]; module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, description: language => language.get("COMMAND_COMPLIMENT_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [user]) { return msg.sendMessage(`${user}, ***you know what? ${Compliments[Math.floor(Math.random() * Compliments.length)]}***`); } }; ================================================ FILE: src/commands/Jokes and Stuff/dadjoke.js ================================================ const { Command, MessageEmbed } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["joke"], requiredPermissions: ["ATTACH_FILES", "EMBED_LINKS"], description: language => language.get("COMMAND_DADJOKE_DESCRIPTION"), extendedHelp: "No extended help available." }); } async run(msg) { const { joke } = await this.fetchURL("https://icanhazdadjoke.com/", { headers: { Accept: "application/json" } }); return msg.sendEmbed(new MessageEmbed() .setDescription(`**Dad Joke Alert**\n\n${joke.length < 1900 ? joke : `${joke.substring(0, 1900)}...`}`) .setThumbnail("https://i.imgur.com/IxosIBh.png") .setColor("RANDOM")); } }; ================================================ FILE: src/commands/Jokes and Stuff/dice.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["die", "roll"], description: language => language.get("COMMAND_DICE_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "[sides:integer]" }); } async run(msg, [sides = 6]) { const num = Math.floor(Math.random() * sides) + 1; return msg.reply(`I rolled you a 🎲 of **${sides}** side(s) and got **${num}** as the outcome.`); } }; ================================================ FILE: src/commands/Jokes and Stuff/fml.js ================================================ const { Command, MessageEmbed } = require("../../index"); const { parse } = require("node-html-parser"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["fuckmylife"], requiredPermissions: ["ATTACH_FILES", "EMBED_LINKS"], description: language => language.get("COMMAND_FML_DESCRIPTION"), extendedHelp: "No extended help available." }); } async run(msg) { const res = await this.fetchURL("http://www.fmylife.com/random", { type: "text" }) .catch(() => null); if (!res) throw `${this.client.emotes.cross} ***${msg.language.get("ER_CATS_DOGS")}***`; const root = parse(res); const article = root.querySelector(".article-link").text; return msg.sendEmbed(new MessageEmbed() .setDescription(`**F*ck My Life**\n${article}`) .setThumbnail("https://i.imgur.com/XW16vXq.png") .setColor("RANDOM")); } }; ================================================ FILE: src/commands/Jokes and Stuff/insult.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); const start = ["a lazy", "a stupid", "an insecure", "an idiotic", "a slimy", "a slutty", "a smelly", "a pompous", "a communist", "a dicknose", "a pie-eating", "a racist", "an elitist", "a white trash", "a drug-loving", "a butterface", "a tone deaf", "a ugly", "a creepy", "an artless", "a bawdy", "a beslubbering", "a bootless", "a churlish", "a cockered", "a clouted", "a craven", "a currish", "a dankish", "a dissembling", "a droning", "an errant", "a fawning", "a fobbing", "a frothy", "a gleeking", "a goatfish", "a gorbellied", "an impertinent", "an infectious", "a jarring", "a loggerheaded", "a lumpish", "a mammering", "a mangled", "a mewling", "a paunchy", "a pribbling", "a puking", "a puny", "a qualling", "a rank", "a reeky", "a roguish", "a ruttish", "a saucy", "a spleeny", "a spongy", "a surly", "a tottering", "an unmuzzled", "a vain", "a venomed", "a villainous", "a warped", "a wayward", "a weedy", "a yeasty", "a lilly-livered", "a rotten", "a stinky", "a lame", "a dim-witted", "a funky", "a crusty", "a steamy", "a drizzly", "a grizzly", "a squirty", "an uptight", "a hairy", "a husky", "an arrogant", "a nippy", "a chunky", "a smelly", "a drooling", "a crusty", "a decrepic", "a stupid", "a moronic", "a greasy", "a poxy", "an ugly", "a smelly", "a putrid", "a shitty", "an assinine", "a sickening"]; // eslint-disable-line const middle = ["douche", "ass", "turd", "rectum", "butt", "shit", "crotch", "turd", "prick", "taint", "boner", "shart", "nut", "sphincter", "base-court", "bat-fowling", "beef-witted", "beetle-headed", "boil-brained", "clapper-clawed", "clay-brained", "common-kissing", "crook-pated", "dismal-dreaming", "dizzy-eyed", "doghearted", "dread-bolted", "earth-vexing", "elf-skinned", "fat-kidneyed", "fen-sucked", "flap-mouthed", "fly-bitten", "folly-fallen", "fool-born", "full-gorged", "guts-gripping", "half-faced", "hasty-witted", "hedge-born", "hell-hated", "idle-headed", "ill-breeding", "ill-nurtured", "knotty-pated", "milk-livered", "motly-minded", "onion-eyed", "plume-plucked", "pottle-deep", "pox-marked", "reeling-ripe", "rough-hewn", "rude-growing", "rump-red", "shard-borne", "sheep-biting", "spur-galled", "swag-bellied", "tardy-gaited", "tickle-brained", "toad-spotted", "unchin-snouted", "weather-bitten", "hiney", "poop", "toot", "wedgie", "stool", "fudge", "bum", "potty", "dookie", "pudding", "sphincter", "booger", "feces", "snot", "crust", "badonk-a", "crud", "sludge", "tool", "shit-kicking", "monkey-licking", "crotch-sniffing", "donkey-spanking", "fashion-illiterate", "worm-ridden", "lathered-up", "pasty-waisted", "snot-flicking", "fart-eating"]; // eslint-disable-line const end = ["pilot", "canoe", "captain", "pirate", "hammer", "knob", "box", "jockey", "nazi", "waffle", "goblin", "blossom", "biscuit", "clown", "socket", "monster", "hound", "dragon", "balloon", "apple-john", "baggage", "barnacle", "bladder", "boar-pig", "bugbear", "bum-bailey", "canker-blossom", "clack-dish", "clotpole", "coxcomb", "codpiece", "death-token", "dewberry", "flap-dragon", "flax-wench", "flirt-gill", "foot-licker", "fustilarian", "giglet", "gudgeon", "haggard", "harpy", "hedge-pig", "horn-beast", "hugger-mugger", "joithead", "lewdster", "lout", "maggot-pie", "malt-worm", "mammet", "measle", "minnow", "miscreant", "moldwarp", "mumble-news", "nut-hook", "pigeon-egg", "pignut", "puttock", "pumpion", "ratsbane", "scut", "skinsmate", "strumpet", "varlot", "vassal", "whey-face", "wagtail", "squeegee", "turtle", "cabbage", "bomb", "sniffer", "binkie", "stump", "nugget", "whistle", "twig", "knuckle", "burger", "hotdog", "loaf", "freckle", "soldier", "kernal", "shingle", "warrior", "hemorrhoid", "fuckface", "asshole", "scumbucket", "toerag", "hackwack", "imbecile", "stunodigan", "maggot", "hipster", "gargabe", "jerkstore"]; // eslint-disable-line module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["die", "roll"], description: language => language.get("COMMAND_INSULT_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [user]) { return msg.sendMessage(`${user}, ***you know what? you're nothing but ${start[Math.floor(Math.random() * start.length)]} ${middle[Math.floor(Math.random() * middle.length)]} ${end[Math.floor(Math.random() * end.length)]}.***`); } }; ================================================ FILE: src/commands/Jokes and Stuff/randomfact.js ================================================ const { Command, MessageEmbed } = require("../../index"); const facts = require("../../lib/constants/facts.json"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["fact", "rfact"], requiredPermissions: ["ATTACH_FILES", "EMBED_LINKS"], description: language => language.get("COMMAND_FACT_DESCRIPTION"), extendedHelp: "No extended help available." }); } async run(msg) { return msg.sendEmbed(new MessageEmbed() .setDescription(`**Random Fact**\n\n${facts[Math.floor(Math.random() * facts.length)]}`) .setThumbnail("https://i.imgur.com/fJiD9Jo.png") .setColor("RANDOM")); } }; ================================================ FILE: src/commands/Jokes and Stuff/trump.js ================================================ const { Command, MessageEmbed } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["trumpjoke", "trumpinsult"], requiredPermissions: ["ATTACH_FILES", "EMBED_LINKS"], description: language => language.get("COMMAND_TRUMP_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "[user:username]" }); } async run(msg, [user = msg.author]) { const data = await this.fetchURL(`https://api.whatdoestrumpthink.com/api/v1/quotes/personalized`, { query: { q: user.username } }); if (!data.message) throw msg.language.get("ER_TRY_AGAIN"); return msg.sendEmbed(new MessageEmbed() .setDescription(`**Get Trumped**\n\n${data.message}`) .setThumbnail("https://i.imgur.com/lGJbGy6.png") .setColor("RANDOM")); } }; ================================================ FILE: src/commands/Jokes and Stuff/yomomma.js ================================================ const { Command, MessageEmbed } = require("../../index"); const data = require("../../lib/constants/yomomma"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["yomoma", "yomommafat", "yomommasofat"], requiredPermissions: ["ATTACH_FILES", "EMBED_LINKS"], description: language => language.get("COMMAND_MOMMA_DESCRIPTION"), extendedHelp: "No extended help available." }); } async run(msg) { const joke = data[Math.floor(Math.random() * data.length)]; return msg.sendEmbed(new MessageEmbed() .setDescription(`**Yo Momma Joke**\n\n${joke}`) .setThumbnail("https://i.imgur.com/ordRh9e.png") .setColor("RANDOM")); } }; ================================================ FILE: src/commands/Management/Automod/manageautomod.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["automod", "automodfilters", "toggleautomod"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], subcommands: true, description: language => language.get("COMMAND_AUTOMOD_DESCRPTION"), usage: " [filter:string] [threshold:float]", usageDelim: " " }); } async toggle(msg, [filter]) { if (!filter) { const mode = !msg.guild.settings.get("toggles.perspective"); await msg.guild.settings.update("toggles.perspective", mode); return msg.sendMessage(`${mode ? this.client.emotes.check : this.client.emotes.cross} ***${mode ? msg.language.get("MESSAGE_AUTOMOD_ENABLED") : msg.language.get("MESSAGE_AUTOMOD_DISABLED")}***`); } else { filter = filter.toUpperCase(); const perspective = msg.guild.settings.get("automod.perspective"); const keys = [...perspective.keys()]; if (!keys.includes(filter)) return msg.sendMessage(`${this.client.emotes.cross} ***That is an Invalid Filter, please choose from \`${keys.join("`, `")}\`.***`); const obj = perspective.get(filter); obj.enabled = !obj.enabled; const { errors } = await msg.guild.settings.update(`automod.perspective.${filter}`, obj, { action: "overwrite" }); if (errors) return msg.sendMessage(`${this.client.emotes.cross} ***There was an error:*** ${errors[0]}`); return msg.sendMessage(`${obj.enabled ? this.client.emotes.check : this.client.emotes.cross} \`${filter}\` ***${msg.language.get("MESSAGE_AUTOMOD_TOGGLED")}.***`); } } async threshold(msg, [filter, threshold]) { if (!filter || !threshold) return msg.sendMessage(`${this.client.emotes.cross} ***Filter or Threshold are required arguments.***`); filter = filter.toUpperCase(); const perspective = msg.guild.settings.get("automod.perspective"); const perspectiveObj = Object.fromEntries(perspective); if (!perspectiveObj[filter]) return msg.sendMessage(`${this.client.emotes.cross} ***That is an Invalid Filter, please choose from \`${Object.keys(perspectiveObj).join("`, `")}\`.***`); if (threshold && (threshold > 1 || threshold <= 0)) return msg.sendMessage(`${this.client.emotes.cross} ***Threshold can't be more than 1 or less than 0. i.e. 0.93***`); const obj = perspectiveObj[filter]; obj.threshold = threshold; const { errors } = await msg.guild.settings.update(`automod.perspective.${filter}`, obj, { action: "overwrite" }); if (errors) return msg.sendMessage(`${this.client.emotes.cross} ***There was an error:*** ${errors[0]}`); return msg.sendMessage(`${this.client.emotes.check} \`${filter}\` ***${msg.language.get("MESSAGE_AUTOMOD_TOGGLED")} with \`${threshold}\` threshold.***`); } }; ================================================ FILE: src/commands/Management/Automod/toggleinvites.js ================================================ const Command = require("../../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["adblock", "antiinvites"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_ADBLOCK_DESCRIPTION"), quotedStringSupport: false, extendedHelp: "No extended help available." }); } async run(msg) { const toggle = !msg.guild.settings.get("automod.invites"); await msg.guild.settings.update("automod.invites", toggle); return msg.sendMessage(`${toggle ? this.client.emotes.check : this.client.emotes.cross} ***Anti-invites have been ${toggle ? "Enabled" : "Disabled"}***`); } }; ================================================ FILE: src/commands/Management/Autoroles/addautoroles.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["addautorole", "removeautorole", "removeautoroles", "deleteautorole", "deleteautoroles"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], usage: "", description: language => language.get("COMMAND_ADD_ROLES_DESCRPTION"), extendedHelp: "No extended help available." }); } async run(msg, [role]) { if (msg.guild.settings.get("roles.autorole").indexOf(role.id) !== -1) { return msg.guild.settings.update("roles.autorole", role, msg.guild).then(() => { msg.sendMessage(`${this.client.emotes.cross} ***${role.name} ${msg.language.get("MESSAGE_AUTOROLE_REMOVED")}***`); }); } else { return msg.guild.settings.update("roles.autorole", role, msg.guild).then(() => { msg.sendMessage(`${this.client.emotes.check} ***${role.name} ${msg.language.get("MESSAGE_AUTOROLE_ADDED")}***`); }); } } }; ================================================ FILE: src/commands/Management/Autoroles/toggleautoroles.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["toggleautorole", "enableautoroles", "disableautoroles"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_TOGGLE_ROLES_DESCRPTION"), extendedHelp: "No extended help available." }); } async run(msg) { const toggle = !msg.guild.settings.get("toggles.autoroles"); await msg.guild.settings.update("toggles.autoroles", toggle); return msg.sendMessage(`${toggle ? this.client.emotes.check : this.client.emotes.cross} ***${toggle ? msg.language.get("MESSAGE_AUTOROLES_ENABLED") : msg.language.get("MESSAGE_AUTOROLES_DISABLED")}`); } }; ================================================ FILE: src/commands/Management/Custom Commands/createcmd.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["addcmd"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_ADD_CMD_DESCRIPTION"), usage: " [...]", usageDelim: " ", extendedHelp: "More Information can be Found Here: https://bit.ly/PenguCustomCommands" }); } async run(msg, [name, ...content]) { name = name.toLowerCase(); if (this.client.commands.has(name)) return msg.reply(`${this.client.emotes.cross} ***\`${name}\` ${msg.language.get("MESSAGE_CMD_EXISTS")}***`); const cmd = msg.guild.settings.get("customcmds").find(c => c.name.toLowerCase() === name); if (cmd) return msg.reply(`${this.client.emotes.cross} ***\`${name}\` ${msg.language.get("MESSAGE_CMD_EXISTS")}***`); await msg.guild.settings.update("customcmds", { content: content.join(" "), name: name }); return msg.sendMessage(`${this.client.emotes.check} ***\`${name}\` ${msg.language.get("MESSAGE_CMD_ADDED")} ${msg.author.tag}!***`); } }; ================================================ FILE: src/commands/Management/Custom Commands/deletecmd.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["delcmd", "removecmd"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_DEL_CMD_DESCRIPTION"), usage: "", extendedHelp: "No extended help available." }); } async run(msg, [name]) { name = name.toLowerCase(); const cmd = msg.guild.settings.get("customcmds").find(c => c.name.toLowerCase() === name); if (!cmd) return msg.reply(`${this.client.emotes.cross} ***\`${name}\` ${msg.language.get("MESSAGE_CMD_NOTFOUND")}***`); await msg.guild.settings.update("customcmds", cmd, { action: `remove` }); return msg.sendMessage(`${this.client.emotes.check} ***\`${name}\` ${msg.language.get("MESSAGE_CMD_REMOVED")} ${msg.author.tag}!***`); } }; ================================================ FILE: src/commands/Management/Custom Commands/listcmds.js ================================================ const { Command, RichDisplay, MessageEmbed } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["listcommands"], requiredPermissions: ["USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_LIST_CMDS_DESCRIPTION"), extendedHelp: "No extended help available." }); } async run(msg) { if (!msg.guild.settings.get("customcmds").length) return msg.reply(`${this.client.emotes.cross} ***${msg.language.get("MESSAGE_NO_CMDS")}***`); const prefix = msg.guild.settings.get("prefix"); const names = msg.guild.settings.get("customcmds").map(cmd => cmd.name.toLowerCase()); const cmds = new RichDisplay(new MessageEmbed() .setTitle("Use the reactions to change pages, select a page or stop viewing the commands.") .setAuthor("Custom Commands - PenguBot", "https://i.imgur.com/DOuCQlY.png") .setDescription("Scroll between pages to see the custom commands list.") .setColor("#F75F4E") ); for (let i = 0, temp = names.length; i < temp; i += 5) { const curr = names.slice(i, i + 5); cmds.addPage(t => t.setDescription(curr.map(c => `• ${prefix}${c}`))); } cmds.run(await msg.sendMessage(`${this.client.emotes.loading} Loading Commands...`), { time: 120000, filter: (reaction, user) => user === msg.author }); } }; ================================================ FILE: src/commands/Management/Custom Commands/togglecustomcmds.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["tccmd", "togglecustom", "tcmd", "togglecustomcommands"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_TOGGLE_CUSTOM_DESCRPTION"), extendedHelp: "No extended help available." }); } async run(msg) { const toggle = !msg.guild.settings.get("toggles.customcmds"); await msg.guild.settings.update("toggles.customcmds", toggle); return msg.sendMessage(`${toggle ? this.client.emotes.check : this.client.emotes.cross} ***${toggle ? msg.language.get("MESSAGE_COMMAND_CUSTOM_ENABLED") : msg.language.get("MESSAGE_COMMAND_CUSTOM_DISABLED")}***`); } }; ================================================ FILE: src/commands/Management/Custom Commands/updatecmd.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["changecmd"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_ADD_CMD_DESCRIPTION"), usage: " [...]", usageDelim: " ", extendedHelp: "More Information can be Found Here: https://bit.ly/PenguCustomCommands" }); } async run(msg, [name, ...content]) { name = name.toLowerCase(); if (this.client.commands.has(name)) return msg.reply(`${this.client.emotes.cross} ***\`${name}\` ${msg.language.get("MESSAGE_CMD_EXISTS")}***`); const cmd = msg.guild.settings.get("customcmds").find(c => c.name.toLowerCase() === name); if (cmd) { const remove = await msg.guild.settings.update("customcmds", cmd, { action: "remove" }); const add = await msg.guild.settings.update("customcmds", { content: content.join(" "), name: cmd.name }, { action: "add" }); if (add.errors || remove.errors) return msg.sendMessage(`${this.client.emotes.cross} ***There was an error, try again.***`); return msg.sendMessage(`${this.client.emotes.check} ***\`${name}\` ${msg.language.get("MESSAGE_CMD_UPDATED")} ${msg.author.tag}!***`); } else { return msg.reply(`${this.client.emotes.cross} ***\`${name}\` ${msg.language.get("MESSAGE_CMD_NOTFOUND")}***`); } } }; ================================================ FILE: src/commands/Management/Level Roles/listlevelroles.js ================================================ const { Command, RichDisplay, MessageEmbed } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["levelroles"], requiredPermissions: ["USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_LIST_LVLROLES_DESCRPTION"), extendedHelp: "No extended help available." }); } async run(msg) { const roles = msg.guild.settings.get("roles.levelrole"); if (!roles.length) return msg.sendMessage(`${this.client.emotes.cross} ***${msg.language.get("CMD_NO_SELFROLES")}***`); const pages = new RichDisplay(new MessageEmbed() .setTitle("Use the reactions to change pages, select a page, or stop viewing the roles") .setAuthor("Level Based Roles - PenguBot", msg.guild.iconURL()) .setDescription("Scroll between pages to see the self assignable roles.") .setColor("#428bca") ); pages.addPage(t => t.setDescription(roles.map(role => `\`-\` ${msg.guild.roles.cache.get(role.id) || "Role Removed"} - Level ${role.lvl}`).join("\n"))); pages.run(await msg.sendMessage(`${this.client.emotes.loading} ***Loading Roles...***`), { time: 120000, filter: (reaction, user) => user === msg.author }); } }; ================================================ FILE: src/commands/Management/Level Roles/managelevelroles.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { subcommands: true, runIn: ["text"], cooldown: 10, aliases: ["managelevelrole", "addlevelrole", "removelevelrole"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_LVLROLE_DESCRPTION"), usage: " [level:integer]", usageDelim: " " }); } async add(msg, [role, level]) { if (!level) throw `${this.client.emotes.cross} ***You must enter a level at which you want to award this role.***`; if (level <= 0) throw `${this.client.emotes.cross} ***You can't give people levels if they are level ZERO or Lower, use Autoroles instead.***`; const roles = msg.guild.settings.get("roles.levelrole"); if (roles.find(r => r.id === role.id)) throw `${this.client.emotes.cross} ***This role already exists in the leveled roles.***`; const myRole = msg.guild.me.roles.highest; if (role.position > myRole.positon) throw `${this.client.emotes.cross} ***That given role is above my role in the guild, please change the order.***`; await msg.guild.settings.update("roles.levelrole", { id: role.id, lvl: level }); return msg.sendMessage(`${this.client.emotes.check} **${role.name}** Role has been added for anyone who reaches **Level ${level}** in **${msg.guild.name}**`); } async remove(msg, [role]) { const levelRole = msg.guild.settings.get("roles.levelrole").find(r => r.id === role.id); if (!levelRole) throw `${this.client.emotes.cross} ***That role doesn't exist in the Level Based Roles list.***`; await msg.guild.settings.update("roles.levelrole", levelRole, { action: "remove" }); return msg.sendMessage(`${this.client.emotes.check} **${role.name}** Role has been removed from Level Based Roles list.`); } }; ================================================ FILE: src/commands/Management/Level Roles/togglelevelroles.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["togglelevelrole", "enablelevelroles", "disablelevelroles"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_TOGGLE_LVLROLES_DESCRPTION"), extendedHelp: "No extended help available." }); } async run(msg) { const toggle = !msg.guild.settings.get("toggles.levelroles"); await msg.guild.settings.update("toggles.levelroles", toggle); return msg.sendMessage(`${toggle ? this.client.emotes.check : this.client.emotes.cross} ${toggle ? msg.language.get("MESSAGE_LEVELROLES_ENABLED") : msg.language.get("MESSAGE_LEVELROLES_DISABLED")}`); } }; ================================================ FILE: src/commands/Management/Logging/log.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["enablelog", "disablelog", "togglelog"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_LOG_DESCRPTION"), usage: "[Option:string]", extendedHelp: "No extended help available." }); } async run(msg, [Option]) { if (!Option) return msg.reply(`${msg.language.get("CMD_LOG_INVALID")} \`automod\`, \`moderation\`, \`join\`, \`leave\`, \`channels\`, \`messages\`, \`roles\`.`); const opt = Option.toLowerCase(); switch (opt) { case "automod": await this.update("automod", msg); break; case "moderation": await this.update("moderation", msg); break; case "channels": await this.update("channels", msg); break; case "join": await this.update("join", msg); break; case "leave": await this.update("leave", msg); break; case "messages": await this.update("messages", msg); break; case "roles": await this.update("roles", msg); break; default: msg.reply(`${msg.language.get("CMD_LOG_INVALID")} \`automod\`, \`moderation\`, \`join\`, \`leave\`, \`channels\`, \`messages\`, \`roles\`.`); } } async update(key, msg) { const serverlogs = msg.guild.settings.get("serverlogs"); if (serverlogs[key]) { const { errors } = await msg.guild.settings.update(`serverlogs.${key}`, false).catch(e => e); if (errors) return msg.sendMessage(`${this.client.emotes.cross} ***There was an error:*** \`${errors}\``); return msg.sendMessage(`${this.client.emotes.cross} ***\`${key}\` ${msg.language.get("CMD_LOG_DISABLED")}***`); } else { const { errors } = await msg.guild.settings.update(`serverlogs.${key}`, true).catch(e => e); if (errors) return msg.sendMessage(`${this.client.emotes.cross} ***There was an error:*** \`${errors}\``); return msg.sendMessage(`${this.client.emotes.check} ***\`${key}\` ${msg.language.get("CMD_LOG_ENABLED")}***`); } } }; ================================================ FILE: src/commands/Management/Logging/loggingchannel.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["setloggingchannel", "setlogchannel"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], usage: "[Channel:channelname]", description: language => language.get("COMMAND_LOGCHAN_DESCRPTION"), extendedHelp: "No extended help available." }); } async run(msg, [Channel = msg.channel]) { return msg.guild.settings.update("channels.logs", Channel.id).then(() => { msg.sendMessage(`${this.client.emotes.check} ***${msg.language.get("MESSAGE_LOGCHAN_SET")}***`); }); } }; ================================================ FILE: src/commands/Management/Logging/modlogs.js ================================================ const Command = require("../../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["modlog", "managemodlogs"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], usage: " [Channel:channelname]", usageDelim: " ", description: language => language.get("COMMAND_MODLOG_DESCRPTION"), extendedHelp: "No extended help available.", subcommands: true }); } async channel(msg, [Channel = msg.channel]) { const { errors } = await msg.guild.settings.update("channels.modlogs", Channel.id); if (errors) return msg.reply(`${this.client.emotes.cross} ***There was an error: ${errors[0]}***`); return msg.sendMessage(`${this.client.emotes.check} ***${msg.language.get("MESSAGE_LOGCHAN_SET")}***`); } async toggle(msg) { const { errors } = await msg.guild.settings.update("toggles.modlogs", !msg.guild.settings.get("toggles.modlogs")); if (errors) return msg.reply(`${this.client.emotes.cross} ***There was an error: ${errors[0]}***`); return msg.reply(`${this.client.emotes.check} ***Mod logs have been ${msg.guild.settings.get("toggles.modlogs") ? "Enabled" : "Disabled"}.***`); } }; ================================================ FILE: src/commands/Management/Self Roles/manageselfroles.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], requiredPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "USE_EXTERNAL_EMOJIS", "MANAGE_ROLES"], aliases: ["addselfrole", "addselfroles", "removeselfrole", "removeselfroles"], cooldown: 5, permissionLevel: 6, description: language => language.get("COMMAND_SELFROLES_MANAGE"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [role]) { const roles = msg.guild.settings.get("roles.selfrole"); if (!roles) return msg.sendMessage(`${this.client.emotes.cross} ***${msg.language.get("CMD_NO_SELFROLES")}***`); if (!roles.includes(role.id)) { await msg.guild.settings.update("roles.selfrole", role, msg.guild); return msg.sendMessage(`${this.client.emotes.check} ***\`${role.name}\` ${msg.language.get("CMD_SELF_ASSIGNABLE")}***`); } else { await msg.guild.settings.update("roles.selfrole", role, msg.guild); return msg.sendMessage(`${this.client.emotes.cross} ***\`${role.name}\` ${msg.language.get("CMD_NO_ASSIGNABLE")}***`); } } }; ================================================ FILE: src/commands/Management/Self Roles/selfroles.js ================================================ const { Command, RichDisplay, MessageEmbed } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], requiredPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "USE_EXTERNAL_EMOJIS", "MANAGE_ROLES"], aliases: ["selfrole"], cooldown: 5, permissionLevel: 0, description: language => language.get("COMMAND_SELFROLES"), extendedHelp: "No extended help available.", usage: " [role:rolename]", usageDelim: " ", subcommands: true }); } async list(msg) { const roles = msg.guild.settings.get("roles.selfrole"); if (!roles.length) return msg.sendMessage(`${this.client.emotes.cross} ***${msg.language.get("CMD_NO_SELFROLES")}***`); const pages = new RichDisplay(new MessageEmbed() .setTitle("Use the reactions to change pages, select a page, or stop viewing the roles") .setAuthor("Self Roles - PenguBot", msg.guild.iconURL()) .setDescription("Scroll between pages to see the self assignable roles.") .setColor("#428bca") ); pages.addPage(t => t.setDescription(roles.map(role => `\`-\` ${msg.guild.roles.cache.get(role) || "Role Removed"}`).join("\n"))); pages.run(await msg.sendMessage(`${this.client.emotes.loading} ***Loading Roles...***`), { time: 120000, filter: (reaction, user) => user === msg.author }); } async add(msg, [role]) { if (!role) return msg.sendMessage(`${this.client.emotes.cross} ***You must specify a role in order to use this command.***`); const roles = msg.guild.settings.get("roles.selfrole"); if (!roles.length) return msg.sendMessage(`${this.client.emotes.cross} ***${msg.language.get("CMD_NO_SELFROLES")}***`); if (!roles.includes(role.id) || !role) return msg.sendMessage(`${this.client.emotes.cross} ***That given role is not self assignable do \`${msg.guild.settings.get("prefix")}selfroles list\` to know all the self assignable roles.***`); const myRole = msg.guild.me.roles.highest; if (role.position > myRole.positon) return msg.sendMessage(`${this.client.emotes.cross} ***That given role is above my role in the guild, please change the order.***`); if (msg.member.roles.cache.has(role.id)) return msg.sendMessage(`${this.client.emotes.cross} ***You already have that role do \`${msg.guild.settings.get("prefix")}selfroles remove ${role.name}\` to remove it.***`); const assigned = await msg.member.roles.add(role, "Self Assigned").catch(() => null); if (!assigned) return msg.sendMessage(`${this.client.emotes.cross} ***There was an error, please try again later.***`); return msg.sendMessage(`${this.client.emotes.check} ***The role has been assigned.***`); } async remove(msg, [role]) { if (!role) return msg.sendMessage(`${this.client.emotes.cross} ***You must specify a role in order to use this command.***`); const roles = msg.guild.settings.get("roles.selfrole"); if (!roles.length) return msg.sendMessage(`${this.client.emotes.cross} ***This guild does not have any self assignable roles or you didn't mention any.***`); if (!roles.includes(role.id) || !role) return msg.sendMessage(`${this.client.emotes.cross} ***That given role is not self assignable do \`${msg.guild.settings.get("prefix")}selfroles list\` to know all the self assignable roles.***`); const myRole = msg.guild.me.roles.highest; if (role.position > myRole.positon) return msg.sendMessage(`${this.client.emotes.cross} ***That given role is above my role in the guild, please change the order.***`); if (!msg.member.roles.cache.has(role.id)) return msg.sendMessage(`${this.client.emotes.cross} ***You don't have that role do \`${msg.guild.settings.get("prefix")}selfroles add ${role.name}\` to add it.***`); const assigned = await msg.member.roles.remove(role, "Self Deassigned").catch(() => null); if (!assigned) return msg.sendMessage(`${this.client.emotes.cross} ***There was an error, please try again later.***`); return msg.sendMessage(`${this.client.emotes.cross} ***The role has been deassigned.***`); } }; ================================================ FILE: src/commands/Management/Self Roles/toggleselfroles.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["toggleselfrole", "enableselfroles", "disableselfroles"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_TOGGLE_SELFROLES"), extendedHelp: "No extended help available." }); } async run(msg) { const toggle = !msg.guild.settings.get("toggles.selfroles"); await msg.guild.settings.update("toggles.selfroles", toggle); return msg.sendMessage(`${toggle ? this.client.emotes.check : this.client.emotes.cross} ${toggle ? msg.language.get("MESSAGE_AUTOROLES_ENABLED") : msg.language.get("MESSAGE_AUTOROLES_DISABLED")}`); } }; ================================================ FILE: src/commands/Management/Starboard/starboard.js ================================================ const { Command, MessageEmbed } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["star"], permissionLevel: 5, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], usage: "", description: language => language.get("COMMAND_STAR_DESCRPTION"), extendedHelp: "No extended help available." }); } async run(msg, [Message]) { const starChannel = msg.guild.channels.cache.find(c => c.id === msg.guild.settings.get("starboard.channel")); if (!starChannel || !starChannel.postable) return msg.reply("I do not have permissions to send Embeds in Starboard channel or Channel not found."); if (!starChannel.nsfw && msg.channel.nsfw) return msg.reply("This message is from an NSFW channel while your Starboard Channel is SFW, I can't send it there sorry!"); const fetch = await starChannel.messages.fetch({ limit: 100 }); const starMsg = fetch.find(m => m.embeds[0] && m.embeds[0].footer && m.embeds[0].footer.text.startsWith("⭐") && m.embeds[0].footer.text.endsWith(Message.id)); const jumpString = `[► View The Original Message](https://discordapp.com/channels/${Message.guild.id}/${Message.channel.id}/${Message.id})\n`; if (starMsg) { const star = /^\⭐\s([0-9]{1,3})\s\|\s([0-9]{17,20})/.exec(starMsg.embeds[0].footer.text); // eslint-disable-line const starEmbed = starMsg.embeds[0]; const image = Message.attachments.size > 0 ? await this.checkAttachments(Message.attachments.array()[0].url) : null; const embed = new MessageEmbed() .setColor(starEmbed.color) .setAuthor(`${Message.author.tag} in #${Message.channel.name}`, Message.author.displayAvatarURL()) .setTimestamp(new Date(Message.createdTimestamp)) .setFooter(`⭐ ${Message.reactions.cache.get("⭐").count} | ${msg.id}`); if (image) embed.setImage(image); if (starEmbed.description) embed.setDescription(`${jumpString}${starEmbed.description}`); else embed.setDescription(jumpString); const oldMsg = await starChannel.messages.fetch(starMsg.id); await oldMsg.edit({ embed }); } else { const image = Message.attachments.size > 0 ? await this.checkAttachments(Message.attachments.array()[0].url) : null; if (!image && Message.content.length < 1) return msg.reply("Can not star an Empty Message."); await Message.react("⭐"); const embed = new MessageEmbed() .setColor(15844367) .setAuthor(`${Message.author.tag} in #${Message.channel.name}`, Message.author.displayAvatarURL()) .setTimestamp(new Date(Message.createdTimestamp)) .setFooter(`⭐ ${Message.reactions.cache.get("⭐").count} | ${Message.id}`); if (image) embed.setImage(image); if (Message.content) embed.setDescription(`${jumpString}${Message.content}`); await starChannel.send({ embed }); } } checkAttachments(attachment) { const imageLink = attachment.split("."); const typeOfImage = imageLink[imageLink.length - 1]; const image = /(jpg|jpeg|png|gif)/gi.test(typeOfImage); if (!image) return null; return attachment; } }; ================================================ FILE: src/commands/Management/Starboard/starboardchannel.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["ssc", "setstarboardchannel"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], usage: "[channel:channelname]", usageDelim: "", description: language => language.get("COMMAND_CHANNEL_STAR_DESCRPTION"), extendedHelp: "No extended help available." }); } async run(msg, [channel = msg.channel]) { return msg.guild.settings.update("starboard.channel", channel.id).then(() => { msg.sendMessage(`${this.client.emotes.check} ***${msg.language.get("MESSAGE_STAR_CHANNEL_SET")}***`); }); } }; ================================================ FILE: src/commands/Management/Starboard/starsrequired.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["setstars", "setminimumstars"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], usage: "", description: language => language.get("COMMAND_REQUIRED_STAR_DESCRPTION"), extendedHelp: "No extended help available." }); } async run(msg, [Stars]) { if (Stars < 1) return msg.sendMessage(`***${this.client.emotes.cross} Required Stars for Starboard can't be less than 1***`); return msg.guild.settings.update("starboard.required", Stars).then(() => { msg.sendMessage(`${this.client.emotes.check} ***${msg.language.get("MESSAGE_STARS_REQUIRED_SET")}***`); }); } }; ================================================ FILE: src/commands/Management/Starboard/togglestarboard.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["tsb", "togglestarboards"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_TOGGLE_STARBOARD_DESCRPTION"), extendedHelp: "No extended help available." }); } async run(msg) { const toggle = !msg.guild.settings.get("toggles.starboard"); await msg.guild.settings.update("toggles.starboard", toggle); return msg.sendMessage(`${toggle ? this.client.emotes.check : this.client.emotes.cross} ${toggle ? msg.language.get("MESSAGE_STAR_ENABLED") : msg.language.get("MESSAGE_STAR_DISABLED")}`); } }; ================================================ FILE: src/commands/Management/Welcome & Leave/setleavechannel.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["slc", "setleavechan"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], usage: "[channel:channelname]", description: language => language.get("COMMAND_CHANNEL_LEAVE_DESCRPTION"), extendedHelp: "No extended help available." }); } async run(msg, [channel = msg.channel]) { return this.dbQuery(msg, channel).then(() => { msg.sendMessage(`${this.client.emotes.check} ***${msg.language.get("MESSAGE_LEAVE_CHANNEL_SET")}***`); }); } async dbQuery(msg, channel) { const r = this.client.providers.default.db; const query = await r.table("guilds").get(msg.guild.id) .update({ channels: { leave: channel.id } }) .run() .catch(e => { console.error(`${this.name} error:\n${e}`); throw `There was an error, please contact us on our support server: \n${e}`; }); await msg.guild.settings.sync(true); return query; } }; ================================================ FILE: src/commands/Management/Welcome & Leave/setleavemsg.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["slm", "setleavemessage"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], usage: "", description: language => language.get("COMMAND_SET_LEAVE_DESCRPTION"), extendedHelp: "No extended help available." }); } async run(msg, [message]) { return msg.guild.settings.update("messages.leave", message).then(() => { msg.sendMessage(`${this.client.emotes.check} ***${msg.language.get("MESSAGE_LEAVE_SET")}***`); }); } }; ================================================ FILE: src/commands/Management/Welcome & Leave/setwelcomechannel.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["swc", "setwelcomechan"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], usage: "[channel:channelname]", description: language => language.get("COMMAND_CHANNEL_WELCOME_DESCRPTION"), extendedHelp: "No extended help available." }); } async run(msg, [channel = msg.channel]) { return this.dbQuery(msg, channel).then(() => { msg.sendMessage(`${this.client.emotes.check} ***${msg.language.get("MESSAGE_WELCOME_CHANNEL_SET")}***`); }); } async dbQuery(msg, channel) { const r = this.client.providers.default.db; const query = await r.table("guilds").get(msg.guild.id) .update({ channels: { join: channel.id } }) .run() .catch(e => { console.error(`${this.name} error:\n${e}`); throw `There was an error, please contact us on our support server: \n${e}`; }); await msg.guild.settings.sync(true); return query; } }; ================================================ FILE: src/commands/Management/Welcome & Leave/setwelcomemsg.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["swm", "setwelcomemmessage"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], usage: "", description: language => language.get("COMMAND_SET_WELCOME_DESCRPTION"), extendedHelp: "No extended help available." }); } async run(msg, [message]) { return msg.guild.settings.update("messages.join", message).then(() => { msg.sendMessage(`${this.client.emotes.check} ***${msg.language.get("MESSAGE_WELCOME_SET")}***`); }); } }; ================================================ FILE: src/commands/Management/Welcome & Leave/toggleleave.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["tlm", "toggleleavemessages"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_TOGGLE_LEAVE_DESCRPTION"), extendedHelp: "No extended help available." }); } async run(msg) { if (!msg.guild.settings.get("toggles.leavemsg")) { if (!msg.guild.channels.cache.get(msg.guild.settings.get("channels.leave"))) { await msg.guild.settings.update("channels.leave", msg.channel.id); } if (!msg.guild.settings.get("messages.leave")) await msg.guild.settings.update("messages.leave", "It's sad to see you leaving **{USERNAME}**!", { action: "add" }); return msg.guild.settings.update("toggles.leavemsg", true).then(() => { msg.sendMessage(`${this.client.emotes.check} ***${msg.language.get("MESSAGE_LEAVE_ENABLED")}***`); }); } else { return msg.guild.settings.update("toggles.leavemsg", false).then(() => { msg.sendMessage(`${this.client.emotes.cross} ***${msg.language.get("MESSAGE_LEAVE_DISABLED")}***`); }); } } }; ================================================ FILE: src/commands/Management/Welcome & Leave/togglewelcome.js ================================================ const { Command } = require("../../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["twm", "togglewelcomemessages"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_TOGGLE_WELCOME_DESCRPTION"), extendedHelp: "No extended help available." }); } async run(msg) { if (!msg.guild.settings.get("toggles.joinmsg")) { if (!msg.guild.channels.cache.get(msg.guild.settings.get("channels.join"))) { await msg.guild.settings.update("channels.join", msg.channel.id); } if (!msg.guild.settings.get("messages.join")) await msg.guild.settings.update("messages.join", "Welcome {MENTION} to {SERVER}, we hope you enjoy your stay!", { action: "add" }); return msg.guild.settings.update("toggles.joinmsg", true).then(() => { msg.sendMessage(`${this.client.emotes.check} ***${msg.language.get("MESSAGE_WLCM_ENABLED")}***`); }); } else { return msg.guild.settings.update("toggles.joinmsg", false).then(() => { msg.sendMessage(`${this.client.emotes.cross} ***${msg.language.get("MESSAGE_WLCM_DISABLED")}***`); }); } } }; ================================================ FILE: src/commands/Manipulation/achievement.js ================================================ const { Command } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["mca", "makeachievement", "achievementget"], requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_MCA_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [achievement]) { const image = await this.client.funcs.images("generate/achievement", { avatar: msg.author.displayAvatarURL({ format: "png", size: 128 }), text: achievement }) .catch(() => null); if (!image) return msg.reply(msg.language.get("ER_TRY_AGAIN")); return msg.channel.sendFile(image); } }; ================================================ FILE: src/commands/Manipulation/approved.js ================================================ const { Command } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_APPROVED_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "[approvewho:username]" }); } async run(msg, [approvewho = msg.author]) { const image = await this.client.funcs.images("overlay/approved", { avatar: approvewho.displayAvatarURL({ format: "png", size: 512 }) }) .catch(() => null); if (!image) return msg.reply(msg.language.get("ER_TRY_AGAIN")); return msg.channel.sendFile(image); } }; ================================================ FILE: src/commands/Manipulation/batslap.js ================================================ const { Command } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["slapme"], requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_BATSLAP_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [user]) { const image = await this.client.funcs.images("generate/batslap", { slapper: msg.author.displayAvatarURL({ format: "png", size: 128 }), slapped: user.displayAvatarURL({ format: "png", size: 128 }) }) .catch(() => null); if (!image) return msg.reply(msg.language.get("ER_TRY_AGAIN")); return msg.channel.sendFile(image); } }; ================================================ FILE: src/commands/Manipulation/beautiful.js ================================================ const { Command } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["beautify"], requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_BEAUTIFUL_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "[user:username]" }); } async run(msg, [user = msg.author]) { const image = await this.client.funcs.images("generate/beautiful", { avatar: user.displayAvatarURL({ format: "png", size: 128 }) }) .catch(() => null); if (!image) return msg.reply(msg.language.get("ER_TRY_AGAIN")); return msg.channel.sendFile(image); } }; ================================================ FILE: src/commands/Manipulation/changemymind.js ================================================ const { Command } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["cmm"], requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_CMM_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [text]) { const image = await this.client.funcs.images("generate/changemymind", { text: text, avatar: msg.author.displayAvatarURL({ format: "png", size: 128 }) }) .catch(() => null); if (!image) return msg.reply(msg.language.get("ER_TRY_AGAIN")); return msg.channel.sendFile(image); } }; ================================================ FILE: src/commands/Manipulation/facepalm.js ================================================ const { Command } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_FACEPALM_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "[user:username]" }); } async run(msg, [user = msg.author]) { const image = await this.client.funcs.images("generate/facepalm", { avatar: user.displayAvatarURL({ format: "png", size: 256 }) }) .catch(() => null); if (!image) return msg.reply(msg.language.get("ER_TRY_AGAIN")); return msg.channel.sendFile(image); } }; ================================================ FILE: src/commands/Manipulation/garbage.js ================================================ const { Command } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["garbagewho"], requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_GARBAGE_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "[garbagewho:username]" }); } async run(msg, [garbagewho = msg.author]) { const image = await this.client.funcs.images("generate/garbage", { avatar: garbagewho.displayAvatarURL({ format: "png", size: 256 }) }) .catch(() => null); if (!image) return msg.reply(msg.language.get("ER_TRY_AGAIN")); return msg.channel.sendFile(image); } }; ================================================ FILE: src/commands/Manipulation/illegal.js ================================================ const { Command } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["isnowillegal", "trumpillegal"], requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_ILLEGAL_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [name]) { const image = await this.client.funcs.images("generate/illegal", { text: name }) .catch(() => null); if (!image) return msg.sendMessage(`${this.client.emotes.cross} You got Trumped, couldn't create a new bill! Try something else.`); return msg.channel.sendFile(image); } }; ================================================ FILE: src/commands/Manipulation/lio.js ================================================ const { Command } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["lionme"], requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_LIO_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "[user:username]" }); } async run(msg, [user = msg.author]) { const image = await this.client.funcs.images("generate/lio", { avatar: user.displayAvatarURL({ format: "png", size: 256 }) }) .catch(() => null); if (!image) return msg.reply(msg.language.get("ER_TRY_AGAIN")); return msg.channel.sendFile(image); } }; ================================================ FILE: src/commands/Manipulation/missing.js ================================================ const { Command } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["missingposter"], requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_MISSING_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "[user:username]" }); } async run(msg, [user = msg.author]) { const image = await this.client.funcs.images("generate/missing", { text: user.username, avatar: user.displayAvatarURL({ format: "png", size: 256 }) }) .catch(() => null); if (!image) return msg.reply(msg.language.get("ER_TRY_AGAIN")); return msg.channel.sendFile(image); } }; ================================================ FILE: src/commands/Manipulation/rejected.js ================================================ const { Command } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_REJECT_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "[rejectwho:username]" }); } async run(msg, [rejectwho = msg.author]) { const image = await this.client.funcs.images("overlay/rejected", { avatar: rejectwho.displayAvatarURL({ format: "png", size: 512 }) }) .catch(() => null); if (!image) return msg.reply(msg.language.get("ER_TRY_AGAIN")); return msg.channel.sendFile(image); } }; ================================================ FILE: src/commands/Manipulation/respect.js ================================================ const { Command } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["rip"], requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_RIP_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "[user:username]" }); } async run(msg, [user = msg.author]) { const image = await this.client.funcs.images("generate/respect", { avatar: user.displayAvatarURL({ format: "png", size: 128 }) }) .catch(() => null); if (!image) return msg.reply(msg.language.get("ER_TRY_AGAIN")); return msg.channel.sendFile(image); } }; ================================================ FILE: src/commands/Manipulation/snap.js ================================================ const { Command } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["snapchat"], requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_SNAPCHAT_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [snaptext]) { const image = await this.client.funcs.images("generate/snpchat", { text: snaptext }) .catch(() => null); if (!image) return msg.reply(msg.language.get("ER_TRY_AGAIN")); return msg.channel.sendFile(image); } }; ================================================ FILE: src/commands/Manipulation/superpunch.js ================================================ const { Command } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["megapunch"], requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_SUPERPUNCH_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [user]) { const image = await this.client.funcs.images("generate/superpunch", { avatar1: msg.author.displayAvatarURL({ format: "png", size: 128 }), avatar2: user.displayAvatarURL({ format: "png", size: 128 }) }) .catch(() => null); if (!image) return msg.reply(msg.language.get("ER_TRY_AGAIN")); return msg.channel.sendFile(image); } }; ================================================ FILE: src/commands/Manipulation/tattoo.js ================================================ const { Command } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["tatted"], requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_TATTOO_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "[user:username]" }); } async run(msg, [user = msg.author]) { const image = await this.client.funcs.images("generate/tattoo", { avatar: user.displayAvatarURL({ format: "png", size: 512 }) }) .catch(() => null); if (!image) return msg.reply(msg.language.get("ER_TRY_AGAIN")); return msg.channel.sendFile(image); } }; ================================================ FILE: src/commands/Manipulation/tinder.js ================================================ const { Command } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_TINDER_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "" }); } async run(msg, [matchwith]) { if (matchwith.id === msg.author.id) return msg.reply(msg.language.get("ER_TINDER")); const image = await this.client.funcs.images("generate/tinder", { avatar1: msg.author.displayAvatarURL({ format: "png", size: 256 }), avatar2: matchwith.displayAvatarURL({ format: "png", size: 256 }) }) .catch(() => null); if (!image) return msg.reply(msg.language.get("ER_TRY_AGAIN")); return msg.channel.sendFile(image); } }; ================================================ FILE: src/commands/Manipulation/triggered.js ================================================ const { Command } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["trigger"], requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_TRIGGERED_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "[user:username]" }); } async run(msg, [user = msg.author]) { const image = await this.client.funcs.images("generate/triggered", { avatar: user.displayAvatarURL({ format: "png", size: 512 }) }) .catch(() => null); if (!image) return msg.reply(msg.language.get("ER_TRY_AGAIN")); return msg.channel.sendFile(image, "triggered.gif"); } }; ================================================ FILE: src/commands/Manipulation/vault.js ================================================ const { Command } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_VAULT_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "[user:username]" }); } async run(msg, [user = msg.author]) { const image = await this.client.funcs.images("generate/vault", { avatar: user.displayAvatarURL({ format: "png", size: 128 }) }) .catch(() => null); if (!image) return msg.reply(msg.language.get("ER_TRY_AGAIN")); return msg.channel.sendFile(image); } }; ================================================ FILE: src/commands/Manipulation/wanted.js ================================================ const { Command } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 8, aliases: ["wantedposter"], requiredPermissions: ["ATTACH_FILES", "USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_WANTED_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "[user:username]" }); } async run(msg, [user = msg.author]) { const image = await this.client.funcs.images("generate/wanted", { avatar: user.displayAvatarURL({ format: "png", size: 512 }) }) .catch(() => null); if (!image) return msg.reply(msg.language.get("ER_TRY_AGAIN")); return msg.channel.sendFile(image); } }; ================================================ FILE: src/commands/Moderation/ban.js ================================================ /* eslint-disable no-unused-expressions */ const { Command, ModLog, Duration } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["banmember"], permissionLevel: 5, requiredPermissions: ["USE_EXTERNAL_EMOJIS", "BAN_MEMBERS"], description: language => language.get("COMMAND_BAN_DESCRIPTION"), quotedStringSupport: false, usage: " [reason:string] [...]", usageDelim: " ", extendedHelp: "`--duration <1d-14d>` to Temporary Ban a User\n`--messages <1-7>` for days of messages to delete" }); } // eslint-disable-next-line complexity async run(msg, [user, ...reason]) { reason = reason ? reason.join(" ") : null; if (user.id === msg.author.id) return msg.reply(`${this.client.emotes.cross} ***${msg.language.get("MESSAGE_BAN_YOURSELF")}***`); if (user.id === this.client.user.id) return msg.reply(`${this.client.emotes.cross} ***${msg.language.get("MESSAGE_BAN_PENGU")}***`); let target = await msg.guild.members.fetch(user.id).catch(() => null); if (target) { if (target.roles.highest.position >= msg.member.roles.highest.position) return msg.reply(`${this.client.emotes.cross} ***Target member is higher in role hierarchy than you.***`); else if (!target.bannable) return msg.reply(`${this.client.emotes.cross} ***${msg.language.get("MESSAGE_BAN_CANT")}***`); } else { target = user; } let msgDays = msg.flagArgs.messages || msg.flagArgs.msg; msgDays = Number(msgDays); const banDays = msg.flagArgs.duration || msg.flagArgs.tempban || msg.flagArgs.time || null; let duration; banDays ? duration = new Duration(banDays) : null; if (msgDays && (!typeof msgDays === Number || msgDays < 1 || msgDays >= 8)) throw `${this.client.emotes.cross} ***Invalid days of messages to be deleted, 1-7 only.***`; if (banDays && (duration.offset < 1 || duration.offset > 2592000000)) throw `${this.client.emotes.cross} ***Invalid temporary ban days, maximum 30 days only.***`; await msg.guild.members.ban(target, { reason: reason ? reason : `No Reason Specified - ${msg.author.tag}`, days: msgDays }); if (msg.guild.settings.get("toggles.modlogs")) { await new ModLog(msg.guild) .setType("ban") .setModerator(msg.author) .setReason(reason) .setUser(user) .send(); } if (banDays) await this.client.schedule.create("timedBan", duration, { data: { guildID: msg.guild.id, userID: user.id }, catchUp: true }); return msg.sendMessage(`${this.client.emotes.check} ***${user.tag ? user.tag : user.user.tag} ${msg.language.get("MESSAGE_BANNED")}${duration > 0 ? ` Temp Ban for: ${banDays}` : ""}***`); } }; ================================================ FILE: src/commands/Moderation/case.js ================================================ const { Command, MessageEmbed } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { requiredPermissions: ["USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], permissionLevel: 3, runIn: ["text"], description: language => language.get("COMMAND_CASE_DESCRIPTION"), usage: "" }); } async run(msg, [selected]) { const log = msg.guild.settings.get("modlogs")[selected]; if (!log) return msg.send(`${this.client.emotes.cross} ${msg.author}, That case could not be found, please try another ID.`); const [user, moderator] = await Promise.all([ this.client.users.fetch(log.user), this.client.users.fetch(log.moderator) ]); return msg.sendEmbed(new MessageEmbed() .setDescription([ `❯ **User**: ${user.tag} (${user.id})`, `❯ **Moderator**: ${moderator.tag} (${moderator.id})`, `❯ **Reason**: ${log.reason || `No Reason Specified. Use \`${msg.guild.settings.get("prefix")}reason ${log.case}\` to claim this log.`}` ].join("\n")) .setTimestamp(log.timestamp) .setFooter("PenguBot.com - Case Date") .setAuthor(`Case: ${log.case}`, this.client.user.displayAvatarURL()) .setColor("#52c6ff")); } }; ================================================ FILE: src/commands/Moderation/history.js ================================================ const { Command, MessageEmbed } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { requiredPermissions: ["USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], permissionLevel: 3, runIn: ["text"], description: language => language.get("COMMAND_HISTORY_DESCRIPTION"), usage: "" }); } async run(msg, [user]) { const userlogs = msg.guild.settings.get("modlogs").filter(log => log.user === user.id); if (!userlogs) return msg.send(`${this.client.emotes.cross} ***No history for this user could be found in the mod logs.***`); const actions = { ban: 0, unban: 0, softban: 0, kick: 0, warn: 0, mute: 0, unmute: 0 }; for (const log of userlogs) actions[log.type]++; return msg.sendEmbed(new MessageEmbed() .setDescription([ `❯ **User**: ${user.tag} (${user.id})`, `❯ **Ban**: ${actions.ban}`, `❯ **Unban**: ${actions.unban}`, `❯ **Mute**: ${actions.mute}`, `❯ **Unmute**: ${actions.unmute}`, `❯ **Warn**: ${actions.warn}`, `❯ **Kick**: ${actions.kick}` ].join("\n")) .setTimestamp() .setFooter("PenguBot.com") .setAuthor(`User History`, this.client.user.displayAvatarURL()) .setColor("#52c6ff")); } }; ================================================ FILE: src/commands/Moderation/kick.js ================================================ const { Command, ModLog } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["kickmember"], permissionLevel: 5, requiredPermissions: ["USE_EXTERNAL_EMOJIS", "KICK_MEMBERS"], description: language => language.get("COMMAND_KICK_DESCRIPTION"), quotedStringSupport: false, usage: " [reason:string] [...]", usageDelim: " ", extendedHelp: "No extended help available." }); } async run(msg, [member, ...reason]) { reason = reason ? reason.join(" ") : null; if (member.id === msg.author.id) return msg.reply(`${this.client.emotes.cross} ***${msg.language.get("MESSAGE_KICK_YOURSELF")}***`); if (member.id === this.client.user.id) return msg.reply(`${this.client.emotes.cross} ***${msg.language.get("MESSAGE_KICK_PENGU")}***`); if (member.roles.highest.position >= msg.member.roles.highest.position) { return msg.send(`${this.client.emotes.cross} ***Target member is higher in role hierarchy than you.***`); } else if (member.kickable === false) { return msg.send(`${this.client.emotes.cross} ***${msg.language.get("MESSAGE_KICK_CANT")}***`); } await member.kick(reason) .catch(e => msg.reply(`${this.client.emotes.cross} ***There was an error: ${e}***`)); if (msg.guild.settings.get("toggles.modlogs")) { await new ModLog(msg.guild) .setType("kick") .setModerator(msg.author) .setUser(member.user) .setReason(reason) .send(); } return msg.sendMessage(`${this.client.emotes.check} ***${member.user.tag} ${msg.language.get("MESSAGE_KICKED")}***`); } }; ================================================ FILE: src/commands/Moderation/mute.js ================================================ /* eslint-disable no-unused-expressions */ const { Command, ModLog, Duration, Permissions: { FLAGS } } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 8, aliases: ["togglemute", "unmute"], permissionLevel: 3, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_MUTE_DESCRPTION"), usage: " [reason:string] [...]", extendedHelp: "No extended help available." }); } async run(msg, [member, ...reason]) { reason = reason ? reason.join(" ") : null; if (member.id === msg.author.id) return msg.reply(`${this.client.emotes.cross} ***You can not mute yourself...***`); if (member.id === this.client.user.id) return msg.reply(`${this.client.emotes.cross} ***Why would you want to mute Pengu?***`); const roleID = await this.dbQueryFetch(msg); if (!roleID || !msg.guild.roles.cache.has(roleID)) await this.createRole(msg); const role = await msg.guild.roles.fetch(await this.dbQueryFetch(msg)).catch(() => null); if (!role) return msg.sendMessage("There was an error, I couldn't find the Muted role! Please try again or contact us at: https://discord.gg/u8WYw5r"); const myRole = msg.guild.me.roles.highest; if (role.position > myRole.positon) return msg.sendMessage(`${this.client.emotes.cross} ***The \`PENGUMUTED\` role is above my role in the hierarchy, please change the order and try again.***`); const highestRole = member.roles.highest; if (myRole.position < highestRole.positon) return msg.sendMessage(`${this.client.emotes.cross} ***That user has a role above my role in the hierarchy, please change the order and try again.***`); const time = msg.flagArgs.time || msg.flagArgs.duration || msg.flagArgs.tempmute; let duration = null; time ? duration = new Duration(time) : null; if (time && (duration.offset < 1 || duration.offset > 2592000000)) throw `${this.client.emotes.cross} ***Duration is invalid, try something like 1 hour, 1 day, etc. Maximum 30 days.***`; if (member.roles.cache.has(role.id)) { await member.roles.remove(role.id) .catch(e => msg.reply(`${this.client.emotes.cross} ***There was an error: ${e}***`)); if (msg.guild.settings.get("toggles.modlogs")) { await new ModLog(msg.guild) .setType("unmute") .setModerator(msg.author) .setReason(reason) .setUser(member.user) .send(); } return msg.sendMessage(`${this.client.emotes.check} ***${member.user.tag} ${msg.language.get("MESSAGE_UNMUTED")}***`); } else { await member.roles.add(role.id) .catch(e => msg.reply(`${this.client.emotes.cross} ***There was an error: ${e}***`)); if (msg.guild.settings.get("toggles.modlogs")) { await new ModLog(msg.guild) .setType("mute") .setModerator(msg.author) .setReason(reason) .setUser(member.user) .send(); } if (time) await this.client.schedule.create("timedMute", new Duration(time), { data: { guildID: msg.guild.id, userID: member.id }, catchUp: true }); return msg.sendMessage(`${this.client.emotes.check} ***${member.user.tag} ${msg.language.get("MESSAGE_MUTED")}${time ? ` Temp Mute for: ${time}` : ""}***`); } } async createRole(msg) { if (!msg.guild.me.permissions.has("MANAGE_ROLES")) throw msg.sendMessage(`${this.client.emotes.cross} ***I do not have \`MANAGE ROLES\` permissions. Please assign the permission and try again.***`); const newRole = await msg.guild.roles.create({ data: { name: "PENGUMUTED", permissions: [FLAGS.VIEW_CHANNEL] } }).catch(() => null); if (!newRole) throw msg.reply(`There was an error. Make sure Pengu has appropriate permissions and try again.`); await this.dbQueryUpdate(msg, newRole.id); const promises = []; for (const channel of msg.guild.channels.cache.values()) promises.push(channel.updateOverwrite(newRole, { SEND_MESSAGES: false, ADD_REACTIONS: false, CONNECT: false }, `Mute Command Executed By ${msg.author.tag}`)); // Catching for channels that don't allow permission await Promise.all(promises).catch(() => null); } async dbQueryUpdate(msg, roleID) { const r = this.client.providers.default.db; const query = await r.table("guilds").get(msg.guild.id) .update({ roles: { muted: roleID } }) .run() .catch(e => { console.error(`${this.name} error:\n${e}`); throw `There was an error, please contact us on our support server: \n${e}`; }); await msg.guild.settings.sync(true); return query; } async dbQueryFetch(msg) { const r = this.client.providers.default.db; const query = await r.table("guilds").get(msg.guild.id) .getField("roles") .run() .catch(e => { console.error(`${this.name} error:\n${e}`); throw `There was an error, please contact us on our support server: \n${e}`; }); if (!query.muted) return null; return query.muted; } }; ================================================ FILE: src/commands/Moderation/prune.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["clean", "purge"], permissionLevel: 3, requiredPermissions: ["MANAGE_MESSAGES", "USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_PRUNE_DESCRIPTION"), usage: "[limit:integer] [link|links|invite|invites|bots|pengu|me|upload|uploads|user:user]", usageDelim: " ", extendedHelp: "No extended help available." }); } async run(msg, [limit = 10, filter = null]) { await msg.delete().catch(() => null); let messages = await msg.channel.messages.fetch({ limit: 100 }); if (filter) { const user = typeof filter !== "string" ? filter : null; const type = typeof filter === "string" ? filter : "user"; messages = messages.filter(this.getFilter(msg, type, user)); } messages = messages.array().slice(0, limit); await msg.channel.bulkDelete(messages, true) .catch(() => msg.reply("I tried my best but some messages were older than 14 days so I couldn't delete them!")); return msg.sendMessage(`${this.client.emotes.check} ***${messages.length} ${msg.language.get("MESSAGE_PRUNE_DELETED")}***`); } getFilter(msg, filter, user) { switch (filter) { case "link" || "links": return mes => /https?:\/\/[^ /.]+\.[^ /.]+/.test(mes.content); case "invite" || "invites": return mes => /(https?:\/\/)?(www\.)?(discord\.(gg|li|me|io)|discordapp\.com\/invite)\/.+/.test(mes.content); case "bots": return mes => mes.author.bot; case "pengu": return mes => mes.author.id === this.client.user.id; case "me": return mes => mes.author.id === msg.author.id; case "upload" || "uploads": return mes => mes.attachments.size > 0; case "user": return mes => mes.author.id === user.id; default: return () => true; } } }; ================================================ FILE: src/commands/Moderation/reason.js ================================================ const { Command, ModLog, klasaUtil, MessageEmbed } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { requiredPermissions: ["USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], permissionLevel: 3, runIn: ["text"], description: language => language.get("COMMAND_REASON_DESCRIPTION"), usage: " [reason:string] [...]", usageDelim: " " }); } async run(msg, [selected, ...reason]) { reason = reason ? reason.join(" ") : null; const logs = msg.guild.settings.get("modlogs"); const log = logs[selected]; if (!log) return msg.sendMessage(`${this.client.emotes.cross} ${msg.author}, That case could not be found, please try another ID.`); if (!msg.guild.settings.get("channels.modlogs")) return msg.sendMessage(`${this.client.emotes.cross} Modlogs channel not found. Please do \`${msg.guild.settings.get("prefix")}modlogschannel \` to set it.`); const channel = msg.guild.channels.cache.get(msg.guild.settings.get("channels.modlogs")); if (!channel) return msg.sendMessage(`${this.client.emotes.cross} Modlogs channel not found. Please do \`${msg.guild.settings.get("prefix")}modlogschannel \` to set it.`); const mod = await this.client.users.fetch(log.moderator); const muser = await this.client.users.fetch(log.user); const messages = await channel.messages.fetch({ limit: 100 }); const message = messages.find(mes => mes.author.id === this.client.user.id && mes.embeds.length > 0 && mes.embeds[0].type === "rich" && mes.embeds[0].footer && mes.embeds[0].footer.text === `Case: ${selected}` ); if (message) { const [embed] = message.embeds; const [type, user] = embed.description.split("\n"); embed.description = [ type, user, `**❯ Reason**: ${reason}` ].join("\n"); await message.edit({ embed }); } else { const embed = new MessageEmbed() .setAuthor(mod.tag) .setColor(ModLog.color(log.type)) .setDescription([ `**❯ Type**: ${log.type[0].toUpperCase() + log.type.slice(1)}`, `**❯ User**: ${muser.tag} (${muser.id})`, `**❯ Reason**: ${reason}` ].join("\n")) .setFooter(`Case: ${selected}`) .setTimestamp(); await channel.send({ embed }); } const oldReason = log.reason; logs[selected].reason = reason; await msg.guild.settings.update("modlogs", logs); return msg.send(`${this.client.emotes.check} Case ${selected} has been updated.${klasaUtil.codeBlock("http", [ `Old reason : ${oldReason || "No Reason Specified."}`, `New reason : ${reason}` ].join("\n"))}`); } }; ================================================ FILE: src/commands/Moderation/softban.js ================================================ const { Command, ModLog } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["softbanmember"], permissionLevel: 5, requiredPermissions: ["USE_EXTERNAL_EMOJIS", "BAN_MEMBERS"], description: language => language.get("COMMAND_SOFTBAN_DESCRIPTION"), quotedStringSupport: false, usage: " [reason:string] [...]", usageDelim: " ", extendedHelp: "--messages <1-7> - Days of messages" }); } // eslint-disable-next-line complexity async run(msg, [user, ...reason]) { reason = reason ? reason.join(" ") : null; if (user.id === msg.author.id) return msg.reply(`${this.client.emotes.cross} ***${msg.language.get("MESSAGE_BAN_YOURSELF")}***`); if (user.id === this.client.user.id) return msg.reply(`${this.client.emotes.cross} ***${msg.language.get("MESSAGE_BAN_PENGU")}***`); let target = await msg.guild.members.fetch(user.id).catch(() => null); if (target) { if (target.roles.highest.position >= msg.member.roles.highest.position) { return msg.reply(`${this.client.emotes.cross} ***Target member is higher in role hierarchy than you.***`); } else if (!target.bannable) { return msg.reply(`${this.client.emotes.cross} ***${msg.language.get("MESSAGE_BAN_CANT")}***`); } } else { target = user; } const msgDays = "messages" in msg.flagArgs ? Number(msg.flagArgs.messages) : 7; if (msgDays < 1 || msgDays >= 8) throw `${this.client.emotes.cross} ***Invalid days of messages to be deleted, 1-7 only.***`; await msg.guild.members.ban(target, { reason: reason ? reason : `No Reason Specified - ${msg.author.tag}`, days: msgDays }) .catch(e => msg.reply(`${this.client.emotes.cross} ***There was an error: ${e}***`)); await msg.guild.members.unban(target, "PenguBot Softban") .catch(e => msg.reply(`${this.client.emotes.cross} ***There was an error: ${e}***`)); if (msg.guild.settings.get("toggles.modlogs")) { await new ModLog(msg.guild) .setType("softban") .setModerator(msg.author) .setReason(reason) .setUser(user) .send(); } return msg.sendMessage(`${this.client.emotes.check} ***${user.tag ? user.tag : user.user.tag} ${msg.language.get("MESSAGE_SOFTBANNED")}***`); } }; ================================================ FILE: src/commands/Moderation/warn.js ================================================ const { Command, ModLog } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { requiredPermissions: ["USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], permissionLevel: 3, runIn: ["text"], description: language => language.get("COMMAND_WARN_DESCRIPTION"), usage: " [reason:string] [...]", usageDelim: " " }); } async run(msg, [member, ...reason]) { reason = reason ? reason.join(" ") : null; if (member.roles.highest.position >= msg.member.roles.highest.position) { return msg.sendMessage(`${this.client.emotes.cross} ***Target member is higher in role hierarchy than you.***`); } await new ModLog(msg.guild) .setType("warn") .setModerator(msg.author) .setUser(member.user) .setReason(reason) .send(); await member.user.sendCode("http", [ `You've been warned in ${msg.guild.name}`, `Reason : ${reason ? reason : "No Reason Specified"}` ].join("\n")).catch(() => null); return msg.sendMessage(`${this.client.emotes.check} ***This user has been sucessfully warned:*** ${member.user.tag}${reason ? `\n***Reason:*** ${reason}` : ""}`); } }; ================================================ FILE: src/commands/Music/music.js ================================================ const KlasaCommand = require("../../lib/structures/KlasaCommand"); const { MessageEmbed } = require("discord.js"); module.exports = class extends KlasaCommand { constructor(...args) { super(...args, { cooldown: 10, requiredPermissions: ["USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_MUSIC_DESCRIPTION"), extendedHelp: "No extended help available." }); } async run(msg) { const prefix = msg.guild.settings.get("prefix"); const embed = new MessageEmbed() .setColor("#91c3d2") .setTitle("🎵 | Music Help - PenguBot") .setTimestamp() .setFooter("© PenguBot.com") .setDescription("Now enjoy music right on your Discord Guild with PenguBot Music, powered with extreme backend technology where performance is not compromised.") .addField(`• ${prefix}play`, "For Song Selector Use: `p!play `, For Playlists, YouTube Video URLs, Soundcloud URLs, Live Streams, etc. use `p!play `, for SoundCloud Search or YouTube Search use: `p!play :`.") // eslint-disable-line max-len .addField(`• ${prefix}stop`, "Stops the music and clears the queue. Requires `Pengu-DJ` or above.") .addField(`• ${prefix}skip`, "Skip the current song instantly if there are 3 or less people in the voice channel. It does a vote skip if there are more people. Requires `Pengu-DJ` or above.") .addField(`• ${prefix}pause`, "Pause the music. Requires Requires `Pengu-DJ` or above. PATRON ONLY") .addField(`• ${prefix}resume`, "Resume the paused music. Requires Requires `Pengu-DJ` or above. PATRON ONLY") .addField(`• ${prefix}queue`, "Tells you which all songs are in the queue with more information.") .addField(`• ${prefix}lyrics`, "Enter a song name and get lyrics for it on the go easily.") .addField(`• ${prefix}nowplaying`, "Get information about the currently playing song.") .addField(`• ${prefix}dmsong`, "Direct Messages you the information about the currently playing song.") .addField(`• ${prefix}managedj`, "Tag a user to make them admin, requires Pengu-Mod or above.") .addField(`• ${prefix}loop`, "Loop a song to repeat everytime it finishes.") .addField(`• ${prefix}toggledj`, "Allow Pengu-Mod and above to make music commands Pengu-DJ Mode only.") .addField(`• ${prefix}shuffle`, "Shuffle the song queue to randomize it.") .addField(`• ${prefix}volume`, "Change Volume of PenguBot in Voice Channel.") .addField("\u200B", `**Support PenguBot, Become a Patron**\nWant to get access to exclusive features while supporting PenguBot? Consider becoming a Patron today: [Patreon](https://www.patreon.com/PenguBot)\n\n**Note:** This feature does go through constant development mostly all the time. If you find any bugs please head over to https://discord.gg/NQCTdEc and report them to us!`); // eslint-disable-line max-len return msg.sendEmbed(embed); } }; ================================================ FILE: src/commands/Profiles/backgrounds.js ================================================ const { Command, RichDisplay } = require("klasa"); const { MessageEmbed } = require("discord.js"); const list = [{ c: 1, n: "Default", i: "https://i.imgur.com/8DJtnYh.png", p: "FREE" }, { c: 2, n: "Sunset Palms", i: "https://i.imgur.com/V5HQd0F.png", p: 1000 }, { c: 3, n: "Cherry Blossoms", i: "https://i.imgur.com/16OiRLK.png", p: 1000 }, { c: 4, n: "Butterflies", i: "https://i.imgur.com/czaPXgo.png", p: 1000 }, { c: 5, n: "Sunset Tree", i: "https://i.imgur.com/Wa7YNAP.png", p: 1250 }, { c: 6, n: "Birdie", i: "https://i.imgur.com/TxtlYGz.png", p: 1250 }, { c: 7, n: "Tracks", i: "https://i.imgur.com/UaOHTeg.png", p: 1500 }, { c: 8, n: "Stars", i: "https://i.imgur.com/nKTku3d.png", p: 1500 }, { c: 9, n: "People", i: "https://i.imgur.com/IfN42Lu.png", p: 1850 }, { c: 10, n: "Courtyard", i: "https://i.imgur.com/8t3lmXK.png", p: 2000 }]; module.exports = class extends Command { constructor(...args) { super(...args, { subcommands: true, aliases: ["background", "profilebg", "bgs", "bg"], usage: " [key:string]", description: language => language.get("COMMAND_BACKGROUND_DESCRIPTION"), usageDelim: " " }); } async view(msg, [key]) { await msg.author.settings.sync(true); // If All Backgrounds if (!key) { const userbg = msg.author.settings.get("backgrounds"); const bgs = new RichDisplay(new MessageEmbed() .setTitle("Use 'p!bgs view all' to view names, id's and prices of all available backgrounds") .setAuthor("Profile Backgrounds You Own - PenguBot", "https://i.imgur.com/oq9kgaR.png") .setDescription("Scroll between pages to see the profile backgrounds list you own. 'p!bgs view all' to view all available backgrounds you can buy and purchase.") .setColor("#F75F4E") ); for (let i = 0, temp = userbg.length; i < temp; i += 5) { const curr = userbg.slice(i, i + 5); bgs.addPage(t => t.setDescription(curr.map(c => `• ${c}`))); } bgs.run(await msg.sendMessage(`${this.client.emotes.loading} Loading List...`), { time: 120000, filter: (reaction, user) => user === msg.author }); } else if (key.toLowerCase() === "all") { const bgs = new RichDisplay(new MessageEmbed() .setTitle("Use Command: `p!bgs buy ID` to buy a background and `p!bgs change ID` to change it") .setAuthor("All Profile Backgrounds - PenguBot", "https://i.imgur.com/oq9kgaR.png") .setDescription("Scroll between pages to see the profile backgrounds list.") .setColor("#F75F4E") ); for (const bg of list) { bgs.addPage(t => t .setImage(bg.i) .setDescription(`**ID:** ${bg.c} | **Name:** ${bg.n} | **Price:** ${bg.p}`)); } bgs.run(await msg.sendMessage(`${this.client.emotes.loading} Loading List...`), { time: 120000, filter: (reaction, user) => user === msg.author }); } else { return msg.reply("Invalid option, please type `p!bg view all` to view all the backgrounds available."); } } async buy(msg, [key]) { await msg.author.settings.sync(true); const id = parseInt(key); switch (id) { case 1: return msg.reply("You already own this background."); case 2: await this.process(msg, "sunset-palms", 1000); break; case 3: await this.process(msg, "cherry-blossoms", 1000); break; case 4: await this.process(msg, "butterflies", 1000); break; case 5: await this.process(msg, "sunset-tree", 1250); break; case 6: await this.process(msg, "birdie", 1250); break; case 7: await this.process(msg, "tracks", 1500); break; case 8: await this.process(msg, "stars", 1500); break; case 9: await this.process(msg, "people", 1850); break; case 10: await this.process(msg, "courtyard", 2000); break; default: return msg.reply("Invalid ID, please view all backgrounds you can purchase by using the command `p!bgs view all`."); } } async change(msg, [key]) { await msg.author.settings.sync(true); const id = parseInt(key); switch (id) { case 1: await this.changeBG(msg, "default"); break; case 2: await this.changeBG(msg, "sunset-palms"); break; case 3: await this.changeBG(msg, "cherry-blossoms"); break; case 4: await this.changeBG(msg, "butterflies"); break; case 5: await this.changeBG(msg, "sunset-tree"); break; case 6: await this.changeBG(msg, "birdie"); break; case 7: await this.changeBG(msg, "tracks"); break; case 8: await this.changeBG(msg, "stars"); break; case 9: await this.changeBG(msg, "people"); break; case 10: await this.changeBG(msg, "courtyard"); break; default: return msg.reply("Invalid ID, please view all backgrounds you can purchase and their IDs by using the command `p!bgs view all`."); } } async process(msg, name, price) { await msg.author.settings.sync(true); if (this.checkOwnership(msg, name)) return msg.reply("You already own this background."); if (!this.checkBalance(msg, price)) return msg.reply("Insufficient Snowflakes in your account to buy this background, please try again later."); await this.updateOwnership(msg, name, price); } async changeBG(msg, name) { await msg.author.settings.sync(true); if (!this.checkOwnership(msg, name)) return msg.reply("You do not own this background, please buy it using `p!bg buy ID` first."); if (this.compareBackground(msg, name)) return msg.reply("That is already your current background, please choose another one."); await this.updateBG(msg, name); } checkOwnership(msg, name) { if (msg.author.settings.get("backgrounds").includes(name)) return true; return false; } compareBackground(msg, name) { if (msg.author.settings.get("profilebg") === name) return true; return false; } checkBalance(msg, price) { if (msg.author.settings.get("snowflakes") >= price) return true; return false; } async updateOwnership(msg, name, price) { await msg.author.settings.update([["snowflakes", msg.author.settings.get("snowflakes") - price], ["backgrounds", name], ["profilebg", name]]); return msg.sendMessage(`${this.client.emotes.check} ***You just bought and set your background to \`${name}\` for ${price} Snowflakes.***`); } async updateBG(msg, name) { await msg.author.settings.update("profilebg", name); return msg.sendMessage(`${this.client.emotes.check} ***Your Profile Background is now set to: \`${name}\`***`); } }; ================================================ FILE: src/commands/Profiles/daily.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, permissionLevel: 0, aliases: ["dailies"], requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_DAILY_DESCRIPTION"), usage: "[user:username]", extendedHelp: "No extended help available." }); } async run(msg, [user = msg.author]) { if (user.bot) { return msg.sendMessage("❄ | ***You can not give your daily Snowflakes to a bot!***"); } await msg.author.settings.sync(true); const upvoter = await this.client.funcs.isUpvoter(msg.author); const reward = upvoter ? 300 : 100; if (msg.author.settings.get("daily") > 0) { const now = Date.now(); const last = msg.author.settings.get("daily"); const diff = now - last; const next = 43200000 - diff; const hours = Math.floor(next / 3600000); const minutes = Math.floor((next / 60000) - (hours * 60)); const seconds = (next / 1000) - ((hours * 3600) + (minutes * 60)); const timeLeft = `${hours} hours, ${minutes} minutes and ${Math.round(seconds)} seconds`; if (diff >= 43200000) { await user.settings.update([["snowflakes", user.settings.get("snowflakes") + reward], ["daily", Date.now()]]); return msg.reply(`❄ | ***You have claimed your ${reward} Snowflakes for today! To gain 300 Snowflakes everyday, make sure to upvote PenguBot at ***`); } else { return msg.sendMessage(`❄ | ***You can claim your daily Snowflakes in ${timeLeft}!***`); } } else { await user.settings.update([["snowflakes", user.settings.get("snowflakes") + reward], ["daily", Date.now()]]); return msg.reply(`❄ | ***You have claimed your ${reward} Snowflakes for today! To gain 300 Snowflakes everyday, make sure to upvote PenguBot at ***`); } } }; ================================================ FILE: src/commands/Profiles/leaderboard.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], aliases: ["lb", "top"], cooldown: 30, description: language => language.get("COMMAND_LEADERBOARD_DESCRIPTION"), usage: "[Page:integer]" }); } async run(msg, [Page]) { const load = await msg.sendMessage(`${this.client.emotes.loading} ***Let me process all that data through my igloo, give me a few...***`); const r = this.client.providers.default.db; const data = await r.table("members") .getAll(msg.guild.id, { index: "guildID" }) .orderBy(r.desc("xp")) .run(); if (!data) throw `${this.client.emotes.cross} ***There exists no members in this guild's leaderboard, try again later.***`; await msg.member.settings.sync(true); const leaderboard = []; const totalPages = Math.round(data.length / 10); const index = Page ? Page -= 1 : 0; if ((index > totalPages && !totalPages) || (totalPages && index + 1 > totalPages)) return msg.sendMessage(`There are only **${totalPages || 1}** page(s) in the leaderboard.`); const pos = data.findIndex(i => i.id.split(".")[1] === msg.author.id); const userProfiles = await Promise.all(data.slice(index * 10, (index + 1) * 10) .map(async user => { const id = user.id.split("."); let username = await this.client.users.fetch(id[1]).then(a => a.username).catch(() => null) || "N/A"; if (id[1] === msg.author.id) username = `${username} | (YOU)`; return { xp: user.xp ? user.xp : 0, username }; })); for (let i = 0; i < userProfiles.length; i++) { const userData = userProfiles[i]; leaderboard.push(`- [${(index * 10) + (i + 1)}] | ${userData.username}\n${userData.xp.toLocaleString().padStart(10, " ")} XP\n`); } const posNum = pos !== -1 ? pos + 1 : 0; leaderboard.push(`\n+ [${posNum}] | ${msg.author.username}\n${msg.member.settings.get("xp").toLocaleString().padStart(10, " ")} XP`); leaderboard.push("--------------------------------------------------"); load.delete(); return msg.channel.send(`🏅 **${msg.guild.name}** Guild Leaderboard\`\`\`diff\n${leaderboard.join("\n")}\n Page ${index + 1} / ${(totalPages + 1).toLocaleString() || 1} - ${data.length.toLocaleString() || 1} Total Member(s) in Leaderboard\`\`\``); } }; ================================================ FILE: src/commands/Profiles/levelup.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { subcommands: true, runIn: ["text"], cooldown: 10, aliases: ["changelevelup", "levelups"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_LEVELUP_DESCRIPTION"), usage: " [type:string]", usageDelim: " " }); } async toggle(msg) { if (msg.guild.settings.get("toggles.levelup")) { await msg.guild.settings.update("toggles.levelup", false); return msg.sendMessage(`${this.client.emotes.check} ***Level Up announcements have been Disabled!***`); } else { await msg.guild.settings.update("toggles.levelup", true); return msg.sendMessage(`${this.client.emotes.check} ***Level Up announcements have been Enabled!***`); } } async type(msg, [type]) { if (!type) throw `${this.client.emotes.cross} ***You must enter a type of Level Up you want to show. Types are: \`guild\` or \`global\`***`; if (type.match(/global/i)) { if (msg.guild.settings.get("misc.leveluptype") === "user") throw `${this.client.emotes.check} **Global** type of Level Ups are already set, try **guild** instead.`; await msg.guild.settings.update("misc.leveluptype", "user"); return msg.sendMessage(`${this.client.emotes.check} **Global** type Level Up announcements have been Enabled!`); } else if (type.match(/guild/i)) { if (msg.guild.settings.get("misc.leveluptype") === "guild") throw `${this.client.emotes.check} **Guild** type of Level Ups are already set, try **global** instead.`; await msg.guild.settings.update("misc.leveluptype", "guild"); return msg.sendMessage(`${this.client.emotes.check} **Guild** type Level Up announcements have been Enabled!`); } else { return msg.sendMessage(`${this.client.emotes.cross} ***Invalid Type, choose from \`global\` or \`guild\` only.***`); } } }; ================================================ FILE: src/commands/Profiles/managexp.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { subcommands: true, runIn: ["text"], cooldown: 10, permissionLevel: 6, aliases: ["setxp", "setexperience", "resetxp", "resetexperience"], requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_MANAGEXP_DESCRIPTION"), usage: " [amount:integer]", usageDelim: " " }); } async set(msg, [member, amount]) { if (!amount) throw `${this.client.emotes.cross} ***Amount not specified.***`; await member.settings.update("xp", amount); return msg.sendMessage(`${this.client.emotes.check} ***XP Amount Set to \`${amount}\` XP(s) for ${member.user.tag}.***`); } async add(msg, [member, amount]) { if (!amount) throw `${this.client.emotes.cross} ***Amount not specified.***`; await member.settings.update("xp", member.settings.get("xp") + amount); return msg.sendMessage(`${this.client.emotes.check} ***\` ${amount}\` XP(s) Added to ${member.user.tag}.***`); } async reset(msg, [member]) { await member.settings.reset("xp"); return msg.sendMessage(`${this.client.emotes.check} ***XP(s) Reset For ${member.user.tag}.***`); } }; ================================================ FILE: src/commands/Profiles/profile.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); const { Canvas } = require("canvas-constructor"); const fs = require("fs-nextra"); const { join } = require("path"); Canvas.registerFont(join(__dirname, "..", "..", "..", "assets", "fonts", "Roboto-Regular.ttf"), { family: "Roboto" }); Canvas.registerFont(join(__dirname, "..", "..", "..", "assets", "fonts", "RobotoCondensed-Regular.ttf"), { family: "Roboto Condensed" }); Canvas.registerFont(join(__dirname, "..", "..", "..", "assets", "fonts", "RobotoMono-Light.ttf"), { family: "Roboto Mono" }); Canvas.registerFont(join(__dirname, "..", "..", "..", "assets", "fonts", "NotoEmoji-Regular.ttf"), { family: "NotoEmoji" }); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 60, requiredPermissions: ["USE_EXTERNAL_EMOJIS", "ATTACH_FILES"], description: language => language.get("COMMAND_PROFILE_DESCRIPTION"), usage: "[user:username]", extendedHelp: "No extended help available." }); } async run(msg, [user = msg.author]) { if (user.bot) return msg.reply("Can not fetch bot profiles."); const load = await msg.sendMessage(`${this.client.emotes.loading} ***Let me process all that data through my igloo, give me a few...***`); msg.channel.sendFile(await this.createImage(user)); return load.delete(); } async createImage(user) { await user.settings.sync(true); const r = this.client.providers.default.db; const xp = user.settings.get("xp"); const lvl = user.settings.get("level"); const snowflakes = user.settings.get("snowflakes"); const reps = user.settings.get("reps"); const title = user.settings.get("title"); const oldLvl = Math.floor((lvl / 0.2) ** 2); const nextLvl = Math.floor(((lvl + 1) / 0.2) ** 2); const xpProg = Math.round(((xp - oldLvl) / (nextLvl - oldLvl)) * 269); const query = await r.db("pengubot").table("users").orderBy({ index: r.desc("xp") }).pluck("id", "xp").limit(10000).offsetsOf(r.row("id").eq(user.id)) .run(); const pos = query.length ? `#${Number(query) + 1}` : "More Than 10,000"; const bgName = user.settings.get("profilebg"); const bgImg = await fs.readFile(`../assets/profiles/bg/${bgName}.png`); const avatar = await this.fetchURL(user.displayAvatarURL({ format: "png", sze: 256 }), { type: "buffer" }); return await new Canvas(300, 300) // Initializing & Avatar .addImage(bgImg, 0, 0, 300, 300) .addImage(avatar, 27, 57, 86, 86) .setTextFont("20px Roboto, NotoEmoji") .setColor("#F2F2F2") .addResponsiveText(user.tag, 120, 120, 160) .setTextFont("18px Roboto") .addText(`Level: ${lvl}`, 120, 150) // Reps .setTextFont("12px Roboto, NotoEmoji") .setColor("#0a0a0a") .setTextAlign("center") .addText(`${reps}rep(s)`, 70, 159) // Main Content .setTextAlign("left") .addText(`Title: ${title}`, 30, 196, 193) .addText(`Snowflakes: ${snowflakes.toLocaleString()}`, 30, 219, 193) .addText(`Global Rank: ${pos}`, 30, 243, 193) // XP Bar .setColor("#459466") .addRect(21, 269, xpProg, 15.5) .setTextFont("10px Roboto") .setColor("#FFFFFF") .setTextAlign("center") .addText(`XP: ${xp} / ${nextLvl}`, 151, 281) .toBufferAsync(); } }; ================================================ FILE: src/commands/Profiles/rank.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); const { Canvas } = require("canvas-constructor"); const fs = require("fs-nextra"); const { join } = require("path"); Canvas.registerFont(join(__dirname, "..", "..", "..", "assets", "fonts", "Roboto-Regular.ttf"), { family: "Roboto" }); Canvas.registerFont(join(__dirname, "..", "..", "..", "assets", "fonts", "RobotoCondensed-Regular.ttf"), { family: "Roboto Condensed" }); Canvas.registerFont(join(__dirname, "..", "..", "..", "assets", "fonts", "RobotoMono-Light.ttf"), { family: "Roboto Mono" }); Canvas.registerFont(join(__dirname, "..", "..", "..", "assets", "fonts", "NotoEmoji-Regular.ttf"), { family: "NotoEmoji" }); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], aliases: ["level"], cooldown: 15, requiredPermissions: ["USE_EXTERNAL_EMOJIS", "ATTACH_FILES"], description: language => language.get("COMMAND_RANK_DESCRIPTION"), usage: "[user:membername]", extendedHelp: "No extended help available." }); } async run(msg, [user = msg.member]) { if (user.bot) return msg.reply("Can not fetch bot's ranks."); const load = await msg.sendMessage(`${this.client.emotes.loading} ***Let me process all that data through my igloo, give me a few...***`); msg.sendMessage(`#⃣ **${user.user.username}'s** Rank Card for **${msg.guild.name}**`, { files: [{ attachment: await this.createImage(user), name: `${msg.author.username}.png` }] }); return load.delete().catch(() => null); } async createImage(member) { await member.settings.sync(true); await member.user.settings.sync(true); const r = this.client.providers.default.db; const xp = member.settings.get("xp"); const lvl = member.settings.get("level"); const oldLvl = Math.floor((lvl / 0.2) ** 2); const nextLvl = Math.floor(((lvl + 1) / 0.2) ** 2); const xpProg = Math.round(((xp - oldLvl) / (nextLvl - oldLvl)) * 645); const data = await r.table("members") .getAll(member.guild.id, { index: "guildID" }) .orderBy(r.desc("xp")) .run(); const rank = data.findIndex(i => i.id.split(".")[1] === member.user.id) + 1; const bgName = member.user.settings.get("profilebg"); const bgImg = await fs.readFile(`../assets/profiles/backgrounds/${bgName}.png`); const template = await fs.readFile(`../assets/profiles/backgrounds/template.png`); const pbar = await fs.readFile(`../assets/profiles/backgrounds/progressbar.png`); const avatar = await this.fetchURL(member.user.displayAvatarURL({ format: "png", sze: 256 }), { type: "buffer" }); const render = await new Canvas(1000, 300) // Initializing and Text .addImage(bgImg, 30, 0, 300, 300) .addImage(template, 10, 0, 1000, 300) .setTextFont("41.67px Roboto, NotoEmoji") .setColor("#212121") .addResponsiveText(member.user.username, 570, 86, 260) .setTextFont("25px Roboto") .setColor("#404040") .addText(`#${member.user.discriminator}`, 570, 110) .save() // Other Text .setColor("#212121") .setTextFont("33.33px Roboto") .addText(`Server Rank: #${rank.toLocaleString()}`, 568, 158) .addText(`Server Level: ${lvl.toLocaleString()}`, 568, 189) .save() // Avatar and Progress .addBeveledImage(avatar, 370, 34, 174, 174, 35) .restore() .createBeveledClip(315, 233, xpProg, 37, 70) .setColor("#212121") .addImage(pbar, 315, 233, 646, 36) // .addRect(315, 233, xpProg, 37) .restore() .setTextAlign("center") .setTextFont("22px Roboto") .setColor("#212121") .save(); if (xpProg >= 305) { render.restore(); render.setColor("#F1F1F1"); } else { render.restore(); } render.addText(`XP: ${xp} / ${nextLvl}`, 627, 260); return render.toBufferAsync(); // 304, 268 } }; ================================================ FILE: src/commands/Profiles/rep.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, permissionLevel: 0, aliases: ["reps", "giverep", "givereputation", "reputation"], requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_REP_DESCRIPTION"), usage: "[user:username]", extendedHelp: "No extended help available." }); } async run(msg, [user]) { if (user) { if (user.id === msg.author.id) { return msg.sendMessage("🏆 | ***You can not give yourself a reputation point!***"); } if (user.bot) { return msg.sendMessage("🏆 | ***You can not rep a bot, I know you love bots like me but no!***"); } } if (msg.author.settings.get("repcooldown") > 0) { await msg.author.settings.sync(true); const now = Date.now(); const last = msg.author.settings.get("repcooldown"); const diff = now - last; const next = 43200000 - diff; const hours = Math.floor(next / 3600000); const minutes = Math.floor((next / 60000) - (hours * 60)); const seconds = (next / 1000) - ((hours * 3600) + (minutes * 60)); const timeLeft = `${hours} hours, ${minutes} minutes and ${Math.round(seconds)} seconds`; if (diff >= 43200000) { if (!user) { return msg.sendMessage("🏆 | ***You can now give a reputation point!***"); } else { await user.settings.sync(true); await msg.author.settings.update("repcooldown", Date.now()); await user.settings.update("reps", user.settings.get("reps") + 1); return msg.sendMessage(`🏆 | ***You have given a reputation point to ${user}!***`); } } else { return msg.sendMessage(`🏆 | ***You can give another reputation point in ${timeLeft}!***`); } } else if (!user) { return msg.sendMessage("🏆 | ***You can now give a reputation point!***"); } else { await msg.author.settings.sync(true); await user.settings.sync(true); msg.author.settings.update("repcooldown", Date.now()); await user.settings.update("reps", user.settings.get("reps") + 1); return msg.sendMessage(`🏆 | ***You have given a reputation point to ${user}!***`); } } }; ================================================ FILE: src/commands/Profiles/snowflakes.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, permissionLevel: 0, aliases: ["snowflake", "sendsnowflakes"], requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_SNOWFLAKES_DESCRIPTION"), usage: "[user:username] [amount:integer]", usageDelim: " ", extendedHelp: "No extended help available." }); } async run(msg, [user, amount]) { await msg.author.settings.sync(true); if (!user) return msg.reply(`❄ | **Your account balance is:** ${msg.author.settings.get("snowflakes").toLocaleString()} Snowflakes.`); if (!amount) return msg.reply("You've not specified the amount of **Snowflake(s)** to send."); if (amount <= 0) return msg.reply("Invalid amount of snowflakes, minimum 1 snowflake."); const currSnowflakes = msg.author.settings.get("snowflakes"); if (amount > currSnowflakes) return msg.reply("Your account balance is low, please enter an amount which you have available."); if (user.bot) return msg.reply("You can not send Snowflakes to bots."); if (msg.author.id === user.id) return msg.reply("You can not send Snowflakes to yourself."); const userSnowflakes = user.settings.get("snowflakes"); const confirm = await msg.prompt(`${msg.author}, Please confirm the transfer of ❄ **${amount.toLocaleString()} Snowflake(s)** to ${user} by typing \`YES\` or \`NO\`.`); if (confirm.content.toLowerCase() === "yes" || confirm.content.toLowerCase() === "y") { await user.settings.sync(true); await msg.author.settings.update("snowflakes", currSnowflakes - amount); await user.settings.update("snowflakes", userSnowflakes + amount); return msg.reply(`❄ | **You've sent \`${amount}\` Snowflake(s) to ${user}!**`); } else { return msg.reply(`❄ | **You've cancelled the transaction or the input was invalid.**`); } } }; ================================================ FILE: src/commands/Profiles/title.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, permissionLevel: 0, aliases: ["settitle"], requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_TITLE_DESCRIPTION"), usage: "", extendedHelp: "No extended help available." }); } async run(msg, [title]) { if (title.length > 30) { return msg.reply("Your title can not be more than 30 characters long, please enter a smaller one."); } await msg.author.settings.sync(true); msg.author.settings.update("title", title); return msg.sendMessage(`${this.client.emotes.check} ***Your profile title has been updated to:*** ${title}`); } }; ================================================ FILE: src/commands/Settings/disablecmd.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, guarded: true, hidden: true, aliases: ["enablecmd", "disablecommand", "enablecommand", "togglecommand"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_TOGGLE_COMMAND_DESCRPTION"), usage: "", extendedHelp: "No extended help available." }); } async run(msg, [cmd]) { if (msg.guild.settings.get("disabledCommands").indexOf(cmd.name) === -1) { await this.dbQuery(msg, cmd, "add"); return msg.sendMessage(`${this.client.emotes.check} ***${cmd.name} command has been Disabled by ${msg.author.tag}!***`); } else { await this.dbQuery(msg, cmd, "remove"); return msg.sendMessage(`${this.client.emotes.check} ***${cmd.name} command has been Enabled by ${msg.author.tag}!***`); } } async dbQuery(msg, cmd, action) { const current = msg.guild.settings.get("disabledCommands"); if (action === "add") { current.push(cmd.name); } else if (action === "remove") { const index = current.indexOf(cmd.name); if (index !== -1) current.splice(index, 1); else throw "The item does not exist in that array."; } else { throw "Invalid operation."; } const r = this.client.providers.default.db; const query = await r.table("guilds").get(msg.guild.id) .update({ disabledCommands: current }) .run() .catch(e => { console.error(`${this.name} error:\n${e}`); throw `There was an error, please contact us on our support server: \n${e}`; }); await msg.guild.settings.sync(true); return query; } }; ================================================ FILE: src/commands/Settings/manageadmin.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); const { Role, MessageEmbed } = require("discord.js"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["setadmin", "makeadmin", "manageadministrators"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_MAKE_ADMIN_DESCRPTION"), usage: " [member:membername|role:rolename]", usageDelim: " ", subcommands: true, extendedHelp: "No extended help available." }); } async add(msg, [memberOrRole]) { if (!memberOrRole) return msg.sendMessage(`${this.client.emotes.cross} ***Member or Role has not been specified or invalid.***`); const type = memberOrRole instanceof Role ? "role" : "member"; if (type === "member") { if (msg.guild.settings.get("users.admin").includes(memberOrRole)) return msg.sendMessage(`${this.client.emotes.cross} ***That user is already a Administrator, try another user or removing them first.***`); await msg.guild.settings.update("users.admin", memberOrRole, { arrayAction: "add", guild: msg.guild }).catch(e => { console.error(`${this.name} error:\n${e}`); throw `${this.client.emotes.cross} ***There was an error: \`${e}\`***`; }); return msg.sendMessage(`${this.client.emotes.check} ***${memberOrRole} has been added as a Administrator.***`); } if (type === "role") { if (msg.guild.settings.get("roles.admin") === memberOrRole.id) return msg.sendMessage(`${this.client.emotes.cross} ***That role is already a Administrator, try another role or removing it first.***`); await msg.guild.settings.update("roles.admin", memberOrRole, { guild: msg.guild }).catch(e => { console.error(`${this.name} error:\n${e}`); throw `${this.client.emotes.cross} ***There was an error: \`${e}\`***`; }); return msg.sendMessage(`${this.client.emotes.check} ***${memberOrRole.name} role has been added as a Administrator.***`); } } async remove(msg, [memberOrRole]) { if (!memberOrRole) return msg.sendMessage(`${this.client.emotes.cross} ***Member or Role has not been specified or invalid.***`); const type = memberOrRole instanceof Role ? "role" : "member"; if (type === "member") { if (!msg.guild.settings.get("users.admin").includes(memberOrRole.id)) return msg.sendMessage(`${this.client.emotes.cross} ***That user is not a Administrator, try another user or adding them first.***`); await msg.guild.settings.update("users.admin", memberOrRole, { arrayAction: "remove", guild: msg.guild }).catch(e => { console.error(`${this.name} error:\n${e}`); throw `${this.client.emotes.cross} ***There was an error: \`${e}\`***`; }); return msg.sendMessage(`${this.client.emotes.check} ***${memberOrRole} has been removed from Administrator.***`); } if (type === "role") { if (msg.guild.settings.get("roles.admin") !== memberOrRole.id) return msg.sendMessage(`${this.client.emotes.cross} ***That role is already a Administrator, try another role or adding it first.***`); await msg.guild.settings.reset("roles.admin", memberOrRole).catch(e => { console.error(`${this.name} error:\n${e}`); throw `${this.client.emotes.cross} ***There was an error: \`${e}\`***`; }); return msg.sendMessage(`${this.client.emotes.check} ***${memberOrRole.name} role has been removed as a Administrator.***`); } } async list(msg) { const role = msg.guild.settings.get("roles.admin"); const users = msg.guild.settings.get("users.admin"); return msg.sendMessage({ embed: new MessageEmbed() .setTimestamp() .setFooter("PenguBot.com") .setColor("#7cf062") .setAuthor("Administrators - PenguBot", this.client.user.displayAvatarURL()) .setDescription([`${role ? `**Role:** ${msg.guild.roles.cache.get(role)}\n` : "**Role:** None\n"}`, `${users.length ? `**Members:**\n- <@${users.join("\n- <@")}>\n\n` : "**Members:** None"}`].join("\n")) }); } }; ================================================ FILE: src/commands/Settings/managedj.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); const { Role, MessageEmbed } = require("discord.js"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["setdj", "makedj", "makepengudj"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_MAKE_DJ_DESCRPTION"), usage: " [member:member|role:rolename]", usageDelim: " ", subcommands: true, extendedHelp: "No extended help available." }); } async add(msg, [memberOrRole]) { if (!memberOrRole) return msg.sendMessage(`${this.client.emotes.cross} ***Member or Role has not been specified or invalid.***`); const type = memberOrRole instanceof Role ? "role" : "member"; if (type === "member") { if (msg.guild.settings.get("users.dj").includes(memberOrRole)) return msg.sendMessage(`${this.client.emotes.cross} ***That user is already a PenguDJ, try another user or removing them first.***`); await msg.guild.settings.update("users.dj", memberOrRole, { arrayAction: "add", guild: msg.guild }).catch(e => { console.error(`${this.name} error:\n${e}`); throw `${this.client.emotes.cross} ***There was an error: \`${e}\`***`; }); return msg.sendMessage(`${this.client.emotes.check} ***${memberOrRole} has been added as a PenguDJ.***`); } if (type === "role") { if (msg.guild.settings.get("roles.dj") === memberOrRole.id) return msg.sendMessage(`${this.client.emotes.cross} ***That role is already a PenguDJ, try another role or removing it first.***`); await msg.guild.settings.update("roles.dj", memberOrRole, { guild: msg.guild }).catch(e => { console.error(`${this.name} error:\n${e}`); throw `${this.client.emotes.cross} ***There was an error: \`${e}\`***`; }); return msg.sendMessage(`${this.client.emotes.check} ***${memberOrRole.name} role has been added as a PenguDJ.***`); } } async remove(msg, [memberOrRole]) { if (!memberOrRole) return msg.sendMessage(`${this.client.emotes.cross} ***Member or Role has not been specified or invalid.***`); const type = memberOrRole instanceof Role ? "role" : "member"; if (type === "member") { if (!msg.guild.settings.get("users.dj").includes(memberOrRole.id)) return msg.sendMessage(`${this.client.emotes.cross} ***That user is not a PenguDJ, try another user or adding them first.***`); await msg.guild.settings.update("users.dj", memberOrRole, { arrayAction: "remove", guild: msg.guild }).catch(e => { console.error(`${this.name} error:\n${e}`); throw `${this.client.emotes.cross} ***There was an error: \`${e}\`***`; }); return msg.sendMessage(`${this.client.emotes.check} ***${memberOrRole} has been removed from PenguDJ.***`); } if (type === "role") { if (msg.guild.settings.get("roles.dj") !== memberOrRole.id) return msg.sendMessage(`${this.client.emotes.cross} ***That role is not a PenguDJ, try another role or adding it first.***`); await msg.guild.settings.reset("roles.dj").catch(e => { console.error(`${this.name} error:\n${e}`); throw `${this.client.emotes.cross} ***There was an error: \`${e}\`***`; }); return msg.sendMessage(`${this.client.emotes.check} ***${memberOrRole.name} role has been removed as a PenguDJ.***`); } } async list(msg) { const role = msg.guild.settings.get("roles.dj"); const users = msg.guild.settings.get("users.dj"); return msg.sendMessage({ embed: new MessageEmbed() .setTimestamp() .setFooter("PenguBot.com") .setColor("#7cf062") .setAuthor("Pengu DJ - PenguBot", this.client.user.displayAvatarURL()) .setDescription([`${role ? `**Role:** ${msg.guild.roles.cache.get(role)}\n` : "**Role:** None\n"}`, `${users.length ? `**Members:**\n- <@${users.join("\n- <@")}>\n\n` : "**Members:** None"}`].join("\n")) }); } }; ================================================ FILE: src/commands/Settings/managemod.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); const { Role, MessageEmbed } = require("discord.js"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["setmod", "makemod", "managemoderators"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_MAKE_MOD_DESCRPTION"), usage: " [member:member|role:rolename]", usageDelim: " ", subcommands: true, extendedHelp: "No extended help available." }); } async add(msg, [memberOrRole]) { if (!memberOrRole) return msg.sendMessage(`${this.client.emotes.cross} ***Member or Role has not been specified or invalid.***`); const type = memberOrRole instanceof Role ? "role" : "member"; if (type === "member") { if (msg.guild.settings.get("users.mod").includes(memberOrRole)) return msg.sendMessage(`${this.client.emotes.cross} ***That user is already a Moderator, try another user or removing them first.***`); await msg.guild.settings.update("users.mod", memberOrRole, { arrayAction: "add", guild: msg.guild }).catch(e => { console.error(`${this.name} error:\n${e}`); throw `${this.client.emotes.cross} ***There was an error: \`${e}\`***`; }); return msg.sendMessage(`${this.client.emotes.check} ***${memberOrRole} has been added as a Moderator.***`); } if (type === "role") { if (msg.guild.settings.get("roles.mod") === memberOrRole.id) return msg.sendMessage(`${this.client.emotes.cross} ***That role is already a Moderator, try another role or removing it first.***`); await msg.guild.settings.update("roles.mod", memberOrRole, { guild: msg.guild }).catch(e => { console.error(`${this.name} error:\n${e}`); throw `${this.client.emotes.cross} ***There was an error: \`${e}\`***`; }); return msg.sendMessage(`${this.client.emotes.check} ***${memberOrRole.name} role has been added as a Moderator.***`); } } async remove(msg, [memberOrRole]) { if (!memberOrRole) return msg.sendMessage(`${this.client.emotes.cross} ***Member or Role has not been specified or invalid.***`); const type = memberOrRole instanceof Role ? "role" : "member"; if (type === "member") { if (!msg.guild.settings.get("users.mod").includes(memberOrRole.id)) return msg.sendMessage(`${this.client.emotes.cross} ***That user is not a Moderator, try another user or adding them first.***`); await msg.guild.settings.update("users.mod", memberOrRole, { arrayAction: "remove", guild: msg.guild }).catch(e => { console.error(`${this.name} error:\n${e}`); throw `${this.client.emotes.cross} ***There was an error: \`${e}\`***`; }); return msg.sendMessage(`${this.client.emotes.check} ***${memberOrRole} has been removed from Moderator.***`); } if (type === "role") { if (msg.guild.settings.get("roles.mod") !== memberOrRole.id) return msg.sendMessage(`${this.client.emotes.cross} ***That role is already a Moderator, try another role or adding it first.***`); await msg.guild.settings.reset("roles.mod").catch(e => { console.error(`${this.name} error:\n${e}`); throw `${this.client.emotes.cross} ***There was an error: \`${e}\`***`; }); return msg.sendMessage(`${this.client.emotes.check} ***${memberOrRole.name} role has been removed as a Moderator.***`); } } async list(msg) { const role = msg.guild.settings.get("roles.mod"); const users = msg.guild.settings.get("users.mod"); return msg.sendMessage({ embed: new MessageEmbed() .setTimestamp() .setFooter("PenguBot.com") .setColor("#7cf062") .setAuthor("Moderators - PenguBot", this.client.user.displayAvatarURL()) .setDescription([`${role ? `**Role:** ${msg.guild.roles.cache.get(role)}\n` : "**Role:** None\n"}`, `${users.length ? `**Members:**\n- <@${users.join("\n- <@")}>\n\n` : "**Members:** None"}`].join("\n")) }); } }; ================================================ FILE: src/commands/Settings/managestaff.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); const { Role, MessageEmbed } = require("discord.js"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["setstaff", "makestaff"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS", "EMBED_LINKS"], description: language => language.get("COMMAND_MAKE_STAFF_DESCRPTION"), usage: " [member:member|role:rolename]", usageDelim: " ", subcommands: true, extendedHelp: "No extended help available." }); } async add(msg, [memberOrRole]) { if (!memberOrRole) return msg.sendMessage(`${this.client.emotes.cross} ***Member or Role has not been specified or invalid.***`); const type = memberOrRole instanceof Role ? "role" : "member"; if (type === "member") { if (msg.guild.settings.get("users.staff").includes(memberOrRole)) return msg.sendMessage(`${this.client.emotes.cross} ***That user is already a Staff, try another user or removing them first.***`); await msg.guild.settings.update("users.staff", memberOrRole, { arrayAction: "add", guild: msg.guild }).catch(e => { console.error(`${this.name} error:\n${e}`); throw `${this.client.emotes.cross} ***There was an error: \`${e}\`***`; }); return msg.sendMessage(`${this.client.emotes.check} ***${memberOrRole} has been added as a Staff.***`); } if (type === "role") { if (msg.guild.settings.get("roles.staff") === memberOrRole.id) return msg.sendMessage(`${this.client.emotes.cross} ***That role is already a Staff, try another role or removing it first.***`); await msg.guild.settings.update("roles.staff", memberOrRole, { guild: msg.guild }); return msg.sendMessage(`${this.client.emotes.check} ***${memberOrRole.name} role has been added as a Staff.***`); } } async remove(msg, [memberOrRole]) { if (!memberOrRole) return msg.sendMessage(`${this.client.emotes.cross} ***Member or Role has not been specified or invalid.***`); const type = memberOrRole instanceof Role ? "role" : "member"; if (type === "member") { if (!msg.guild.settings.get("users.staff").includes(memberOrRole.id)) return msg.sendMessage(`${this.client.emotes.cross} ***That user is not a Staff, try another user or adding them first.***`); await msg.guild.settings.update("users.staff", memberOrRole.id, { arrayAction: "remove", guild: msg.guild }).catch(e => { console.error(`${this.name} error:\n${e}`); throw `${this.client.emotes.cross} ***There was an error: \`${e}\`***`; }); return msg.sendMessage(`${this.client.emotes.check} ***${memberOrRole} has been removed from Staff.***`); } if (type === "role") { if (msg.guild.settings.get("roles.staff") !== memberOrRole.id) return msg.sendMessage(`${this.client.emotes.cross} ***That role is already a Staff, try another role or adding it first.***`); await msg.guild.settings.reset("roles.staff").catch(e => { console.error(`${this.name} error:\n${e}`); throw `${this.client.emotes.cross} ***There was an error: \`${e}\`***`; }); return msg.sendMessage(`${this.client.emotes.check} ***${memberOrRole.name} role has been removed as a Staff.***`); } } async list(msg) { const role = msg.guild.settings.get("roles.staff"); const users = msg.guild.settings.get("users.staff"); return msg.sendMessage({ embed: new MessageEmbed() .setTimestamp() .setFooter("PenguBot.com") .setColor("#7cf062") .setAuthor("Staff - PenguBot", this.client.user.displayAvatarURL()) .setDescription([`${role ? `**Role:** ${msg.guild.roles.cache.get(role)}\n` : "**Role:** None\n"}`, `${users.length ? `**Members:**\n- <@${users.join("\n- <@")}>\n\n` : "**Members:** None"}`].join("\n")) }); } }; ================================================ FILE: src/commands/Settings/prefix.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, aliases: ["setprefix"], permissionLevel: 0, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_PREFIX_DESCRIPTION"), quotedStringSupport: false, usage: "[prefix:string]", extendedHelp: "No extended help available." }); } async run(msg, [prefix]) { if (!await msg.hasAtLeastPermissionLevel(6)) return msg.sendMessage(`👉 ***${msg.language.get("MESSAGE_CURRENT_PREFIX")}*** ${msg.guild.settings.get("prefix")}`); if (!prefix) return msg.sendMessage(`👉 ***${msg.language.get("MESSAGE_CURRENT_PREFIX")}*** ${msg.guild.settings.get("prefix")}`); await msg.guild.settings.update({ prefix: prefix }).then(() => { msg.sendMessage(`<:penguSuccess:435712876506775553> ***${msg.language.get("MESSAGE_PREFIX_SET")}*** ${prefix}`); }); } }; ================================================ FILE: src/commands/Settings/setlanguage.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, guarded: true, hidden: true, aliases: ["language", "selectlanguage"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_SETLANGUAGE_DESCRPTION"), usage: "[language:string]", extendedHelp: "No extended help available." }); } async run(msg, [language]) { if (!language) return msg.sendMessage(msg.language.get("HELP_SET_LANGUAGE")); const currLang = msg.guild.settings.get("language"); if (/english|inglese|en|en-us/i.test(language)) { if (currLang === "en-US") throw `${this.client.emotes.cross} ***${msg.language.get("ER_CURR_LANG")}***`; await this.changeLanguage(msg, "en-US"); } else if (/italian|italiano|it|it-it/i.test(language)) { if (currLang === "it-IT") throw `${this.client.emotes.cross} ***${msg.language.get("ER_CURR_LANG")}***`; await this.changeLanguage(msg, "it-IT"); } else if (/spanish|español|espanol|es|es-es/i.test(language)) { if (currLang === "es-ES") throw `${this.client.emotes.cross} ***${msg.language.get("ER_CURR_LANG")}***`; await this.changeLanguage(msg, "es-ES"); } else if (/français|french|francais|fr|fr-fr/i.test(language)) { if (currLang === "fr-FR") throw `${this.client.emotes.cross} ***${msg.language.get("ER_CURR_LANG")}***`; await this.changeLanguage(msg, "fr-FR"); } else if (/sardinian|sard|sardu|sar|sar-IT/i.test(language)) { if (currLang === "fr-FR") throw `${this.client.emotes.cross} ***${msg.language.get("ER_CURR_LANG")}***`; await this.changeLanguage(msg, "fr-FR"); } else { throw `${this.client.emotes.cross} ***${msg.language.get("ER_NO_LANG")}***`; } } async changeLanguage(msg, language) { await msg.guild.settings.update("language", language); return msg.sendMessage(`${this.client.emotes.check} \`${language}\` ***${msg.language.get("CONF_LANG_SET")}***`); } }; ================================================ FILE: src/commands/Settings/togglecategory.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 10, guarded: true, hidden: true, aliases: ["enablegroup", "disablecommandgroup", "enablecommandgroup", "disablecommandcategory", "enablecommandcategory", "disablecategory", "enablecategory", "disablegroup"], permissionLevel: 6, requiredPermissions: ["USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_TOGGLE_GROUP_DESCRPTION"), usage: "(category:string)", extendedHelp: "No extended help available." }); } async run(msg, [category]) { category = category.toLowerCase(); if (!this.categories.includes(category)) throw "That is not a valid category."; await msg.guild.settings.update("disabledCommandsGroup", category, { guild: msg.guild }); const exists = msg.guild.settings.get("disabledCommandsGroup").includes(category); return msg.sendMessage(`${exists ? this.client.emotes.cross : this.client.emotes.check} ***${category[0].toUpperCase() + category.slice(1)} commands category has been ${exists ? "Disabled" : "Enabled"} by ${msg.author.tag}!***`); } get categories() { return [...new Set(this.client.commands.map(u => u.category.toLowerCase()))]; } }; ================================================ FILE: src/commands/Utilities/afk.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 5, description: language => language.get("COMMAND_AFK_DESCRIPTION"), extendedHelp: "No extended help available.", usage: "[reason:string]" }); } async run(msg, [reason = "No reason"]) { await msg.author.settings.sync(); const afk = await msg.author.settings.get("afk"); if (afk.time) { await msg.author.settings.reset(["afk.time", "afk.reason"]); return msg.sendLocale("COMMAND_AFK_REMOVED", [msg.author.username]); } await msg.author.settings.update([["afk.time", Date.now()], ["afk.reason", reason]]); return msg.sendLocale("COMMAND_AFK_SET", [msg.author.username, reason]); } }; ================================================ FILE: src/commands/Utilities/avatar.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text", "dm"], cooldown: 5, aliases: ["pp", "profilepicture"], permissionLevel: 0, requiredPermissions: ["EMBED_LINKS", "USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_AVATAR_DESCRIPTION"), usage: "[person:username]", extendedHelp: "No extended help available." }); } async run(msg, [person = msg.author]) { return msg.sendMessage(`<:blobsmilehappy:373821679132213248> | ***${msg.language.get("MESSAGE_AVATAR")} ${person.tag}:*** ${person.displayAvatarURL({ size: 2048 })}`); } }; ================================================ FILE: src/commands/Utilities/choose.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text", "dm"], cooldown: 5, aliases: ["pick", "random"], requiredPermissions: ["EMBED_LINKS", "USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_CHOOSE_DESCRIPTION"), usage: " [...]", usageDelim: "|", extendedHelp: "No extended help available." }); } async run(msg, choices) { return msg.reply(choices.length === 1 ? `${this.client.emotes.cross} ***${msg.language.get("ER_CHOICES_SENSE")}***` : `${this.client.emotes.check} ${msg.language.get("CHOICE_SELECT")} ***"${choices[Math.floor(Math.random() * choices.length)]}"***`); } }; ================================================ FILE: src/commands/Utilities/covid.js ================================================ const { Command, MessageEmbed } = require("../../index"); const imageRegex = //; module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 10, aliases: ["coronavirus", "covidstats", "covid19"], description: "Get Corona Virus Statistics.", usage: "[country:string]" }); } async run(msg, [country]) { if (!country) { const res = await this.getData("all"); return msg.sendEmbed(new MessageEmbed() .setAuthor(`COVID-19 Global Statistics`, "https://upload.wikimedia.org/wikipedia/commons/thumb/2/26/COVID-19_Outbreak_World_Map.svg/800px-COVID-19_Outbreak_World_Map.svg.png", "https://pengubot.com") .setImage("https://upload.wikimedia.org/wikipedia/commons/thumb/2/26/COVID-19_Outbreak_World_Map.svg/800px-COVID-19_Outbreak_World_Map.svg.png") .setDescription(`Use \`${msg.guild.settings.get("prefix")}covid \` for country specific information`) .addField("Cases", `${res.cases.toLocaleString()} (${this.formatChange(res.todayCases)})`, true) .addField("Deaths", `${res.deaths.toLocaleString()} (${this.formatChange(res.todayDeaths)})`, true) .addField("Recovered", `${res.recovered.toLocaleString()} (${this.formatChange(res.todayRecovered)})`, true) .addField("Active", `${res.active.toLocaleString()}`, true) .addField("Critical", `${res.critical.toLocaleString()}`, true) .addField("Tests", `${res.tests.toLocaleString()}`, true) .addField("Population", `${res.population.toLocaleString()}`, true) .addField("Test Rate", `${((res.tests / res.population) * 100).toFixed(3)}%`, true) .addField("Infection Rate", `${((res.cases / res.population) * 100).toFixed(3)}%`, true) .setFooter(`PenguBot.com | Last Updated`) .setTimestamp(res.updated)); } country = country.toUpperCase(); const res = await this.getData(`countries/${country.toUpperCase()}`); const imagePrefix = ["United States", "Netherlands"].includes(res.country) ? `the_` : ""; const wikiRes = await this.fetchURL(`https://en.wikipedia.org/wiki/2020_coronavirus_pandemic_in_${imagePrefix}${res.country.replace("USA", "United States").replace(/ /g, "_")}`, { type: "text" }).catch(() => ""); const imageLink = imageRegex.exec(wikiRes) ? `${imageRegex.exec(wikiRes)[1]}?newest=${res.updated}` : ""; return msg.sendEmbed(new MessageEmbed() .setAuthor(`${res.country} - COVID-19 Statistics`, res.countryInfo.flag, "https://pengubot.com") .setThumbnail(res.countryInfo.flag) .addField("Cases", `${res.cases.toLocaleString()} (${this.formatChange(res.todayCases)})`, true) .addField("Deaths", `${res.deaths.toLocaleString()} (${this.formatChange(res.todayDeaths)})`, true) .addField("Recovered", `${res.recovered.toLocaleString()} (${this.formatChange(res.todayRecovered)})`, true) .addField("Active", `${res.active.toLocaleString()}`, true) .addField("Critical", `${res.critical.toLocaleString()}`, true) .addField("Tests", `${res.tests.toLocaleString()}`, true) .addField("Population", `${res.population.toLocaleString()}`, true) .addField("Test Rate", `${((res.tests / res.population) * 100).toFixed(3)}%`, true) .addField("Infection Rate", `${((res.cases / res.population) * 100).toFixed(3)}%`, true) .setFooter(`PenguBot.com | Last Updated`) .setImage(imageLink) .setTimestamp(res.updated)); } async getData(route) { const data = await this.fetchURL(`https://disease.sh/v3/covid-19/${route}`).catch(() => null); if (!data) throw "There was an error trying to get information regarding your query, please try again and if the problem presists then please report at: https://discord.gg/u8WYw5r"; return data; } formatChange(number) { if (number > 0) return `+${number.toLocaleString()}`; else if (number < 0) return `-${number.toLocaleString()}`; return 0; } }; ================================================ FILE: src/commands/Utilities/emote.js ================================================ const { Command, discordUtil: { parseEmoji }, util: { toCodePoint } } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], aliases: ["emoji", "jumbo"], cooldown: 3, description: "Shows you an emote.", extendedHelp: "This command shows an image of an emote.", usage: "", requiredPermissions: ["ATTACH_FILES"] }); this .createCustomResolver("customemote", arg => { if (!arg) throw "No Emoji Provided, please provide one in order to use this command."; const discordEmoji = parseEmoji(arg); if (discordEmoji && discordEmoji.id) return `https://cdn.discordapp.com/emojis/${discordEmoji.id}.${discordEmoji.animated ? "gif" : "png"}`; const unicode = toCodePoint(arg); return `https://twemoji.maxcdn.com/2/72x72/${unicode}.png`; }); } async run(msg, [emote]) { const emoji = await this.fetchURL(emote, { type: "buffer" }).catch(() => null); if (emoji === null) throw `The provided emoji is invalid. Please try a different one.`; return msg.channel.sendFile(emote); } }; ================================================ FILE: src/commands/Utilities/guild.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); const { MessageEmbed } = require("discord.js"); const filterLevels = { DISABLED: "None", MEMBERS_WITHOUT_ROLES: "Low", ALL_MEMBERS: "High" }; const verificationLevels = { NONE: "None", LOW: "Low", MEDIUM: "Medium", HIGH: "(╯°□°)╯︵ ┻━┻", VERY_HIGH: "┻━┻ ミヽ(ಠ 益 ಠ)ノ彡 ┻━┻" }; module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], aliases: ["server", "guildinfo", "sererinfo"], cooldown: 5, requiredPermissions: ["EMBED_LINKS", "USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_GUILDINFO_DESCRIPTION"), extendedHelp: "No extended help available." }); } async run(msg) { const embed = new MessageEmbed() .setColor("RANDOM") .setTimestamp() .setFooter("© PenguBot.com") .setThumbnail(msg.guild.iconURL()) .addField("❯ Name", msg.guild.name, true) .addField("❯ ID", msg.guild.id, true) .addField("❯ Region", msg.guild.region.toUpperCase(), true) .addField("❯ Creation Date", msg.guild.createdAt.toDateString(), true) .addField("❯ Explicit Filter", filterLevels[msg.guild.explicitContentFilter], true) .addField("❯ Verification Level", verificationLevels[msg.guild.verificationLevel], true) .addField("❯ Owner", `<@${msg.guild.ownerID}>`, true) .addField("❯ Members", msg.guild.memberCount, true) .addField("❯ Roles", msg.guild.roles.cache.size, true) .addField("❯ Channels", msg.guild.channels.cache.size, true); return msg.sendEmbed(embed); } }; ================================================ FILE: src/commands/Utilities/lmgtfy.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text", "dm"], cooldown: 5, aliases: ["letmegoogleitforyou", "google"], permissionLevel: 0, requiredPermissions: ["EMBED_LINKS", "USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_LMGTFY_DESCRIPTION"), usage: "", extendedHelp: "No extended help available." }); } async run(msg, [query]) { return msg.sendMessage(`<:blobsmilehappy:373821679132213248> | ***Here's your LMGTFY Link: ***`); } }; ================================================ FILE: src/commands/Utilities/poll.js ================================================ const { Command } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 10, aliases: ["strawpoll", "createpoll"], requiredPermissions: ["EMBED_LINKS", "USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_POLL_DESCRIPTION"), usage: " [...]", usageDelim: "|", extendedHelp: "No extended help available." }); } async run(msg, [title, ...options]) { try { const data = await this.fetchURL("https://www.strawpoll.me/api/v2/polls", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ title, options, multi: "multi" in msg.flagArgs ? msg.flagArgs.multi : true, captcha: "captcha" in msg.flagArgs ? msg.flagArgs.captcha : true }) }); return msg.sendMessage(`<:penguCheck1:431440099675209738> ***Here's the poll you requested:*** https://www.strawpoll.me/${data.id}`); } catch (e) { return msg.sendMessage(":penguError: There was an error trying to create this poll, please try again."); } } }; ================================================ FILE: src/commands/Utilities/quote.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); const { Argument } = require("klasa"); const { MessageEmbed } = require("discord.js"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 8, requiredPermissions: ["EMBED_LINKS", "USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_QUOTE_DESCRIPTION"), usage: "[channel:channel] ", usageDelim: " " }); } async run(msg, [channel = msg.channel, msgId]) { if (!Argument.regex.snowflake.test(msgId)) throw "Invalid message ID. Use developer mode to copy IDs."; const message = await channel.messages.fetch(msgId).catch(() => null); if (!message) throw "Your message does not exist or is not in this channel. Try specifying the channel it is from."; const image = message.attachments.size > 0 ? this.checkAttachments(message.attachments.first().url) : null; const embed = new MessageEmbed() .setColor("#FAFAFA") .setDescription(message.content) .setTimestamp(message.createdAt) .setAuthor(message.author.tag, message.author.displayAvatarURL()); if (image) embed.setImage(image); return msg.sendEmbed(embed); } checkAttachments(attachment) { const imageLink = attachment.split("."); const typeOfImage = imageLink[imageLink.length - 1]; const image = /(jpg|jpeg|png|gif)/gi.test(typeOfImage); if (!image) return null; return attachment; } }; ================================================ FILE: src/commands/Utilities/reddit.js ================================================ const { Command } = require("../../index"); const subReddits = require("../../lib/constants/nsfw/subreddits.json"); const types = /top|hot|controversial|new|rising/i; module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 5, upvoteOnly: true, requiredPermissions: ["ATTACH_FILES", "EMBED_LINKS"], description: "Get a random picture from a sub-reddit of your choice!", extendedHelp: "No extended help available.", usage: "[subreddit:string]", aliases: ["randomreddit", "redditimage", "subreddit", "amateur", "anal", "asiannsfw", "bdsm", "blowjob", "boobs", "booty", "ass", "cosplay", "fitgirls", "gifs", "nsfwgifs", "gonewild", "hentai", "lesbian", "milfs", "nsfw", "nsfwsnapchat", "pussy", "teen"] }); } async run(msg, [subreddit]) { let wcType; if (msg.flagArgs && msg.flagArgs.type) { const { type } = msg.flagArgs; if (types.test(type)) wcType = type; } if (!subreddit && msg.command.aliases.includes(msg.commandText)) { const aliasSubCat = subReddits[msg.commandText]; const aliasSub = aliasSubCat[Math.floor(Math.random() * aliasSubCat.length)]; const data = await this.client.funcs.scrapeSubreddit(aliasSub, { type: wcType }); if (data.over_18 && !msg.channel.nsfw) return msg.sendMessage(`${this.client.emotes.cross} ***This channel is not NSFW so I can't send it here...***`); await msg.channel.send(data.url); return msg.channel.send(`**Note:** This command has been deprecated and will be renamed soon, please use \`${msg.guild.settings.get("prefix")}reddit \``); } else if (subreddit) { const data = await this.client.funcs.scrapeSubreddit(subreddit, { type: wcType }); if (data.over_18 && !msg.channel.nsfw) return msg.sendMessage(`${this.client.emotes.cross} ***This channel is not NSFW so I can't send it here...***`); return msg.sendMessage([ `> **Title:** ${data.title}`, `> **Author:** u/${data.author}`, `${data.url}`].join("\n")); } else { return msg.reply("Please specify a sub-reddit you would like to see."); } } }; ================================================ FILE: src/commands/Utilities/remind.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text", "dm"], cooldown: 10, permissionLevel: 0, aliases: ["remindme", "setreminder", "remindmein"], requiredPermissions: ["MANAGE_MESSAGES", "USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_REMIND_DESCRIPTION"), usage: " [...]", usageDelim: " ", extendedHelp: "No extended help available." }); } async run(msg, [time, ...message]) { const r = await this.client.schedule.create("reminder", time, { data: { channel: msg.channel.id, user: msg.author.id, text: message.join(" ") } }); return msg.reply(`<:penguSuccess:435712876506775553> ***${msg.language.get("MESSAGE_NEW_REMINDER")} \`${r.id}\`***`); } }; ================================================ FILE: src/commands/Utilities/roleinfo.js ================================================ const { Command, MessageEmbed } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 5, requiredPermissions: ["EMBED_LINKS", "USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_ROLEINFO_DESCRIPTION"), usage: "", extendedHelp: "No extended help available." }); } async run(msg, [role]) { return msg.sendEmbed(new MessageEmbed() .setColor(role.hexColor) .setTimestamp(role.createdAt) .setFooter("© PenguBot.com • Role Created At") .addField("❯ Name", role.name, true) .addField("❯ ID", role.id, true) .addField("❯ Color", role.hexColor, true) .addField("❯ Members", role.members.size, true) .addField("❯ Hoisted", role.hoist ? "Yes" : "No", true) .addField("❯ Mentionable", role.mentionable ? "Yes" : "No", true) .addField(`❯ Permission(s)`, role.permissions.toArray().length ? role.permissions.toArray().join(", ") : "None")); } }; ================================================ FILE: src/commands/Utilities/say.js ================================================ const Command = require("../../lib/structures/KlasaCommand"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], cooldown: 5, permissionLevel: 3, requiredPermissions: ["MANAGE_MESSAGES", "USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_SAY_DESCRIPTION"), usage: "", extendedHelp: "No extended help available." }); } async run(msg, [message]) { if (message.length < 1) return msg.sendMessage("<:penguError:435712890884849664> Message length can't be less than one character."); msg.delete(); return msg.sendMessage(message); } }; ================================================ FILE: src/commands/Utilities/shorten.js ================================================ const { Command } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text", "dm"], cooldown: 10, aliases: ["shortener", "shortlink"], permissionLevel: 0, requiredPermissions: ["EMBED_LINKS", "USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_SHORTEN_DESCRIPTION"), usage: "", extendedHelp: "No extended help available." }); } async run(msg, [link]) { const data = await this.fetchURL(`https://is.gd/create.php?format=json&url=${encodeURIComponent(link)}`); return msg.sendMessage(`<:penguSuccess:435712876506775553> ***${msg.language.get("MESSAGE_LINK_SHORTEN")}*** ${data.shorturl}`); } }; ================================================ FILE: src/commands/Utilities/translate.js ================================================ const { Command } = require("../../index"); const translate = require("@k3rn31p4nic/google-translate-api"); module.exports = class extends Command { constructor(...args) { super(...args, { description: language => language.get("COMMAND_TRANSLATE_DESCRIPTION"), usageDelim: "|", usage: " " }); } async run(msg, [content, language]) { const { text } = await translate(content, { to: language }) .catch(() => { throw "That language is not supported, please try again."; }); return msg.sendMessage(`**Translated Message:** ${text}`); } }; ================================================ FILE: src/commands/Utilities/twstats.js ================================================ const { Command, MessageEmbed, Timestamp, config: { apis } } = require("../../index"); const timestamp = new Timestamp("d MMMM YYYY"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 15, aliases: ["twitchstats", "twitchstatistics"], requiredPermissions: ["EMBED_LINKS"], description: "Get twitch channel statisitcs directly from twitch.", usage: "", extendedHelp: "No extended help available." }); } async run(msg, [channel]) { const body = await this.fetchURL(`https://api.twitch.tv/kraken/channels/${channel}`, { query: { client_id: apis.twitch } }) .catch(() => { throw "I'm having trouble communicating with twitch, make sure you entered the right username."; }); return msg.sendEmbed(new MessageEmbed() .setColor("#1976D2") .setAuthor(body.display_name, body.logo, body.url) .setTimestamp() .setFooter(`Requested by ${msg.author.tag}`) .setDescription(` ❯ **Views:** ${body.views.toLocaleString()} ❯ **Followers:** ${body.followers.toLocaleString()} ❯ **Game:** ${body.game} ❯ **Status:** ${body.status} ❯ **Mature?:** ${body.mature ? "Yes" : "No"} ❯ **Created At:** ${timestamp.display(body.created_at)} `)); } }; ================================================ FILE: src/commands/Utilities/urban.js ================================================ const { Command, MessageEmbed } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 10, aliases: ["urband", "ud"], description: "Get meaning for a word from Urban Dictionary.", usage: "", nsfw: true }); } async run(msg, [word]) { const info = await this.getDefinition(word); return msg.sendEmbed(new MessageEmbed() .setAuthor(`Word: ${info.word}`, info.link) .setDescription(`**Definition:** ${info.definition}`) .setColor("RANDOM") .setFooter("Urban Dictionary", this.client.user.displayAvatarURL()) .addField("Votes", `👍 ${info.thumbsUp} **|** 👎 ${info.thumbsDown}`, true) .addField("Example", info.example, true)); } async getDefinition(term) { const { list: [word] } = await this.fetchURL(`http://api.urbandictionary.com/v0/define`, { query: { term } }); if (!word) throw "No entry found"; return { definition: word.definition.length >= 1984 ? `${word.definition.substr(0, 1984)}...` : word.definition, word: word.word, link: word.permalink, thumbsUp: word.thumbs_up, thumbsDown: word.thumbs_down, example: word.example, author: word.author }; } }; ================================================ FILE: src/commands/Utilities/userinfo.js ================================================ const { Command, Timestamp, MessageEmbed } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text"], aliases: ["uinfo"], cooldown: 5, requiredPermissions: ["EMBED_LINKS", "USE_EXTERNAL_EMOJIS"], description: language => language.get("COMMAND_USERINFO_DESCRIPTION"), usage: "[user:membername]", extendedHelp: "No extended help available." }); this.timestamp = new Timestamp("DD MMMM YYYY, HH:MM"); } async run(msg, [user]) { if (!user) user = await msg.guild.members.fetch(msg.author.id).catch(() => null); const embed = new MessageEmbed() .setColor(user.displayHexColor ? user.displayHexColor : "#32c4e3") .setTimestamp() .setFooter("© PenguBot.com") .setThumbnail(user.user.displayAvatarURL()) .addField("❯ Name", user.user.tag, true) .addField("❯ ID", user.id, true) .addField("❯ Discord Join Date", this.timestamp.display(user.user.createdAt), true) .addField("❯ Server Join Date", user.joinedTimestamp ? this.timestamp.display(user.joinedTimestamp) : "Unknown", true) .addField("❯ Nickname", user.nickname || "None", true) .addField("❯ Bot?", user.user.bot ? "Yes" : "No", true) .addField("❯ Roles", user.roles.cache.size - 1, true); if ((user.roles.size - 1) > 0) embed.setDescription(`<@&${user.roles.map(r => r.id).filter(r => r !== msg.guild.roles.everyone.id).join("> <@&")}>`); return msg.sendEmbed(embed); } }; ================================================ FILE: src/commands/Utilities/weather.js ================================================ const { Command, config: { apis } } = require("../../index"); const { Canvas } = require("canvas-constructor"); const fs = require("fs-nextra"); const { join } = require("path"); Canvas.registerFont(join(__dirname, "..", "..", "..", "assets", "fonts", "Roboto-Regular.ttf"), { family: "Roboto" }); Canvas.registerFont(join(__dirname, "..", "..", "..", "assets", "fonts", "RobotoCondensed-Regular.ttf"), { family: "Roboto Condensed" }); Canvas.registerFont(join(__dirname, "..", "..", "..", "assets", "fonts", "RobotoMono-Light.ttf"), { family: "Roboto Mono" }); module.exports = class extends Command { constructor(...args) { super(...args, { runIn: ["text", "dm"], aliases: ["w", "☁", "⛅", "⛈", "🌤", "🌥", "🌦", "🌧", "🌨", "🌩", "🌪"], cooldown: 30, requiredPermissions: ["EMBED_LINKS", "ATTACH_FILES"], description: language => language.get("COMMAND_WEATHER_DESCRIPTION"), usage: "", extendedHelp: "No extended help available." }); } async run(msg, [location]) { try { const response = await this.fetchURL("https://maps.googleapis.com/maps/api/geocode/json", { query: { address: location.replace(/ /g, "+"), key: apis.google } }) .catch(() => { throw "I'm is having some troubles receiving the data for your location. Try again later"; }); if (!response.results.length) return msg.reply("<:penguError:435712890884849664> I Could not find that location! Please try again with a different one."); const geocodelocation = response.results[0].formatted_address; const locality = response.results[0].address_components.find(loc => loc.types.includes("locality")); const governing = response.results[0].address_components.find(gov => gov.types.includes("administrative_area_level_1")); // eslint-disable-line max-len const country = response.results[0].address_components.find(cou => cou.types.includes("country")); const continent = response.results[0].address_components.find(con => con.types.includes("continent")); const city = locality || governing || country || continent || {}; const state = locality && governing ? governing : locality ? country : {}; const params = `${response.results[0].geometry.location.lat},${response.results[0].geometry.location.lng}`; const res = await this.fetchURL(`https://api.darksky.net/forecast/${apis.darksky}/${params}?units=si&exclude=daily,minutely,hourly,flags`) .catch(e => { console.error(e); return null; }); if (!res) return msg.reply("I'm is having some troubles receiving the data for your location. Please try again later."); const condition = res.currently.summary; const { icon } = res.currently; const chanceofrain = Math.round((res.currently.precipProbability * 100) / 5) * 5; const temperature = Math.round(res.currently.temperature); const humidity = Math.round(res.currently.humidity * 100); let theme = "light"; let fontColor = "#FFFFFF"; if (icon === "snow" || icon === "sleet" || icon === "fog") { theme = "dark"; fontColor = "#444444"; } const bg = await this.getBase(icon); const cond = await fs.readFile(`../assets/weather/icons/${theme}/${icon}.png`); const hum = await fs.readFile(`../assets/weather/icons/${theme}/humidity.png`); const precip = await fs.readFile(`../assets/weather/icons/${theme}/precip.png`); const img = await new Canvas(400, 180) .addImage(bg, 0, 0, 400, 180) .setColor(fontColor) .setTextFont("20px Roboto") .addText(city.long_name ? city.long_name : "Unknown", 35, 50) .setTextFont("16px Roboto") .addText(state.long_name ? state.long_name : "", 35, 72.5) .setTextFont("48px Roboto Mono") .addText(`${temperature}°C`, 35, 140) .addImage(cond, 325, 31, 48, 48) .addImage(hum, 358, 88, 13, 13) .addImage(precip, 358, 108, 13, 13) .setTextAlign("right") .setTextFont("16px Roboto") .addText(condition, 370, 142) .setTextFont("16px 'Roboto Condensed'") .addText(`${humidity}%`, 353, 100) .addText(`${chanceofrain}%`, 353, 121) .toBufferAsync(); return msg.sendMessage({ files: [{ attachment: img, name: `${geocodelocation}.png` }] }); } catch (e) { console.error(e); return msg.sendMessage(`<:penguError:435712890884849664> ***Oopsies, an error occoured, please try again!***`); } } async getBase(icon) { if (icon === "clear-day" || icon === "partly-cloudy-day") { return `../assets/weather/base/day.png`; } else if (icon === "clear-night" || icon === "partly-cloudy-night") { return `../assets/weather/base/night.png`; } else if (icon === "rain") { return `../assets/weather/base/rain.png`; } else if (icon === "thunderstorm") { return `../assets/weather/base/thunderstorm.png`; } else if (icon === "snow" || icon === "sleet" || icon === "fog") { return `../assets/weather/base/snow.png`; } else if (icon === "wind" || icon === "tornado") { return `../assets/weather/base/windy.png`; } else if (icon === "cloudy") { return `../assets/weather/base/cloudy.png`; } else { return `../assets/weather/base/cloudy.png`; } } }; ================================================ FILE: src/commands/Utilities/ytstats.js ================================================ const { Command, Timestamp, MessageEmbed, config } = require("../../index"); module.exports = class extends Command { constructor(...args) { super(...args, { cooldown: 25, aliases: ["ytstats", "youtubesubs", "youtubeinfo", "ytinfo"], requiredPermissions: ["EMBED_LINKS"], description: "Get youTube channel statisitcs directly from youTube.", usage: "", extendedHelp: "No extended help available." }); this.timestamp = new Timestamp("d MMMM YYYY"); } async run(msg, [channel]) { const { items: [channelInfo] } = await this.fetchURL("https://www.googleapis.com/youtube/v3/search", { query: { part: "snippet", q: channel, key: config.apis.google, maxResults: 1, type: "channel" } }) .catch(() => { throw "I'm having trouble communicating with youtube, make sure you entered the right channel."; }); if (!channelInfo) return msg.sendMessage("I could not find that channel, make sure the channel name is entered correctly."); const { items: [channelStats] } = await this.fetchURL("https://www.googleapis.com/youtube/v3/channels", { query: { part: "snippet,contentDetails,statistics,brandingSettings", id: channelInfo.id.channelId, key: config.apis.google } }) .catch(() => { throw "I'm having trouble communicating with youtube, make sure you entered the right channel."; }); if (!channelStats) return msg.sendMessage("I could not find information about that channel. Make sure the channel name is entered correctly."); return msg.sendEmbed(new MessageEmbed() .setFooter("YouTube Channel Statistics") .setTimestamp() .setColor("#1976D2") .setAuthor(channelInfo.snippet.channelTitle, channelInfo.snippet.thumbnails.high.url, `https://www.youtube.com/channel/${channelInfo.id.channelId}`) .setDescription(`**Channel Description:** ${channelInfo.snippet.description}`) .addField("Subsciber Count:", Number(channelStats.statistics.subscriberCount).toLocaleString(), true) .addField("View Count:", Number(channelStats.statistics.viewCount).toLocaleString(), true) .addField("Video Count:", Number(channelStats.statistics.videoCount).toLocaleString(), true) .addField("Created At:", this.timestamp.display(channelInfo.snippet.publishedAt), true) .setThumbnail(channelInfo.snippet.thumbnails.high.url)); } }; ================================================ FILE: src/events/channelCreate.js ================================================ const { Event } = require("klasa"); const ServerLog = require("../lib/structures/ServerLog"); module.exports = class extends Event { async run(channel) { if (channel.type !== "text") return; await new ServerLog(channel.guild) .setColor("green") .setType("channels") .setName("Channel Created") .setMessage(`📗 **#${channel.name}** (${channel.id}) channel was \`created\``) .send(); const role = channel.guild.roles.cache.filter(r => r.name === "PENGU_MUTED"); if (role) await channel.updateOverwrite(role, { SEND_MESSAGES: false, ADD_REACTIONS: false, CONNECT: false }, `New Channel Created`).catch(() => null); } }; ================================================ FILE: src/events/channelDelete.js ================================================ const { Event } = require("klasa"); const ServerLog = require("../lib/structures/ServerLog"); module.exports = class extends Event { async run(channel) { if (channel.type === "voice") { if (channel.guild.music.queue && !channel.guild.music.voiceChannel) { if (channel.guild.music.textChannel) channel.guild.music.textChannel.sendMessage(`${this.client.emotes.check} ***Queue cleared, leaving voice channel.***`).catch(() => null); channel.guild.music.destroy(); } return; } else if (channel.type === "text") { await new ServerLog(channel.guild) .setColor("red") .setType("channels") .setName("Channel Deleted") .setMessage(`📕 **#${channel.name}** (${channel.id}) channel was \`deleted\``) .send(); } return; } }; ================================================ FILE: src/events/commandError.js ================================================ const { Event } = require("klasa"); const Raven = require("raven"); module.exports = class extends Event { run(message, command, params, error) { if (error instanceof Error) { this.client.emit("wtf", `[COMMAND] ${command.path}\n${error.stack || error}`); Raven.captureMessage(`commandError: ${command.name}\n${error.stack || error}`); } if (error.message) message.sendCode("JSON", error.message).catch(err => this.client.emit("wtf", err)); else message.sendMessage(error).catch(err => this.client.emit("wtf", err)); } }; ================================================ FILE: src/events/commandUnknown.js ================================================ const { Event } = require("klasa"); const Parser = require("breadtags"); const { join } = require("path"); const timeout = new Set(); module.exports = class extends Event { async run(msg, command, prefixLength) { if (!msg.guild || !msg.guild.settings.get("customcmds").length) return; await msg.guild.settings.sync(true); command = command.toLowerCase(); const customCommand = msg.guild.settings.get("customcmds").find(c => c.name.toLowerCase() === command); if (!customCommand) return; if (timeout.has(`${msg.author.id}-${msg.guild.id}`)) return msg.sendMessage(`${this.client.emotes.cross} **Ooh, Not so quickly. Please wait and try again!**`); const args = msg.content.slice(prefixLength).trim().split(" ").slice(1); const parsed = await this.parser.parse(customCommand.content, { guild: msg.guild, user: msg.author, member: msg.member, channel: msg.channel, args }); await msg.channel.send(parsed ? parsed : customCommand.content); timeout.add(`${msg.author.id}-${msg.guild.id}`); setTimeout(() => timeout.delete(`${msg.author.id}-${msg.guild.id}`), 3500); return; } async init() { this.parser = new Parser(); this.parser.loadAll(join(__dirname, "..", "lib", "tags")); } }; ================================================ FILE: src/events/debug.js ================================================ const { Event, config } = require("../index"); module.exports = class extends Event { constructor(...args) { super(...args, { enabled: "debug" in config ? config.debug : false }); } async run(info) { this.client.console.debug(info); } }; ================================================ FILE: src/events/disconnect.js ================================================ const { Event } = require("klasa"); module.exports = class extends Event { async run() { this.client.console.warn(`[${this.client.shard.id}]: Disconnected`); } }; ================================================ FILE: src/events/eventError.js ================================================ const { Event } = require("klasa"); const Raven = require("raven"); module.exports = class extends Event { run(event, args, error) { this.client.emit("wtf", `[EVENT] ${event.path}\n${error ? error.stack ? error.stack : error : "Unknown error"}`); Raven.captureMessage(`eventError: ${event.name}\n${error ? error.stack ? error.stack : error : "Unknown error"}`); } }; ================================================ FILE: src/events/guildBanAdd.js ================================================ const { Event } = require("klasa"); const ServerLog = require("../lib/structures/ServerLog"); module.exports = class extends Event { async run(guild, user) { await new ServerLog(guild) .setColor("red") .setType("moderation") .setName("Member Banned") .setMessage(`🔨 ${user} (${user.id}) has been **banned**.`) .send(); } }; ================================================ FILE: src/events/guildBanRemove.js ================================================ const { Event } = require("klasa"); const ServerLog = require("../lib/structures/ServerLog"); module.exports = class extends Event { async run(guild, user) { await new ServerLog(guild) .setColor("yellow") .setType("moderation") .setName("Member Unbanned") .setMessage(`🔨 ${user} (${user.id}) has been **unbanned**.`) .send(); } }; ================================================ FILE: src/events/guildCreate.js ================================================ const { Event, MessageEmbed } = require("../index"); module.exports = class extends Event { async run(guild) { this.client.dogstats.increment("pengubot.guildsadded"); const prefix = guild.settings.get("prefix") || "p!"; const description = [ "Hey! Thank you for inviting me to your server. I am Pengu, a highly advanced multi-purpose Discord Bot! I am here to make your server more engaging, fun, and safe.", "", "**Features**: Music, Social Profiles, Leaderboard, Economy, AI Moderation, Starboard, Server and Mod Logs, Join, Self & Level Roles, Custom Commands, Welcome & Leave Messages, Image Manipulation, Reddit, Jokes, Memes, and much more!", "", "➡️ **Official Website:** [PenguBot.com](https://pengubot.com/)", "➡️ **List of Commands:** [PenguBot.com/commands](https://pengubot.com/commands)", "➡️ **Add PenguBot to your server:** [PenguBot.com/invite](https://pengubot.com/invite)", "➡️ **By using PenguBot you agree with:** [Terms of Service](https://pengubot.com/tos) - [Privacy Policy](https://pengubot.com/privacy)" ]; const embed = new MessageEmbed() .setAuthor("Welcome to PenguBot", this.client.user.displayAvatarURL(), "https://pengubot.com") .setDescription(description.join("\n")) .addField("Server Prefix", `${prefix}`, true) .addField("Setup PenguBot", `${prefix}settings`, true) .addField("Need Help?", "[Official Server](https://pengubot.com/support)", true) .setFooter("PenguBot.com") .setTimestamp(); const channels = guild.channels.cache.filter(c => c.type === "text"); let channel = channels.filter(c => c.permissionsFor(guild.me).has(["VIEW_CHANNEL", "SEND_MESSAGES", "EMBED_LINKS"])); if (channel.size) return channel.first().send({ embed }); channel = channels.filter(c => c.permissionsFor(guild.me).has(["VIEW_CHANNEL", "SEND_MESSAGES"])); const noEmbed = [ "> Hey! Thank you for inviting me to your server. I am Pengu, a highly advanced multi-purpose Discord Bot! I am here to make your server more engaging, fun, and safe.", "> ", "> **Features**: Music, Social Profiles, Leaderboard, Economy, AI Moderation, Starboard, Server and Mod Logs, Join, Self & Level Roles, Custom Commands, Welcome & Leave Messages, Image Manipulation, Reddit, Jokes, Memes, and much more!", "> ", `> ➡️ **Prefix:** ${prefix} | **Setup PenguBot:** ${prefix}settings`, "> ", "> ➡️ **Official Website:** https://pengubot.com/", "> ➡️ **List of Commands:** https://pengubot.com/commands", "> ➡️ **Add PenguBot to your server:** https://pengubot.com/invite", "> ➡️ **Need Help?:** https://pengubot.com/support", "> ", "> ➡️ **By using PenguBot you agree with:** [Terms of Service](https://pengubot.com/tos) - [Privacy Policy](https://pengubot.com/privacy)" ]; if (channel.size) return channel.first().send(noEmbed.join("\n")); } }; ================================================ FILE: src/events/guildDelete.js ================================================ const { Event } = require("klasa"); module.exports = class extends Event { async run() { this.client.dogstats.increment("pengubot.guildsremoved"); } }; ================================================ FILE: src/events/guildMemberAdd.js ================================================ const { Event } = require("klasa"); const ServerLog = require("../lib/structures/ServerLog"); module.exports = class extends Event { async run(member) { await new ServerLog(member.guild) .setColor("green") .setType("join") .setName("Member Joined") .setMessage(`📥 ${member.user} (${member.id}) has joined **${member.guild.name}**.`) .send(); await this.welcomeMessage(member); await this.autoroles(member); } welcomeMessage(member) { if (!member.guild.settings.get("toggles.joinmsg")) return; const channel = member.guild.channels.cache.get(member.guild.settings.get("channels.join")); if (!channel) return; if (!channel.postable) return; return channel.send(this.replaceText(member.guild.settings.get("messages.join"), member)); } autoroles(member) { if (!member.guild.settings.get("toggles.autoroles") || !member.guild.settings.get("roles.autorole")) return; if (!member.guild.me || !member.guild.me.permissions.has("MANAGE_ROLES")) return; const roles = member.guild.settings.get("roles.autorole"); const fetchedRoles = []; for (const role of roles) { if (!member.guild.roles.cache.has(role)) continue; if (role.position >= member.guild.me.roles.highest.position) continue; fetchedRoles.push(member.guild.roles.cache.get(role)); } return member.roles.add(fetchedRoles, "PenguBot.com - Autorole Feature").catch(() => null); } replaceText(str, member) { return str.replace(/\{(mention|guild_name|server|server\.id|username|user\.tag|user\.id|user|displayname|id|size|members|count)\}/gi, (__, match) => { switch (match.toLowerCase()) { case "mention": return member.toString(); case "guild_name": case "server": return member.guild.name; case "server.id": return member.guild.id; case "user": case "displayname": case "username": return member.user.username; case "user.tag": return member.user.tag; case "user.id": case "id": return member.id; case "size": case "members": case "count": return member.guild.memberCount; default: return __; } }); } }; ================================================ FILE: src/events/guildMemberRemove.js ================================================ const { Event } = require("klasa"); const ServerLog = require("../lib/structures/ServerLog"); module.exports = class extends Event { async run(member) { await new ServerLog(member.guild) .setColor("red") .setType("leave") .setName("Member Joined") .setMessage(`📤 ${member.user} (${member.id}) has left **${member.guild.name}**.`) .send(); await this.leaveMessage(member); } leaveMessage(member) { if (!member.guild.settings.get("toggles.leavemsg")) return; const channel = member.guild.channels.cache.get(member.guild.settings.get("channels.leave")); if (!channel || (channel && !channel.postable)) return; return channel.send(this.replaceText(member.guild.settings.get("messages.leave"), member)); } replaceText(str, member) { return str.replace(/\{(mention|server|server\.id|username|user\.tag|user\.id|user|displayname|id|size|members|count)\}/gi, (__, match) => { switch (match.toLowerCase()) { case "mention": return member.toString(); case "server": return member.guild.name; case "server.id": return member.guild.id; case "user": case "displayname": case "username": return member.user.username; case "user.tag": return member.user.tag; case "user.id": case "id": return member.id; case "size": case "members": case "count": return member.guild.memberCount; default: return __; } }); } }; ================================================ FILE: src/events/klasaReady.js ================================================ const { Event, config } = require("../index"); module.exports = class extends Event { async run() { // Memory Sweeper task if (!this.client.schedule.tasks.some(task => task.taskName === "memorySweeper")) { await this.client.schedule.create("memorySweeper", "*/10 * * * *"); } // Health task if (!this.client.schedule.tasks.some(task => task.taskName === "health")) { await this.client.schedule.create("health", "* * * * *"); } // sendStats task if (config.production && !this.client.schedule.tasks.some(task => task.taskName === "stats")) { await this.client.schedule.create("stats", "*/20 * * * *"); } // Datadog task if (config.production && !this.client.schedule.tasks.some(task => task.taskName === "datadog")) { await this.client.schedule.create("datadog", "*/1 * * * *"); } this.client.console.log(`[${this.client.shard.id}]: Online`); } }; ================================================ FILE: src/events/messageDelete.js ================================================ const { Event } = require("klasa"); const ServerLog = require("../lib/structures/ServerLog"); module.exports = class extends Event { async run(message) { if (!message.guild || message.author.bot) return; await new ServerLog(message.guild) .setColor("red") .setType("messages") .setName("Message Deleted") .setAuthor(`${message.author.tag} in #${message.channel.name}`, message.author.displayAvatarURL()) .setMessage(`**Content:**\n${message.content}`) .send(); } }; ================================================ FILE: src/events/messageDeleteBulk.js ================================================ const { Event } = require("klasa"); const ServerLog = require("../lib/structures/ServerLog"); module.exports = class extends Event { async run(messages) { if (!messages.first().guild) return; await new ServerLog(messages.first().guild) .setColor("red") .setType("messages") .setName("Bulk Messages Deleted") .setMessage(`❌ \`${messages.size}\` Messages Deleted in ${messages.first().channel}`) .send(); } }; ================================================ FILE: src/events/messageReactionAdd.js ================================================ /* eslint-disable complexity */ const { Event } = require("klasa"); const { MessageEmbed } = require("discord.js"); module.exports = class extends Event { async run(reaction) { const msg = reaction.message; const { guild } = msg; if (!guild || reaction.emoji.name !== "⭐") return; if (!guild.settings.get("toggles.starboard") || !guild.settings.get("starboard.channel")) return; if (msg.reactions.cache.get("⭐").count < guild.settings.get("starboard.required")) return; const starChannel = msg.guild.channels.cache.get(msg.guild.settings.get("starboard.channel")); if (!starChannel || !starChannel.postable || !starChannel.embedable) return; if (!starChannel.nsfw && msg.channel.nsfw) return; const fetch = await starChannel.messages.fetch({ limit: 100 }); const starMsg = fetch.find(m => m.embeds.length && m.embeds[0].footer && m.embeds[0].footer.text.startsWith("⭐") && m.embeds[0].footer.text.endsWith(msg.id)); const jumpString = `[► View The Original Message](https://discordapp.com/channels/${msg.guild.id}/${msg.channel.id}/${msg.id})\n`; if (starMsg) { const starEmbed = starMsg.embeds[0]; const image = msg.attachments.size > 0 ? this.checkAttachments(msg.attachments.array()[0].url) : null; const embed = new MessageEmbed() .setColor(starEmbed.color) .setAuthor(`${msg.author.tag} in #${msg.channel.name}`, msg.author.displayAvatarURL()) .setTimestamp(new Date(msg.createdTimestamp)) .setFooter(`⭐ ${msg.reactions.cache.get("⭐").count} | ${msg.id}`); if (image) embed.setImage(image); if (msg.content) embed.setDescription(`${jumpString}${msg.content}`); else embed.setDescription(jumpString); const oldMsg = await starChannel.messages.fetch(starMsg.id).catch(() => null); if (!oldMsg) return; if (oldMsg.author.id !== this.client.user.id) return; await oldMsg.edit({ embed }); } else { const image = msg.attachments.size > 0 ? this.checkAttachments(msg.attachments.array()[0].url) : null; if (!image && !msg.content) return; const embed = new MessageEmbed() .setColor(15844367) .setAuthor(`${msg.author.tag} in #${msg.channel.name}`, msg.author.displayAvatarURL()) .setTimestamp(new Date(msg.createdTimestamp)) .setFooter(`⭐ ${msg.reactions.cache.get("⭐").count} | ${msg.id}`); if (image) embed.setImage(image); if (msg.content) embed.setDescription(`${jumpString}${msg.content}`); else embed.setDescription(jumpString); await starChannel.send({ embed }); } } checkAttachments(attachment) { const imageLink = attachment.split("."); const typeOfImage = imageLink[imageLink.length - 1]; const image = /(jpg|jpeg|png|gif)/gi.test(typeOfImage); if (!image) return null; return attachment; } get provider() { return this.client.providers.default; } }; ================================================ FILE: src/events/messageReactionRemove.js ================================================ const { Event } = require("klasa"); const { MessageEmbed } = require("discord.js"); module.exports = class extends Event { async run(reaction) { const msg = reaction.message; const { guild } = msg; if (!guild || reaction.emoji.name !== "⭐") return; if (!guild.settings.get("toggles.starboard") || !guild.settings.get("starboard.channel")) return; const starChannel = msg.guild.channels.cache.get(msg.guild.settings.get("starboard.channel")); if (!starChannel || !starChannel.postable || !starChannel.embedable) return; if (!starChannel.nsfw && msg.channel.nsfw) return; const fetch = await starChannel.messages.fetch({ limit: 100 }); const starMsg = fetch.find(m => m.embeds.length && m.embeds[0].footer && m.embeds[0].footer.text.startsWith("⭐") && m.embeds[0].footer.text.endsWith(msg.id)); const jumpString = `[► View The Original Message](https://discordapp.com/channels/${msg.guild.id}/${msg.channel.id}/${msg.id})\n`; if (starMsg) { const starEmbed = starMsg.embeds[0]; const image = msg.attachments.size > 0 ? await this.checkAttachments(msg.attachments.array()[0].url) : null; const embed = new MessageEmbed() .setColor(starEmbed.color) .setAuthor(`${msg.author.tag} in #${msg.channel.name}`, msg.author.displayAvatarURL()) .setTimestamp(new Date(msg.createdTimestamp)) .setFooter(`⭐ ${msg.reactions.cache.get("⭐") ? msg.reactions.cache.get("⭐").count : 0} | ${msg.id}`); if (image) embed.setImage(image); if (msg.content) embed.setDescription(`${jumpString}${msg.content}`); else embed.setDescription(jumpString); const oldMsg = await starChannel.messages.fetch(starMsg.id).catch(() => null); if (!oldMsg) return; if (oldMsg.author.id !== this.client.user.id) return; if (!msg.reactions.cache.get("⭐")) return oldMsg.delete(); await oldMsg.edit({ embed }); } } checkAttachments(attachment) { const imageLink = attachment.split("."); const typeOfImage = imageLink[imageLink.length - 1]; const image = /(jpg|jpeg|png|gif)/gi.test(typeOfImage); if (!image) return null; return attachment; } get provider() { return this.client.providers.default; } }; ================================================ FILE: src/events/messageUpdate.js ================================================ const { Event } = require("klasa"); const ServerLog = require("../lib/structures/ServerLog"); module.exports = class extends Event { async run(oldMessage, newMessage) { if (this.client.ready && oldMessage.content !== newMessage.content) this.client.monitors.run(newMessage); if (!oldMessage.guild || oldMessage.author.bot || oldMessage.content === newMessage.content) return; await new ServerLog(oldMessage.guild) .setColor("blue") .setType("messages") .setName("Message Updated") .setAuthor(`${oldMessage.author.tag} in #${oldMessage.channel.name}`, oldMessage.author.displayAvatarURL()) .setMessage(`[► View The Message](https://discordapp.com/channels/${oldMessage.guild.id}/${oldMessage.channel.id}/${oldMessage.id})\n\n**Old:**\n${oldMessage.content}\n\n**New:**\n${newMessage.content}`) .send(); } }; ================================================ FILE: src/events/reconnecting.js ================================================ const { Event } = require("klasa"); module.exports = class extends Event { async run() { this.client.console.warn(`[${this.client.shard.id}]: Reconnecting`); } }; ================================================ FILE: src/events/resumed.js ================================================ const { Event } = require("klasa"); module.exports = class extends Event { run() { this.client.console.warn(`[${this.client.shard.id}]: Reconnected`); } }; ================================================ FILE: src/events/roleCreate.js ================================================ const { Event } = require("klasa"); const ServerLog = require("../lib/structures/ServerLog"); module.exports = class extends Event { async run(role) { await new ServerLog(role.guild) .setColor("green") .setType("roles") .setName("Role Created") .setMessage(`☑ **${role}** (${role.id}) role was \`created\``) .send(); } }; ================================================ FILE: src/events/roleDelete.js ================================================ const { Event } = require("klasa"); const ServerLog = require("../lib/structures/ServerLog"); module.exports = class extends Event { async run(role) { await new ServerLog(role.guild) .setColor("red") .setType("roles") .setName("Role Deleted") .setMessage(`❌ **${role}** (${role.id}) role was \`deleted\``) .send(); } }; ================================================ FILE: src/events/shardError.js ================================================ const { Event } = require("klasa"); module.exports = class extends Event { async run(error, shardID) { this.client.console.error(`[${shardID}]:`, error); } }; ================================================ FILE: src/extendables/fetchURL.js ================================================ const { Extendable, Piece, Util: { fetch } } = require("../index"); module.exports = class extends Extendable { constructor(...args) { super(...args, { appliesTo: [Piece] }); } fetchURL(url, options = {}) { options.headers = options.headers ? { ...options.headers, "User-Agent": this.client.userAgent } : { "User-Agent": this.client.userAgent }; return fetch(url, options, options.type || "json").catch(error => { Error.captureStackTrace(error); this.client.emit("error", error); throw error; }); } }; ================================================ FILE: src/extendables/prompt.js ================================================ const { Extendable } = require("klasa"); const { Message } = require("discord.js"); module.exports = class extends Extendable { constructor(...args) { super(...args, { appliesTo: [Message] }); } async prompt(text, time = 30000) { const message = await this.channel.send(text); const responses = await this.channel.awaitMessages(msg => msg.author === this.author, { time, max: 1 }); message.delete(); if (responses.size === 0) throw this.language.get("MESSAGE_PROMPT_TIMEOUT"); return responses.first(); } }; ================================================ FILE: src/finalizers/commandCounter.js ================================================ const { Finalizer } = require("klasa"); module.exports = class extends Finalizer { async run() { const r = this.client.providers.default.db; const query = await r.table("clientStorage") .get(this.client.user.id) .getField("counter") .run(); await r.table("clientStorage") .get(this.client.user.id) .update({ counter: { total: query.total + 1 } }) .run(); await this.client.shard.broadcastEval("this.settings.sync(true);"); } }; ================================================ FILE: src/functions/friendlyDuration.js ================================================ const { Function } = require("@kcp/functions"); module.exports = class extends Function { run(ms) { const sec = Math.floor((ms / 1000) % 60).toString(); const min = Math.floor((ms / (1000 * 60)) % 60).toString(); const hrs = Math.floor(ms / (1000 * 60 * 60)).toString(); return `${hrs.padStart(2, "0")}:${min.padStart(2, "0")}:${sec.padStart(2, "0")}`; } }; ================================================ FILE: src/functions/images.js ================================================ const { Function, config, util: { fetch } } = require("../index"); module.exports = class extends Function { run(endpoint, load = {}) { return fetch(`https://server.pengubot.com/${endpoint}`, { method: "POST", headers: { authorization: config.apis.pengu }, body: JSON.stringify(load) }, "buffer"); } }; ================================================ FILE: src/functions/isPatron.js ================================================ const { Function } = require("@kcp/functions"); module.exports = class extends Function { run(guild) { return this.client.settings.get("pGuilds").includes(guild.id); } }; ================================================ FILE: src/functions/isUpvoter.js ================================================ const { Function } = require("@kcp/functions"); module.exports = class extends Function { run(user) { const diff = Date.now() - user.settings.get("lastUpvote"); if (diff <= 43200000) return true; return false; } }; ================================================ FILE: src/functions/randomNumber.js ================================================ const { Function } = require("@kcp/functions"); module.exports = class extends Function { run(min, max) { if (typeof min !== "number") throw "Minimun value must be a number"; if (typeof max !== "number") throw "Maximum value must be a number"; if (min >= max) throw "Minimun must be less than Maximum to determine the range"; min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min)) + min; } }; ================================================ FILE: src/functions/scrapeSubreddit.js ================================================ const { util: { fetch }, Function } = require("../index"); module.exports = class extends Function { async run(subreddit, options = { }) { let type; if (options.type) type = `/${options.type.toLowerCase()}`; const data = await fetch(`https://www.reddit.com/r/${subreddit}${type ? type : ""}/.json?limit=100`) .then(res => res.data) .catch(() => null); if (!data) throw "Houston we have a problem, please try again!"; const random = data.children[Math.floor(Math.random() * data.children.length)]; if (!random || !random.data) throw "Houston we have a problem, please try again!"; return random.data; } }; ================================================ FILE: src/index.js ================================================ const klasa = require("klasa"); const discord = require("discord.js"); const klasaApi = require("klasa-api"); const klasaFunctions = require("@kcp/functions"); const { version } = require("../package.json"); module.exports = { ...klasa, ...discord, ...klasaApi, ...klasaFunctions, Util: require("./lib/util/Util"), util: require("./lib/util/Util"), config: require("../config.js"), klasaUtil: klasa.util, discordUtil: discord.Util, version, klasaVersion: klasa.version, discordVersion: discord.version, klasaConstants: klasa.constants, discordConstants: discord.Constants, Command: require("./lib/structures/KlasaCommand"), ModLog: require("./lib/structures/ModLog"), ServerLog: require("./lib/structures/ServerLog") }; ================================================ FILE: src/inhibitors/disabledGroup.js ================================================ const { Inhibitor } = require("klasa"); module.exports = class extends Inhibitor { constructor(...args) { super(...args, { spamProtection: true }); } async run(msg, cmd) { if (!msg.guild || !msg.guild.settings.get("disabledCommandsGroup").includes(cmd.category.toLowerCase())) return; throw msg.sendMessage(`${msg.language.get("INHIBITOR_DISABLED_GROUP")}: \`${cmd.category}\``); } }; ================================================ FILE: src/inhibitors/patronOnly.js ================================================ const { Inhibitor } = require("../index"); module.exports = class extends Inhibitor { constructor(...args) { super(...args, { spamProtection: false }); } async run(msg, cmd) { if (!cmd.patronOnly || this.client.funcs.isPatron(msg.guild)) return; throw `🔒 ***${msg.language.get("CMD_PATRON_ONLY")}***`; } }; ================================================ FILE: src/inhibitors/requireDJ.js ================================================ const { Inhibitor } = require("klasa"); module.exports = class extends Inhibitor { constructor(...args) { super(...args, { spamProtection: true }); } async run(msg, cmd) { if (cmd.requireDJ !== true) return; if (msg.channel.type !== "text") throw "This command may be only executed in a server."; if (!msg.guild.settings.get("toggles.djmode")) return; if (await msg.hasAtLeastPermissionLevel(2)) return; throw `${this.client.emotes.cross} ***${msg.language.get("INHIBITOR_DJ_ONLY")}***`; } }; ================================================ FILE: src/inhibitors/requireMusic.js ================================================ const { Inhibitor } = require("klasa"); module.exports = class extends Inhibitor { constructor(...args) { super(...args, { spamProtection: false }); } async run(msg, cmd) { if (!msg.guild || cmd.requireMusic !== true) return; const force = "force" in msg.flagArgs; await msg.guild.members.fetch(msg.author).catch(() => null); const { music } = msg.guild; if (!msg.member.voice.channel && !force) throw "You are not connected in a voice channel."; if (!music.voiceChannel) throw "I am not connected in a voice channel."; if (msg.member.voice.channel !== msg.guild.me.voice.channel && !force) throw "You must be in the same voice channel as me."; if (!music.queue.length) throw msg.language.get("MUSIC_NO_SONGS_IN_QUEUE"); } }; ================================================ FILE: src/inhibitors/upvoterOnly.js ================================================ const { Inhibitor } = require("../index"); module.exports = class extends Inhibitor { constructor(...args) { super(...args, { spamProtection: false }); } async run(msg, cmd) { if (!msg.guild || !cmd.upvoteOnly) return; if (this.client.funcs.isUpvoter(msg.author) || this.client.funcs.isPatron(msg.guild)) return; throw `🔒 ***${msg.language.get("CMD_UPVOTE_ONLY")}***`; } }; ================================================ FILE: src/languages/en-US.js ================================================ const { Language, klasaUtil: util, version, Duration } = require("../index"); module.exports = class extends Language { constructor(...args) { super(...args); this.language = { DEFAULT: key => `${key} has not been localized for en-US yet.`, INHIBITOR_DISABLED: "<:penguError:435712890884849664> ***This command is currently disabled***", INHIBITOR_DISABLED_GROUP: "<:penguError:435712890884849664> ***This command group is currently disabled***", COMMAND_UNLOAD: (type, name) => `<:penguSuccess:435712876506775553> Unloaded ${type}: ${name}`, COMMAND_TRANSFER_ERROR: "<:penguError:435712890884849664> That file has been transfered already or never existed.", COMMAND_RELOAD: (type, name) => `<:penguSuccess:435712876506775553> Reloaded ${type}: ${name}`, COMMAND_RELOAD_ALL: type => `<:penguSuccess:435712876506775553> Reloaded all ${type}.`, COMMAND_LOAD: (time, type, name) => `<:penguSuccess:435712876506775553> Successfully loaded ${type}: ${name}. (Took: ${time})`, COMMAND_LOAD_ERROR: (type, name, error) => `<:penguError:435712890884849664> Failed to load ${type}: ${name}. Reason:${util.codeBlock("js", error)}`, COMMAND_INVITE: `**👉 | Invite PenguBot to your Discord Guild:** `, COMMAND_SUPPORT: `**__PenguBot Support Guild__**\n• **Invite Link:** https://discord.gg/u8WYw5r`, COMMAND_INVITE_DESCRIPTION: "Displays the join server link of the bot.", COMMAND_INFO: [ "PenguBot is a Multi-Purpose Discord Bot which is filled with features ranging from", "Moderation, Fun, Utilities and more. It is developed in NodeJS using many different", "technologies such as RethinkDB, JavaScript and Linux.", "", "• **Author:** [AdityaTD#5346](https://www.AdityaTripathi.co.in)", `• **Version:** ${version}`, "• **Website:** ", "• **Patreon:** ", "• **PayPal:** ", "• **Discord Guild:** ", "• **GitHub:** " ], COMMAND_DONATE: [ "Enjoying Pengu? Then you'll definately love Pengu Premium! Support us and recieve some awesome perks for your contribution!", "", "__Perks__:", "• Unlimited Access to Queue Lengths, Volume Adjustment and more!", "• No Vote Locking - No Need To Upvote for Locked Commands", "• Better Uptime and Premium Support from Pengu's Team", "• Special Role in Climactic's Official Server", "", "• **Patreon:** https://www.patreon.com/PenguBot", "• **PenguBot's Premium Page:** https://www.PenguBot.com/premium" ], COMMAND_HELP_NODM: "📪 | You have DMs disabled, I couldn't send you the commands in DMs so here's a link to all the commands: ", COMMAND_UPVOTE: ["Want PenguBot to become bigger and be available in more guilds you visit?", "Then vote for PenguBot via the link below and also unlock access to", "limited features that only upvoters can have access to!", "", "• **Vote:** https://top.gg/bot/PenguBot/vote"], COMMAND_TOGGLE_GROUP_DESCRPTION: "Disable/Enable Command Categories.", COMMAND_TOGGLE_COMMAND_DESCRPTION: "Disable/Enable Commands in your guild.", COMMAND_SUPPORT_DESCRIPTION: "Link to join PenguBot's Support Guild.", // Pengu's Sentences MESSAGE_PREFIX_SET: "Successfully updated the guild's prefix to:", MESSAGE_CURRENT_PREFIX: "Guild's current prefix is:", MESSAGE_PENGU: "here you go!", // Kick Messages MESSAGE_KICKED: "was kicked!", MESSAGE_KICK_YOURSELF: "You can not kick yourself!", MESSAGE_KICK_PENGU: "Why would you want to kick me?", MESSAGE_KICK_CANT: "This user can't be kicked.", // Ban Messages MESSAGE_BANNED: "was banned!", MESSAGE_SOFTBANNED: "was soft banned!", MESSAGE_BAN_YOURSELF: "You can not ban yourself!", MESSAGE_BAN_PENGU: "Why would you want to ban me?", MESSAGE_BAN_CANT: "This user can't be banned!", // Make Admin and Mod Messages MESSAGE_ADMIN_ADD: "is now a Pengu Admin!", MESSAGE_ADMIN_REMOVE: "is no longer a Pengu Admin!", MESSAGE_MOD_ADD: "is now a Pengu Moderator!", MESSAGE_MOD_REMOVE: "is no longer a Pengu Moderator!", MESSAGE_DJ_ADD: "is now a Pengu DJ!", MESSAGE_DJ_REMOVE: "is no longer a Pengu DJ!", // Mute Command Messages MESSAGE_MUTED: "was muted!", MESSAGE_UNMUTED: "was un-muted!", // Other Mod Commands Messages MESSAGE_PRUNE_DELETED: "message(s) were deleted!", // Custom Commands Messages MESSAGE_CMD_ADDED: "command was added by", MESSAGE_CMD_UPDATED: "command was updated by", MESSAGE_CMD_REMOVED: "command was removed by", MESSAGE_CMD_NOTFOUND: "command was not found!", MESSAGE_CMD_EXISTS: "command with this name already exists in Pengu as a default or custom command!", MESSAGE_NO_CMDS: "Your guild has no custom commands, ask an admin or above to make one!", MESSAGE_COMMAND_CUSTOM_ENABLED: "Custom Commands are now Enabled!", MESSAGE_COMMAND_CUSTOM_DISABLED: "Custom Commands are now Disabled!", // Welcome & Leave messages MESSAGE_WLCM_ENABLED: "Welcome Messages are now Enabeld!", MESSAGE_WLCM_DISABLED: "Welcome Messages are now Disabled!", MESSAGE_LEAVE_ENABLED: "Leave Messages are now Enabeld!", MESSAGE_LEAVE_DISABLED: "Leave Messages are now Disabled!", MESSAGE_WELCOME_SET: "Welcome message has now been set!", MESSAGE_LEAVE_SET: "Leave message has now been set!", MESSAGE_WELCOME_CHANNEL_SET: "Welcome messages channel has now been set!", MESSAGE_LEAVE_CHANNEL_SET: "Leave messages channel has now been set!", // Logging MESSAGE_LOGCHAN_SET: "Logging channel has now been set!", COMMAND_LOG_DESCRPTION: "Enable/Disable Logging events if you're Pengu Admin or above.", // Autoroles, Level & Self Roles MESSAGE_AUTOROLES_ENABLED: "Auto Roles have been enabled in this guild!", MESSAGE_AUTOROLES_DISABLED: "Auto Roles have been disabled in this guild!", MESSAGE_AUTOROLE_REMOVED: "role was removed from the Auto Roles!", MESSAGE_AUTOROLE_ADDED: "role was added in the Auto Roles!", COMMAND_SELFROLES: "Assign or Deassign or list Self Roles from Yourself.", COMMAND_SELFROLES_MANAGE: "Add or Remove Self Roles from the server.", COMMAND_TOGGLE_SELFROLES: "Enable/Disable Self Roles on the server.", MESSAGE_LEVELROLES_ENABLED: "Level Based Roles have been enabled in this guild!", MESSAGE_LEVELROLES_DISABLED: "Level Based Roles have been disabled in this guild!", // Utilities Messages MESSAGE_NEW_REMINDER: "New Reminder has been created with ID:", MESSAGE_LINK_SHORTEN: "Here's your Short URL:", MESSAGE_AVATAR: "Here's the avatar of", MESSAGE_STARCHAN_SET: "Starboard channel has now been set.", // Pengu's Commands Descriptions COMMAND_KICK_DESCRIPTION: "Allows moderators and above to kick users.", COMMAND_BAN_DESCRIPTION: "Allows moderators and above to ban users.", COMMAND_SOFTBAN_DESCRIPTION: "Allows moderators and above to softban users.", COMMAND_MAKE_ADMIN_DESCRIPTION: "Allows guild managers, admins and pengu admins to add/remove new pengu admins.", COMMAND_MAKE_MOD_DESCRIPTION: "Allows guild managers, admins and pengu admins to add/remove new pengu mods.", COMMAND_MAKE_STAFF_DESCRPTION: "Allows guild managers, admins and pengu admins to add/remove new pengu staff.", COMMAND_MUTE_DESCRIPTION: "Allows Pengu Moderators and above to Mute people.", COMMAND_SAY_DESCRIPTION: "Allows Pengu Moderators and above to make Pengu say stuff.", COMMAND_ADD_CMD_DESCRIPTION: "Allows Pengu Administrators and above to add custom commands to the guild.", COMMAND_TOGGLE_CUSTOM_DESCRIPTION: "Allows Pengu Administrators and above to enable or disable custom commands in the guild.", COMMAND_TOGGLE_WELCOME_DESCRPTION: "Allows Pengu Administrators and above to enable or disable welcome messages in the guild.", COMMAND_TOGGLE_LEAVE_DESCRPTION: "Allows Pengu Administrators and above to enable or disable welcome messages in the guild.", COMMAND_SET_WELCOME_DESCRPTION: "Allows Pengu Administrators and above set welcome messages in the guild.", COMMAND_SET_LEAVE_DESCRPTION: "Allows Pengu Administrators and above set leave messages in the guild.", COMMAND_CHANNEL_WELCOME_DESCRPTION: "Allows Pengu Administrators and above set welcome messages channel in the guild.", COMMAND_CHANNEL_LEAVE_DESCRPTION: "Allows Pengu Administrators and above set leave messages channel in the guild.", COMMAND_TOGGLE_ROLES_DESCRPTION: "Allows Pengu Administrators and above to enable or disable Auto Roles.", COMMAND_TOGGLE_LVLROLES_DESCRPTION: "Allows Pengu Administrators and above to enable or disable Level Based Roles.", COMMAND_LIST_LVLROLES_DESCRPTION: "List all the roles in the Level Based Roles List.", COMMAND_LVLROLE_DESCRPTION: "ALLOWS Pengu Administrators and above to Add and Remove Level Based Roles for a guild.", COMMAND_ADD_ROLES_DESCRPTION: "Allows Pengu Administrators and above to add new Auto Roles.", COMMAND_REMIND_DESCRIPTION: "Make Pengu remind you things so you don't forget.", COMMAND_SHORTEN_DESCRIPTION: "Let Pengu shorten your Long URLs in one simple command.", COMMAND_AFK_DESCRIPTION: "Set yourself AFK with a reason so other's know!", COMMAND_DEL_CMD_DESCRIPTION: "Allows Pengu Administrators and above to delete a custom command made previously.", COMMAND_LIST_CMDS_DESCRIPTION: "List all custom commands made in a guild.", COMMAND_TOGGLE_CUSTOM_DESCRPTION: "Allows Pengu Administrators and above to enable or disable custom commands in a guild.", COMMAND_MUTE_DESCRPTION: "Allows Pengu Moderators and above to Mute a person in the guild", COMMAND_PRUNE_DESCRIPTION: "Allows Pengu Moderators and above to Bulk Delete messages in a guild with filters.", COMMAND_MAKE_ADMIN_DESCRPTION: "Allows Administrators and Guild Owners to create new Pengu Admins.", COMMAND_MAKE_MODS_DESCRPTION: "Allows Pengu Admins and above to create new Pengu Mods.", COMMAND_PREFIX_DESCRIPTION: "Allows Pengu Admins and above to change a guild's prefix for PenguBot.", COMMAND_SHARDS_DESCRIPTION: "Check all the detailed shards information of PenguBot.", COMMAND_LMGTFY_DESCRIPTION: "Feeling lazy to google something? Let me google it for you.", COMMAND_UPVOTE_DESCRIPTION: "Vote for PenguBot on DBL and gain access to limited features in a second.", // Automod MESSAGE_AUTOMOD_ENABLED: "Auto moderation has now been Enabled with THREAT and SPAM filters by default. Change filters by doing `p!automod toggle `", MESSAGE_AUTOMOD_DISABLED: "Auto moderation has now been Disabled.", MESSAGE_AUTOMOD_TOGGLED: "filter has now been toggled", COMMAND_AUTOMOD_DESCRPTION: "Manage Auto moderation Settings.", // Fun Commands Descriptions COMMAND_CAT_DESCRIPTION: "Cute Cat Photos and Facts with Pengu!", COMMAND_CHUCK_DESCRIPTION: "Chuck Norris Jokes just a command away!", COMMAND_COMPLIMENT_DESCRIPTION: "Be nice and compliment some people out there with Pengu!", COMMAND_COOKIE_DESCRIPTION: "Mouth watering Cookie pictures to make you even more hungry!", COMMAND_DADJOKE_DESCRIPTION: "Everyone loves jokes but what about some Dad Jokes?", COMMAND_DOG_DESCRIPTION: "Cute Doggo Pictures to make your day!", COMMAND_FML_DESCRIPTION: "Things which has made people say FML!", COMMAND_HUG_DESCRIPTION: "Someone needs a hug? Why wait, just give it!", COMMAND_PENGU_DESCRIPTION: "The Cute OG Pengu Pictures!", COMMAND_8BALL_DESCRIPTION: "Ask the magical 8ball your questions!", COMMAND_DICE_DESCRIPTION: "Roll a dice and get an outcome with Pengu!", COMMAND_INSULT_DESCRIPTION: "Don't be nice and insult a fellow guild member!", COMMAND_KISS_DESCRIPTION: "Get naughty and just kiss the person!", COMMAND_PUNCH_DESCRIPTION: "Someone's being naughty? Give them a strong punch!", COMMAND_COMIC_DESCRIPTION: "The OG Kids would still remember comics, it's for them!", COMMAND_FACT_DESCRIPTION: "Educate Yourself with Pengu!", COMMAND_RPS_DESCRIPTION: "Ever wanted to compete against Pengu in Rock, Paper, Scissors, the greatest eSport of all time? Now you can!", COMMAND_SLOTS_DESCRIPTION: "I don't promote gambling but you can if you want because I can!", COMMAND_TRUMP_DESCRIPTION: "Get Trumped by Trump Insults!", COMMAND_MOMMA_DESCRIPTION: "Still not tired of Yo Momma jokes? We got more, don't you worry!", COMMAND_FOX_DESCRIPTION: "Love foxes? Me too! Here's a picture of a fox.", COMMAND_ILLEGAL_DESCRIPTION: "Let's make things illegal by making trump sign the bills for it.", COMMAND_MCA_DESCRIPTION: "Generate yourself a Minecraft Achievement image because My Craft...", COMMAND_LIO_DESCRIPTION: "Add yours or other people's face on to the cute lio!", COMMAND_SLAP_DESCRIPTION: "Who's being naughty? Give them a tight slap!", COMMAND_PAT_DESCRIPTION: "Someone did a good job? Give them a pat.", COMMAND_CUDDLE_DESCRIPTION: "Cuddle in, it's time to relax, everything's gonna be fine.", COMMAND_TICKLE_DESCRIPTION: "Who's being tough on surface? Tickle them and make them laugh!", COMMAND_POKE_DESCRIPTION: "Ping someone by poking them!", COMMAND_FEED_DESCRIPTION: "Anyone hungry? Feed them some food.", COMMAND_BATSLAP_DESCRIPTION: "Be a Bat Man and slap someone!", COMMAND_BEAUTIFUL_DESCRIPTION: "Admire your or someone else's avatar.", COMMAND_FACEPALM_DESCRIPTION: "*sigh* facepalm where you have to.", COMMAND_RIP_DESCRIPTION: "Pay someone their final respect.", COMMAND_SUPERPUNCH_DESCRIPTION: "Become a superman and give someone an even stronger punch!", COMMAND_TATTOO_DESCRIPTION: "Ever wanted your avatar being tatted on someone else? Here you have it.", COMMAND_TRIGGERED_DESCRIPTION: "Because getting trigerred is a lot easier now...", COMMAND_WANTED_DESCRIPTION: "Print some Wanted posters of who is wanted by the sherrif department.", COMMAND_VAULT_DESCRIPTION: "Be the ICONIC Vault boy or make someone else be one.", COMMAND_GARBAGE_DESCRIPTION: "Garbage someone because they're trash.", COMMAND_APPROVED_DESCRIPTION: "Give someone a seal of approval", COMMAND_REJECT_DESCRIPTION: "Reject someone, their quality isn't upto the mark.", COMMAND_TINDER_DESCRIPTION: "You Have a Match, let's match you with someone!", COMMAND_MISSING_DESCRIPTION: "Has your dear one went missing? Get them a poster.", COMMAND_SNAPCHAT_DESCRIPTION: "Create a Snapchat Meme Image.", COMMAND_OSU_DESCRIPTION: "Get osu! Statistics in a cool way!", COMMAND_CMM_DESCRIPTION: "Create a nice Change My Mind meme!", // NSFW Commands COMMAND_ANAL_DESCRIPTION: "-NOT SAFE FOR WORK- Anal images.", COMMAND_BOOBS_DESCRIPTION: "-NOT SAFE FOR WORK- Boobs images.", COMMAND_BOOTY_DESCRIPTION: "-NOT SAFE FOR WORK- Booty images.", COMMAND_PUSSY_DESCRIPTION: "-NOT SAFE FOR WORK- Pussy images.", COMMAND_TEEN_DESCRIPTION: "-NOT SAFE FOR WORK- Teen images.", COMMAND_HENTAI_DESCRIPTION: "-NOT SAFE FOR WORK- Hentai images.", COMMAND_SNAP_DESCRIPTION: "-NOT SAFE FOR WORK- Snapchat Images.", COMMAND_AMETEUR_DESCRIPTION: "-NOT SAFE FOR WORK- Ameteur Images.", COMMAND_GIFS_DESCRIPTION: "-NOT SAFE FOR WORK- Animated Gifs.", COMMAND_GWNSFW_DESCRIPTION: "-NOT SAFE FOR WORK- Gone Wild Images.", COMMAND_LESB_DESCRIPTION: "-NOT SAFE FOR WORK- Lesbian Images.", COMMAND_MILF_DESCRIPTION: "-NOT SAFE FOR WORK- MILF images.", COMMAND_NEKOS_DESCRIPTION: "-NOT SAFE FOR WORK- Nekos Images.", COMMAND_ANIMETRAPS_DESCRIPTION: "-NOT SAFE FOR WORK- Anime Trap Images", COMMAND_ASIAN_DESCRIPTION: "-NOT SAFE FOR WORK- Asian NSFW Images", COMMAND_BDSM_DESCRIPTION: "-NOT SAFE FOR WORK- BDSM Images", COMMAND_BJNSFW_DESCRIPTION: "-NOT SAFE FOR WORK- Blowjob Images", COMMAND_COSPLAY_DESCRIPTION: "-NOT SAFE FOR WORK- Cosplay Images", COMMAND_FITGIRLS_DESCRIPTION: "-NOT SAFE FOR WORK- Fitgirl Images", COMMAND_FUTANARI_DESCRIPTION: "-NOT SAFE FOR WORK- Futanari Images", COMMAND_NSFW_DESCRIPTION: "-NOT SAFE FOR WORK- General NSFW Images", COMMAND_FEET_DESCRIPTION: "-NOT SAFE FOR WORK- Feet Fetish Images", COMMAND_GINGER_DESCRIPTION: "-NOT SAFE FOR WORK- Ginger Images", COMMAND_OUTFITS_DESCRIPTION: "-NOT SAFE FOR WORK- Outfits Images", COMMAND_PARTYHOUSE_DESCRIPTION: "-NOT SAFE FOR WORK- Partyhouse Images", COMMAND_R34_DESCRIPTION: "-NOT SAFE FOR WORK- Rule-34 Images", COMMAND_SOLO_DESCRIPTION: "-NOT SAFE FOR WORK- Solo People Images", COMMAND_THICC_DESCRIPTION: "-NOT SAFE FOR WORK- Thicc Images", COMMAND_NSFWTRAPS_DESCRIPTION: "-NOT SAFE FOR WORK- Traps Images", // Utilities Commands COMMAND_GUILDINFO_DESCRIPTION: "Get brief information about a guild with this command.", COMMAND_TWSTATS_DESCRIPTION: "Check Twitch Statistics live on the go.", COMMAND_URBAN_DESCRIPTION: "Find meanings of words on Urban Dictionary.", COMMAND_USERINFO_DESCRIPTION: "Get brief user information in a single command.", COMMAND_WEATHER_DESCRIPTION: "Get weather of your area easily and in a fun way.", COMMAND_YTSTATS_DESCRIPTION: "Check YouTube Statistics live on the go.", COMMAND_ADBLOCK_DESCRIPTION: "Enable/Disable Auto Deletion of Invite Links. Pengu Mods and above can bypass this.", COMMAND_TRANSLATE_DESCRIPTION: "Translate a sentence or message to any selected language.", COMMAND_POLL_DESCRIPTION: "Create a Strawpoll using PenguBot", COMMAND_LOGCHAN_DESCRPTION: "Select a Channel Where you want to Log Events.", COMMAND_AVATAR_DESCRIPTION: "Get Avatar URL of Yourself or Someone else.", COMMAND_QUOTE_DESCRIPTION: "Quote a message with it's Message ID.", // Profile Commands COMMAND_LEVELUP_DESCRIPTION: "Manage Level Up settings of Users in your guild.", COMMAND_REP_DESCRIPTION: "Give your valuable rep point to someone to make them feel special.", COMMAND_PROFILE_DESCRIPTION: "Check yours or other users fancy profiles!", COMMAND_DAILY_DESCRIPTION: "Claim your daily 100 Snowflakes which you can use to buy cosmetics.", COMMAND_TITLE_DESCRIPTION: "Set your title which will be visible in your profile.", COMMAND_SNOWFLAKES_DESCRIPTION: "Check your Snowflakes or send your Snowflakes to others.", COMMAND_BGBUY_DESCRIPTION: "Buy backgrounds for your Pengu Profile.", COMMAND_CHANGEBG_DESCRIPTION: "Change your Pengu Profile's Background.", COMMAND_LEADERBOARD_DESCRIPTION: "See who is winning the leaderboard for your guild.", COMMAND_BACKGROUND_DESCRIPTION: "Customize your PenguBot profile by buying and choosing different backgrounds.", COMMAND_RANK_DESCRIPTION: "Server Based Member Rank Cards (Different for Each Server)", COMMAND_MANAGEXP_DESCRIPTION: "Set/Reset/Add XP to a Guild Member (PenguAdmin or Above Required)", // Dev Commands COMMAND_EXEC_DESCRIPTION: "-BOT OWNER ONLY-", COMMAND_SG_DESCRIPTION: "-BOT OWNER ONLY-", COMMAND_TPG_DESCRIPTION: "-BOT OWNER ONLY-", COMMAND_DONATE_DESCRIPTION: "Donate to PenguBot and help make something awesome!", // Music Commands COMMAND_DMSONG_DESCRIPTION: "Make Pengu send you the current song in your DMs.", COMMAND_LOOP_DESCRIPTION: "Loop a song so it repeats when it finishes playing.", COMMAND_LYRICS_DESCRIPTION: "Get a song's lyrics directly with Pengu.", COMMAND_MUSIC_DESCRIPTION: "Detailed information for all Music Commands.", COMMAND_NOWPLAYING_DESCRIPTION: "Know which song is currently playing and what is it's progress.", COMMAND_PLAY_DESCRIPTION: "Play Songs from YouTube/Twitch/SoundCloud/Mixer/Live Streams, etc. with Pengu.", COMMAND_SHUFFLE_DESCRIPTION: "Shuffle songs in the queue to be randomized.", COMMAND_QUEUE_DESCRIPTION: "See the current song queue in an interactive manner", COMMAND_SKIP_DESCRIPTION: "Skip the current song or call a vote skip if there are more than 3 members in the VC.", COMMAND_STOP_DESCRIPTION: "Stop and Clear the queue if you're Pengu-DJ or are the only one listening.", COMMAND_MAKE_DJ_DESCRPTION: "Allows guild managers, admins and pengu admins to add/remove new pengu dj.", COMMAND_LEAVE_DESCRIPTION: "Make Pengu forcefully leave your Voice Channel.", COMMAND_PAUSE_DESCRIPTION: "Pause/Resume the currently playing music.", COMMAND_VOLUME_DESCRIPTION: "Change the default volume of Pengu in your guild", COMMAND_DJONLY_DESCRIPTION: "Toggle Pengu DJ only mode for Music Commands.", INHIBITOR_DJ_ONLY: "This guild is configured to allow only Pengu DJ's to use Music Commands.", COMMAND_DUMP_DESCRIPTION: "Dump your server queue in raw format to be used later!", // Game Stats COMMAND_FORTNITE_DESCRIPTION: "Get Fortnite Game Statistics within Discord.", COMMAND_CRSTATS_DESCRIPTION: "Clash Royale Player Statistics within Discord.", COMMAND_COCSTATS_DESCRIPTION: "Clash of Clans Player Statistics within Discord.", COMMAND_CSGO_DESCRIPTION: "Counter Strike Global Offensive Player Statistics", // Starboard COMMAND_TOGGLE_STARBOARD_DESCRPTION: "Allows Pengu Administrators and above to toggle Starboard in the guild.", COMMAND_CHANNEL_STAR_DESCRPTION: "Allows Pengu Administrators and above to set a Starboard channel.", COMMAND_REQUIRED_STAR_DESCRPTION: "Allows Pengu Administrators and above to set minimum stars before Starboard message.", COMMAND_STAR_DESCRPTION: "Allows Pengu Moderators and above to force Starboard a message.", MESSAGE_STAR_ENABLED: "Starboard has now been enabled.", MESSAGE_STAR_DISABLED: "Starboard has now been disabled.", MESSAGE_STARS_REQUIRED_SET: "Set the minimum Stars required before a message is sent to Starboard.", MESSAGE_STAR_CHANNEL_SET: "Successfully set the Starboard channel.", // Custom Messages ER_TRY_AGAIN: "I am very sorry but there was an error, please try again or contact us at https://discord.gg/u8WYw5r", ER_MUSIC_TRIP: "I tripped on a wire! *Ouch!* It hurts but I'll recover, try again later or contact us at https://discord.gg/u8WYw5r", ER_MUSIC_NF: "<:penguError:435712890884849664> I could not find any results for your query, please try again with a different one or contact us at https://discord.gg/u8WYw5r", ER_CATS_DOGS: "There was an error, I think a cat has cut the wire off, dogs don't do that.", ER_API: "Unfortunately due to the provider of this command's API getting down, this command is temporarily disabled.", ER_TINDER: "Can't match you with yourself...", CMD_LOG_DISABLED: "logging is now Disabled.", CMD_LOG_ENABLED: "logging is now Enabled.", CMD_NO_SELFROLES: "This guild does not have any self assignable roles.", CMD_SELF_ASSIGNABLE: "role is now self assignable.", CMD_NO_ASSIGNABLE: "role is no longer self assignable.", ER_NO_DM: "Can't send Direct Message to you because your DMs are not open.", CMD_FUN_COOKIE: "you've been given a cookie by", CMD_FUN_CUDDLE: "you just got cuddled by", CMD_FUN_FED: "you just got fed by", CMD_FUN_HUG: "you just got hugged by", CMD_FUN_KISS: "you just got kissed by", CMD_FUN_PAT: "you just got patted by", CMD_FUN_POKE: "you just got poked by", CMD_FUN_PUNCH: "you just got punched by", CMD_FUN_SLAP: "you just got slapped by", CMD_FUN_TICKLE: "you just got tickled by", CMD_FUN_PENGU: "here's the cute Pengu picture you requested", CMD_COC_TAG: "Invalid Tag, please retry with a valid one which you can find under In-game.", CMD_COC_DATA: "Couldn't find your data, try again later.", CMD_FORT_PLAT: "Invalid Username or Platform, please retry with either of these platforms: `pc`. `xbox`, `psn`.", CMD_FORT_ERR: "There was an error in the Tracking API, please try again later.", CMD_OSU_ERR: "Either the user couldn't be found or we're having some issues.", CMD_UPVOTE_ONLY: "You are not an up-voter of PenguBot, please visit to vote now and get access!", CMD_PATRON_ONLY: "This command is locked for Patrons Only. If you want to become a Patron please visit and gain access to the Premium Bot.", CMD_RPS_INVALID: "That's an invalid move, please choose", CMD_SLOTS_INVALID: "The specified amount of Snowflakes is invalid, please enter at least 1 or more Snowflakes.", CMD_LOG_INVALID: "Invalid Option, please choose from", CMD_CSGO_NF: "That Username was not found on Steam, please try again with a different one.", CMD_CSGO_ER: "There was an error, either your profile is PRIVATE or you haven't bought CSGO or the API bailed on us. Try again later.", // Missing Default DEFAULT_LANGUAGE: "Default Language", SETTING_GATEWAY_EXPECTS_GUILD: "The parameter expects either a Guild or a Guild Object.", SETTING_GATEWAY_VALUE_FOR_KEY_NOEXT: (data, key) => `The value ${data} for the key ${key} does not exist.`, SETTING_GATEWAY_VALUE_FOR_KEY_ALREXT: (data, key) => `The value ${data} for the key ${key} already exists.`, SETTING_GATEWAY_SPECIFY_VALUE: "You must specify the value to add or filter.", SETTING_GATEWAY_KEY_NOT_ARRAY: key => `The key ${key} is not an Array.`, SETTING_GATEWAY_KEY_NOEXT: key => `The key ${key} does not exist in the current data schema.`, SETTING_GATEWAY_INVALID_TYPE: "The type parameter must be either add or remove.", RESOLVER_INVALID_PIECE: (name, piece) => `${name} must be a valid ${piece} name.`, RESOLVER_INVALID_MSG: name => `${name} must be a valid message id.`, RESOLVER_INVALID_USER: name => `${name} must be a mention or valid user id.`, RESOLVER_INVALID_MEMBER: name => `${name} must be a mention or valid user id.`, RESOLVER_INVALID_CHANNEL: name => `${name} must be a channel tag or valid channel id.`, RESOLVER_INVALID_GUILD: name => `${name} must be a valid guild id.`, RESOLVER_INVALID_ROLE: name => `${name} must be a role mention or role id.`, RESOLVER_INVALID_LITERAL: name => `Your option did not match the only possibility: ${name}`, RESOLVER_INVALID_BOOL: name => `${name} must be true or false.`, RESOLVER_INVALID_INT: name => `${name} must be an integer.`, RESOLVER_INVALID_FLOAT: name => `${name} must be a valid number.`, RESOLVER_INVALID_REGEX_MATCH: (name, pattern) => `${name} must follow this regex pattern \`${pattern}\`.`, RESOLVER_INVALID_URL: name => `${name} must be a valid url.`, RESOLVER_STRING_SUFFIX: " characters", RESOLVER_MINMAX_EXACTLY: (name, min, suffix) => `${name} must be exactly ${min}${suffix}.`, RESOLVER_MINMAX_BOTH: (name, min, max, suffix) => `${name} must be between ${min} and ${max}${suffix}.`, RESOLVER_MINMAX_MIN: (name, min, suffix) => `${name} must be greater than ${min}${suffix}.`, RESOLVER_MINMAX_MAX: (name, max, suffix) => `${name} must be less than ${max}${suffix}.`, COMMANDMESSAGE_MISSING: "Missing one or more required arguments after end of input.", COMMANDMESSAGE_MISSING_REQUIRED: name => `${name} is a required argument.`, COMMANDMESSAGE_MISSING_OPTIONALS: possibles => `Missing a required option: (${possibles})`, COMMANDMESSAGE_NOMATCH: possibles => `Your option didn't match any of the possibilities: (${possibles})`, MONITOR_COMMAND_HANDLER_REPROMPT: (tag, error, time) => `${tag} | **${error}** | You have **${time}** seconds to respond to this prompt with a valid argument. Type **"ABORT"** to abort this prompt.`, // eslint-disable-line max-len MONITOR_COMMAND_HANDLER_ABORTED: "Aborted", INHIBITOR_COOLDOWN: remaining => `You have just used this command. You can use this command again in ${remaining} seconds.`, INHIBITOR_MISSING_BOT_PERMS: missing => `Insufficient permissions, missing: **${missing}**`, INHIBITOR_PERMISSIONS: "You do not have permission to use this command", INHIBITOR_REQUIRED_SETTINGS: settings => `The guild is missing the **${settings.join(", ")}** guild setting${settings.length > 1 ? "s" : ""} and thus the command cannot run.`, INHIBITOR_RUNIN: types => `This command is only available in ${types} channels`, INHIBITOR_RUNIN_NONE: name => `The ${name} command is not configured to run in any channel.`, COMMAD_UNLOAD: (type, name) => `✅ Unloaded ${type}: ${name}`, COMMAND_TRANSFER_SUCCESS: (type, name) => `✅ Successfully transferred ${type}: ${name}`, COMMAND_TRANSFER_FAILED: (type, name) => `Transfer of ${type}: ${name} to Client has failed. Please check your Console.`, COMMAND_REBOOT: "Rebooting...", COMMAND_PING: "Ping?", COMMAND_PINGPONG: (diff, ping) => `Pong! (Roundtrip took: ${diff}ms. Heartbeat: ${ping}ms.)`, COMMAND_INVITE_SELFBOT: "Why would you need an invite link for a selfbot...", COMMAND_HELP_DM: "📥 | The list of commands you have access to has been sent to your DMs.", COMMAND_ENABLE: (type, name) => `+ Successfully enabled ${type}: ${name}`, COMMAND_DISABLE: (type, name) => `+ Successfully disabled ${type}: ${name}`, COMMAND_DISABLE_WARN: "You probably don't want to disable that, since you wouldn't be able to run any command to enable it again", COMMAND_CONF_NOKEY: "You must provide a key", COMMAND_CONF_NOVALUE: "You must provide a value", COMMAND_CONF_ADDED: (value, key) => `Successfully added the value \`${value}\` to the key: **${key}**`, COMMAND_CONF_UPDATED: (key, response) => `Successfully updated the key **${key}**: \`${response}\``, COMMAND_CONF_KEY_NOT_ARRAY: "This key is not array type. Use the action 'reset' instead.", COMMAND_CONF_REMOVE: (value, key) => `Successfully removed the value \`${value}\` from the key: **${key}**`, COMMAND_CONF_GET_NOEXT: key => `The key **${key}** does not seem to exist.`, COMMAND_CONF_GET: (key, value) => `The value for the key **${key}** is: \`${value}\``, COMMAND_CONF_RESET: (key, response) => `The key **${key}** has been reset to: \`${response}\``, // Music interface MUSIC_NOT_PLAYING: "There is currently no music playing, queue up some songs to get the party going!", MUSICIF_NOW_PLAYING_TITLE: "Now Playing - PenguBot", MUSICIF_TITLE: "Title", MUSICIF_AUTHOR: "Author", MUSICIF_SONG_LENGHT: "Duration", MUSICIF_SONG_REQUESTED_BY: "Requested by", MUSICIF_SONG_LINK: "Link", MUSICIF_QUEUE_HINT: "Scroll between pages to see the song queue.", MUSICIF_QUEUE_TITLE: "Use the reactions to change pages, select a page, or stop viewing the queue", MUSICIF_QUEUE_LOADING: "Loading Queue...", MUSICIF_NO_VOICE_CHANNEL: "You're currently not in a voice channel or there was an error, try again.", MUSICIF_TOGGLE_SONG_LOOP: "Toggled single song repeat.", MUSICIF_TOGGLE_QUEUE_LOOP: "Now all queue will repeat.", MUSIC_NO_SONGS_IN_QUEUE: "There are no songs queued up. Queue up some songs!", COMMAND_MUSIC_LOOP_MAX_QUEUE: "Sorry but the maximum queue size is 1000 songs. If you want to bypass this limit, consider becoming a Patron at ", // 30th December 2018 HELP_SET_LANGUAGE: ["Please select a Language you Want **PenguBot** to Speak in.", "", ":flag_gb: English (en-US)", ":flag_it: Italian (it-IT)", ":flag_it: Sardinian (sar-IT)", ":flag_fr: French (fr-FR)", ":flag_es: Espanol (es-ES)", "", "Type `p!setlanguage ` to change your language."], CONF_LANG_SET: "is now set as the default PenguBot language in this guild.", // January 2019 ER_MUSIC_PATRON: "This feature has been locked for Premium Guilds only, if you want to gain access become a Patron at or Donate at with your Discord Username and ID as a message or contact us at .", ERR_TRY_AGAIN: "There was an oopsie, please try again!", ER_CHOICES_SENSE: "You want me to choose from a single option? That makes sense...", CHOICE_SELECT: "My gut feeling says, go with", COMMAND_CHOOSE_DESCRIPTION: "Need help in selecting an option? PenguBot to the rescue!", COMMAND_CASE_DESCRIPTION: "Get information about a specific moderation case with it's ID.", COMMAND_WARN_DESCRIPTION: "Warn a user for an infraction and log it.", COMMAND_HISTORY_DESCRIPTION: "Get a user's infraction history from mod logs.", COMMAND_REASON_DESCRIPTION: "Allow a moderator to set a case's history in mod logs.", COMMAND_MODLOG_DESCRIPTION: "Change the Mod Logs setting in the server.", COMMAND_MEME_DESCRIPTION: "Grabs you a random meme from the interwebs.", COMMAND_WHOLESOME_DESCRIPTION: "Grabs you a random wholesome image from the interwebs.", COMMAND_ROLEINFO_DESCRIPTION: "Get information about a role in a server.", // Commands (Start of cleaning up Language files) COMMAND_AFK_REMOVED: username => `Dear ${username}, I've successfully removed you from AFK.`, COMMAND_AFK_SET: (username, reason) => `Dear ${username}, I've set you afk for \`${reason}\``, // Monitors MONITOR_AFK_REMOVED: username => `Welcome back **${username}**, I have removed you from AFK.`, MONITOR_AFK_ISAFK: (username, reason, time) => `**${username}** is currently AFK for \`${reason}\` - ${Duration.toNow(time)} ago`, settingGatewayDuplicateValue: "That value already exists, please provide a different one." }; } async init() { await super.init(); } }; ================================================ FILE: src/languages/es-ES.js ================================================ const { Language, klasaUtil: util, version, Duration } = require("../index"); module.exports = class extends Language { constructor(...args) { super(...args); this.language = { DEFAULT: key => `${key} no se ha localizado para es-ES.`, INHIBITOR_DISABLED: "<:penguError:435712890884849664> ***This command is currently disabled***", INHIBITOR_DISABLED_GROUP: "<:penguError:435712890884849664> ***This command group is currently disabled***", COMMAND_UNLOAD: (type, name) => `<:penguSuccess:435712876506775553> Unloaded ${type}: ${name}`, COMMAND_TRANSFER_ERROR: "<:penguError:435712890884849664> That file has been transfered already or never existed.", COMMAND_RELOAD: (type, name) => `<:penguSuccess:435712876506775553> Reloaded ${type}: ${name}`, COMMAND_RELOAD_ALL: type => `<:penguSuccess:435712876506775553> Reloaded all ${type}.`, COMMAND_LOAD: (time, type, name) => `<:penguSuccess:435712876506775553> Successfully loaded ${type}: ${name}. (Took: ${time})`, COMMAND_LOAD_ERROR: (type, name, error) => `<:penguError:435712890884849664> Failed to load ${type}: ${name}. Reason:${util.codeBlock("js", error)}`, COMMAND_INVITE: `**👉 | Invite PenguBot to your Discord Guild:** `, COMMAND_SUPPORT: `**__PenguBot Support Guild__**\n• **Invite Link:** https://discord.gg/u8WYw5r`, COMMAND_INVITE_DESCRIPTION: "Displays the join server link of the bot.", COMMAND_INFO: [ "PenguBot is a Multi-Purpose Discord Bot which is filled with features ranging from", "Moderation, Fun, Utilities and more. It is developed in NodeJS using many different", "technologies such as RethinkDB, JavaScript and Linux.", "", "• **Author:** [AdityaTD#5346](https://www.AdityaTripathi.co.in)", `• **Version:** ${version}`, "• **Website:** ", "• **Patreon:** ", "• **PayPal:** ", "• **Discord Guild:** ", "• **GitHub:** " ], COMMAND_DONATE: [ "Enjoying Pengu? Then you'll definately love Pengu Premium! Support us and recieve some awesome perks for your contribution!", "", "__Perks__:", "• Unlimited Access to Queue Lengths, Volume Adjustment and more!", "• No Vote Locking - No Need To Upvote for Locked Commands", "• Better Uptime and Premium Support from Pengu's Team", "• Special Role in Climactic's Official Server", "", "• **Patreon:** https://www.patreon.com/PenguBot", "• **PenguBot's Premium Page:** https://www.PenguBot.com/premium" ], COMMAND_HELP_NODM: "📪 | You have DMs disabled, I couldn't send you the commands in DMs so here's a link to all the commands: ", COMMAND_UPVOTE: ["Want PenguBot to become bigger and be available in more guilds you visit?", "Then vote for PenguBot via the link below and also unlock access to", "limited features that only upvoters can have access to!", "", "• **Vote:** https://top.gg/bot/PenguBot/vote"], COMMAND_TOGGLE_GROUP_DESCRPTION: "Disable/Enable Command Categories.", COMMAND_TOGGLE_COMMAND_DESCRPTION: "Disable/Enable Commands in your guild.", COMMAND_SUPPORT_DESCRIPTION: "Link to join PenguBot's Support Guild.", // Pengu's Sentences MESSAGE_PREFIX_SET: "Successfully updated the guild's prefix to:", MESSAGE_CURRENT_PREFIX: "Guild's current prefix is:", MESSAGE_PENGU: "here you go!", // Kick Messages MESSAGE_KICKED: "was kicked!", MESSAGE_KICK_YOURSELF: "You can not kick yourself!", MESSAGE_KICK_PENGU: "Why would you want to kick me?", MESSAGE_KICK_CANT: "This user can't be kicked.", // Ban Messages MESSAGE_BANNED: "was banned!", MESSAGE_SOFTBANNED: "was soft banned!", MESSAGE_BAN_YOURSELF: "You can not ban yourself!", MESSAGE_BAN_PENGU: "Why would you want to ban me?", MESSAGE_BAN_CANT: "This user can't be banned!", // Make Admin and Mod Messages MESSAGE_ADMIN_ADD: "is now a Pengu Admin!", MESSAGE_ADMIN_REMOVE: "is no longer a Pengu Admin!", MESSAGE_MOD_ADD: "is now a Pengu Moderator!", MESSAGE_MOD_REMOVE: "is no longer a Pengu Moderator!", MESSAGE_DJ_ADD: "is now a Pengu DJ!", MESSAGE_DJ_REMOVE: "is no longer a Pengu DJ!", // Mute Command Messages MESSAGE_MUTED: "was muted!", MESSAGE_UNMUTED: "was un-muted!", // Other Mod Commands Messages MESSAGE_PRUNE_DELETED: "message(s) were deleted!", // Custom Commands Messages MESSAGE_CMD_ADDED: "command was added by", MESSAGE_CMD_UPDATED: "command was updated by", MESSAGE_CMD_REMOVED: "command was removed by", MESSAGE_CMD_NOTFOUND: "command was not found!", MESSAGE_CMD_EXISTS: "command with this name already exists in Pengu as a default or custom command!", MESSAGE_NO_CMDS: "Your guild has no custom commands, ask an admin or above to make one!", MESSAGE_COMMAND_CUSTOM_ENABLED: "Custom Commands are now Enabled!", MESSAGE_COMMAND_CUSTOM_DISABLED: "Custom Commands are now Disabled!", // Welcome & Leave messages MESSAGE_WLCM_ENABLED: "Welcome Messages are now Enabeld!", MESSAGE_WLCM_DISABLED: "Welcome Messages are now Disabled!", MESSAGE_LEAVE_ENABLED: "Leave Messages are now Enabeld!", MESSAGE_LEAVE_DISABLED: "Leave Messages are now Disabled!", MESSAGE_WELCOME_SET: "Welcome message has now been set!", MESSAGE_LEAVE_SET: "Leave message has now been set!", MESSAGE_WELCOME_CHANNEL_SET: "Welcome messages channel has now been set!", MESSAGE_LEAVE_CHANNEL_SET: "Leave messages channel has now been set!", // Logging MESSAGE_LOGCHAN_SET: "Logging channel has now been set!", COMMAND_LOG_DESCRPTION: "Enable/Disable Logging events if you're Pengu Admin or above.", // Autoroles, Level & Self Roles MESSAGE_AUTOROLES_ENABLED: "Auto Roles have been enabled in this guild!", MESSAGE_AUTOROLES_DISABLED: "Auto Roles have been disabled in this guild!", MESSAGE_AUTOROLE_REMOVED: "role was removed from the Auto Roles!", MESSAGE_AUTOROLE_ADDED: "role was added in the Auto Roles!", COMMAND_SELFROLES: "Assign or Deassign or list Self Roles from Yourself.", COMMAND_SELFROLES_MANAGE: "Add or Remove Self Roles from the server.", COMMAND_TOGGLE_SELFROLES: "Enable/Disable Self Roles on the server.", MESSAGE_LEVELROLES_ENABLED: "Level Based Roles have been enabled in this guild!", MESSAGE_LEVELROLES_DISABLED: "Level Based Roles have been disabled in this guild!", // Utilities Messages MESSAGE_NEW_REMINDER: "New Reminder has been created with ID:", MESSAGE_LINK_SHORTEN: "Here's your Short URL:", MESSAGE_AVATAR: "Here's the avatar of", MESSAGE_STARCHAN_SET: "Starboard channel has now been set.", // Pengu's Commands Descriptions COMMAND_KICK_DESCRIPTION: "Allows moderators and above to kick users.", COMMAND_BAN_DESCRIPTION: "Allows moderators and above to ban users.", COMMAND_SOFTBAN_DESCRIPTION: "Allows moderators and above to softban users.", COMMAND_MAKE_ADMIN_DESCRIPTION: "Allows guild managers, admins and pengu admins to add/remove new pengu admins.", COMMAND_MAKE_MOD_DESCRIPTION: "Allows guild managers, admins and pengu admins to add/remove new pengu mods.", COMMAND_MAKE_STAFF_DESCRPTION: "Allows guild managers, admins and pengu admins to add/remove new pengu staff.", COMMAND_MUTE_DESCRIPTION: "Allows Pengu Moderators and above to Mute people.", COMMAND_SAY_DESCRIPTION: "Allows Pengu Moderators and above to make Pengu say stuff.", COMMAND_ADD_CMD_DESCRIPTION: "Allows Pengu Administrators and above to add custom commands to the guild.", COMMAND_TOGGLE_CUSTOM_DESCRIPTION: "Allows Pengu Administrators and above to enable or disable custom commands in the guild.", COMMAND_TOGGLE_WELCOME_DESCRPTION: "Allows Pengu Administrators and above to enable or disable welcome messages in the guild.", COMMAND_TOGGLE_LEAVE_DESCRPTION: "Allows Pengu Administrators and above to enable or disable welcome messages in the guild.", COMMAND_SET_WELCOME_DESCRPTION: "Allows Pengu Administrators and above set welcome messages in the guild.", COMMAND_SET_LEAVE_DESCRPTION: "Allows Pengu Administrators and above set leave messages in the guild.", COMMAND_CHANNEL_WELCOME_DESCRPTION: "Allows Pengu Administrators and above set welcome messages channel in the guild.", COMMAND_CHANNEL_LEAVE_DESCRPTION: "Allows Pengu Administrators and above set leave messages channel in the guild.", COMMAND_TOGGLE_ROLES_DESCRPTION: "Allows Pengu Administrators and above to enable or disable Auto Roles.", COMMAND_TOGGLE_LVLROLES_DESCRPTION: "Allows Pengu Administrators and above to enable or disable Level Based Roles.", COMMAND_LIST_LVLROLES_DESCRPTION: "List all the roles in the Level Based Roles List.", COMMAND_LVLROLE_DESCRPTION: "ALLOWS Pengu Administrators and above to Add and Remove Level Based Roles for a guild.", COMMAND_ADD_ROLES_DESCRPTION: "Allows Pengu Administrators and above to add new Auto Roles.", COMMAND_REMIND_DESCRIPTION: "Make Pengu remind you things so you don't forget.", COMMAND_SHORTEN_DESCRIPTION: "Let Pengu shorten your Long URLs in one simple command.", COMMAND_AFK_DESCRIPTION: "Set yourself AFK with a reason so other's know!", COMMAND_DEL_CMD_DESCRIPTION: "Allows Pengu Administrators and above to delete a custom command made previously.", COMMAND_LIST_CMDS_DESCRIPTION: "List all custom commands made in a guild.", COMMAND_TOGGLE_CUSTOM_DESCRPTION: "Allows Pengu Administrators and above to enable or disable custom commands in a guild.", COMMAND_MUTE_DESCRPTION: "Allows Pengu Moderators and above to Mute a person in the guild", COMMAND_PRUNE_DESCRIPTION: "Allows Pengu Moderators and above to Bulk Delete messages in a guild with filters.", COMMAND_MAKE_ADMIN_DESCRPTION: "Allows Administrators and Guild Owners to create new Pengu Admins.", COMMAND_MAKE_MODS_DESCRPTION: "Allows Pengu Admins and above to create new Pengu Mods.", COMMAND_PREFIX_DESCRIPTION: "Allows Pengu Admins and above to change a guild's prefix for PenguBot.", COMMAND_SHARDS_DESCRIPTION: "Check all the detailed shards information of PenguBot.", COMMAND_LMGTFY_DESCRIPTION: "Feeling lazy to google something? Let me google it for you.", COMMAND_UPVOTE_DESCRIPTION: "Vote for PenguBot on DBL and gain access to limited features in a second.", // Automod MESSAGE_AUTOMOD_ENABLED: "Auto moderation has now been Enabled with THREAT and SPAM filters by default. Change filters by doing `p!automod toggle `", MESSAGE_AUTOMOD_DISABLED: "Auto moderation has now been Disabled.", MESSAGE_AUTOMOD_TOGGLED: "filter has now been toggled", COMMAND_AUTOMOD_DESCRPTION: "Manage Auto moderation Settings.", // Fun Commands Descriptions COMMAND_CAT_DESCRIPTION: "Cute Cat Photos and Facts with Pengu!", COMMAND_CHUCK_DESCRIPTION: "Chuck Norris Jokes just a command away!", COMMAND_COMPLIMENT_DESCRIPTION: "Be nice and compliment some people out there with Pengu!", COMMAND_COOKIE_DESCRIPTION: "Mouth watering Cookie pictures to make you even more hungry!", COMMAND_DADJOKE_DESCRIPTION: "Everyone loves jokes but what about some Dad Jokes?", COMMAND_DOG_DESCRIPTION: "Cute Doggo Pictures to make your day!", COMMAND_FML_DESCRIPTION: "Things which has made people say FML!", COMMAND_HUG_DESCRIPTION: "Someone needs a hug? Why wait, just give it!", COMMAND_PENGU_DESCRIPTION: "The Cute OG Pengu Pictures!", COMMAND_8BALL_DESCRIPTION: "Ask the magical 8ball your questions!", COMMAND_DICE_DESCRIPTION: "Roll a dice and get an outcome with Pengu!", COMMAND_INSULT_DESCRIPTION: "Don't be nice and insult a fellow guild member!", COMMAND_KISS_DESCRIPTION: "Get naughty and just kiss the person!", COMMAND_PUNCH_DESCRIPTION: "Someone's being naughty? Give them a strong punch!", COMMAND_COMIC_DESCRIPTION: "The OG Kids would still remember comics, it's for them!", COMMAND_FACT_DESCRIPTION: "Educate Yourself with Pengu!", COMMAND_RPS_DESCRIPTION: "Ever wanted to compete against Pengu in Rock, Paper, Scissors, the greatest eSport of all time? Now you can!", COMMAND_SLOTS_DESCRIPTION: "I don't promote gambling but you can if you want because I can!", COMMAND_TRUMP_DESCRIPTION: "Get Trumped by Trump Insults!", COMMAND_MOMMA_DESCRIPTION: "Still not tired of Yo Momma jokes? We got more, don't you worry!", COMMAND_FOX_DESCRIPTION: "Love foxes? Me too! Here's a picture of a fox.", COMMAND_ILLEGAL_DESCRIPTION: "Let's make things illegal by making trump sign the bills for it.", COMMAND_MCA_DESCRIPTION: "Generate yourself a Minecraft Achievement image because My Craft...", COMMAND_LIO_DESCRIPTION: "Add yours or other people's face on to the cute lio!", COMMAND_SLAP_DESCRIPTION: "Who's being naughty? Give them a tight slap!", COMMAND_PAT_DESCRIPTION: "Someone did a good job? Give them a pat.", COMMAND_CUDDLE_DESCRIPTION: "Cuddle in, it's time to relax, everything's gonna be fine.", COMMAND_TICKLE_DESCRIPTION: "Who's being tough on surface? Tickle them and make them laugh!", COMMAND_POKE_DESCRIPTION: "Ping someone by poking them!", COMMAND_FEED_DESCRIPTION: "Anyone hungry? Feed them some food.", COMMAND_BATSLAP_DESCRIPTION: "Be a Bat Man and slap someone!", COMMAND_BEAUTIFUL_DESCRIPTION: "Admire your or someone else's avatar.", COMMAND_FACEPALM_DESCRIPTION: "*sigh* facepalm where you have to.", COMMAND_RIP_DESCRIPTION: "Pay someone their final respect.", COMMAND_SUPERPUNCH_DESCRIPTION: "Become a superman and give someone an even stronger punch!", COMMAND_TATTOO_DESCRIPTION: "Ever wanted your avatar being tatted on someone else? Here you have it.", COMMAND_TRIGGERED_DESCRIPTION: "Because getting trigerred is a lot easier now...", COMMAND_WANTED_DESCRIPTION: "Print some Wanted posters of who is wanted by the sherrif department.", COMMAND_VAULT_DESCRIPTION: "Be the ICONIC Vault boy or make someone else be one.", COMMAND_GARBAGE_DESCRIPTION: "Garbage someone because they're trash.", COMMAND_APPROVED_DESCRIPTION: "Give someone a seal of approval", COMMAND_REJECT_DESCRIPTION: "Reject someone, their quality isn't upto the mark.", COMMAND_TINDER_DESCRIPTION: "You Have a Match, let's match you with someone!", COMMAND_MISSING_DESCRIPTION: "Has your dear one went missing? Get them a poster.", COMMAND_SNAPCHAT_DESCRIPTION: "Create a Snapchat Meme Image.", COMMAND_OSU_DESCRIPTION: "Get osu! Statistics in a cool way!", COMMAND_CMM_DESCRIPTION: "Create a nice Change My Mind meme!", // NSFW Commands COMMAND_ANAL_DESCRIPTION: "-NOT SAFE FOR WORK- Anal images.", COMMAND_BOOBS_DESCRIPTION: "-NOT SAFE FOR WORK- Boobs images.", COMMAND_BOOTY_DESCRIPTION: "-NOT SAFE FOR WORK- Booty images.", COMMAND_PUSSY_DESCRIPTION: "-NOT SAFE FOR WORK- Pussy images.", COMMAND_TEEN_DESCRIPTION: "-NOT SAFE FOR WORK- Teen images.", COMMAND_HENTAI_DESCRIPTION: "-NOT SAFE FOR WORK- Hentai images.", COMMAND_SNAP_DESCRIPTION: "-NOT SAFE FOR WORK- Snapchat Images.", COMMAND_AMETEUR_DESCRIPTION: "-NOT SAFE FOR WORK- Ameteur Images.", COMMAND_GIFS_DESCRIPTION: "-NOT SAFE FOR WORK- Animated Gifs.", COMMAND_GWNSFW_DESCRIPTION: "-NOT SAFE FOR WORK- Gone Wild Images.", COMMAND_LESB_DESCRIPTION: "-NOT SAFE FOR WORK- Lesbian Images.", COMMAND_MILF_DESCRIPTION: "-NOT SAFE FOR WORK- MILF images.", COMMAND_NEKOS_DESCRIPTION: "-NOT SAFE FOR WORK- Nekos Images.", COMMAND_ANIMETRAPS_DESCRIPTION: "-NOT SAFE FOR WORK- Anime Trap Images", COMMAND_ASIAN_DESCRIPTION: "-NOT SAFE FOR WORK- Asian NSFW Images", COMMAND_BDSM_DESCRIPTION: "-NOT SAFE FOR WORK- BDSM Images", COMMAND_BJNSFW_DESCRIPTION: "-NOT SAFE FOR WORK- Blowjob Images", COMMAND_COSPLAY_DESCRIPTION: "-NOT SAFE FOR WORK- Cosplay Images", COMMAND_FITGIRLS_DESCRIPTION: "-NOT SAFE FOR WORK- Fitgirl Images", COMMAND_FUTANARI_DESCRIPTION: "-NOT SAFE FOR WORK- Futanari Images", COMMAND_NSFW_DESCRIPTION: "-NOT SAFE FOR WORK- General NSFW Images", COMMAND_FEET_DESCRIPTION: "-NOT SAFE FOR WORK- Feet Fetish Images", COMMAND_GINGER_DESCRIPTION: "-NOT SAFE FOR WORK- Ginger Images", COMMAND_OUTFITS_DESCRIPTION: "-NOT SAFE FOR WORK- Outfits Images", COMMAND_PARTYHOUSE_DESCRIPTION: "-NOT SAFE FOR WORK- Partyhouse Images", COMMAND_R34_DESCRIPTION: "-NOT SAFE FOR WORK- Rule-34 Images", COMMAND_SOLO_DESCRIPTION: "-NOT SAFE FOR WORK- Solo People Images", COMMAND_THICC_DESCRIPTION: "-NOT SAFE FOR WORK- Thicc Images", COMMAND_NSFWTRAPS_DESCRIPTION: "-NOT SAFE FOR WORK- Traps Images", // Utilities Commands COMMAND_GUILDINFO_DESCRIPTION: "Get brief information about a guild with this command.", COMMAND_TWSTATS_DESCRIPTION: "Check Twitch Statistics live on the go.", COMMAND_URBAN_DESCRIPTION: "Find meanings of words on Urban Dictionary.", COMMAND_USERINFO_DESCRIPTION: "Get brief user information in a single command.", COMMAND_WEATHER_DESCRIPTION: "Get weather of your area easily and in a fun way.", COMMAND_YTSTATS_DESCRIPTION: "Check YouTube Statistics live on the go.", COMMAND_ADBLOCK_DESCRIPTION: "Enable/Disable Auto Deletion of Invite Links. Pengu Mods and above can bypass this.", COMMAND_TRANSLATE_DESCRIPTION: "Translate a sentence or message to any selected language.", COMMAND_POLL_DESCRIPTION: "Create a Strawpoll using PenguBot", COMMAND_LOGCHAN_DESCRPTION: "Select a Channel Where you want to Log Events.", COMMAND_AVATAR_DESCRIPTION: "Get Avatar URL of Yourself or Someone else.", COMMAND_QUOTE_DESCRIPTION: "Quote a message with it's Message ID.", // Profile Commands COMMAND_LEVELUP_DESCRIPTION: "Manage Level Up settings of Users in your guild.", COMMAND_REP_DESCRIPTION: "Give your valuable rep point to someone to make them feel special.", COMMAND_PROFILE_DESCRIPTION: "Check yours or other users fancy profiles!", COMMAND_DAILY_DESCRIPTION: "Claim your daily 100 Snowflakes which you can use to buy cosmetics.", COMMAND_TITLE_DESCRIPTION: "Set your title which will be visible in your profile.", COMMAND_SNOWFLAKES_DESCRIPTION: "Check your Snowflakes or send your Snowflakes to others.", COMMAND_BGBUY_DESCRIPTION: "Buy backgrounds for your Pengu Profile.", COMMAND_CHANGEBG_DESCRIPTION: "Change your Pengu Profile's Background.", COMMAND_LEADERBOARD_DESCRIPTION: "See who is winning the leaderboard for your guild.", COMMAND_BACKGROUND_DESCRIPTION: "Customize your PenguBot profile by buying and choosing different backgrounds.", COMMAND_RANK_DESCRIPTION: "Server Based Member Rank Cards (Different for Each Server)", COMMAND_MANAGEXP_DESCRIPTION: "Set/Reset/Add XP to a Guild Member (PenguAdmin or Above Required)", // Dev Commands COMMAND_EXEC_DESCRIPTION: "-BOT OWNER ONLY-", COMMAND_SG_DESCRIPTION: "-BOT OWNER ONLY-", COMMAND_TPG_DESCRIPTION: "-BOT OWNER ONLY-", COMMAND_DONATE_DESCRIPTION: "Donate to PenguBot and help make something awesome!", // Music Commands COMMAND_DMSONG_DESCRIPTION: "Make Pengu send you the current song in your DMs.", COMMAND_LOOP_DESCRIPTION: "Loop a song so it repeats when it finishes playing.", COMMAND_LYRICS_DESCRIPTION: "Get a song's lyrics directly with Pengu.", COMMAND_MUSIC_DESCRIPTION: "Detailed information for all Music Commands.", COMMAND_NOWPLAYING_DESCRIPTION: "Know which song is currently playing and what is it's progress.", COMMAND_PLAY_DESCRIPTION: "Play Songs from YouTube/Twitch/SoundCloud/Mixer/Live Streams, etc. with Pengu.", COMMAND_SHUFFLE_DESCRIPTION: "Shuffle songs in the queue to be randomized.", COMMAND_QUEUE_DESCRIPTION: "See the current song queue in an interactive manner", COMMAND_SKIP_DESCRIPTION: "Skip the current song or call a vote skip if there are more than 3 members in the VC.", COMMAND_STOP_DESCRIPTION: "Stop and Clear the queue if you're Pengu-DJ or are the only one listening.", COMMAND_MAKE_DJ_DESCRPTION: "Allows guild managers, admins and pengu admins to add/remove new pengu dj.", COMMAND_LEAVE_DESCRIPTION: "Make Pengu forcefully leave your Voice Channel.", COMMAND_PAUSE_DESCRIPTION: "Pause/Resume the currently playing music.", COMMAND_VOLUME_DESCRIPTION: "Change the default volume of Pengu in your guild", COMMAND_DJONLY_DESCRIPTION: "Toggle Pengu DJ only mode for Music Commands.", INHIBITOR_DJ_ONLY: "This guild is configured to allow only Pengu DJ's to use Music Commands.", COMMAND_DUMP_DESCRIPTION: "Dump your server queue in raw format to be used later!", // Game Stats COMMAND_FORTNITE_DESCRIPTION: "Get Fortnite Game Statistics within Discord.", COMMAND_CRSTATS_DESCRIPTION: "Clash Royale Player Statistics within Discord.", COMMAND_COCSTATS_DESCRIPTION: "Clash of Clans Player Statistics within Discord.", COMMAND_CSGO_DESCRIPTION: "Counter Strike Global Offensive Player Statistics", // Starboard COMMAND_TOGGLE_STARBOARD_DESCRPTION: "Allows Pengu Administrators and above to toggle Starboard in the guild.", COMMAND_CHANNEL_STAR_DESCRPTION: "Allows Pengu Administrators and above to set a Starboard channel.", COMMAND_REQUIRED_STAR_DESCRPTION: "Allows Pengu Administrators and above to set minimum stars before Starboard message.", COMMAND_STAR_DESCRPTION: "Allows Pengu Moderators and above to force Starboard a message.", MESSAGE_STAR_ENABLED: "Starboard has now been enabled.", MESSAGE_STAR_DISABLED: "Starboard has now been disabled.", MESSAGE_STARS_REQUIRED_SET: "Set the minimum Stars required before a message is sent to Starboard.", MESSAGE_STAR_CHANNEL_SET: "Successfully set the Starboard channel.", // Custom Messages ER_TRY_AGAIN: "I am very sorry but there was an error, please try again or contact us at https://discord.gg/u8WYw5r", ER_MUSIC_TRIP: "I tripped on a wire! *Ouch!* It hurts but I'll recover, try again later or contact us at https://discord.gg/u8WYw5r", ER_MUSIC_NF: "<:penguError:435712890884849664> I could not find any results for your query, please try again with a different one or contact us at https://discord.gg/u8WYw5r", ER_CATS_DOGS: "There was an error, I think a cat has cut the wire off, dogs don't do that.", ER_API: "Unfortunately due to the provider of this command's API getting down, this command is temporarily disabled.", ER_TINDER: "Can't match you with yourself...", CMD_LOG_DISABLED: "logging is now Disabled.", CMD_LOG_ENABLED: "logging is now Enabled.", CMD_NO_SELFROLES: "This guild does not have any self assignable roles.", CMD_SELF_ASSIGNABLE: "role is now self assignable.", CMD_NO_ASSIGNABLE: "role is no longer self assignable.", ER_NO_DM: "Can't send Direct Message to you because your DMs are not open.", CMD_FUN_COOKIE: "you've been given a cookie by", CMD_FUN_CUDDLE: "you just got cuddled by", CMD_FUN_FED: "you just got fed by", CMD_FUN_HUG: "you just got hugged by", CMD_FUN_KISS: "you just got kissed by", CMD_FUN_PAT: "you just got patted by", CMD_FUN_POKE: "you just got poked by", CMD_FUN_PUNCH: "you just got punched by", CMD_FUN_SLAP: "you just got slapped by", CMD_FUN_TICKLE: "you just got tickled by", CMD_FUN_PENGU: "here's the cute Pengu picture you requested", CMD_COC_TAG: "Invalid Tag, please retry with a valid one which you can find under In-game.", CMD_COC_DATA: "Couldn't find your data, try again later.", CMD_FORT_PLAT: "Invalid Username or Platform, please retry with either of these platforms: `pc`. `xbox`, `psn`.", CMD_FORT_ERR: "There was an error in the Tracking API, please try again later.", CMD_OSU_ERR: "Either the user couldn't be found or we're having some issues.", CMD_UPVOTE_ONLY: "You are not an up-voter of PenguBot, please visit to vote now and get access!", CMD_PATRON_ONLY: "This guild is not Premium. Please consider becoming a Patron at in order to access this feature or Donate at with your Discord Username as a Message.", CMD_RPS_INVALID: "That's an invalid move, please choose", CMD_SLOTS_INVALID: "The specified amount of Snowflakes is invalid, please enter at least 1 or more Snowflakes.", CMD_LOG_INVALID: "Invalid Option, please choose from", CMD_CSGO_NF: "That Username was not found on Steam, please try again with a different one.", CMD_CSGO_ER: "There was an error, either your profile is PRIVATE or you haven't bought CSGO or the API bailed on us. Try again later.", // Missing Default DEFAULT_LANGUAGE: "Idioma predeterminado", SETTING_GATEWAY_EXPECTS_GUILD: "El parámetro require o una ID o una instancia de Guild.", SETTING_GATEWAY_VALUE_FOR_KEY_NOEXT: (data, key) => `El valor '${data}' para la clave '${key}' no existe.`, SETTING_GATEWAY_VALUE_FOR_KEY_ALREXT: (data, key) => `El valor '${data}' para la clave '${key}' ya existe.`, SETTING_GATEWAY_SPECIFY_VALUE: "Debes especificar el valor para añadir o filtrar.", SETTING_GATEWAY_KEY_NOT_ARRAY: key => `La clave '${key}' no es un Array.`, SETTING_GATEWAY_KEY_NOEXT: key => `La clave '${key}' no existe en el esquema de datos.`, SETTING_GATEWAY_INVALID_TYPE: "El parámetro 'type' debe ser o 'add' o 'remove'.", RESOLVER_INVALID_PIECE: (name, piece) => `${name} debe ser un nombre válido de ${piece}.`, RESOLVER_INVALID_MSG: name => `${name} debe ser una ID de mensaje válida.`, RESOLVER_INVALID_USER: name => `${name} debe ser una mención o una ID de usuario válida.`, RESOLVER_INVALID_MEMBER: name => `${name} debe ser una mención o una ID de usuario válida.`, RESOLVER_INVALID_CHANNEL: name => `${name} debe ser una mención o una ID de canal válida.`, RESOLVER_INVALID_GUILD: name => `${name} debe ser una ID válida de servidor.`, RESOLVER_INVALID_ROLE: name => `${name} debe ser una mención o una ID de rol válida.`, RESOLVER_INVALID_LITERAL: name => `Su opción no coincide con la siguiente posibilidad: ${name}`, RESOLVER_INVALID_BOOL: name => `${name} debe ser 'true' o 'false'.`, RESOLVER_INVALID_INT: name => `${name} debe ser un número entero.`, RESOLVER_INVALID_FLOAT: name => `${name} debe ser un número.`, RESOLVER_INVALID_URL: name => `${name} debe ser un enlace URL válido.`, RESOLVER_STRING_SUFFIX: " carácteres", RESOLVER_MINMAX_EXACTLY: (name, min, suffix) => `${name} debe ser exactamente ${min}${suffix}.`, RESOLVER_MINMAX_BOTH: (name, min, max, suffix) => `${name} debe estar entre ${min} y ${max}${suffix}.`, RESOLVER_MINMAX_MIN: (name, min, suffix) => `${name} debe ser mayor que ${min}${suffix}.`, RESOLVER_MINMAX_MAX: (name, max, suffix) => `${name} debe ser menor que ${max}${suffix}.`, COMMANDMESSAGE_MISSING: "Faltan uno o más argumentos al final de la entrada.", COMMANDMESSAGE_MISSING_REQUIRED: name => `${name} es un argumento requerido.`, COMMANDMESSAGE_MISSING_OPTIONALS: possibles => `Falta una opción requerida: (${possibles})`, COMMANDMESSAGE_NOMATCH: possibles => `Su opción no coincide con ninguna de las posibilidades: (${possibles})`, // eslint-disable-next-line max-len MONITOR_COMMAND_HANDLER_REPROMPT: (tag, error, time) => `${tag} | **${error}** | Usted tiene **${time}** segundos para responder este mensage emergente con un argumento válido. Escribe **"ABORT"** para abortar el mensaje emergente.`, MONITOR_COMMAND_HANDLER_ABORTED: "Abortado.", INHIBITOR_COOLDOWN: remaining => `Acabas de usar este comando. Puedes usarlo de nuevo en ${remaining} segundos.`, INHIBITOR_MISSING_BOT_PERMS: missing => `Permisos insuficientes, necesito: **${missing}**`, INHIBITOR_PERMISSIONS: "Usted no tiene permiso para usar este comando.", INHIBITOR_REQUIRED_SETTINGS: settings => `El servidor no tiene las siguientes clave${settings.length > 1 ? "s" : ""}: **${settings.join(", ")}** y no puede ser ejecutado.`, INHIBITOR_RUNIN: types => `Este comando sólo está disponible en los canales de tipo: ${types}.`, INHIBITOR_RUNIN_NONE: name => `El comando ${name} no está configurado para ser ejecutado en cualquier canal.`, COMMAD_UNLOAD: (type, name) => `✅ Descargado la pieza tipo ${type}: ${name}`, COMMAND_TRANSFER_SUCCESS: (type, name) => `✅ Transferido la pieza tipo ${type}: ${name} con éxito.`, COMMAND_TRANSFER_FAILED: (type, name) => `La transferencia de la pieza tipo ${type}: ${name} al Cliente ha fallado. Por favor, revisa su consola.`, COMMAND_REBOOT: "Reiniciando...", COMMAND_PING: "Ping?", COMMAND_PINGPONG: (diff, ping) => `Pong! (El viaje duró: ${diff}ms. Latido: ${ping}ms.)`, COMMAND_INVITE_SELFBOT: "¿Por qué necesitarías un enlace de invitación para un selfbot?", COMMAND_HELP_DM: "📥 | La lista de comandos ha sido enviado a tus mensajes privados.", COMMAND_ENABLE: (type, name) => `+ Activado con éxito la pieza tipo ${type}: ${name}`, COMMAND_DISABLE: (type, name) => `+ Desactivado con éxito la pieza ${type}: ${name}`, COMMAND_DISABLE_WARN: "Probablemente no quieras desactivar eso, ya que no podrías ejecutar un comando para reactivarlo.", COMMAND_CONF_NOKEY: "Debes escribir una clave", COMMAND_CONF_NOVALUE: "Debes escribir un valor", COMMAND_CONF_ADDED: (value, key) => `Añadido con éxito el valor \`${value}\` a la clave: **${key}**.`, COMMAND_CONF_UPDATED: (key, response) => `Actualizado con éxito la clave **${key}**: \`${response}\`.`, COMMAND_CONF_KEY_NOT_ARRAY: "Esta clave no es de tipo Array. Usa la acción 'reset'.", COMMAND_CONF_REMOVE: (value, key) => `Removido con éxito el valor \`${value}\` de la clave: **${key}**.`, COMMAND_CONF_GET_NOEXT: key => `La clave **${key}** no parece existir.`, COMMAND_CONF_GET: (key, value) => `El valor para la clave **${key}** es: \`${value}\`.`, COMMAND_CONF_RESET: (key, response) => `La clave **${key}** ha sido restaurado a: \`${response}\`.`, // Music interface MUSICIF_NO_MUSIC_PLAYING: "There's currently no music playing!", MUSIC_NO_SONGS_IN_QUEUE: "Canción no encontrada, por favor intente con una diferente", // 30th December 2018 HELP_SET_LANGUAGE: ["Please select a Language you Want **PenguBot** to Speak in.", "", ":flag_gb: English (en-US)", ":flag_it: Italian (it-IT)", ":flag_it: Sardinian (sar-IT)", ":flag_fr: French (fr-FR)", ":flag_es: Espanol (es-ES)", "", "Type `p!setlanguage ` to change your language."], CONF_LANG_SET: "und die standardsprache für PenguBot für Ihren server.", // January 2019 ER_MUSIC_PATRON: "This feature has been locked for Premium Guilds only, if you want to gain access become a Patron at or Donate at with your Discord Username and ID as a message or contact us at ", ERR_TRY_AGAIN: "There was an oopsie, please try again!", ER_CHOICES_SENSE: "You want me to choose from a single option? That makes sense...", CHOICE_SELECT: "My gut feeling says, go with", COMMAND_CHOOSE_DESCRIPTION: "Need help in selecting an option? PenguBot to the rescue!", COMMAND_CASE_DESCRIPTION: "Get information about a specific moderation case with it's ID.", COMMAND_WARN_DESCRIPTION: "Warn a user for an infraction and log it.", COMMAND_HISTORY_DESCRIPTION: "Get a user's infraction history from mod logs.", COMMAND_REASON_DESCRIPTION: "Allow a moderator to set a case's history in mod logs.", COMMAND_MODLOG_DESCRIPTION: "Change the Mod Logs setting in the server.", COMMAND_MEME_DESCRIPTION: "Grabs you a random meme from the interwebs.", COMMAND_WHOLESOME_DESCRIPTION: "Grabs you a random wholesome image from the interwebs.", COMMAND_ROLEINFO_DESCRIPTION: "Get information about a role in a server.", // Commands (Start of cleaning up Language files) COMMAND_AFK_REMOVED: username => `Dear ${username}, I've successfully removed you from AFK.`, COMMAND_AFK_SET: (username, reason) => `Dear ${username}, I've set you afk for \`${reason}\``, // Monitors MONITOR_AFK_REMOVED: username => `Welcome back **${username}**, I have removed you from AFK.`, MONITOR_AFK_ISAFK: (username, reason, time) => `**${username}** is currently AFK for \`${reason}\` - ${Duration.toNow(time)} ago`, settingGatewayDuplicateValue: "That value already exists, please provide a different one." }; } async init() { await super.init(); } }; ================================================ FILE: src/languages/fr-FR.js ================================================ const { Language, klasaUtil: util, version, Duration } = require("../index"); module.exports = class extends Language { constructor(...args) { super(...args); this.language = { DEFAULT: key => `${key} n'a pas encore été localisé pour fr-FR.`, INHIBITOR_DISABLED: "<:penguError:435712890884849664> ***Cette commande est actuellement désactivée***", INHIBITOR_DISABLED_GROUP: "<:penguError:435712890884849664> ***Ce groupe de commandes est actuellement désactivé***", COMMAND_UNLOAD: (type, name) => `<:penguSuccess:435712876506775553> Déchargé ${type}: ${name}`, COMMAND_TRANSFER_ERROR: "<:penguError:435712890884849664> Ce fichier a déjà été transféré ou n'a jamais existé.", COMMAND_RELOAD: (type, name) => `<:penguSuccess:435712876506775553> Rechargé ${type}: ${name}`, COMMAND_RELOAD_ALL: type => `<:penguSuccess:435712876506775553> Rechargé tous ${type}.`, COMMAND_LOAD: (time, type, name) => `<:penguSuccess:435712876506775553> Chargé avec succès ${type}: ${name}. (J'ai employé: ${time})`, COMMAND_LOAD_ERROR: (type, name, error) => `<:penguError:435712890884849664> Échec du chargement ${type}: ${name}. Raison:${util.codeBlock("js", error)}`, COMMAND_INVITE: `**👉 | Inviter PenguBot dans votre Discord guilde:** `, COMMAND_SUPPORT: `**__PenguBot Support Guild__**\n• **Invite Link:** https://discord.gg/u8WYw5r`, COMMAND_INVITE_DESCRIPTION: "Voir le lien d'invitation pour le bot.", COMMAND_INFO: [ "PenguBot est un bot Discord multi-usages rempli de fonctionnalités quels Modération, amusement, utilitaires et plus. Il est développé dans NodeJS en utilisant de nombreuses technologies différentes telles que RethinkDB, JavaScript and Linux.", "", "• **Auteur:** [AdityaTD#5346](https://www.AdityaTripathi.co.in)", `• **Version:** ${version}`, "• **Site Internet:** ", "• **Patreon:** ", "• **Discord Guilde:** ", "• **GitHub:** " ], COMMAND_DONATE: [ "Enjoying Pengu? Then you'll definately love Pengu Premium! Support us and recieve some awesome perks for your contribution!", "", "__Perks__:", "• Accès illimité a la durée de la play, réglage du volume et plus encore!", "• Pas de verrouillage des votes - Pas besoin de vote pour quelques commandes", "• Meilleure disponibilité avec un Bot pour le Patron", "• Rôle spécial dans le serveur officiel de Pengu Squad", "", "• **Patreon:** https://www.patreon.com/PenguBot", "• **PenguBot's Premium Page:** https://www.PenguBot.com/premium" ], COMMAND_HELP_NODM: "📪 | Vous avez les DM désactivés, je ne pouvais pas vous envoyer les commandes dans les DM alors voici un lien vers toutes les commandes: ", COMMAND_UPVOTE: ["Voulez-vous que PenguBot devienne plus grand et soit disponible dans plus de guildes que vous visitez?", "Ensuite, votez pour PenguBot via le lien ci-dessous et débloquez également l'accès à", "fonctionnalités limitées que seuls les votants peuvent avoir accès!", "", "• **Vote:** https://top.gg/bot/PenguBot/vote"], COMMAND_TOGGLE_GROUP_DESCRPTION: "Désactiver/Activer les Catégories de Commandes.", COMMAND_TOGGLE_COMMAND_DESCRPTION: "Désactiver/Activer les Commandes dans ta guilde.", COMMAND_SUPPORT_DESCRIPTION: "Link to join PenguBot's Support Guild.", // Pengu's Sentences ** MESSAGE_PREFIX_SET: "Mise à jour du préfixe de la guilde avec:", MESSAGE_CURRENT_PREFIX: "Le préfixe actuel de la guilde est:", MESSAGE_PENGU: "Voici.. !", // Kick Messages ** MESSAGE_KICKED: "a été mis dehors!!", MESSAGE_KICK_YOURSELF: "Tu ne peux pas mettre toi meme dehors!", MESSAGE_KICK_PENGU: "Pourquoi voudriez-vous me mettre dehors??", MESSAGE_KICK_CANT: "Cet utilisateur ne peut pas être expulsé.", // Ban Messages ** MESSAGE_BANNED: "a été banni! (ban)", MESSAGE_SOFTBANNED: "a été banni! (softban)", MESSAGE_BAN_YOURSELF: "Vous ne pouvez pas vous interdire!", MESSAGE_BAN_PENGU: "Pourquoi voudriez-vous m'interdire?", MESSAGE_BAN_CANT: "Cet utilisateur ne peut pas être banni!", // Make Admin and Mod Messages ** MESSAGE_ADMIN_ADD: "est maintenant un Administrateur Pengu!", MESSAGE_ADMIN_REMOVE: "n'est plus un Administrateur Pengu!", MESSAGE_MOD_ADD: "est maintenant un Modérateur Pengu!", MESSAGE_MOD_REMOVE: "n'est plus un Modérateur Pengu!", MESSAGE_DJ_ADD: "est maintenant un Pengu DJ!", MESSAGE_DJ_REMOVE: "n'est plus un a Pengu DJ!", // Mute Command Messages ** MESSAGE_MUTED: "était en sourdine!", MESSAGE_UNMUTED: "était sans sourdine!", // Other Mod Commands Messages MESSAGE_PRUNE_DELETED: "messages ont été supprimés!", // Custom Commands Messages ** MESSAGE_CMD_ADDED: "- commande a été ajoutée par", MESSAGE_CMD_UPDATED: "- commande a été mise à jour par", MESSAGE_CMD_REMOVED: "- commande a été supprimée par", MESSAGE_CMD_NOTFOUND: "- commande n'a pas été trouvée!", MESSAGE_CMD_EXISTS: "- commande avec ce nom existe déjà dans Pengu en tant que commande par défaut ou personnalisée!", MESSAGE_NO_CMDS: "Votre guilde n'a pas de commandes personnalisées, demandez à un administrateur ou supérieur de vous en créer une!", MESSAGE_COMMAND_CUSTOM_ENABLED: "Les Commandes Personnalisées sont maintenant activées!", MESSAGE_COMMAND_CUSTOM_DISABLED: "Les Commandes Personnalisées sont maintenant désactivées!", // Welcome & Leave messages ** MESSAGE_WLCM_ENABLED: "Les Messages de Bienvenue sont maintenant activées!!", MESSAGE_WLCM_DISABLED: "Les Messages de Bienvenue sont maintenant désactivées!", MESSAGE_LEAVE_ENABLED: "Leave Messages de Adieu sont maintenant activées!!", MESSAGE_LEAVE_DISABLED: "Leave Messages de Adieu sont maintenant désactivéesd!", MESSAGE_WELCOME_SET: "Le Message de Bienvenue est maintenant défini!", MESSAGE_LEAVE_SET: "Le Message de Adieu est maintenant défini!", MESSAGE_WELCOME_CHANNEL_SET: "Le canal des messages de bienvenue est maintenant défini!", MESSAGE_LEAVE_CHANNEL_SET: "Le canal des messages de adieu est maintenant défini!", // Logging ** MESSAGE_LOGCHAN_SET: "Le canal de journalisation est maintenant défini!", COMMAND_LOG_DESCRPTION: "Activer/Désactiver les événements de journalisation. Si vous êtes Administrateur de Pengu ou supérieur.", // Autoroles, Level & Self Roles ** MESSAGE_AUTOROLES_ENABLED: "Les rôles automatiques ont été activés dans cette guilde!", MESSAGE_AUTOROLES_DISABLED: "Les rôles automatiques ont été desactivés dans cette guilde!", MESSAGE_AUTOROLE_REMOVED: "rôle a été retiré des Rôles-Automatiques!", MESSAGE_AUTOROLE_ADDED: "rôle a été ajouté dans les Rôles-Automatiques!", COMMAND_SELFROLES: "Assigner/Désaffecter/Afficher soi-même les Rôles.", COMMAND_SELFROLES_MANAGE: "Attribuer ou désaffecter des Rôles-Automatiques du serveur.", COMMAND_TOGGLE_SELFROLES: "Activer/Désactiver les Rôles-Automatiques du serveur.", MESSAGE_LEVELROLES_ENABLED: "Les Rôles basés sur les Niveaux ont été activés dans cette guilde!", MESSAGE_LEVELROLES_DISABLED: "Les Rôles basés sur les Niveaux ont été desactivés dans cette guilde!", // Utilities Messages MESSAGE_NEW_REMINDER: "New Reminder has been created with ID:", MESSAGE_LINK_SHORTEN: "Here's your Short URL:", MESSAGE_AVATAR: "Here's the avatar of", MESSAGE_STARCHAN_SET: "Starboard channel has now been set.", // Pengu's Commands Descriptions COMMAND_KICK_DESCRIPTION: "Permet aux Modérateurs de mettre qlq au dehors.", COMMAND_BAN_DESCRIPTION: "Permet aux Modérateursto ban users.", COMMAND_SOFTBAN_DESCRIPTION: "Permet aux Modérateurs to softban users.", COMMAND_MAKE_ADMIN_DESCRIPTION: "Allows guild managers, admins and pengu admins to add/remove new pengu admins.", COMMAND_MAKE_MOD_DESCRIPTION: "Allows guild managers, admins and pengu admins to add/remove new pengu mods.", COMMAND_MAKE_STAFF_DESCRPTION: "Allows guild managers, admins and pengu admins to add/remove new pengu staff.", COMMAND_MUTE_DESCRIPTION: "Allows Pengu Moderators and above to Mute people.", COMMAND_SAY_DESCRIPTION: "Allows Pengu Moderators and above to make Pengu say stuff.", COMMAND_ADD_CMD_DESCRIPTION: "Allows Pengu Administrators and above to add custom commands to the guild.", COMMAND_TOGGLE_CUSTOM_DESCRIPTION: "Allows Pengu Administrators and above to enable or disable custom commands in the guild.", COMMAND_TOGGLE_WELCOME_DESCRPTION: "Allows Pengu Administrators and above to enable or disable welcome messages in the guild.", COMMAND_TOGGLE_LEAVE_DESCRPTION: "Allows Pengu Administrators and above to enable or disable welcome messages in the guild.", COMMAND_SET_WELCOME_DESCRPTION: "Allows Pengu Administrators and above set welcome messages in the guild.", COMMAND_SET_LEAVE_DESCRPTION: "Allows Pengu Administrators and above set leave messages in the guild.", COMMAND_CHANNEL_WELCOME_DESCRPTION: "Allows Pengu Administrators and above set welcome messages channel in the guild.", COMMAND_CHANNEL_LEAVE_DESCRPTION: "Allows Pengu Administrators and above set leave messages channel in the guild.", COMMAND_TOGGLE_ROLES_DESCRPTION: "Allows Pengu Administrators and above to enable or disable Auto Roles.", COMMAND_TOGGLE_LVLROLES_DESCRPTION: "Allows Pengu Administrators and above to enable or disable Level Based Roles.", COMMAND_LIST_LVLROLES_DESCRPTION: "List all the roles in the Level Based Roles List.", COMMAND_LVLROLE_DESCRPTION: "ALLOWS Pengu Administrators and above to Add and Remove Level Based Roles for a guild.", COMMAND_ADD_ROLES_DESCRPTION: "Allows Pengu Administrators and above to add new Auto Roles.", COMMAND_REMIND_DESCRIPTION: "Make Pengu remind you things so you don't forget.", COMMAND_SHORTEN_DESCRIPTION: "Let Pengu shorten your Long URLs in one simple command.", COMMAND_AFK_DESCRIPTION: "Set yourself AFK with a reason so other's know!", COMMAND_DEL_CMD_DESCRIPTION: "Allows Pengu Administrators and above to delete a custom command made previously.", COMMAND_LIST_CMDS_DESCRIPTION: "List all custom commands made in a guild.", COMMAND_TOGGLE_CUSTOM_DESCRPTION: "Allows Pengu Administrators and above to enable or disable custom commands in a guild.", COMMAND_MUTE_DESCRPTION: "Allows Pengu Moderators and above to Mute a person in the guild", COMMAND_PRUNE_DESCRIPTION: "Allows Pengu Moderators and above to Bulk Delete messages in a guild with filters.", COMMAND_MAKE_ADMIN_DESCRPTION: "Allows Administrators and Guild Owners to create new Pengu Admins.", COMMAND_MAKE_MODS_DESCRPTION: "Allows Pengu Admins and above to create new Pengu Mods.", COMMAND_PREFIX_DESCRIPTION: "Allows Pengu Admins and above to change a guild's prefix for PenguBot.", COMMAND_SHARDS_DESCRIPTION: "Check all the detailed shards information of PenguBot.", COMMAND_LMGTFY_DESCRIPTION: "Feeling lazy to google something? Let me google it for you.", COMMAND_UPVOTE_DESCRIPTION: "Vote for PenguBot on DBL and gain access to limited features in a second.", // Automod MESSAGE_AUTOMOD_ENABLED: "Auto moderation has now been Enabled with THREAT and SPAM filters by default. Change filters by doing `p!automod toggle `", MESSAGE_AUTOMOD_DISABLED: "Auto moderation has now been Disabled.", MESSAGE_AUTOMOD_TOGGLED: "filter has now been toggled", COMMAND_AUTOMOD_DESCRPTION: "Manage Auto moderation Settings.", // Fun Commands Descriptions COMMAND_CAT_DESCRIPTION: "Cute Cat Photos and Facts with Pengu!", COMMAND_CHUCK_DESCRIPTION: "Chuck Norris Jokes just a command away!", COMMAND_COMPLIMENT_DESCRIPTION: "Be nice and compliment some people out there with Pengu!", COMMAND_COOKIE_DESCRIPTION: "Mouth watering Cookie pictures to make you even more hungry!", COMMAND_DADJOKE_DESCRIPTION: "Everyone loves jokes but what about some Dad Jokes?", COMMAND_DOG_DESCRIPTION: "Cute Doggo Pictures to make your day!", COMMAND_FML_DESCRIPTION: "Things which has made people say FML!", COMMAND_HUG_DESCRIPTION: "Someone needs a hug? Why wait, just give it!", COMMAND_PENGU_DESCRIPTION: "The Cute OG Pengu Pictures!", COMMAND_8BALL_DESCRIPTION: "Ask the magical 8ball your questions!", COMMAND_DICE_DESCRIPTION: "Roll a dice and get an outcome with Pengu!", COMMAND_INSULT_DESCRIPTION: "Don't be nice and insult a fellow guild member!", COMMAND_KISS_DESCRIPTION: "Get naughty and just kiss the person!", COMMAND_PUNCH_DESCRIPTION: "Someone's being naughty? Give them a strong punch!", COMMAND_COMIC_DESCRIPTION: "The OG Kids would still remember comics, it's for them!", COMMAND_FACT_DESCRIPTION: "Educate Yourself with Pengu!", COMMAND_RPS_DESCRIPTION: "Ever wanted to compete against Pengu in Rock, Paper, Scissors, the greatest eSport of all time? Now you can!", COMMAND_SLOTS_DESCRIPTION: "I don't promote gambling but you can if you want because I can!", COMMAND_TRUMP_DESCRIPTION: "Get Trumped by Trump Insults!", COMMAND_MOMMA_DESCRIPTION: "Still not tired of Yo Momma jokes? We got more, don't you worry!", COMMAND_FOX_DESCRIPTION: "Love foxes? Me too! Here's a picture of a fox.", COMMAND_ILLEGAL_DESCRIPTION: "Let's make things illegal by making trump sign the bills for it.", COMMAND_MCA_DESCRIPTION: "Generate yourself a Minecraft Achievement image because My Craft...", COMMAND_LIO_DESCRIPTION: "Add yours or other people's face on to the cute lio!", COMMAND_SLAP_DESCRIPTION: "Who's being naughty? Give them a tight slap!", COMMAND_PAT_DESCRIPTION: "Someone did a good job? Give them a pat.", COMMAND_CUDDLE_DESCRIPTION: "Cuddle in, it's time to relax, everything's gonna be fine.", COMMAND_TICKLE_DESCRIPTION: "Who's being tough on surface? Tickle them and make them laugh!", COMMAND_POKE_DESCRIPTION: "Ping someone by poking them!", COMMAND_FEED_DESCRIPTION: "Anyone hungry? Feed them some food.", COMMAND_BATSLAP_DESCRIPTION: "Be a Bat Man and slap someone!", COMMAND_BEAUTIFUL_DESCRIPTION: "Admire your or someone else's avatar.", COMMAND_FACEPALM_DESCRIPTION: "*sigh* facepalm where you have to.", COMMAND_RIP_DESCRIPTION: "Pay someone their final respect.", COMMAND_SUPERPUNCH_DESCRIPTION: "Become a superman and give someone an even stronger punch!", COMMAND_TATTOO_DESCRIPTION: "Ever wanted your avatar being tatted on someone else? Here you have it.", COMMAND_TRIGGERED_DESCRIPTION: "Because getting trigerred is a lot easier now...", COMMAND_WANTED_DESCRIPTION: "Print some Wanted posters of who is wanted by the sherrif department.", COMMAND_VAULT_DESCRIPTION: "Be the ICONIC Vault boy or make someone else be one.", COMMAND_GARBAGE_DESCRIPTION: "Garbage someone because they're trash.", COMMAND_APPROVED_DESCRIPTION: "Give someone a seal of approval", COMMAND_REJECT_DESCRIPTION: "Reject someone, their quality isn't upto the mark.", COMMAND_TINDER_DESCRIPTION: "You Have a Match, let's match you with someone!", COMMAND_MISSING_DESCRIPTION: "Has your dear one went missing? Get them a poster.", COMMAND_SNAPCHAT_DESCRIPTION: "Create a Snapchat Meme Image.", COMMAND_OSU_DESCRIPTION: "Get osu! Statistics in a cool way!", COMMAND_CMM_DESCRIPTION: "Create a nice Change My Mind meme!", // NSFW Commands COMMAND_ANAL_DESCRIPTION: "-NOT SAFE FOR WORK- Anal images.", COMMAND_BOOBS_DESCRIPTION: "-NOT SAFE FOR WORK- Boobs images.", COMMAND_BOOTY_DESCRIPTION: "-NOT SAFE FOR WORK- Booty images.", COMMAND_PUSSY_DESCRIPTION: "-NOT SAFE FOR WORK- Pussy images.", COMMAND_TEEN_DESCRIPTION: "-NOT SAFE FOR WORK- Teen images.", COMMAND_HENTAI_DESCRIPTION: "-NOT SAFE FOR WORK- Hentai images.", COMMAND_SNAP_DESCRIPTION: "-NOT SAFE FOR WORK- Snapchat Images.", COMMAND_AMETEUR_DESCRIPTION: "-NOT SAFE FOR WORK- Ameteur Images.", COMMAND_GIFS_DESCRIPTION: "-NOT SAFE FOR WORK- Animated Gifs.", COMMAND_GWNSFW_DESCRIPTION: "-NOT SAFE FOR WORK- Gone Wild Images.", COMMAND_LESB_DESCRIPTION: "-NOT SAFE FOR WORK- Lesbian Images.", COMMAND_MILF_DESCRIPTION: "-NOT SAFE FOR WORK- MILF images.", COMMAND_NEKOS_DESCRIPTION: "-NOT SAFE FOR WORK- Nekos Images.", COMMAND_ANIMETRAPS_DESCRIPTION: "-NOT SAFE FOR WORK- Anime Trap Images", COMMAND_ASIAN_DESCRIPTION: "-NOT SAFE FOR WORK- Asian NSFW Images", COMMAND_BDSM_DESCRIPTION: "-NOT SAFE FOR WORK- BDSM Images", COMMAND_BJNSFW_DESCRIPTION: "-NOT SAFE FOR WORK- Blowjob Images", COMMAND_COSPLAY_DESCRIPTION: "-NOT SAFE FOR WORK- Cosplay Images", COMMAND_FITGIRLS_DESCRIPTION: "-NOT SAFE FOR WORK- Fitgirl Images", COMMAND_FUTANARI_DESCRIPTION: "-NOT SAFE FOR WORK- Futanari Images", COMMAND_NSFW_DESCRIPTION: "-NOT SAFE FOR WORK- General NSFW Images", COMMAND_FEET_DESCRIPTION: "-NOT SAFE FOR WORK- Feet Fetish Images", COMMAND_GINGER_DESCRIPTION: "-NOT SAFE FOR WORK- Ginger Images", COMMAND_OUTFITS_DESCRIPTION: "-NOT SAFE FOR WORK- Outfits Images", COMMAND_PARTYHOUSE_DESCRIPTION: "-NOT SAFE FOR WORK- Partyhouse Images", COMMAND_R34_DESCRIPTION: "-NOT SAFE FOR WORK- Rule-34 Images", COMMAND_SOLO_DESCRIPTION: "-NOT SAFE FOR WORK- Solo People Images", COMMAND_THICC_DESCRIPTION: "-NOT SAFE FOR WORK- Thicc Images", COMMAND_NSFWTRAPS_DESCRIPTION: "-NOT SAFE FOR WORK- Traps Images", // Utilities Commands COMMAND_GUILDINFO_DESCRIPTION: "Get brief information about a guild with this command.", COMMAND_TWSTATS_DESCRIPTION: "Check Twitch Statistics live on the go.", COMMAND_URBAN_DESCRIPTION: "Find meanings of words on Urban Dictionary.", COMMAND_USERINFO_DESCRIPTION: "Get brief user information in a single command.", COMMAND_WEATHER_DESCRIPTION: "Get weather of your area easily and in a fun way.", COMMAND_YTSTATS_DESCRIPTION: "Check YouTube Statistics live on the go.", COMMAND_ADBLOCK_DESCRIPTION: "Enable/Disable Auto Deletion of Invite Links. Pengu Mods and above can bypass this.", COMMAND_TRANSLATE_DESCRIPTION: "Translate a sentence or message to any selected language.", COMMAND_POLL_DESCRIPTION: "Create a Strawpoll using PenguBot", COMMAND_LOGCHAN_DESCRPTION: "Select a Channel Where you want to Log Events.", COMMAND_AVATAR_DESCRIPTION: "Get Avatar URL of Yourself or Someone else.", COMMAND_QUOTE_DESCRIPTION: "Quote a message with it's Message ID.", // Profile Commands COMMAND_LEVELUP_DESCRIPTION: "Manage Level Up settings of Users in your guild.", COMMAND_REP_DESCRIPTION: "Give your valuable rep point to someone to make them feel special.", COMMAND_PROFILE_DESCRIPTION: "Check yours or other users fancy profiles!", COMMAND_DAILY_DESCRIPTION: "Claim your daily 100 Snowflakes which you can use to buy cosmetics.", COMMAND_TITLE_DESCRIPTION: "Set your title which will be visible in your profile.", COMMAND_SNOWFLAKES_DESCRIPTION: "Check your Snowflakes or send your Snowflakes to others.", COMMAND_BGBUY_DESCRIPTION: "Buy backgrounds for your Pengu Profile.", COMMAND_CHANGEBG_DESCRIPTION: "Change your Pengu Profile's Background.", COMMAND_LEADERBOARD_DESCRIPTION: "See who is winning the leaderboard for your guild.", COMMAND_BACKGROUND_DESCRIPTION: "Customize your PenguBot profile by buying and choosing different backgrounds.", COMMAND_RANK_DESCRIPTION: "Server Based Member Rank Cards (Different for Each Server)", COMMAND_MANAGEXP_DESCRIPTION: "Set/Reset/Add XP to a Guild Member (PenguAdmin or Above Required)", // Dev Commands COMMAND_EXEC_DESCRIPTION: "-BOT OWNER ONLY-", COMMAND_SG_DESCRIPTION: "-BOT OWNER ONLY-", COMMAND_TPG_DESCRIPTION: "-BOT OWNER ONLY-", COMMAND_DONATE_DESCRIPTION: "Faites un don à PenguBot et aidez à faire quelque chose de génial!!", // Music Commands COMMAND_DMSONG_DESCRIPTION: "Faites en sorte que Pengu vous envoie la chanson en cours dans votre DMs.", COMMAND_LOOP_DESCRIPTION: "Répéter une chanson. Il répète la chanson quand il a fini de jouer.", COMMAND_LYRICS_DESCRIPTION: "Get a song's lyrics directly with Pengu.", COMMAND_MUSIC_DESCRIPTION: "Detailed information for all Music Commands.", COMMAND_NOWPLAYING_DESCRIPTION: "Know which song is currently playing and what is it's progress.", COMMAND_PLAY_DESCRIPTION: "Play Songs from YouTube/Twitch/SoundCloud/Mixer/Live Streams, etc. with Pengu.", COMMAND_SHUFFLE_DESCRIPTION: "Shuffle songs in the queue to be randomized.", COMMAND_QUEUE_DESCRIPTION: "See the current song queue in an interactive manner", COMMAND_SKIP_DESCRIPTION: "Skip the current song or call a vote skip if there are more than 3 members in the VC.", COMMAND_STOP_DESCRIPTION: "Stop and Clear the queue if you're Pengu-DJ or are the only one listening.", COMMAND_MAKE_DJ_DESCRPTION: "Allows guild managers, admins and pengu admins to add/remove new pengu dj.", COMMAND_LEAVE_DESCRIPTION: "Make Pengu forcefully leave your Voice Channel.", COMMAND_PAUSE_DESCRIPTION: "Pause/Resume the currently playing music.", COMMAND_VOLUME_DESCRIPTION: "Change the default volume of Pengu in your guild", COMMAND_DJONLY_DESCRIPTION: "Toggle Pengu DJ only mode for Music Commands.", INHIBITOR_DJ_ONLY: "This guild is configured to allow only Pengu DJ's to use Music Commands.", COMMAND_DUMP_DESCRIPTION: "Dump your server queue in raw format to be used later!", // Game Stats COMMAND_FORTNITE_DESCRIPTION: "Get Fortnite Game Statistics within Discord.", COMMAND_CRSTATS_DESCRIPTION: "Clash Royale Player Statistics within Discord.", COMMAND_COCSTATS_DESCRIPTION: "Clash of Clans Player Statistics within Discord.", COMMAND_CSGO_DESCRIPTION: "Counter Strike Global Offensive Player Statistics", // Starboard COMMAND_TOGGLE_STARBOARD_DESCRPTION: "Allows Pengu Administrators and above to toggle Starboard in the guild.", COMMAND_CHANNEL_STAR_DESCRPTION: "Allows Pengu Administrators and above to set a Starboard channel.", COMMAND_REQUIRED_STAR_DESCRPTION: "Allows Pengu Administrators and above to set minimum stars before Starboard message.", COMMAND_STAR_DESCRPTION: "Allows Pengu Moderators and above to force Starboard a message.", MESSAGE_STAR_ENABLED: "Starboard has now been enabled.", MESSAGE_STAR_DISABLED: "Starboard has now been disabled.", MESSAGE_STARS_REQUIRED_SET: "Set the minimum Stars required before a message is sent to Starboard.", MESSAGE_STAR_CHANNEL_SET: "Successfully set the Starboard channel.", // Custom Messages ER_TRY_AGAIN: "I am very sorry but there was an error, please try again or contact us at https://discord.gg/u8WYw5r", ER_MUSIC_TRIP: "I tripped on a wire! *Ouch!* It hurts but I'll recover, try again later or contact us at https://discord.gg/u8WYw5r", ER_MUSIC_NF: "<:penguError:435712890884849664> I could not find any results for your query, please try again with a different one or contact us at https://discord.gg/u8WYw5r", ER_CATS_DOGS: "There was an error, I think a cat has cut the wire off, dogs don't do that.", ER_API: "Unfortunately due to the provider of this command's API getting down, this command is temporarily disabled.", ER_TINDER: "Can't match you with yourself...", CMD_LOG_DISABLED: "logging is now Disabled.", CMD_LOG_ENABLED: "logging is now Enabled.", CMD_NO_SELFROLES: "This guild does not have any self assignable roles.", CMD_SELF_ASSIGNABLE: "role is now self assignable.", CMD_NO_ASSIGNABLE: "role is no longer self assignable.", ER_NO_DM: "Can't send Direct Message to you because your DMs are not open.", ER_CURR_LANG: "PenguBot déjà parle Français!", CMD_FUN_COOKIE: "you've been given a cookie by", CMD_FUN_CUDDLE: "you just got cuddled by", CMD_FUN_FED: "you just got fed by", CMD_FUN_HUG: "you just got hugged by", CMD_FUN_KISS: "you just got kissed by", CMD_FUN_PAT: "you just got patted by", CMD_FUN_POKE: "you just got poked by", CMD_FUN_PUNCH: "you just got punched by", CMD_FUN_SLAP: "you just got slapped by", CMD_FUN_TICKLE: "you just got tickled by", CMD_FUN_PENGU: "here's the cute Pengu picture you requested", CMD_COC_TAG: "Invalid Tag, please retry with a valid one which you can find under In-game.", CMD_COC_DATA: "Couldn't find your data, try again later.", CMD_FORT_PLAT: "Invalid Username or Platform, please retry with either of these platforms: `pc`. `xbox`, `psn`.", CMD_FORT_ERR: "There was an error in the Tracking API, please try again later.", CMD_OSU_ERR: "Either the user couldn't be found or we're having some issues.", CMD_UPVOTE_ONLY: "You are not an up-voter of PenguBot, please visit to vote now and get access!", CMD_PATRON_ONLY: "Cette commande est verrouillée pour les utilisateurs uniquement. Si vous souhaitez devenir Patron, rendez-vous sur https://patreon.com/PenguBot et accédez au bot Premium.", CMD_RPS_INVALID: "That's an invalid move, please choose", CMD_SLOTS_INVALID: "The specified amount of Snowflakes is invalid, please enter at least 1 or more Snowflakes.", CMD_LOG_INVALID: "Invalid Option, please choose from", CMD_CSGO_NF: "That Username was not found on Steam, please try again with a different one.", CMD_CSGO_ER: "There was an error, either your profile is PRIVATE or you haven't bought CSGO or the API bailed on us. Try again later.", // Missing Default DEFAULT_LANGUAGE: "Langue par défaut", SETTING_GATEWAY_EXPECTS_GUILD: "Le paramètre attend soit un identifiant soit une instance de serveur.", SETTING_GATEWAY_VALUE_FOR_KEY_NOEXT: (data, key) => `La valeur '${data}' pour la clef '${key}' n'existe pas.`, SETTING_GATEWAY_VALUE_FOR_KEY_ALREXT: (data, key) => `La valeur '${data}' pour la clef '${key}' existe déjà.`, SETTING_GATEWAY_SPECIFY_VALUE: "Vous devez spécifier une clef pour ajouter ou filtrer.", SETTING_GATEWAY_KEY_NOT_ARRAY: key => `La clef '${key}' n'est pas une matrice.`, SETTING_GATEWAY_KEY_NOEXT: key => `La clef '${key}' n'existe pas dans le schema de données actuel.`, SETTING_GATEWAY_INVALID_TYPE: "Le paramètre 'type' doit être soit 'add' ou 'remove'.", RESOLVER_INVALID_PIECE: (name, piece) => `${name} doit être un nom de ${piece} valide.`, RESOLVER_INVALID_MSG: name => `${name} doit être un identifiant de message valide.`, RESOLVER_INVALID_USER: name => `${name} doit être une mention ou un identifiant d'utilisateur valide.`, RESOLVER_INVALID_MEMBER: name => `${name} doit être une mention ou un identifiant d'utilisateur valide.`, RESOLVER_INVALID_CHANNEL: name => `${name} doit être un tag ou un identifiant de salon valide.`, RESOLVER_INVALID_GUILD: name => `${name} doit être un identifiant de serveur valide.`, RESOLVER_INVALID_ROLE: name => `${name} doit être une mention ou un identifiant de rôle.`, RESOLVER_INVALID_LITERAL: name => `Votre option ne correspond pas à la seule possibilité : ${name}`, RESOLVER_INVALID_BOOL: name => `${name} doit être vrai ou faux.`, RESOLVER_INVALID_INT: name => `${name} doit être un entier.`, RESOLVER_INVALID_FLOAT: name => `${name} doit être un nombre valide.`, RESOLVER_INVALID_URL: name => `${name} doit être une url valide.`, RESOLVER_STRING_SUFFIX: " caractères", RESOLVER_MINMAX_EXACTLY: (name, min, suffix) => `${name} doit être exactement ${min}${suffix}.`, RESOLVER_MINMAX_BOTH: (name, min, max, suffix) => `${name} doit être entre ${min} et ${max}${suffix}.`, RESOLVER_MINMAX_MIN: (name, min, suffix) => `${name} doit être plus grand que ${min}${suffix}.`, RESOLVER_MINMAX_MAX: (name, max, suffix) => `${name} doit être plus petit que ${max}${suffix}.`, COMMANDMESSAGE_MISSING: "Il manque au moins un argument à la fin de l'entrée.", COMMANDMESSAGE_MISSING_REQUIRED: name => `${name} est un argument requis.`, COMMANDMESSAGE_MISSING_OPTIONALS: possibles => `Il manque une option requise : (${possibles})`, COMMANDMESSAGE_NOMATCH: possibles => `Votre option ne correspond à aucune des possibilités : (${possibles})`, // eslint-disable-next-line max-len MONITOR_COMMAND_HANDLER_REPROMPT: (tag, error, time) => `${tag} | **${error}** | Vous avez **${time}** secondes pour répondre à ce message avec un argument valide. Tapez **"ABORT"** pour annuler ce message.`, MONITOR_COMMAND_HANDLER_ABORTED: "Annulé", INHIBITOR_COOLDOWN: remaining => `Vous venez d'utiliser cette commande. Vous pourrez à nouveau utiliser cette commande dans ${remaining} secondes.`, INHIBITOR_MISSING_BOT_PERMS: missing => `Permissions insuffisantes, il manque : **${missing}**`, INHIBITOR_PERMISSIONS: "Vous n'avez pas la permission d'utiliser cette commmande", // eslint-disable-next-line max-len INHIBITOR_REQUIRED_SETTINGS: settings => `Votre serveur n'a pas le${settings.length > 1 ? "s" : ""} paramètre${settings.length > 1 ? "s" : ""} **${settings.join(", ")}** et ne peux pas s'exécuter.`, INHIBITOR_RUNIN: types => `Cette commande est uniquement disponible dans les salons ${types}`, INHIBITOR_RUNIN_NONE: name => `La commande ${name} n'est pas configurée pour s'exécuter dans un salon.`, COMMAD_UNLOAD: (type, name) => `✅ ${type} déchargé : ${name}`, COMMAND_TRANSFER_SUCCESS: (type, name) => `✅ ${type} transféré avec succès : ${name}`, COMMAND_TRANSFER_FAILED: (type, name) => `Le transfert de ${type} : ${name} au Client a échoué. Veuillez vérifier votre Console.`, COMMAND_REBOOT: "Redémarrage...", COMMAND_PING: "Ping ?", COMMAND_PINGPONG: (diff, ping) => `Pong ! (L'aller-retour a pris : ${diff}ms. Pulsation : ${ping}ms.)`, COMMAND_INVITE_SELFBOT: "Pourquoi auriez-vous besoin d'un lien d'invitation pour un selfbot...", COMMAND_HELP_DM: "📥 | Les commandes ont été envoyées dans vos MPs.", COMMAND_ENABLE: (type, name) => `+ ${type} activé avec succès : ${name}`, COMMAND_DISABLE: (type, name) => `+ ${type} désactivé avec succès : ${name}`, COMMAND_DISABLE_WARN: "Vous ne voulez probablement pas désactiver cela, car vous ne serez plus capable d'exécuter une commande pour le réactiver", COMMAND_CONF_NOKEY: "Vous devez fournir une clef", COMMAND_CONF_NOVALUE: "Vous devez fournir une valeur", COMMAND_CONF_ADDED: (value, key) => `La valeur \`${value}\` a été ajoutée avec succès à la clef : **${key}**`, COMMAND_CONF_UPDATED: (key, response) => `La clef **${key}** a été mise à jour avec succès : \`${response}\``, COMMAND_CONF_KEY_NOT_ARRAY: "Cette clef n'est pas une matrice. Utilisez plutôt l'action 'reset'.", COMMAND_CONF_REMOVE: (value, key) => `La valeur \`${value}\` a été otée avec succès de la clef : **${key}**`, COMMAND_CONF_GET_NOEXT: key => `La clef **${key}** ne semble pas exister.`, COMMAND_CONF_GET: (key, value) => `La valeur pour la clef **${key}** est : \`${value}\``, COMMAND_CONF_RESET: (key, response) => `La clef **${key}** a été réinitialisée à : \`${response}\``, // Music interface MUSICIF_NO_MUSIC_PLAYING: "Aucune musique ne joue!", MUSICIF_NOW_PLAYING_TITLE: "En cours de lecture..", MUSICIF_TITLE: "Title", MUSICIF_AUTHOR: "Auteur", MUSICIF_SONG_LENGHT: "Durée", MUSICIF_SONG_REQUESTED_BY: "Demandeur", MUSICIF_SONG_LINK: "Link", MUSIC_NO_SONGS_IN_QUEUE: "Chant non trouvé, veuillez essayer avec un autre.", // 30th December 2018 HELP_SET_LANGUAGE: ["**PenguBot** peut parler une des langues disponibles.", "", ":flag_gb: Anglais (en-US)", ":flag_it: Italien (it-IT)", ":flag_it: Sardinian (sar-IT)", ":flag_fr: Français (fr-FR)", ":flag_es: Espagnol (es-ES)", "", "Type `p!setlanguage ` to change your language."], CONF_LANG_SET: "est la langue par défaut pour PenguBot sur ce serveur.", // January 2019 ER_MUSIC_PATRON: "This feature has been locked for Premium Guilds only, if you want to gain access become a Patron at or Donate at with your Discord Username and ID as a message or contact us at ", ERR_TRY_AGAIN: "There was an oopsie, please try again!", ER_CHOICES_SENSE: "You want me to choose from a single option? That makes sense...", CHOICE_SELECT: "My gut feeling says, go with", COMMAND_CHOOSE_DESCRIPTION: "Need help in selecting an option? PenguBot to the rescue!", COMMAND_CASE_DESCRIPTION: "Get information about a specific moderation case with it's ID.", COMMAND_WARN_DESCRIPTION: "Warn a user for an infraction and log it.", COMMAND_HISTORY_DESCRIPTION: "Get a user's infraction history from mod logs.", COMMAND_REASON_DESCRIPTION: "Allow a moderator to set a case's history in mod logs.", COMMAND_MODLOG_DESCRIPTION: "Change the Mod Logs setting in the server.", COMMAND_MEME_DESCRIPTION: "Grabs you a random meme from the interwebs.", COMMAND_WHOLESOME_DESCRIPTION: "Grabs you a random wholesome image from the interwebs.", COMMAND_ROLEINFO_DESCRIPTION: "Get information about a role in a server.", // Commands (Start of cleaning up Language files) COMMAND_AFK_REMOVED: username => `Dear ${username}, I've successfully removed you from AFK.`, COMMAND_AFK_SET: (username, reason) => `Dear ${username}, I've set you afk for \`${reason}\``, // Monitors MONITOR_AFK_REMOVED: username => `Welcome back **${username}**, I have removed you from AFK.`, MONITOR_AFK_ISAFK: (username, reason, time) => `**${username}** is currently AFK for \`${reason}\` - ${Duration.toNow(time)} ago`, settingGatewayDuplicateValue: "That value already exists, please provide a different one." }; } async init() { await super.init(); } }; ================================================ FILE: src/languages/it-IT.js ================================================ const { Language, klasaUtil: util, version, Duration } = require("../index"); module.exports = class extends Language { constructor(...args) { super(...args); this.language = { DEFAULT: key => `${key} non è stato ancora tradotta.`, INHIBITOR_DISABLED: "<:penguError:435712890884849664> ***Questo comando è attualmente disabilitato.***", INHIBITOR_DISABLED_GROUP: "<:penguError:435712890884849664> ***Questo gruppo di comandi è attualmente disabilitato***", COMMAND_UNLOAD: (type, name) => `<:penguSuccess:435712876506775553> Scaricato ${type}: ${name}`, COMMAND_TRANSFER_ERROR: "<:penguError:435712890884849664> Questo file è stato spostato ovvero non è mai esistito.", COMMAND_RELOAD: (type, name) => `<:penguSuccess:435712876506775553> Ricaricato ${type}: ${name}`, COMMAND_RELOAD_ALL: type => `<:penguSuccess:435712876506775553> Ricaricati tutti i ${type}.`, COMMAND_LOAD: (time, type, name) => `<:penguSuccess:435712876506775553> Caricato correttamente ${type}: ${name}. (Ho impiegato: ${time})`, COMMAND_LOAD_ERROR: (type, name, error) => `<:penguError:435712890884849664> Impossibile caricare ${type}: ${name}. Motivo:${util.codeBlock("js", error)}`, COMMAND_INVITE: `**👉 | Invita PenguBot sul tuo server discord:** `, COMMAND_SUPPORT: `**__PenguBot - Server di Supporto__**\n• **Link di Invito:** https://discord.gg/u8WYw5r`, COMMAND_INVITE_DESCRIPTION: "Visualizza il link per unirti al server di supporto PenguBot", COMMAND_INFO: [ "PenguBot è un bot multi-funzione per Discord ricco di funzionalità quali Moderazione, Divertimento, Utilità di sistema ed altro.. Sviluppato in NodeJS utilizzando diverse tecnologie quali RethinkDB, JavaScript e Linux.", "", "• **Autore:** [AdityaTD#5346](https://www.AdityaTripathi.co.in)", `• **Versione:** ${version}`, "• **Sito Web:** ", "• **Patreon:** ", "• **Server Discord:** ", "• **GitHub:** " ], COMMAND_DONATE: [ "PenguBot funziona su vari server attorno al mondo e questo richiede un costo. Se ti andasse di supportare PenguBot in questi costi, verrai ricompensato nei seguenti modi:", "", "__Perks__:", "• Accesso illimitato alla lunghezza della Playlist, regolazione Volume ed altro..", "• Nessun blocco dai voti - Nessun bisogno di voti per sbloccare i comandi bloccati.", "• Tempo di uptime migliorato, con un Bot dedicato ai Patrons", "• Ruolo speciale nel server della Official Pengu Squad", "", "• **Patreon:** https://www.patreon.com/PenguBot", "• **Crypto Donazioni:** https://1upcoin.com/donate/adityatd", "• **Pagina di PenguBot per le premium:** https://www.PenguBot.com/premium" ], COMMAND_HELP_NODM: "📪 | Hai disabilitato i messaggi personali. Non posso inviarti i comandi in privato. Questo il link per la lista dei comandi disponibili : ", COMMAND_UPVOTE: ["Vuoi che PenguBot sia più grande e disponbile su più server che frequenti?", "Allora vota per PenguBot tramite il link sottostante e sblocca l'accesso", "a tutte quelle caratteristiche che sono riservate a coloro che ci votano!!", "", "• **Votaci:** https://top.gg/bot/PenguBot/vote"], COMMAND_TOGGLE_GROUP_DESCRPTION: "Abilita/Disabilita le categorie dei comandi.", COMMAND_TOGGLE_COMMAND_DESCRPTION: "Abilita/Disabilita i comandi sul tuo server.", COMMAND_SUPPORT_DESCRIPTION: "Link per connetterti al Server di Supporto di PenguBot.", // Pengu's Sentences MESSAGE_PREFIX_SET: "Ho aggiornato il prefisso a : ", MESSAGE_CURRENT_PREFIX: "Il prefisso attuale su questo server è: ", MESSAGE_PENGU: "eccolo quà!", // Kick Messages MESSAGE_KICKED: "è stato disconnesso! (Kick)", MESSAGE_KICK_YOURSELF: "Non puoi disconnettere te stesso!!", MESSAGE_KICK_PENGU: "Per quale motivo vuoi disconnettermi??", MESSAGE_KICK_CANT: "Questo utente non può esser disconnesso.", // Ban Messages MESSAGE_BANNED: "è stato bandito!! (ban)", MESSAGE_SOFTBANNED: "è stato bandito momentaneamente! (softban)", MESSAGE_BAN_YOURSELF: "Non puoi bandire te stesso!", MESSAGE_BAN_PENGU: "Per quale motivo vorresti bandirmi??", MESSAGE_BAN_CANT: "Questo utente non può esser bandito!", // Make Admin and Mod Messages MESSAGE_ADMIN_ADD: "è ora un Amministratore di Pengu!", MESSAGE_ADMIN_REMOVE: "non è più un Amministratore di Pengu!", MESSAGE_MOD_ADD: "è ora un Moderatore per Pengu!", MESSAGE_MOD_REMOVE: "non è più un Moderatore per Pengu!", MESSAGE_DJ_ADD: "è ora un DJ per Pengu DJ!", MESSAGE_DJ_REMOVE: "non è più un DJ per Pengu!", // Mute Command Messages MESSAGE_MUTED: "è stato mutato!", MESSAGE_UNMUTED: "ora può parlare di nuovo!", // Other Mod Commands Messages MESSAGE_PRUNE_DELETED: "messaggio/i cancellato/i!", // Custom Commands Messages MESSAGE_CMD_ADDED: "comand aggiunto da", MESSAGE_CMD_UPDATED: "comando aggiornato da", MESSAGE_CMD_REMOVED: "comando rimosso da", MESSAGE_CMD_NOTFOUND: "comando non trovato!", MESSAGE_CMD_EXISTS: "comando con questo nome esiste già per Pengu! (Comune o personalizzato)", MESSAGE_NO_CMDS: "Questo server non ha comandi personalizzati, chiedi ad un amministratore di crearlo per te!", MESSAGE_COMMAND_CUSTOM_ENABLED: "Comandi personalizzati è adesso disponibile!", MESSAGE_COMMAND_CUSTOM_DISABLED: "Comandi personalizzati è adesso disabilitato!", // Welcome & Leave messages MESSAGE_WLCM_ENABLED: "I messaggi di Benvenuto sono abilitati!", MESSAGE_WLCM_DISABLED: "I messaggi di Benvenuto sono stati disabilitati!", MESSAGE_LEAVE_ENABLED: "I messaggi di Addio sono abilitati!", MESSAGE_LEAVE_DISABLED: "I messaggi di Addio sono stati disabilitati!", MESSAGE_WELCOME_SET: "I messaggi di Benvenuto non sono ancora stati impostati!!", MESSAGE_LEAVE_SET: "I messaggi di Addio non sono ancora stati impostati!!", MESSAGE_WELCOME_CHANNEL_SET: "I Messaggi di Benvenuto sono stati correttamente impostati!", MESSAGE_LEAVE_CHANNEL_SET: "I Messaggi di Addio sono stati correttamente impostati!", // Logging MESSAGE_LOGCHAN_SET: "Canale di Logging impostato correttamente!", COMMAND_LOG_DESCRPTION: "Abilita/Disabilita gli eventi di Logging (se sei un Amministratore di Pengu)", // Autoroles, Level & Self Roles MESSAGE_AUTOROLES_ENABLED: "Ruoli-Automatici abilitati su questo server!", MESSAGE_AUTOROLES_DISABLED: "Ruoli-Automatici Roles disabilitati su questo server!", MESSAGE_AUTOROLE_REMOVED: "ruolo è stato rimosso dai Ruoli-Automatici!", MESSAGE_AUTOROLE_ADDED: "role è stato aggiunto ai Ruoli-Automatici!", COMMAND_SELFROLES: "Assegna/Rimuove/Visualizza i ruoli per te stesso.", COMMAND_SELFROLES_MANAGE: "Aggiungi/Rimuovi Ruoli-Automatici al server.", COMMAND_TOGGLE_SELFROLES: "Abilita/Disabilita Ruoli-Automatici sul server.", MESSAGE_LEVELROLES_ENABLED: "Ruoli basati sul Livello sono stati abilitati sul server!", MESSAGE_LEVELROLES_DISABLED: "Ruoli basati sul Livello sono stati disabilitati sul server!", // Utilities Messages MESSAGE_NEW_REMINDER: "Nuovo Promemoria creato con ID:", MESSAGE_LINK_SHORTEN: "Ecco la tua URL:", MESSAGE_AVATAR: "Ecco l'avatar di", MESSAGE_STARCHAN_SET: "Il canale Starboard è stato impostato correttamente.", // Pengu's Commands Descriptions COMMAND_KICK_DESCRIPTION: "(Moderatore) Disconnette gli utenti. (kick)", COMMAND_BAN_DESCRIPTION: "(Moderatore) Bandisce gli utenti. (ban)", COMMAND_SOFTBAN_DESCRIPTION: "(Moderatore) Bandisce momentaneamente gli utenti. (softban)", COMMAND_MAKE_ADMIN_DESCRIPTION: "Allows guild managers, admins and pengu admins to add/remove new pengu admins.", COMMAND_MAKE_MOD_DESCRIPTION: "Allows guild managers, admins and pengu admins to add/remove new pengu mods.", COMMAND_MAKE_STAFF_DESCRPTION: "Allows guild managers, admins and pengu admins to add/remove new pengu staff.", COMMAND_MUTE_DESCRIPTION: "(Moderatore) Zittisci gli utenti. (mute)", COMMAND_SAY_DESCRIPTION: "(Moderatore) Fai parlare PenguBot.", COMMAND_ADD_CMD_DESCRIPTION: "(Admin) Aggiungi Comandi Personalizzati al server locale.", COMMAND_TOGGLE_CUSTOM_DESCRIPTION: "(Admin) Abilita/disabilita i Comandi Personalizzati sul server.", COMMAND_TOGGLE_WELCOME_DESCRPTION: "(Admin) Abilita/Disabilita i Messaggi di Benvenuto al server.", COMMAND_TOGGLE_LEAVE_DESCRPTION: "(Admin) Abilita/disabilita i Messaggi di Addio al server.", COMMAND_SET_WELCOME_DESCRPTION: "(Admin) Imposta i Messaggi di Benvenuto al server.", COMMAND_SET_LEAVE_DESCRPTION: "(Admin) Imposta i Messaggi di Addio al server.", COMMAND_CHANNEL_WELCOME_DESCRPTION: "(Admin) Imposta il canale per i Messaggi di Benvenuto.", COMMAND_CHANNEL_LEAVE_DESCRPTION: "(Admin) Imposta il canale per i Messaggi di Addio.", COMMAND_TOGGLE_ROLES_DESCRPTION: "(Admin) Abilita/Disabilita i Ruoli-Automatici.", COMMAND_TOGGLE_LVLROLES_DESCRPTION: "(Admin) Abilita/Disabilita i Ruoli basati sul Livello.", COMMAND_LIST_LVLROLES_DESCRPTION: "Visualizza i Ruoli disponili per quelli basati sul Livello dell'utente.", COMMAND_LVLROLE_DESCRPTION: "(Admin) Aggiungi/rimuovi Ruoli ai Ruoli-Automatici.", COMMAND_ADD_ROLES_DESCRPTION: "(Admin) Aggiungi nuovi Ruoli-Automatici.", COMMAND_REMIND_DESCRIPTION: "Crea un Promemoria. Così Pengu si occuperà di ricordare le cose che non vuoi dimenticare ..", COMMAND_SHORTEN_DESCRIPTION: "Permette a Pengu di creare un link corto con un singolo comando.", COMMAND_AFK_DESCRIPTION: "Imposta la ragione per la quale sarai AFK - Assente!", COMMAND_DEL_CMD_DESCRIPTION: "Permette agli Amministratori di Pengu di cancellare uno dei Comandi Personalizzati precedentemente creati.", COMMAND_LIST_CMDS_DESCRIPTION: "Visualizza tutti i Comandi Personalizzati disponibili sul server.", COMMAND_TOGGLE_CUSTOM_DESCRPTION: "Permette agli Amministratori di Pengu di abilitare/disabilitare i Comandi Personalizzati per questo server.", COMMAND_MUTE_DESCRPTION: "Permette ai Moderatori di Pengu di zittire gli utenti del server.", COMMAND_PRUNE_DESCRIPTION: "Permette ai Moderatori di Pengu di cancellare i messaggi (tramite filtro)", COMMAND_MAKE_ADMIN_DESCRPTION: "(Admin) Crea nuovi Amministratori di Pengu.", COMMAND_MAKE_MODS_DESCRPTION: "(Admin) Creare nuove Pengu Mods.", COMMAND_PREFIX_DESCRIPTION: "(Admin) Modifica il prefisso su questo server.", COMMAND_SHARDS_DESCRIPTION: "Visualizza tutte le informazioni disponibili per PenguBot.", COMMAND_LMGTFY_DESCRIPTION: "Stanco di cercare su Google?? Lascia che PenguBot cerchi per te .. ", COMMAND_UPVOTE_DESCRIPTION: "Vota per PenguBot su DBL e ricevi l'accesso a maggiori caratteristiche di PenguBot.. Immediatamente!!", // Automod MESSAGE_AUTOMOD_ENABLED: "Moderazione Automatica è ora abilitato (con filtro THREAT e SPAM). Modifica questo con: `p!automod toggle `", MESSAGE_AUTOMOD_DISABLED: "Moderazione Automatica è stato disabilitato.", MESSAGE_AUTOMOD_TOGGLED: "il filtro è stato attivato/disattivato", COMMAND_AUTOMOD_DESCRPTION: "Impostazioni di Moderazione Automatica.", // Fun Commands Descriptions COMMAND_CAT_DESCRIPTION: "Tenere foto e fatti riguardanti gatti!", COMMAND_CHUCK_DESCRIPTION: "Opere di Chuck Norris a portata di tastiera!!", COMMAND_COMPLIMENT_DESCRIPTION: "Sii carino e fai i complimenti a qualcuno con Pengu!", COMMAND_COOKIE_DESCRIPTION: "Immagini di biscotti e dolciumi, per stimolare la tua fame!!", COMMAND_DADJOKE_DESCRIPTION: "Tutti amano gli scherzetti!! Anche i Dad Jokes?", COMMAND_DOG_DESCRIPTION: "Tenere foto di cagnetti!!", COMMAND_FML_DESCRIPTION: "Cose che fan dire alla gente: FML!", COMMAND_HUG_DESCRIPTION: "Qualcuno vuole un abbraccio? Perchè attendere.. inviaglielo!!", COMMAND_PENGU_DESCRIPTION: "Immagini di carinissimi Pinguini OG!", COMMAND_8BALL_DESCRIPTION: "Chiedi alla palla magica !!", COMMAND_DICE_DESCRIPTION: "Tira un dado .. Pengu!", COMMAND_INSULT_DESCRIPTION: "Vuoi insultare qualcuno? Questo il comando giusto!", COMMAND_KISS_DESCRIPTION: "Manda un bacio a qualcuno ..", COMMAND_PUNCH_DESCRIPTION: "Tira un pugno a qualcuno ..", COMMAND_COMIC_DESCRIPTION: "I millenials ricorderanno le strisce comiche? Questo comando è per loro!!", COMMAND_FACT_DESCRIPTION: "Educati con Pengu! Fatti sempre attuali ..", COMMAND_RPS_DESCRIPTION: "Carta, forbice o sasso?? Gioca con Pengu!! Adesso puoi ..", COMMAND_SLOTS_DESCRIPTION: "Non promuoviamo i giochi d'azzardo .. ma se vuoi, puoi!!", COMMAND_TRUMP_DESCRIPTION: "Vieni Trumpato .. dagli insulti di Trump!", COMMAND_MOMMA_DESCRIPTION: "Ancora non sei stanco di ... tua mamma?? Scopri le novità!!!", COMMAND_FOX_DESCRIPTION: "Adori le volpi?? Pure io!!! Ecco la foto di una di esse ..", COMMAND_ILLEGAL_DESCRIPTION: "Facciamo le cose illegali:: mettiamo il simbolo di Trump sulle banconote!!", COMMAND_MCA_DESCRIPTION: "Genera un obiettivo di Minecraft ..", COMMAND_LIO_DESCRIPTION: "Aggiungi la faccia di qualcun altro al tenero Lio!", COMMAND_SLAP_DESCRIPTION: "Chi ha detto una cazzata?? Puniscilo con uno schiaffo!", COMMAND_PAT_DESCRIPTION: "Qualcuno ha fatto un buon lavoro?? Rendigli una giusta pacca sulle spalle..", COMMAND_CUDDLE_DESCRIPTION: "Non ci pensare.. tempo di relax. Tutto andrà meglio, dopo ..", COMMAND_TICKLE_DESCRIPTION: "Brutta giornata?? Manda un Tickle .. cambia l'umore!", COMMAND_POKE_DESCRIPTION: "Pinga qualcuno con un poke ..", COMMAND_FEED_DESCRIPTION: "Qualcuno ha fame?? Dagli del cibo!!", COMMAND_BATSLAP_DESCRIPTION: "Diventa Batman .. e dagli un cazzotto!!", COMMAND_BEAUTIFUL_DESCRIPTION: "Ammira il tuo avatar (o quello di qualcun altro)!", COMMAND_FACEPALM_DESCRIPTION: "*sigh* Una mano in faccia descrive sempre bene la situazione ..", COMMAND_RIP_DESCRIPTION: "Paga il tuo rispetto personale!!", COMMAND_SUPERPUNCH_DESCRIPTION: "Diventa Superman e dagli un cazzottone!!", COMMAND_TATTOO_DESCRIPTION: "Vorresti tatuare il tuo avatar su qualcuno?? Ecco come!!", COMMAND_TRIGGERED_DESCRIPTION: "Perchè esser toccato al giorno d'oggi è facilissimo ..", COMMAND_WANTED_DESCRIPTION: "Stampa alcuni posters VIVO-O-MORTO .. da parte dello sceriffo!!", COMMAND_VAULT_DESCRIPTION: "Sii una icona per questo server!! O indica qualcuno meglio di te!", COMMAND_GARBAGE_DESCRIPTION: "Cestina qualcuno .. perchè se lo merita!!", COMMAND_APPROVED_DESCRIPTION: "Dai un segno di approvazione a qualcuno ..", COMMAND_REJECT_DESCRIPTION: "Respingi qualcuno, le sue qualità fanno schifo!!", COMMAND_TINDER_DESCRIPTION: "Hai una corrispondenza con qualcuno!! Visualizzala!!", COMMAND_MISSING_DESCRIPTION: "E' sparito uno dei tuoi cari?? Fai un poster da appendere in giro ..", COMMAND_SNAPCHAT_DESCRIPTION: "Crea una immagine Meme Snapchat.", COMMAND_OSU_DESCRIPTION: "Usa osu! Statistiche in formato fighissimo!!", COMMAND_CMM_DESCRIPTION: "Crea un meme: ho cambiato idea!", // NSFW Commands COMMAND_ANAL_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di inculate.", COMMAND_BOOBS_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di tette.", COMMAND_BOOTY_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di culi.", COMMAND_PUSSY_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di figa.", COMMAND_TEEN_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di ragazzine.", COMMAND_HENTAI_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini Hentai.", COMMAND_SNAP_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini da Snapchat.", COMMAND_AMETEUR_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini amatoriali.", COMMAND_GIFS_DESCRIPTION: "-NOT SAFE FOR WORK- Gifs Animate.", COMMAND_GWNSFW_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini selvagge.", COMMAND_LESB_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di lesbiche.", COMMAND_MILF_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di MILF.", COMMAND_NEKOS_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di Nekos.", COMMAND_ANIMETRAPS_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di Anime Trap", COMMAND_ASIAN_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di Asiatiche", COMMAND_BDSM_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini BDSM", COMMAND_BJNSFW_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di pompini", COMMAND_COSPLAY_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di Cosplay", COMMAND_FITGIRLS_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di ragazze in forma", COMMAND_FUTANARI_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di Futanari", COMMAND_NSFW_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini generiche NSFW", COMMAND_FEET_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di piedi", COMMAND_GINGER_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di Ginger", COMMAND_OUTFITS_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di abbigliamenti", COMMAND_PARTYHOUSE_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di Partyhouse", COMMAND_R34_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di Rule-34", COMMAND_SOLO_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di masturbazioni", COMMAND_THICC_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini Thicc", COMMAND_NSFWTRAPS_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini Traps", // Utilities Commands COMMAND_GUILDINFO_DESCRIPTION: "Visualizza maggiori informazioni sul server locale.", COMMAND_TWSTATS_DESCRIPTION: "Verifica le statistiche di Twitch, live!", COMMAND_URBAN_DESCRIPTION: "Trova il significato di parole dall'Urban Dictionary.", COMMAND_USERINFO_DESCRIPTION: "Visualizza maggiori informazioni sull'utente indicato.", COMMAND_WEATHER_DESCRIPTION: "Visualizza le informazioni climatologiche del posto indicato ..", COMMAND_YTSTATS_DESCRIPTION: "Visualizza le statistiche YouTube, live!", COMMAND_ADBLOCK_DESCRIPTION: "Abilita/Disabilita la cancellazione dei links di invito.", COMMAND_TRANSLATE_DESCRIPTION: "Traduci una parola o un messaggio in uno dei linguaggi selezionabili.", COMMAND_POLL_DESCRIPTION: "Crea un sondaggio Strawpoll usando PenguBot", COMMAND_LOGCHAN_DESCRPTION: "Seleziona un canale le quale visualizzare gli eventi di Log.", COMMAND_AVATAR_DESCRIPTION: "Visualizza l'URL del tuo Avatar o di qualcun altro..", COMMAND_QUOTE_DESCRIPTION: "Rispondi ad un messaggio, citandone il contenuto .. (Message ID)", // Profile Commands COMMAND_LEVELUP_DESCRIPTION: "Gestisci i livelli raggiungibili dagli utenti del server.", COMMAND_REP_DESCRIPTION: "Dai i tuoi punti di reputazione a qualcuno, per farlo sentire speciale!", COMMAND_PROFILE_DESCRIPTION: "Visualizza i profili degli utenti in un modo simpatico!!", COMMAND_DAILY_DESCRIPTION: "Reclama i tuoi 100 Snowflakes! Potrai usarli per comperare le cose..", COMMAND_TITLE_DESCRIPTION: "Imposta il titolo che verrà visualizzato sul tuo profilo.", COMMAND_SNOWFLAKES_DESCRIPTION: "Visualizza i tuoi Snowflakes o inviali a qualcuno ..", COMMAND_BGBUY_DESCRIPTION: "Acquista nuovi sfondi per il tuo profilo su PenguBot.", COMMAND_CHANGEBG_DESCRIPTION: "Modifica lo sfondo del tuo profilo su PenguBot.", COMMAND_LEADERBOARD_DESCRIPTION: "Controlla chi stà vincendo!! Guarda la leaderboard del tuo server..", COMMAND_BACKGROUND_DESCRIPTION: "Personalizza il tuo profilo su PenguBot acquistando e scegliendo nuovi sfondi ..", COMMAND_RANK_DESCRIPTION: "Tessere di Iscrizione al server personalizzate (Differenti per OGNI server)", COMMAND_MANAGEXP_DESCRIPTION: "Imposta/Reimposta/Aggiungi esperienza per un utente del server.", // Dev Commands COMMAND_EXEC_DESCRIPTION: "-BOT OWNER ONLY-", COMMAND_SG_DESCRIPTION: "-BOT OWNER ONLY-", COMMAND_TPG_DESCRIPTION: "-BOT OWNER ONLY-", COMMAND_DONATE_DESCRIPTION: "Dona qualcosa a PenguBot! Aiutaci a rendere questo bot bellissimo!!", // Music Commands COMMAND_DMSONG_DESCRIPTION: "Permetti a Pengu di inviare la canzone in riproduzione tramite DMs.", COMMAND_LOOP_DESCRIPTION: "Metti in Loop una canzone.", COMMAND_LYRICS_DESCRIPTION: "Ottieni il testo di una canzone, direttamente su PenguBot.", COMMAND_MUSIC_DESCRIPTION: "Informazioni dettagliate per tutti i comandi musicali.", COMMAND_NOWPLAYING_DESCRIPTION: "Visualizza quale traccia audio è in riproduzione ed il suo attuale progresso .. ", COMMAND_PLAY_DESCRIPTION: "Suona tracce da YouTube/Twitch/SoundCloud/Mixer/Live Streams, etc.. con PenguBot.", COMMAND_SHUFFLE_DESCRIPTION: "Mischia le tracce nella playlist, rendile più casuali ..", COMMAND_QUEUE_DESCRIPTION: "Percorri la traccia in coda in maniera interattiva ..", COMMAND_SKIP_DESCRIPTION: "Salta la traccia corrente o richiedi una votazione per farlo (se presenti più di 3 utenti)", COMMAND_STOP_DESCRIPTION: "Ferma la riproduzione e pulisci la playlist (Se sei un Pengu-DJ ovvero IL SOLO all'ascolto)", COMMAND_MAKE_DJ_DESCRPTION: "Allows guild managers, admins and pengu admins to add/remove new pengu dj.", COMMAND_LEAVE_DESCRIPTION: "Obbliga PenguBot ad abbandonare forzatamente il canale vocale.", COMMAND_PAUSE_DESCRIPTION: "Pausa/Riprendi l'attuale riproduzione musicale.", COMMAND_VOLUME_DESCRIPTION: "Modifica il volume di default di PenguBot per tutti gli utenti del server.", COMMAND_DJONLY_DESCRIPTION: "Abilita/Disabilita la modalità Pengu-DJ per i comandi musicali.", INHIBITOR_DJ_ONLY: "Questo server è stato configurato per consentire SOLTANTO ai Pengu-DJ di utilizzare i comandi musicali.", COMMAND_DUMP_DESCRIPTION: "Scarica la playlist in formato raw, per poterla riutilizzare in seguito!", // ---------------------------------------------------------------------------------------------------------------------------------- // Game Stats COMMAND_FORTNITE_DESCRIPTION: "Visualizza statistiche di gioco Fortnite su Discord.", COMMAND_CRSTATS_DESCRIPTION: "Visualizza statistiche utente per Clash Royale su Discord.", COMMAND_COCSTATS_DESCRIPTION: "Visualizza statistiche utente per Clash of Clans su Discord.", COMMAND_CSGO_DESCRIPTION: "Visualizza statistiche utente Counter Strike Global Offensive su Discord", // Starboard COMMAND_TOGGLE_STARBOARD_DESCRPTION: "Permetti agli Amministratori di Pengu di abilitare/disabilitare la Starboard su questo server.", COMMAND_CHANNEL_STAR_DESCRPTION: "Permetti agli Amministratori di Pengu di impostare il canale Starboard.", COMMAND_REQUIRED_STAR_DESCRPTION: "Permetti agli Amministratori di Pengu di impostare il minimo di stelle prima dei messaggi Starboard.", COMMAND_STAR_DESCRPTION: "Permetti agli Amministratori di Pengu di forzare un messaggio Starboard.", MESSAGE_STAR_ENABLED: "Starboard è stato abilitato su questo server.", MESSAGE_STAR_DISABLED: "Starboard è stato disabilitato su questo server.", MESSAGE_STARS_REQUIRED_SET: "Indica il minimo numero di stelle NECESSARIO prima che il messaggio sia mandato sullo Starboard.", MESSAGE_STAR_CHANNEL_SET: "Canale Starboard impostato correttamente.", // Custom Messages ER_TRY_AGAIN: "Sono spiacente, ma c'è stato un errore.. Riprova più tardi. Se il problema persiste, contattaci su https://discord.gg/u8WYw5r", ER_MUSIC_TRIP: "Accidenti!!! Ho qualche problema sulla traccia indicata.. Riprova più tardi. Se il problema persiste, contattaci su https://discord.gg/u8WYw5r", ER_MUSIC_NF: "<:penguError:435712890884849664> Non sono riuscito a trovare alcun risultato per la tua richiesta. Riprova più tardi. Se il problema persiste, contattaci su https://discord.gg/u8WYw5r", ER_CATS_DOGS: "C'è stato un errore! Penso che un gatto abbia smangiucchiato il cavo.. un cane certe cose non le fa!", ER_API: "Sfortunatamente, a causa di una mancanza del provider, questo comando è stato momentaneamente disabilitato.", ER_TINDER: "Non trovo corrispondenze per te .. ", CMD_LOG_DISABLED: "Il giornale di bordo (logging) è ora disabilitato.", CMD_LOG_ENABLED: "Il giornale di bordo (logging) è ora abilitato e funzionante!", CMD_NO_SELFROLES: "Questo server non ha alcun Ruolo-Automatico assegnabile.", CMD_SELF_ASSIGNABLE: "il ruolo adesso è auto-assegnabile.", CMD_NO_ASSIGNABLE: "il ruolo adesso non è più auto-assegnabile.", ER_NO_DM: "Non posso mandarti Messaggi Diretti poichè non ne ho la possibilità. Abilita i Messaggi Diretti nelle tue preferenze personali.", ER_CURR_LANG: "PenguBot è già impostato per parlare Italiano!", CMD_FUN_COOKIE: "Ti è stato mandato un biscotto da ", CMD_FUN_CUDDLE: "Qualcuno ti coccolerebbe:", CMD_FUN_FED: "Ti è stato dato da mangiare! Ci ha pensato ", CMD_FUN_HUG: "Sei stato abbracciato da", CMD_FUN_KISS: "Sei stato baciato da", CMD_FUN_PAT: "Qualcuno ti ha dato una pacca sulla spalla:", CMD_FUN_POKE: "Qualcuno cerca la tua attenzione: ", CMD_FUN_PUNCH: "Qualcuno ti ha dato un pugno:", CMD_FUN_SLAP: "Qualcuno ti schiaffeggerebbe:", CMD_FUN_TICKLE: "Qualcuno ti solletica:", CMD_FUN_PENGU: "Ecco la dolce immagine di un Pengu che hai richiesto", CMD_COC_TAG: "Tag invalida; prova con una tag differente. Usa una di quelle In-game.", CMD_COC_DATA: "Nessun dato recuperato. Riprova più tardi ..", CMD_FORT_PLAT: "NomeUtente o Piattaforma non validi. Riprova con una delle seguenti piattaforme: `pc`. `xbox`, `psn`.", CMD_FORT_ERR: "Errore nelle Tracking API. Riprova più tardi ..", CMD_OSU_ERR: "O non sono riuscito a trovare l'utente .. o abbiamo grossi problemi!!", CMD_UPVOTE_ONLY: "Non hai ancora votato per PenguBot!! Visita il sito per votare PenguBot ed ottenere l'accesso!", CMD_PATRON_ONLY: "Questo server non è un server premium. Considera l'idea di diventare un Patron su per ottenere l'accesso a taluni comandi.", CMD_RPS_INVALID: "Mossa non valida. Seleziona nuovamente ..", CMD_SLOTS_INVALID: "Il quantitativo di Snowflakes indicato non è valido. Inserisci ALMENO 1 o più Snowflakes.", CMD_LOG_INVALID: "Opzione non valida. Seleziona tra", CMD_CSGO_NF: "Il NomeUtente indicato non è stato trovato su Steam. Riprova, con un NomeUtente differente ..", CMD_CSGO_ER: "C'è stato un errore: O il tuo profilo è PRIVATO, o non hai comperato CSGO, o le API non funzionano. Riprova più tardi ..", // Missing Default DEFAULT_LANGUAGE: "Linguaggio Predefinito", SETTING_GATEWAY_EXPECTS_GUILD: "Il parametro si aspetta un server o l'istanza di un server.", SETTING_GATEWAY_VALUE_FOR_KEY_NOEXT: (data, key) => `Il valore ${data} per la chiave ${key} non esiste.`, SETTING_GATEWAY_VALUE_FOR_KEY_ALREXT: (data, key) => `Il valore ${data} per la chiave ${key} è già esistente.`, SETTING_GATEWAY_SPECIFY_VALUE: "Devi specificare il valore da aggiungere o filtrare.", SETTING_GATEWAY_KEY_NOT_ARRAY: key => `La chiave ${key} non è una lista.`, SETTING_GATEWAY_KEY_NOEXT: key => `La chiave ${key} non esiste nello schema dei dati corrente.`, SETTING_GATEWAY_INVALID_TYPE: "Il parametro 'type' può essere solo 'add' o 'remove'.", RESOLVER_INVALID_PIECE: (name, piece) => `${name} deve esserve il nome di un ${piece} valido.`, RESOLVER_INVALID_MSG: name => `${name} deve essere l'id di un messaggio valido.`, RESOLVER_INVALID_USER: name => `${name} deve essere una menzione o l'id di un utente valido.`, RESOLVER_INVALID_MEMBER: name => `${name} deve essere una menzione o l'id di un utente valido.`, RESOLVER_INVALID_CHANNEL: name => `${name} deve essere il tag di un canale o l'id di un canale valido.`, RESOLVER_INVALID_GUILD: name => `${name} deve essere l'id di un server valido.`, RESOLVER_INVALID_ROLE: name => `${name} deve essere una menzione o l'id di un ruolo.`, RESOLVER_INVALID_LITERAL: name => `La tua opzione non corrisponde all'unica possibilità: ${name}`, RESOLVER_INVALID_BOOL: name => `${name} deve essere 'true' o 'false'.`, RESOLVER_INVALID_INT: name => `${name} deve essere un intero.`, RESOLVER_INVALID_FLOAT: name => `${name} deve essere un numero valido.`, RESOLVER_INVALID_REGEX_MATCH: (name, pattern) => `${name} deve combaciare con il seguente pattern in regex: \`${pattern}\`.`, RESOLVER_INVALID_URL: name => `${name} deve essere un url valido.`, RESOLVER_STRING_SUFFIX: " caratteri", RESOLVER_MINMAX_EXACTLY: (name, min, suffix) => `${name} deve essere esattamente ${min}${suffix}.`, RESOLVER_MINMAX_BOTH: (name, min, max, suffix) => `${name} deve essere compreso tra ${min} e ${max}${suffix}.`, RESOLVER_MINMAX_MIN: (name, min, suffix) => `${name} deve essere maggiore di ${min}${suffix}.`, RESOLVER_MINMAX_MAX: (name, max, suffix) => `${name} deve essere minore di ${max}${suffix}.`, COMMANDMESSAGE_MISSING: "Uno o più argomenti mancanti dopo la fine dell'inserimento.", COMMANDMESSAGE_MISSING_REQUIRED: name => `${name} è un argomento richiesto.`, COMMANDMESSAGE_MISSING_OPTIONALS: possibles => `Opzione richiesta mancante: (${possibles})`, COMMANDMESSAGE_NOMATCH: possibles => `La tua opzione non corrisponde a nessuna possibilità: (${possibles})`, MONITOR_COMMAND_HANDLER_REPROMPT: (tag, error, time) => `${tag} | **${error}** | Hai **${time}** secondi per rispondere a questo messaggio con un argomento calido. Scrivi **"ABORT"** per annullare.`, // eslint-disable-line max-len MONITOR_COMMAND_HANDLER_ABORTED: "Annullato", INHIBITOR_COOLDOWN: remaining => `Hai appena usato questo comando. Potrai usare questo comando nuovamente in ${remaining} secondi.`, INHIBITOR_MISSING_BOT_PERMS: missing => `Permessi insufficienti, mancano: **${missing}**`, INHIBITOR_PERMISSIONS: "Non hai il permesso di utilizzare questo comando", INHIBITOR_REQUIRED_SETTINGS: settings => `Il server manca ${settings.length > 1 ? "del permesso" : "dei permessi"} **${settings.join(", ")}** e quindi non è possibile continuare.`, INHIBITOR_RUNIN: types => `Questo comando è disponibile solo in canali di tipo ${types}`, INHIBITOR_RUNIN_NONE: name => `Il comando ${name} non è configurato per essere eseguito in alcun canale.`, COMMAD_UNLOAD: (type, name) => `✅ Scaricato ${type}: ${name}`, COMMAND_TRANSFER_SUCCESS: (type, name) => `✅ Trasferito con successo il ${type}: ${name}`, COMMAND_TRANSFER_FAILED: (type, name) => `Trasferimento del ${type}: ${name} al Client è fallito, controlla la Console.`, COMMAND_REBOOT: "Riavvio...", COMMAND_PING: "Ping?", COMMAND_PINGPONG: (diff, ping) => `Pong! (Roundtrip ha richiesto: ${diff}ms. Heartbeat: ${ping}ms.)`, COMMAND_INVITE_SELFBOT: "Perchè dovrebbe servirti un invito per un bot personale...", COMMAND_HELP_DM: "📥 | La lista di comandi a cui hai accesso è stata inviata nei tuoi messaggi privati.", COMMAND_ENABLE: (type, name) => `+ Abilitato con successo il ${type}: ${name}`, COMMAND_DISABLE: (type, name) => `+ Disabilitato con successo il ${type}: ${name}`, COMMAND_DISABLE_WARN: "Probabilmente non vuoi disabilitare questo, dato che non saresti più in grado di eseguire un comando per riabilitarlo", COMMAND_CONF_NOKEY: "Devi definire una chiave", COMMAND_CONF_NOVALUE: "Devi definire un valore", COMMAND_CONF_ADDED: (value, key) => `Aggiunto con successo il valore \`${value}\` alla chiave: **${key}**`, COMMAND_CONF_UPDATED: (key, response) => `Aggiornata con successo la chiave **${key}**: \`${response}\``, COMMAND_CONF_KEY_NOT_ARRAY: "Questa chiave non è una lista. Usa l'azione 'reset'.", COMMAND_CONF_REMOVE: (value, key) => `Rimosso con successo il valore \`${value}\` dalla chiave: **${key}**`, COMMAND_CONF_GET_NOEXT: key => `La chiave **${key}** non sembra esistere.`, COMMAND_CONF_GET: (key, value) => `Il valore per la chiave **${key}** è: \`${value}\``, COMMAND_CONF_RESET: (key, response) => `La chiave **${key}** è stata ripristinata a: \`${response}\``, // Music interface MUSICIF_NO_MUSIC_PLAYING: "Non sta suonando alcuna musica!", MUSICIF_NOW_PLAYING_TITLE: "In riproduzione.. - PenguBot", MUSICIF_TITLE: "Titolo", MUSICIF_AUTHOR: "Autore/Canale", MUSICIF_SONG_LENGHT: "Lunghezza", MUSICIF_SONG_REQUESTED_BY: "Richiedente", MUSICIF_SONG_LINK: "Link", MUSIC_NO_SONGS_IN_QUEUE: "Canzone non trovata. Provane un'altra, o aggiungi argomenti ..", MUSICIF_QUEUE_HINT: "Sfoglia le pagine della playlist..", MUSICIF_QUEUE_TITLE: "Usa le reazioni per interagire con la playlist.", MUSICIF_QUEUE_LOADING: "Carico la playlist ..", MUSICIF_NO_VOICE_CHANNEL: "Non sei connesso ad un canale al quale io possa accedere. Riprova.", MUSICIF_TOGGLE_SONG_LOOP: "Abilitata/Disabilita la ripetizione della singola traccia.", MUSICIF_TOGGLE_SONG_LOOP_ON: "Abilitata la ripetizione della singola traccia.", MUSICIF_TOGGLE_SONG_LOOP_OFF: "Disabilita la ripetizione della singola traccia.", MUSICIF_TOGGLE_QUEUE_LOOP: "Tutta la playlist verrà ripetuta.", COMMAND_MUSIC_LOOP_MAX_QUEUE: "Siamo spiacenti ma la lunghezza massima della coda è di 1000 elementi. Se vuoi non avere questo limite, considera di diventare un nostro Patron su ", // 30th December 2018 HELP_SET_LANGUAGE: ["Please select a Language you Want **PenguBot** to Speak in.", "", ":flag_gb: English (en-US)", ":flag_it: Italian (it-IT)", ":flag_it: Sardinian (sar-IT)", ":flag_fr: French (fr-FR)", ":flag_es: Espanol (es-ES)", "", "Type `p!setlanguage ` to change your language."], CONF_LANG_SET: "è la lingua di default per PenguBot su questo server.", // January 2019 ER_MUSIC_PATRON: "This feature has been locked for Premium Guilds only, if you want to gain access become a Patron at or Donate at with your Discord Username and ID as a message or contact us at ", ERR_TRY_AGAIN: "There was an oopsie, please try again!", ER_CHOICES_SENSE: "You want me to choose from a single option? That makes sense...", CHOICE_SELECT: "My gut feeling says, go with", COMMAND_CHOOSE_DESCRIPTION: "Need help in selecting an option? PenguBot to the rescue!", COMMAND_CASE_DESCRIPTION: "Get information about a specific moderation case with it's ID.", COMMAND_WARN_DESCRIPTION: "Warn a user for an infraction and log it.", COMMAND_HISTORY_DESCRIPTION: "Get a user's infraction history from mod logs.", COMMAND_REASON_DESCRIPTION: "Allow a moderator to set a case's history in mod logs.", COMMAND_MODLOG_DESCRIPTION: "Change the Mod Logs setting in the server.", COMMAND_MEME_DESCRIPTION: "Grabs you a random meme from the interwebs.", COMMAND_WHOLESOME_DESCRIPTION: "Grabs you a random wholesome image from the interwebs.", COMMAND_ROLEINFO_DESCRIPTION: "Get information about a role in a server.", // Commands (Start of cleaning up Language files) COMMAND_AFK_REMOVED: username => `Dear ${username}, I've successfully removed you from AFK.`, COMMAND_AFK_SET: (username, reason) => `Dear ${username}, I've set you afk for \`${reason}\``, // Monitors MONITOR_AFK_REMOVED: username => `Welcome back **${username}**, I have removed you from AFK.`, MONITOR_AFK_ISAFK: (username, reason, time) => `**${username}** is currently AFK for \`${reason}\` - ${Duration.toNow(time)} ago`, settingGatewayDuplicateValue: "That value already exists, please provide a different one." }; } async init() { await super.init(); } }; ================================================ FILE: src/languages/sar-IT.js ================================================ const { Language, klasaUtil: util, version, Duration } = require("../index"); module.exports = class extends Language { constructor(...args) { super(...args); this.language = { DEFAULT: key => `${key} no este istau galu postu in limba.`, INHIBITOR_DISABLED: "<:penguError:435712890884849664> ***Custu commandu este disabilitau.***", INHIBITOR_DISABLED_GROUP: "<:penguError:435712890884849664> ***Custu gruppo de commandoso suno disabilitadoso.***", COMMAND_UNLOAD: (type, name) => `<:penguSuccess:435712876506775553> Scaricadu ${type}: ${name}`, COMMAND_TRANSFER_ERROR: "<:penguError:435712890884849664> Custu file este istau moghiu. Non b'este..", COMMAND_RELOAD: (type, name) => `<:penguSuccess:435712876506775553> Ricaricadu ${type}: ${name}`, COMMAND_RELOAD_ALL: type => `<:penguSuccess:435712876506775553> Ricaricadoso tottu sos ${type}.`, COMMAND_LOAD: (time, type, name) => `<:penguSuccess:435712876506775553> Carricadu correttamente ${type}: ${name}. (B'appo postu: ${time})`, COMMAND_LOAD_ERROR: (type, name, error) => `<:penguError:435712890884849664> Impossibile de carrigare ${type}: ${name}. Motivu:${util.codeBlock("js", error)}`, COMMAND_INVITE: `**👉 | Invita PenguBot in su server discord tuo:** `, COMMAND_SUPPORT: `**__PenguBot - Server de Supporto__**\n• **Link de Invitu:** https://discord.gg/u8WYw5r`, COMMAND_INVITE_DESCRIPTION: "Ammustra su link pro ti che unire a su server de supporto de PenguBot", COMMAND_INFO: [ "PenguBot este uno multi-funtzione pro Discord prenu de funtzionalidadese commente: Moderatzione, Divertimentu, Utilidades de sistema et atteru.. Sviluppadu chin NodeJS utilisande diversasa tecnologiasa commente RethinkDB, JavaScript et Linux.", "", "• **Autore:** [AdityaTD#5346](https://www.AdityaTripathi.co.in)", `• **Versione:** ${version}`, "• **Situ Web:** ", "• **Patreon:** ", "• **Server Discord:** ", "• **GitHub:** " ], COMMAND_DONATE: [ "PenguBot funtziona in varios servers in su mundu. Custa cosa costata in denaru. Si cherese podes supportare PenguBot chin minuju. Asa a che picare carchi pretziosu poterese:", "", "__Perks__:", "• Accessu chentza limitese a sa Playlist, regolatzione de su Volume et atteru..", "• Nessun blocco dae sos votoso - Non servini votos pro che usare sos commandoso bloccadoso.", "• Tempu de traballu metzorau, chin unu Bot dedicadu a sos Patronese", "• Ruolo ispeciale in su server de sa Official Pengu Squad", "", "• **Patreon:** https://www.patreon.com/PenguBot", "• **Crypto Donazioni:** https://1upcoin.com/donate/adityatd", "• **Paghina de PenguBot pro sas premium:** https://www.PenguBot.com/premium" ], COMMAND_HELP_NODM: "📪 | Hai disabilitato i messaggi personali. Non posso inviarti i comandi in privato. Questo il link per la lista dei comandi disponibili : ", COMMAND_UPVOTE: ["Vuoi che PenguBot sia più grande e disponbile su più server che frequenti?", "Allora vota per PenguBot tramite il link sottostante e sblocca l'accesso", "a tutte quelle caratteristiche che sono riservate a coloro che ci votano!!", "", "• **Votaci:** https://top.gg/bot/PenguBot/vote"], COMMAND_TOGGLE_GROUP_DESCRPTION: "Abilita/Disabilita le categorie dei comandi.", COMMAND_TOGGLE_COMMAND_DESCRPTION: "Abilita/Disabilita i comandi sul tuo server.", COMMAND_SUPPORT_DESCRIPTION: "Link per connetterti al Server di Supporto di PenguBot.", // Pengu's Sentences MESSAGE_PREFIX_SET: "Ho aggiornato il prefisso a : ", MESSAGE_CURRENT_PREFIX: "Il prefisso attuale su questo server è: ", MESSAGE_PENGU: "eccolo quà!", // Kick Messages MESSAGE_KICKED: "è stato disconnesso! (Kick)", MESSAGE_KICK_YOURSELF: "Non puoi disconnettere te stesso!!", MESSAGE_KICK_PENGU: "Per quale motivo vuoi disconnettermi??", MESSAGE_KICK_CANT: "Questo utente non può esser disconnesso.", // Ban Messages MESSAGE_BANNED: "è stato bandito!! (ban)", MESSAGE_SOFTBANNED: "è stato bandito momentaneamente! (softban)", MESSAGE_BAN_YOURSELF: "Non puoi bandire te stesso!", MESSAGE_BAN_PENGU: "Per quale motivo vorresti bandirmi??", MESSAGE_BAN_CANT: "Questo utente non può esser bandito!", // Make Admin and Mod Messages MESSAGE_ADMIN_ADD: "è ora un Amministratore di Pengu!", MESSAGE_ADMIN_REMOVE: "non è più un Amministratore di Pengu!", MESSAGE_MOD_ADD: "è ora un Moderatore per Pengu!", MESSAGE_MOD_REMOVE: "non è più un Moderatore per Pengu!", MESSAGE_DJ_ADD: "è ora un DJ per Pengu DJ!", MESSAGE_DJ_REMOVE: "non è più un DJ per Pengu!", // Mute Command Messages MESSAGE_MUTED: "è stato mutato!", MESSAGE_UNMUTED: "ora può parlare di nuovo!", // Other Mod Commands Messages MESSAGE_PRUNE_DELETED: "messaggio/i cancellato/i!", // Custom Commands Messages MESSAGE_CMD_ADDED: "comand aggiunto da", MESSAGE_CMD_UPDATED: "comando aggiornato da", MESSAGE_CMD_REMOVED: "comando rimosso da", MESSAGE_CMD_NOTFOUND: "comando non trovato!", MESSAGE_CMD_EXISTS: "comando con questo nome esiste già per Pengu! (Comune o personalizzato)", MESSAGE_NO_CMDS: "Questo server non ha comandi personalizzati, chiedi ad un amministratore di crearlo per te!", MESSAGE_COMMAND_CUSTOM_ENABLED: "Comandi personalizzati è adesso disponibile!", MESSAGE_COMMAND_CUSTOM_DISABLED: "Comandi personalizzati è adesso disabilitato!", // Welcome & Leave messages MESSAGE_WLCM_ENABLED: "I messaggi di Benvenuto sono abilitati!", MESSAGE_WLCM_DISABLED: "I messaggi di Benvenuto sono stati disabilitati!", MESSAGE_LEAVE_ENABLED: "I messaggi di Addio sono abilitati!", MESSAGE_LEAVE_DISABLED: "I messaggi di Addio sono stati disabilitati!", MESSAGE_WELCOME_SET: "I messaggi di Benvenuto non sono ancora stati impostati!!", MESSAGE_LEAVE_SET: "I messaggi di Addio non sono ancora stati impostati!!", MESSAGE_WELCOME_CHANNEL_SET: "I Messaggi di Benvenuto sono stati correttamente impostati!", MESSAGE_LEAVE_CHANNEL_SET: "I Messaggi di Addio sono stati correttamente impostati!", // Logging MESSAGE_LOGCHAN_SET: "Canale di Logging impostato correttamente!", COMMAND_LOG_DESCRPTION: "Abilita/Disabilita gli eventi di Logging (se sei un Amministratore di Pengu)", // Autoroles, Level & Self Roles MESSAGE_AUTOROLES_ENABLED: "Ruoli-Automatici abilitati su questo server!", MESSAGE_AUTOROLES_DISABLED: "Ruoli-Automatici Roles disabilitati su questo server!", MESSAGE_AUTOROLE_REMOVED: "ruolo è stato rimosso dai Ruoli-Automatici!", MESSAGE_AUTOROLE_ADDED: "role è stato aggiunto ai Ruoli-Automatici!", COMMAND_SELFROLES: "Assegna/Rimuove/Visualizza i ruoli per te stesso.", COMMAND_SELFROLES_MANAGE: "Aggiungi/Rimuovi Ruoli-Automatici al server.", COMMAND_TOGGLE_SELFROLES: "Abilita/Disabilita Ruoli-Automatici sul server.", MESSAGE_LEVELROLES_ENABLED: "Ruoli basati sul Livello sono stati abilitati sul server!", MESSAGE_LEVELROLES_DISABLED: "Ruoli basati sul Livello sono stati disabilitati sul server!", // Utilities Messages MESSAGE_NEW_REMINDER: "Nuovo Promemoria creato con ID:", MESSAGE_LINK_SHORTEN: "Ecco la tua URL:", MESSAGE_AVATAR: "Ecco l'avatar di", MESSAGE_STARCHAN_SET: "Il canale Starboard è stato impostato correttamente.", // Pengu's Commands Descriptions COMMAND_KICK_DESCRIPTION: "Permette ai Moderatori di disconnettere gli utenti. (kick)", COMMAND_BAN_DESCRIPTION: "Permette ai Moderatori di bandire gli utenti. (ban)", COMMAND_SOFTBAN_DESCRIPTION: "Permette ai Moderatori di bandire momentaneamente gli utenti. (softban)", COMMAND_MAKE_ADMIN_DESCRIPTION: "Allows guild managers, admins and pengu admins to add/remove new pengu admins.", COMMAND_MAKE_MOD_DESCRIPTION: "Allows guild managers, admins and pengu admins to add/remove new pengu mods.", COMMAND_MAKE_STAFF_DESCRPTION: "Allows guild managers, admins and pengu admins to add/remove new pengu staff.", COMMAND_MUTE_DESCRIPTION: "Permette ai Moderatori di zittire gli utenti. (mute)", COMMAND_SAY_DESCRIPTION: "Permette ai Moderatori di far parlare PenguBot.", COMMAND_ADD_CMD_DESCRIPTION: "Permette agli Amministratori di aggiungere Comandi Personalizzati al server locale.", COMMAND_TOGGLE_CUSTOM_DESCRIPTION: "Permette agli Amministratori di Pengu di abilitare/disabilitare i Comandi Personalizzati sul server.", COMMAND_TOGGLE_WELCOME_DESCRPTION: "Permette agli Amministratori di Pengu di abilitare/disabilitare i messaggi di Benvenuto al server.", COMMAND_TOGGLE_LEAVE_DESCRPTION: "Permette agli Amministratori di Pengu di abilitare/disabilitare i messaggi di Addio al server.", COMMAND_SET_WELCOME_DESCRPTION: "Permette agli Amministratori di Pengu di impostare i messaggi di Benvenuto al server.", COMMAND_SET_LEAVE_DESCRPTION: "Permette agli Amministratori di Pengu di impostare i messaggi di Addio al server.", COMMAND_CHANNEL_WELCOME_DESCRPTION: "Permette agli Amministratori di Pengu di impostare il canale per i messaggi di Benvenuto.", COMMAND_CHANNEL_LEAVE_DESCRPTION: "Permette agli Amministratori di Pengu di impostare il canale per i messaggi di Addio.", COMMAND_TOGGLE_ROLES_DESCRPTION: "Permette agli Amministratori di Pengu di abilitare/disabilitare i Ruoli-Automatici.", COMMAND_TOGGLE_LVLROLES_DESCRPTION: "Permette agli Amministratori di Pengu di abilitare/disabilitare i Ruoli basati sul Livello.", COMMAND_LIST_LVLROLES_DESCRPTION: "Visualizza i Ruoli disponili per quelli basati sul Livello dell'utente.", COMMAND_LVLROLE_DESCRPTION: "Permette agli Amministratori di Pengu di aggiungere/rimuovere Ruoli ai Ruoli-Automatici.", COMMAND_ADD_ROLES_DESCRPTION: "Permette agli Amministratori di Pengu di aggiungere nuovi Ruoli-Automatici.", COMMAND_REMIND_DESCRIPTION: "Crea un Promemoria. Così Pengu si occuperà di ricordare le cose che non vuoi dimenticare ..", COMMAND_SHORTEN_DESCRIPTION: "Permette a Pengu di creare un link corto con un singolo comando.", COMMAND_AFK_DESCRIPTION: "Imposta la ragione per la quale sarai AFK - Assente!", COMMAND_DEL_CMD_DESCRIPTION: "Permette agli Amministratori di Pengu di cancellare uno dei Comandi Personalizzati precedentemente creati.", COMMAND_LIST_CMDS_DESCRIPTION: "Visualizza tutti i Comandi Personalizzati disponibili sul server.", COMMAND_TOGGLE_CUSTOM_DESCRPTION: "Permette agli Amministratori di Pengu di abilitare/disabilitare i Comandi Personalizzati per questo server.", COMMAND_MUTE_DESCRPTION: "Permette ai Moderatori di Pengu di zittire gli utenti del server.", COMMAND_PRUNE_DESCRIPTION: "Permette ai Moderatori di Pengu di cancellare i messaggi (tramite filtro)", COMMAND_MAKE_ADMIN_DESCRPTION: "Permette agli Amministratori di Pengu di creare nuovi Amministratori di Pengu.", COMMAND_MAKE_MODS_DESCRPTION: "Permette agli Amministratori di Pengu di creare nuove Pengu Mods.", COMMAND_PREFIX_DESCRIPTION: "Permette agli Amministratori di Pengu di modificare il prefisso su questo server.", COMMAND_SHARDS_DESCRIPTION: "Visualizza tutte le informazioni disponibili per PenguBot.", COMMAND_LMGTFY_DESCRIPTION: "Stanco di cercare su Google?? Lascia che PenguBot cerchi per te .. ", COMMAND_UPVOTE_DESCRIPTION: "Vota per PenguBot su DBL e ricevi l'accesso a maggiori caratteristiche di PenguBot.. Immediatamente!!", // Automod MESSAGE_AUTOMOD_ENABLED: "Moderazione Automatica è ora abilitato (con filtro THREAT e SPAM). Modifica questo con: `p!automod toggle `", MESSAGE_AUTOMOD_DISABLED: "Moderazione Automatica è stato disabilitato.", MESSAGE_AUTOMOD_TOGGLED: "il filtro è stato attivato/disattivato", COMMAND_AUTOMOD_DESCRPTION: "Impostazioni di Moderazione Automatica.", // Fun Commands Descriptions COMMAND_CAT_DESCRIPTION: "Tenere foto e fatti riguardanti gatti!", COMMAND_CHUCK_DESCRIPTION: "Opere di Chuck Norris a portata di tastiera!!", COMMAND_COMPLIMENT_DESCRIPTION: "Sii carino e fai i complimenti a qualcuno con Pengu!", COMMAND_COOKIE_DESCRIPTION: "Immagini di biscotti e dolciumi, per stimolare la tua fame!!", COMMAND_DADJOKE_DESCRIPTION: "Tutti amano gli scherzetti!! Anche i Dad Jokes?", COMMAND_DOG_DESCRIPTION: "Tenere foto di cagnetti!!", COMMAND_FML_DESCRIPTION: "Cose che fan dire alla gente: FML!", COMMAND_HUG_DESCRIPTION: "Qualcuno vuole un abbraccio? Perchè attendere.. inviaglielo!!", COMMAND_PENGU_DESCRIPTION: "Immagini di carinissimi Pinguini OG!", COMMAND_8BALL_DESCRIPTION: "Chiedi alla palla magica !!", COMMAND_DICE_DESCRIPTION: "Tira un dado .. Pengu!", COMMAND_INSULT_DESCRIPTION: "Vuoi insultare qualcuno? Questo il comando giusto!", COMMAND_KISS_DESCRIPTION: "Manda un bacio a qualcuno ..", COMMAND_PUNCH_DESCRIPTION: "Tira un pugno a qualcuno ..", COMMAND_COMIC_DESCRIPTION: "I millenials ricorderanno le strisce comiche? Questo comando è per loro!!", COMMAND_FACT_DESCRIPTION: "Educati con Pengu! Fatti sempre attuali ..", COMMAND_RPS_DESCRIPTION: "Carta, forbice o sasso?? Gioca con Pengu!! Adesso puoi ..", COMMAND_SLOTS_DESCRIPTION: "Non promuoviamo i giochi d'azzardo .. ma se vuoi, puoi!!", COMMAND_TRUMP_DESCRIPTION: "Vieni Trumpato .. dagli insulti di Trump!", COMMAND_MOMMA_DESCRIPTION: "Ancora non sei stanco di ... tua mamma?? Scopri le novità!!!", COMMAND_FOX_DESCRIPTION: "Adori le volpi?? Pure io!!! Ecco la foto di una di esse ..", COMMAND_ILLEGAL_DESCRIPTION: "Facciamo le cose illegali:: mettiamo il simbolo di Trump sulle banconote!!", COMMAND_MCA_DESCRIPTION: "Genera un obiettivo di Minecraft ..", COMMAND_LIO_DESCRIPTION: "Aggiungi la faccia di qualcun altro al tenero Lio!", COMMAND_SLAP_DESCRIPTION: "Chi ha detto una cazzata?? Puniscilo con uno schiaffo!", COMMAND_PAT_DESCRIPTION: "Qualcuno ha fatto un buon lavoro?? Rendigli una giusta pacca sulle spalle..", COMMAND_CUDDLE_DESCRIPTION: "Non ci pensare.. tempo di relax. Tutto andrà meglio, dopo ..", COMMAND_TICKLE_DESCRIPTION: "Brutta giornata?? Manda un Tickle .. cambia l'umore!", COMMAND_POKE_DESCRIPTION: "Pinga qualcuno con un poke ..", COMMAND_FEED_DESCRIPTION: "Qualcuno ha fame?? Dagli del cibo!!", COMMAND_BATSLAP_DESCRIPTION: "Diventa Batman .. e dagli un cazzotto!!", COMMAND_BEAUTIFUL_DESCRIPTION: "Ammira il tuo avatar (o quello di qualcun altro)!", COMMAND_FACEPALM_DESCRIPTION: "*sigh* Una mano in faccia descrive sempre bene la situazione ..", COMMAND_RIP_DESCRIPTION: "Paga il tuo rispetto personale!!", COMMAND_SUPERPUNCH_DESCRIPTION: "Diventa Superman e dagli un cazzottone!!", COMMAND_TATTOO_DESCRIPTION: "Vorresti tatuare il tuo avatar su qualcuno?? Ecco come!!", COMMAND_TRIGGERED_DESCRIPTION: "Perchè esser toccato al giorno d'oggi è facilissimo ..", COMMAND_WANTED_DESCRIPTION: "Stampa alcuni posters VIVO-O-MORTO .. da parte dello sceriffo!!", COMMAND_VAULT_DESCRIPTION: "Sii una icona per questo server!! O indica qualcuno meglio di te!", COMMAND_GARBAGE_DESCRIPTION: "Cestina qualcuno .. perchè se lo merita!!", COMMAND_APPROVED_DESCRIPTION: "Dai un segno di approvazione a qualcuno ..", COMMAND_REJECT_DESCRIPTION: "Respingi qualcuno, le sue qualità fanno schifo!!", COMMAND_TINDER_DESCRIPTION: "Hai una corrispondenza con qualcuno!! Visualizzala!!", COMMAND_MISSING_DESCRIPTION: "E' sparito uno dei tuoi cari?? Fai un poster da appendere in giro ..", COMMAND_SNAPCHAT_DESCRIPTION: "Crea una immagine Meme Snapchat.", COMMAND_OSU_DESCRIPTION: "Usa osu! Statistiche in formato fighissimo!!", COMMAND_CMM_DESCRIPTION: "Crea un meme: ho cambiato idea!", // NSFW Commands COMMAND_ANAL_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di inculate.", COMMAND_BOOBS_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di tette.", COMMAND_BOOTY_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di culi.", COMMAND_PUSSY_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di figa.", COMMAND_TEEN_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di ragazzine.", COMMAND_HENTAI_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini Hentai.", COMMAND_SNAP_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini da Snapchat.", COMMAND_AMETEUR_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini amatoriali.", COMMAND_GIFS_DESCRIPTION: "-NOT SAFE FOR WORK- Gifs Animate.", COMMAND_GWNSFW_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini selvagge.", COMMAND_LESB_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di lesbiche.", COMMAND_MILF_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di MILF.", COMMAND_NEKOS_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di Nekos.", COMMAND_ANIMETRAPS_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di Anime Trap", COMMAND_ASIAN_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di Asiatiche", COMMAND_BDSM_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini BDSM", COMMAND_BJNSFW_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di pompini", COMMAND_COSPLAY_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di Cosplay", COMMAND_FITGIRLS_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di ragazze in forma", COMMAND_FUTANARI_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di Futanari", COMMAND_NSFW_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini generiche NSFW", COMMAND_FEET_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di piedi", COMMAND_GINGER_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di Ginger", COMMAND_OUTFITS_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di abbigliamenti", COMMAND_PARTYHOUSE_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di Partyhouse", COMMAND_R34_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di Rule-34", COMMAND_SOLO_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini di masturbazioni", COMMAND_THICC_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini Thicc", COMMAND_NSFWTRAPS_DESCRIPTION: "-NOT SAFE FOR WORK- Immagini Traps", // Utilities Commands COMMAND_GUILDINFO_DESCRIPTION: "Visualizza maggiori informazioni sul server locale.", COMMAND_TWSTATS_DESCRIPTION: "Verifica le statistiche di Twitch, live!", COMMAND_URBAN_DESCRIPTION: "Trova il significato di parole dall'Urban Dictionary.", COMMAND_USERINFO_DESCRIPTION: "Visualizza maggiori informazioni sull'utente indicato.", COMMAND_WEATHER_DESCRIPTION: "Visualizza le informazioni climatologiche del posto indicato ..", COMMAND_YTSTATS_DESCRIPTION: "Visualizza le statistiche YouTube, live!", COMMAND_ADBLOCK_DESCRIPTION: "Abilita/Disabilita la cancellazione dei links di invito.", COMMAND_TRANSLATE_DESCRIPTION: "Traduci una parola o un messaggio in uno dei linguaggi selezionabili.", COMMAND_POLL_DESCRIPTION: "Crea un sondaggio Strawpoll usando PenguBot", COMMAND_LOGCHAN_DESCRPTION: "Seleziona un canale le quale visualizzare gli eventi di Log.", COMMAND_AVATAR_DESCRIPTION: "Visualizza l'URL del tuo Avatar o di qualcun altro..", COMMAND_QUOTE_DESCRIPTION: "Rispondi ad un messaggio, citandone il contenuto .. (Message ID)", // Profile Commands COMMAND_LEVELUP_DESCRIPTION: "Gestisci i livelli raggiungibili dagli utenti del server.", COMMAND_REP_DESCRIPTION: "Dai i tuoi punti di reputazione a qualcuno, per farlo sentire speciale!", COMMAND_PROFILE_DESCRIPTION: "Visualizza i profili degli utenti in un modo simpatico!!", COMMAND_DAILY_DESCRIPTION: "Reclama i tuoi 100 Snowflakes! Potrai usarli per comperare le cose..", COMMAND_TITLE_DESCRIPTION: "Imposta il titolo che verrà visualizzato sul tuo profilo.", COMMAND_SNOWFLAKES_DESCRIPTION: "Visualizza i tuoi Snowflakes o inviali a qualcuno ..", COMMAND_BGBUY_DESCRIPTION: "Acquista nuovi sfondi per il tuo profilo su PenguBot.", COMMAND_CHANGEBG_DESCRIPTION: "Modifica lo sfondo del tuo profilo su PenguBot.", COMMAND_LEADERBOARD_DESCRIPTION: "Controlla chi stà vincendo!! Guarda la leaderboard del tuo server..", COMMAND_BACKGROUND_DESCRIPTION: "Personalizza il tuo profilo su PenguBot acquistando e scegliendo nuovi sfondi ..", COMMAND_RANK_DESCRIPTION: "Tessere di Iscrizione al server personalizzate (Differenti per OGNI server)", COMMAND_MANAGEXP_DESCRIPTION: "Imposta/Reimposta/Aggiungi esperienza per un utente del server.", // Dev Commands COMMAND_EXEC_DESCRIPTION: "-BOT OWNER ONLY-", COMMAND_SG_DESCRIPTION: "-BOT OWNER ONLY-", COMMAND_TPG_DESCRIPTION: "-BOT OWNER ONLY-", COMMAND_DONATE_DESCRIPTION: "Dona qualcosa a PenguBot! Aiutaci a rendere questo bot bellissimo!!", // Music Commands COMMAND_DMSONG_DESCRIPTION: "Permetti a Pengu di inviare la canzone in riproduzione tramite DMs.", COMMAND_LOOP_DESCRIPTION: "Metti in Loop una canzone.", COMMAND_LYRICS_DESCRIPTION: "Ottieni il testo di una canzone, direttamente su PenguBot.", COMMAND_MUSIC_DESCRIPTION: "Informazioni dettagliate per tutti i comandi musicali.", COMMAND_NOWPLAYING_DESCRIPTION: "Visualizza quale traccia audio è in riproduzione ed il suo attuale progresso .. ", COMMAND_PLAY_DESCRIPTION: "Suona tracce da YouTube/Twitch/SoundCloud/Mixer/Live Streams, etc.. con PenguBot.", COMMAND_SHUFFLE_DESCRIPTION: "Mischia le tracce nella playlist, rendile più casuali ..", COMMAND_QUEUE_DESCRIPTION: "Percorri la traccia in coda in maniera interattiva ..", COMMAND_SKIP_DESCRIPTION: "Salta la traccia corrente o richiedi una votazione per farlo (se presenti più di 3 utenti)", COMMAND_STOP_DESCRIPTION: "Ferma la riproduzione e pulisci la playlist (Se sei un Pengu-DJ ovvero IL SOLO all'ascolto)", COMMAND_MAKE_DJ_DESCRPTION: "Allows guild managers, admins and pengu admins to add/remove new pengu dj.", COMMAND_LEAVE_DESCRIPTION: "Obbliga PenguBot ad abbandonare forzatamente il canale vocale.", COMMAND_PAUSE_DESCRIPTION: "Pausa/Riprendi l'attuale riproduzione musicale.", COMMAND_VOLUME_DESCRIPTION: "Modifica il volume di default di PenguBot per tutti gli utenti del server.", COMMAND_DJONLY_DESCRIPTION: "Abilita/Disabilita la modalità Pengu-DJ per i comandi musicali.", INHIBITOR_DJ_ONLY: "Questo server è stato configurato per consentire SOLTANTO ai Pengu-DJ di utilizzare i comandi musicali.", COMMAND_DUMP_DESCRIPTION: "Scarica la playlist in formato raw, per poterla riutilizzare in seguito!", // ---------------------------------------------------------------------------------------------------------------------------------- // Game Stats COMMAND_FORTNITE_DESCRIPTION: "Visualizza statistiche di gioco Fortnite su Discord.", COMMAND_CRSTATS_DESCRIPTION: "Visualizza statistiche utente per Clash Royale su Discord.", COMMAND_COCSTATS_DESCRIPTION: "Visualizza statistiche utente per Clash of Clans su Discord.", COMMAND_CSGO_DESCRIPTION: "Visualizza statistiche utente Counter Strike Global Offensive su Discord", // Starboard COMMAND_TOGGLE_STARBOARD_DESCRPTION: "Permetti agli Amministratori di Pengu di abilitare/disabilitare la Starboard su questo server.", COMMAND_CHANNEL_STAR_DESCRPTION: "Permetti agli Amministratori di Pengu di impostare il canale Starboard.", COMMAND_REQUIRED_STAR_DESCRPTION: "Permetti agli Amministratori di Pengu di impostare il minimo di stelle prima dei messaggi Starboard.", COMMAND_STAR_DESCRPTION: "Permetti agli Amministratori di Pengu di forzare un messaggio Starboard.", MESSAGE_STAR_ENABLED: "Starboard è stato abilitato su questo server.", MESSAGE_STAR_DISABLED: "Starboard è stato disabilitato su questo server.", MESSAGE_STARS_REQUIRED_SET: "Indica il minimo numero di stelle NECESSARIO prima che il messaggio sia mandato sullo Starboard.", MESSAGE_STAR_CHANNEL_SET: "Canale Starboard impostato correttamente.", // Custom Messages ER_TRY_AGAIN: "Sono spiacente, ma c'è stato un errore.. Riprova più tardi. Se il problema persiste, contattaci su https://discord.gg/u8WYw5r", ER_MUSIC_TRIP: "Accidenti!!! Ho qualche problema sulla traccia indicata.. Riprova più tardi. Se il problema persiste, contattaci su https://discord.gg/u8WYw5r", ER_MUSIC_NF: "<:penguError:435712890884849664> Non sono riuscito a trovare alcun risultato per la tua richiesta. Riprova più tardi. Se il problema persiste, contattaci su https://discord.gg/u8WYw5r", ER_CATS_DOGS: "C'è stato un errore! Penso che un gatto abbia smangiucchiato il cavo.. un cane certe cose non le fa!", ER_API: "Sfortunatamente, a causa di una mancanza del provider, questo comando è stato momentaneamente disabilitato.", ER_TINDER: "Non trovo corrispondenze per te .. ", CMD_LOG_DISABLED: "Il giornale di bordo (logging) è ora disabilitato.", CMD_LOG_ENABLED: "Il giornale di bordo (logging) è ora abilitato e funzionante!", CMD_NO_SELFROLES: "Questo server non ha alcun Ruolo-Automatico assegnabile.", CMD_SELF_ASSIGNABLE: "il ruolo adesso è auto-assegnabile.", CMD_NO_ASSIGNABLE: "il ruolo adesso non è più auto-assegnabile.", ER_NO_DM: "Non posso mandarti Messaggi Diretti poichè non ne ho la possibilità. Abilita i Messaggi Diretti nelle tue preferenze personali.", CMD_FUN_COOKIE: "Ti è stato mandato un biscotto da ", CMD_FUN_CUDDLE: "Qualcuno ti coccolerebbe:", CMD_FUN_FED: "Ti è stato dato da mangiare! Ci ha pensato ", CMD_FUN_HUG: "Sei stato abbracciato da", CMD_FUN_KISS: "Sei stato baciato da", CMD_FUN_PAT: "Qualcuno ti ha dato una pacca sulla spalla:", CMD_FUN_POKE: "Qualcuno cerca la tua attenzione: ", CMD_FUN_PUNCH: "Qualcuno ti ha dato un pugno:", CMD_FUN_SLAP: "Qualcuno ti schiaffeggerebbe:", CMD_FUN_TICKLE: "Qualcuno ti solletica:", CMD_FUN_PENGU: "Ecco la dolce immagine di un Pengu che hai richiesto", CMD_COC_TAG: "Tag invalida; prova con una tag differente. Usa una di quelle In-game.", CMD_COC_DATA: "Nessun dato recuperato. Riprova più tardi ..", CMD_FORT_PLAT: "NomeUtente o Piattaforma non validi. Riprova con una delle seguenti piattaforme: `pc`. `xbox`, `psn`.", CMD_FORT_ERR: "Errore nelle Tracking API. Riprova più tardi ..", CMD_OSU_ERR: "O non sono riuscito a trovare l'utente .. o abbiamo grossi problemi!!", CMD_UPVOTE_ONLY: "Non hai ancora votato per PenguBot!! Visita il sito per votare PenguBot ed ottenere l'accesso!", CMD_PATRON_ONLY: "Questo server non è un server premium. Considera l'idea di diventare un Patron su per ottenere l'accesso a taluni comandi.", CMD_RPS_INVALID: "Mossa non valida. Seleziona nuovamente ..", CMD_SLOTS_INVALID: "Il quantitativo di Snowflakes indicato non è valido. Inserisci ALMENO 1 o più Snowflakes.", CMD_LOG_INVALID: "Opzione non valida. Seleziona tra", CMD_CSGO_NF: "Il NomeUtente indicato non è stato trovato su Steam. Riprova, con un NomeUtente differente ..", CMD_CSGO_ER: "C'è stato un errore: O il tuo profilo è PRIVATO, o non hai comperato CSGO, o le API non funzionano. Riprova più tardi ..", // Missing Default DEFAULT_LANGUAGE: "Linguaggio Predefinito", SETTING_GATEWAY_EXPECTS_GUILD: "Il parametro si aspetta un server o l'istanza di un server.", SETTING_GATEWAY_VALUE_FOR_KEY_NOEXT: (data, key) => `Il valore ${data} per la chiave ${key} non esiste.`, SETTING_GATEWAY_VALUE_FOR_KEY_ALREXT: (data, key) => `Il valore ${data} per la chiave ${key} è già esistente.`, SETTING_GATEWAY_SPECIFY_VALUE: "Devi specificare il valore da aggiungere o filtrare.", SETTING_GATEWAY_KEY_NOT_ARRAY: key => `La chiave ${key} non è una lista.`, SETTING_GATEWAY_KEY_NOEXT: key => `La chiave ${key} non esiste nello schema dei dati corrente.`, SETTING_GATEWAY_INVALID_TYPE: "Il parametro 'type' può essere solo 'add' o 'remove'.", RESOLVER_INVALID_PIECE: (name, piece) => `${name} deve esserve il nome di un ${piece} valido.`, RESOLVER_INVALID_MSG: name => `${name} deve essere l'id di un messaggio valido.`, RESOLVER_INVALID_USER: name => `${name} deve essere una menzione o l'id di un utente valido.`, RESOLVER_INVALID_MEMBER: name => `${name} deve essere una menzione o l'id di un utente valido.`, RESOLVER_INVALID_CHANNEL: name => `${name} deve essere il tag di un canale o l'id di un canale valido.`, RESOLVER_INVALID_GUILD: name => `${name} deve essere l'id di un server valido.`, RESOLVER_INVALID_ROLE: name => `${name} deve essere una menzione o l'id di un ruolo.`, RESOLVER_INVALID_LITERAL: name => `La tua opzione non corrisponde all'unica possibilità: ${name}`, RESOLVER_INVALID_BOOL: name => `${name} deve essere 'true' o 'false'.`, RESOLVER_INVALID_INT: name => `${name} deve essere un intero.`, RESOLVER_INVALID_FLOAT: name => `${name} deve essere un numero valido.`, RESOLVER_INVALID_REGEX_MATCH: (name, pattern) => `${name} deve combaciare con il seguente pattern in regex: \`${pattern}\`.`, RESOLVER_INVALID_URL: name => `${name} deve essere un url valido.`, RESOLVER_STRING_SUFFIX: " caratteri", RESOLVER_MINMAX_EXACTLY: (name, min, suffix) => `${name} deve essere esattamente ${min}${suffix}.`, RESOLVER_MINMAX_BOTH: (name, min, max, suffix) => `${name} deve essere compreso tra ${min} e ${max}${suffix}.`, RESOLVER_MINMAX_MIN: (name, min, suffix) => `${name} deve essere maggiore di ${min}${suffix}.`, RESOLVER_MINMAX_MAX: (name, max, suffix) => `${name} deve essere minore di ${max}${suffix}.`, COMMANDMESSAGE_MISSING: "Uno o più argomenti mancanti dopo la fine dell'inserimento.", COMMANDMESSAGE_MISSING_REQUIRED: name => `${name} è un argomento richiesto.`, COMMANDMESSAGE_MISSING_OPTIONALS: possibles => `Opzione richiesta mancante: (${possibles})`, COMMANDMESSAGE_NOMATCH: possibles => `La tua opzione non corrisponde a nessuna possibilità: (${possibles})`, MONITOR_COMMAND_HANDLER_REPROMPT: (tag, error, time) => `${tag} | **${error}** | Hai **${time}** secondi per rispondere a questo messaggio con un argomento calido. Scrivi **"ABORT"** per annullare.`, // eslint-disable-line max-len MONITOR_COMMAND_HANDLER_ABORTED: "Annullato", INHIBITOR_COOLDOWN: remaining => `Hai appena usato questo comando. Potrai usare questo comando nuovamente in ${remaining} secondi.`, INHIBITOR_MISSING_BOT_PERMS: missing => `Permessi insufficienti, mancano: **${missing}**`, INHIBITOR_PERMISSIONS: "Non hai il permesso di utilizzare questo comando", INHIBITOR_REQUIRED_SETTINGS: settings => `Il server manca ${settings.length > 1 ? "del permesso" : "dei permessi"} **${settings.join(", ")}** e quindi non è possibile continuare.`, INHIBITOR_RUNIN: types => `Questo comando è disponibile solo in canali di tipo ${types}`, INHIBITOR_RUNIN_NONE: name => `Il comando ${name} non è configurato per essere eseguito in alcun canale.`, COMMAD_UNLOAD: (type, name) => `✅ Scaricato ${type}: ${name}`, COMMAND_TRANSFER_SUCCESS: (type, name) => `✅ Trasferito con successo il ${type}: ${name}`, COMMAND_TRANSFER_FAILED: (type, name) => `Trasferimento del ${type}: ${name} al Client è fallito, controlla la Console.`, COMMAND_REBOOT: "Riavvio...", COMMAND_PING: "Ping?", COMMAND_PINGPONG: (diff, ping) => `Pong! (Roundtrip ha richiesto: ${diff}ms. Heartbeat: ${ping}ms.)`, COMMAND_INVITE_SELFBOT: "Perchè dovrebbe servirti un invito per un bot personale...", COMMAND_HELP_DM: "📥 | La lista di comandi a cui hai accesso è stata inviata nei tuoi messaggi privati.", COMMAND_ENABLE: (type, name) => `+ Abilitato con successo il ${type}: ${name}`, COMMAND_DISABLE: (type, name) => `+ Disabilitato con successo il ${type}: ${name}`, COMMAND_DISABLE_WARN: "Probabilmente non vuoi disabilitare questo, dato che non saresti più in grado di eseguire un comando per riabilitarlo", COMMAND_CONF_NOKEY: "Devi definire una chiave", COMMAND_CONF_NOVALUE: "Devi definire un valore", COMMAND_CONF_ADDED: (value, key) => `Aggiunto con successo il valore \`${value}\` alla chiave: **${key}**`, COMMAND_CONF_UPDATED: (key, response) => `Aggiornata con successo la chiave **${key}**: \`${response}\``, COMMAND_CONF_KEY_NOT_ARRAY: "Questa chiave non è una lista. Usa l'azione 'reset'.", COMMAND_CONF_REMOVE: (value, key) => `Rimosso con successo il valore \`${value}\` dalla chiave: **${key}**`, COMMAND_CONF_GET_NOEXT: key => `La chiave **${key}** non sembra esistere.`, COMMAND_CONF_GET: (key, value) => `Il valore per la chiave **${key}** è: \`${value}\``, COMMAND_CONF_RESET: (key, response) => `La chiave **${key}** è stata ripristinata a: \`${response}\``, // Requires Translation MUSICIF_NO_MUSIC_PLAYING: "There's currently no music playing!", MUSIC_NO_SONGS_IN_QUEUE: "There are no songs queued up. Queue up some songs!", // 30th December 2018 HELP_SET_LANGUAGE: ["Issepera una limba dae cussas disponibilese pro **PenguBot**.", "", ":flag_gb: Inglesu (en-US)", ":flag_it: Italianu (it-IT)", ":flag_it: Sardinian (sar-IT)", ":flag_fr: Frantzesu (fr-FR)", ":flag_es: Ispagnolu (es-ES)", "", "Usa `p!setlanguage ` pro che cambiare sa limba de PenguBot."], CONF_LANG_SET: "este sa limba de PenguBot in custu server.", // January 2019 ER_MUSIC_PATRON: "This feature has been locked for Premium Guilds only, if you want to gain access become a Patron at or Donate at with your Discord Username and ID as a message or contact us at ", ERR_TRY_AGAIN: "There was an oopsie, please try again!", ER_CHOICES_SENSE: "You want me to choose from a single option? That makes sense...", CHOICE_SELECT: "My gut feeling says, go with", COMMAND_CHOOSE_DESCRIPTION: "Need help in selecting an option? PenguBot to the rescue!", COMMAND_CASE_DESCRIPTION: "Get information about a specific moderation case with it's ID.", COMMAND_WARN_DESCRIPTION: "Warn a user for an infraction and log it.", COMMAND_HISTORY_DESCRIPTION: "Get a user's infraction history from mod logs.", COMMAND_REASON_DESCRIPTION: "Allow a moderator to set a case's history in mod logs.", COMMAND_MODLOG_DESCRIPTION: "Change the Mod Logs setting in the server.", COMMAND_MEME_DESCRIPTION: "Grabs you a random meme from the interwebs.", COMMAND_WHOLESOME_DESCRIPTION: "Grabs you a random wholesome image from the interwebs.", COMMAND_ROLEINFO_DESCRIPTION: "Get information about a role in a server.", // Commands (Start of cleaning up Language files) COMMAND_AFK_REMOVED: username => `Dear ${username}, I've successfully removed you from AFK.`, COMMAND_AFK_SET: (username, reason) => `Dear ${username}, I've set you afk for \`${reason}\``, // Monitors MONITOR_AFK_REMOVED: username => `Welcome back **${username}**, I have removed you from AFK.`, MONITOR_AFK_ISAFK: (username, reason, time) => `**${username}** is currently AFK for \`${reason}\` - ${Duration.toNow(time)} ago`, settingGatewayDuplicateValue: "That value already exists, please provide a different one." }; } async init() { await super.init(); } }; ================================================ FILE: src/lib/constants/facts.json ================================================ ["Most American car horns honk in the key of F.\r","The name Wendy was made up for the book \"Peter Pan.\"\r","Barbie's full name is Barbara Millicent Roberts.\r","Every time you lick a stamp, you consume 1/10 of a calorie.\r","The average person falls asleep in seven minutes.\r","Studies show that if a cat falls off the seventh floor of a building it has about thirty percent less chance of surviving than a cat that falls off the twentieth floor. It supposedly takes about eight floors for the cat to realize what is occurring, relax and correct itself.\r","Your stomach has to produce a new layer of mucus every 2 weeks otherwise it will digest itself.\r","The citrus soda 7-UP was created in 1929; '7' was selected after the original 7-ounce containers and 'UP' for the direction of the bubbles.\r","101 Dalmatians, Peter Pan, Lady and the Tramp, and Mulan are the only Disney cartoons where both parents are present and don't die throughout the movie. .\r","A pig's orgasm lasts for 30 minutes.\r","'Stewardesses' is the longest word that is typed with only the left hand.\r","To escape the grip of a crocodile's jaws, push your thumbs into its eyeballs - it will let you go instantly.\r","Reindeer like to eat bananas.\r","No word in the English language rhymes with month, orange, silver and purple.\r","The word \"samba\" means \"to rub navels together.\"\r","Mel Blanc (the voice of Bugs Bunny) was allergic to carrots.\r","The electric chair was invented by a dentist.\r","The very first bomb dropped by the Allies on Berlin during World War II Killed the only elephant in the Berlin Zoo.\r","More people are killed annually by donkeys than airplane crashes.\r","A 'jiffy' is a unit of time for 1/100th of a second.\r","A whale's penis is called a dork.\r","Because of the rotation of the earth, an object can be thrown farther if it is thrown west.\r","The average person spends 6 months of their life sitting at red lights.\r","In 1912 a law passed in Nebraska where drivers in the country at night were required to stop every 150 yards, send up a skyrocket, wait eight minutes for the road to clear before proceeding cautiously, all the while blowing their horn and shooting off flares.\r","More Monopoly money is printed in a year, than real money throughout the world.\r","Caesar salad has nothing to do with any of the Caesars. It was first concocted in a bar in Tijuana, Mexico, in the 1920's.\r","One quarter of the bones in your body are in your feet.\r","Crocodiles and alligators are surprisingly fast on land. Although they are rapid, they are not agile. So, if being chased by one, run in a zigzag line to lose him or her.\r","Seattle’s Fremont Bridge rises up and down more than any drawbridge in the world.\r","Right-handed people live, on average; nine years longer than left handed people.\r","Ten percent of the Russian government's income comes from the sale of vodka.\r","In the United States, a pound of potato chips costs two hundred times more than a pound of potatoes. \r","A giraffe can go without water longer than a camel.\r","A person cannot taste food unless it is mixed with saliva. For example, if a strong-tasting substance like salt is placed on a dry tongue, the taste buds will not be able to taste it. As soon as a drop of saliva is added and the salt is dissolved, however, a definite taste sensation results. This is true for all foods.\r","Nearly 80% of all animals on earth have six legs.\r","In the marriage ceremony of the ancient Inca Indians of Peru, the couple was considered officially wed when they took off their sandals and handed them to each other.\r","Ninety percent of all species that have become extinct have been birds.\r","There is approximately one chicken for every human being in the world.\r","Most collect calls are made on father's day.\r","The first automobile race ever seen in the United States was held in Chicago in 1895. The track ran from Chicago to Evanston, Illinois. The winner was J. Frank Duryea, whose average speed was 71/2 miles per hour.\r","Each of us generates about 3.5 pounds of rubbish a day, most of it paper.\r","Women manage the money and pay the bills in 75% of all Americans households.\r","A rainbow can be seen only in the morning or late afternoon. It can occur only when the sun is 40 degrees or less above the horizon.\r","It has NEVER rained in Calama, a town in the Atacama Desert of Chile.\r","It costs more to buy a new car today in the United States than it cost Christopher Columbus to equip and undertake three voyages to and from the New World.\r","The plastic things on the end of shoelaces are called aglets.\r","An eighteenth-century German named Matthew Birchinger, known as \"the little man of Nuremberg,\" played four musical instruments including the bagpipes, was an expert calligrapher, and was the most famous stage magician of his day. He performed tricks with the cup and balls that have never been explained. Yet Birchinger had no hands, legs, or thighs, and was less than 29 inches tall.\r","Daylight Saving Time is not observed in most of the state of Arizona and parts of Indiana.\r","Ants closely resemble human manners: When they wake, they stretch & appear to yawn in a human manner before taking up the tasks of the day.\r","Bees have 5 eyes. There are 3 small eyes on the top of a bee's head and 2 larger ones in front.\r","Count the number of cricket chirps in a 15-second period, add 37 to the total, and your result will be very close to the actual outdoor Fahrenheit temperature.\r","One-fourth of the world's population lives on less than $200 a year. Ninety million people survive on less than $75 a year.\r","Butterflies taste with their hind feet.\r","Only female mosquito’s' bite and most are attracted to the color blue twice as much as to any other color.\r","If one places a tiny amount of liquor on a scorpion, it will instantly go mad and sting itself to death.\r","It is illegal to hunt camels in the state of Arizona.\r","In eighteenth-century English gambling dens, there was an employee whose only job was to swallow the dice if there was a police raid.\r","There are no clocks in Las Vegas gambling casinos.\r","The human tongue tastes bitter things with the taste buds toward the back. Salty and pungent flavors are tasted in the middle of the tongue, sweet flavors at the tip!\r","The first product to have a bar code was Wrigley’s gum.\r","When you sneeze, air and particles travel through the nostrils at speeds over100 mph. During this time, all bodily functions stop, including your heart, contributing to the impossibility of keeping one's eyes open during a sneeze.\r","Annual growth of WWW traffic is 314,000%\r","%60 of all people using the Internet, use it for pornography.\r","In 1778, fashionable women of Paris never went out in blustery weather without a lightning rod attached to their hats.\r","Sex burns 360 calories per hour.\r","A raisin dropped in a glass of fresh champagne will bounce up and down continually from the bottom of the glass to the top.\r","Celery has negative calories! It takes more calories to eat a piece of celery than the celery has in it.\r","The average lead pencil will draw a line 35 miles long or write approximately 50,000 English words. More than 2 billion pencils are manufactured each year in the United States. If these were laid end to end they would circle the world nine times.\r","The pop you hear when you crack your knuckles is actually a bubble of gas burning.\r","A literal translation of a standard traffic sign in China: \"Give large space to the festive dog that makes sport in the roadway.\"\r","You burn more calories sleeping than you do watching TV.\r","Larry Lewis ran the 100-yard dash in 17.8 seconds in 1969, thereby setting a new world's record for runners in the 100-years-or-older class. He was 101.\r","In a lifetime the average human produces enough quarts of spit to fill 2 swimming pools.\r","It's against the law to doze off under a hair dryer in Florida/against the law to slap an old friend on the back in Georgia/against the law to Play hopscotch on a Sunday in Missouri.\r","Barbie's measurements, if she were life-size, would be 39-29-33.\r","The human heart creates enough pressure to squirt blood 30ft.\r","One third of all cancers are sun related.\r","THE MOST UNUSUAL CANNONBALL: On two occasions, Miss 'Rita Thunderbird' remained inside the cannon despite a lot of gunpowder encouragement to do otherwise. She performed in a gold lamé bikini and on one of the two occasions (1977) Miss Thunderbird remained lodged in the cannon, while her bra was shot across the Thames River.\r","It has been estimated that humans use only 10% of their brain.\r","Valentine Tapley from Pike County, Missouri grew chin whiskers attaining a length of twelve feet six inches from 1860 until his death 1910, protesting Abraham Lincoln's election to the presidency.\r","Most Egyptians died by the time they were 30 about 300 years ago,\r","For some time Frederic Chopin, the composer and pianist, wore a beard on only one side of his face, explaining: \"It does not matter, my audience sees only my right side.\"\r","1 in every 4 Americans has appeared someway or another on television.\r","1 in 8 Americans has worked at a McDonalds restaurant.\r","70% of all boats sold are used for fishing.\r","Studies have shown that children laugh an average of 300 times/day and adults 17 times/day, making the average child more optimistic, curious, and creative than the adult.\r","A pregnant goldfish is called a twit.\r","The shortest war in history was between Zanzibar and England in 1896. Zanzibar surrendered after 38 minutes.\r","You were born with 300 bones, but by the time you are an adult you will only have 206.\r","If you go blind in one eye you only lose about one fifth of your vision but all your sense of depth.\r","Women blink nearly twice as much as men.\r","The strongest muscle (Relative to size) in the body is the tongue.\r","A Boeing 747's wingspan is longer than the Wright brother's first flight.\r","American Airlines saved $40,000 in 1987 by eliminating one olive from each salad served in first-class.\r","Average life span of a major league baseball: 7 pitches.\r","A palindrome is a sentence or group of sentences that reads the same backwards as it does forward: Ex: 'Red rum, sir, is murder.' 'Ma is as selfless as I am.' 'Nurse, I spy gypsies. Run!' 'A man, a plan, a canal - Panama.' 'He lived as a devil, eh?'\r","The first CD pressed in the US was Bruce Springsteen's 'Born in the USA'\r","In 1986 Congress & President Ronald Reagan signed Public Law 99-359, which changed Daylight Saving Time from the last Sunday in April to the first Sunday in April. It was estimated to save the nation about 300,000 barrels of oil each year by adding most of the month April to D.S.T.\r","The thumbnail grows the slowest, the middle nail the fastest, nearly 4 times faster than toenails.\r","The Human eyes never grow, but nose and ears never stop growing.\r","The 57 on Heinz ketchup bottles represents the number of varieties of pickles the company once had.\r","Tom Sawyer was the first novel written on a typewriter.\r","If Texas were a country, its GNP would be the fifth largest of any country in the world.\r","There are 1 million ants for every human in the world.\r","Odds of being killed by lightening? 1 in 2million/killed in a car crash? 1 in 5,000/killed by falling out of bed? 1 in 2million/killed in a plane crash? 1 in 25 million.\r","Since 1978, 37 people have died by Vending Machine's falling on them. 13 people are killed annually. All this while trying to shake merchandise out of them. 113 people have been injured.\r","Half the foods eaten throughout the world today were developed by farmers in the Andes Mountains (including potatoes, maize, sweet potatoes, squash, all varieties of beans, peanuts, manioc, papayas, strawberries, mulberries and many others).\r","The 'Golden Arches' of fast food chain McDonalds is more recognized worldwide than the religious cross of Christianity.\r","Former basketball superstar Michael Jordan is the most recognized face in the world, more than the pope himself.\r","The average talker sprays about 300 microscopic saliva droplets per minute, about 2.5 droplets per word.\r","The Earth experiences 50,000 Earth quakes per year and is hit by Lightning 100 times a second.\r","Every year 11,000 Americans injure themselves while trying out bizarre sexual positions.\r","If we had the same mortality rate now as in 1900, more than half the people in the world today would not be alive.\r","On average, Americans eat 18 acres of pizza everyday.\r","Researchers at the Texas Department of Highways in Fort Worth determined the cow population of the U.S. burps some 50 million tons of valuable hydrocarbons into the atmosphere each year. The accumulated burps of ten average cows could keep a small house adequately heated and its stove operating for a year.\r","During a severe windstorm or rainstorm the Empire State Building sways several feet to either side.\r","In the last 3,500 years, there have been approximately 230 years of peace throughout the civilized world.\r","The Black Death reduced the population of Europe by one third in the period from 1347 to 1351.\r","The average person spends about two years on the phone in a lifetime.\r","Length of beard an average man would grow if he never shaved 27.5 feet\r","Over 60% of all those who marry get divorced.\r","400-quarter pounders can be made from 1 cow.\r","A full-loaded supertanker traveling at normal speed takes at least 20 minutes to stop.\r","Coca-Cola was originally green.\r","Men can read smaller print than women; women can hear better.\r","Hong Kong holds the most Rolls Royce’s per capita.\r","Average number of days a West German goes without washing his underwear: 7\r","WWII fighter pilots in the South Pacific armed their airplanes while stationed with .50 caliber machine gun ammo belts measuring 27 feet before being loaded into the fuselage. If the pilots fired all their ammo at a target, he went through \"the whole 9 yards\", hence the term.\r","Average number of people airborne over the US any given hour: 61,000.\r","Intelligent people have more zinc and copper in their hair.\r","Iceland consumes more Coca-Cola per capita than any other nation.\r","In the early 1940s, the FCC assigned television's Channel 1 to mobile services (like two-way radios in taxis) but did not re-number the other channel assignments.\r","The San Francisco Cable cars are the only mobile National Monuments.\r","Firehouses have circular stairways originating from the old days when the engines were pulled by horses. The horses were stabled on the ground floor and figured out how to walk up straight staircases.\r","The Main Library at Indiana University sinks over an inch every year because when it was built, engineers failed to take into account the weight of all the books that would occupy the building.\r","111,111,111 x 111,111,111 = 12,345,678,987,654,321\r","Statues in parks: If the horse has both front legs in the air, the person died in battle; if the horse has one front leg in the air, the person died as a result of wounds received in battle; if the horse has all four legs on the ground, the person died of natural causes.\r","The expression 'to get fired' comes from long ago Clans that wanted to get rid of unwanted people, so they would burn their houses instead of killing them, creating the term 'Got fired'.\r","\"I am.\" is the shortest complete sentence in the English language.\r","Hershey's Kisses are called that because the machine that makes them looks like it's kissing the conveyor belt.\r","The phrase \"rule of thumb\" is derived from an old English law, which stated that you couldn't beat your wife with anything wider than your thumb.\r","The longest recorded flight of a chicken is thirteen seconds.\r","The Eisenhower interstate system requires that one mile in every five must be straight in case of war or emergency, they could be used as airstrips.\r","The name Jeep came from the abbreviation used in the army. G.P. for 'General Purpose' vehicle.\r","The Pentagon, in Arlington, Virginia, has twice as many bathrooms as is necessary, because when it was built in the 1940s, the state of Virginia still had segregation laws requiring separate toilet facilities for blacks and whites.\r","The cruise liner, Queen Elizabeth II, moves only six inches for each gallon of diesel that it burns.\r","If you have three quarters, four dimes, and four pennies, you have $1.19, the largest amount of money in coins without being able to make change for a dollar.\r","In Aspen Colorado, you can have a maximum income of $104,000 and still receive government subsidized housing.\r","Honking of car horns for a couple that just got married is an old superstition to insure great sex.\r","Dr. Kellogg introduced Kellogg's Corn Flakes in hopes that it would reduce masturbation.\r","The sperm of a mouse is actually longer than the sperm of an elephant.\r","In medieval France, unfaithful wives were made to chase a chicken through town naked.\r","The Black Widow spider eats her mate during or after sex.\r","Napoleon's penis was sold to an American Urologist for $40,000.\r","Eating the heart of a male Partridge was the cure for impotence in ancient Babylon.\r","A bull can inseminate 300 cows from one single ejaculation.\r","When a Hawaiian woman wears a flower over her left ear, it means that she is not available.\r","The \"save\" icon on Microsoft Word shows a floppy disk with the shutter on backwards.\r","The only nation whose name begins with an \"A\", but doesn't end in an \"A\" is Afghanistan.\r","The following sentence: 'A rough-coated, dough-faced, thoughtful ploughman strode through the streets of Scarborough; after falling into a slough, he coughed and hiccoughed.' Contains the nine different pronunciations of \"ough\" in the English Language.\r","The verb \"cleave\" is the only English word with two synonyms which are antonyms of each other: adhere and separate.\r","The only 15-letter word that can be spelled without repeating a letter is uncopyrightable.\r","The shape of plant collenchyma’s cells and the shape of the bubbles in beer foam are the same - they are orthotetrachidecahedrons.\r","Emus and kangaroos cannot walk backwards, and are on the Australian coat of arms for that reason.\r","Cats have over one hundred vocal sounds, while dogs only have about ten.\r","Blueberry Jelly Bellies were created especially for Ronald Reagan.\r","PEZ candy even comes in a Coffee flavor.\r","The first song played on Armed Forces Radio during operation Desert Shield was \"Rock the Casba\" by the Clash.\r","Non-dairy creamer is flammable.\r","The airplane Buddy Holly died in was the \"American Pie.\" (Thus the name of the Don McLean song.)\r","Each king in a deck of playing cards represents a great king from history. Spades - King David, Clubs - Alexander the Great, Hearts - Charlemagne, and Diamonds - Julius Caesar.\r","Golf courses cover 4% of North America.\r","The average person will accidentally eat just under a pound of insects every year.\r","Until 1994, world maps and globes sold in Albania only had Albania on them.\r","The value of Pi will be officially \"rounded down\" to 3.14 from 3.14159265359 on December 31, 1999.\r","The Great Wall of China is the only man-made structure visible from space.\r","A piece of paper can be folded no more then 9 times.\r","The amount of computer Memory required to run WordPerfect for Win95 is 8 times the amount needed aboard the space shuttle.\r","The average North American will eat 35,000 cookies during their life span.\r","Between 25% and 33% of the population sneeze when exposed to light.\r","The most common name in world is Mohammed.\r","Mount Olympus Mons on Mars is three times the size of Mount Everest.\r","Most toilets flush in E flat.\r","2,000 pounds of space dust and other space debris fall on the Earth every day.\r","Each month, there is at least one report of UFOs from each province of Canada.\r","40,000 Americans are injured by toilets each year.\r","You can be fined up to $1,000 for whistling on Sunday in Salt Lake City, Utah.\r","It takes about 142.18 licks to reach the center of a Tootsie pop.\r","The serial number of the first MAC ever produced was 2001.\r","It is illegal to eat oranges while bathing in California.\r","If done perfectly, a rubix cube combination can be solved in 17 turns.\r","The average American butt is 14.9 inches long.\r","More bullets were fired in 'Starship Troopers' than any other movie ever made.\r","60% of electrocutions occur while talking on the telephone during a thunderstorm.\r","The name of the girl on the statue of liberty is Mother of Exiles.\r","3.6 cans of Spam are consumed each second.\r","There's a systematic lull in conversation every 7 minutes.\r","The buzz from an electric razor in America plays in the key of B flat; Key of G in England.\r","There are 1,575 steps from the ground floor to the top of the Empire State building.\r","The world's record for keeping a Lifesaver in the mouth with the hole intact is 7 hrs 10 min.\r","There are 293 ways to make change for a dollar.\r","The world record for spitting a watermelon seed is 65 feet 4 inches.\r","In the Philippine jungle, the yo-yo was first used as a weapon.\r","Dueling is legal in Paraguay as long as both parties are registered blood donors.\r","Texas is also the only state that is allowed to fly its state flag at the same height as the U.S. flag.\r","The three most recognized Western names in China are Jesus Christ, Richard Nixon, & Elvis Presley.\r","There is a town in Newfoundland, Canada called Dildo.\r","The Boston University Bridge (on Commonwealth Avenue, Boston, Massachusetts) is the only place in the world where a boat can sail under a train driving under a car driving under an airplane.\r","All 50 states are listed across the top of the Lincoln Memorial on the back of the $5 bill.\r","In space, astronauts are unable to cry, because there is no gravity and the tears won't flow.\r","Chewing gum while peeling onions will keep you from crying.\r","There are more plastic flamingos in the U.S that there are real ones.\r","The crack of a whip is actually a tiny sonic boom, since the tip breaks the sound barrier.\r","Jupiter is bigger than all the other planets in our solar system combined.\r","Hot water is heavier than cold.\r","The common idea that only 10% of the brain is used it not true as it is impossible to determine the actual percentage because of the complexity of the brain.\r","Lawn darts are illegal in Canada.\r","There are more psychoanalysts per capita in Buenos Aires than any other place in the world.\r","Between 2 and 3 jockeys are killed each year in horse racing.\r","5,840 people with pillow related injuries checked into U.S. emergency rooms in 1992.\r","The average woman consumes 6 lbs of lipstick in her lifetime.\r","Some individuals express concern sharing their soap, rightly so, considering 75% of all people wash from top to bottom.\r","Conception occurs most in the month of December.\r","CBS' \"60 Minutes\" is the only TV show without a theme song/music.\r","Half of all Americans live within 50 miles of their birthplace.\r","'Obsession' is the most popular boat name.\r","On average, Americans' favorite smell is banana.\r","If one spells out numbers, they would have to count to One Thousand before coming across the letter \"A\".\r","Honey is the only food which does not spoil.\r","3.9% of all women do not wear underwear.\r","This common everyday occurrence composed of 59% nitrogen, 21% hydrogen, and 9% dioxide is called a 'fart'.\r","\"Evaluation and Parameterization of Stability and Safety Performance Characteristics of Two and Three Wheeled Vehicular Toys for Riding.\" Title of a $230,000 research project proposed by the Department of Health, Education and Welfare, to study the various ways children fall off bicycles.\r","Babies are born without kneecaps. They don't appear until the child reaches 2-6 years of age.\r","Meteorologists claim they're right 85% of the time (think about that one!)\r","In 1980, a Las Vegas hospital suspended workers for betting on when patients would die.\r","Los Angeles' full name 'El Pueblo de Nuestra Senora la Reina de Los Angeles de Porciuncula' is reduced to 3.63% of its size in the abbreviation 'L.A.'.\r","If you went out into space, you would explode before you suffocated because there's no air pressure.\r","The only real person to ever to appear on a pez dispenser was Betsy Ross.\r","Mike Nesmith's (the guitarist of The Monkeys) mom invented White Out.\r","Only 6 people in the whole world have died from moshing.\r","In a test performed by Canadian scientists, using various different styles of music, it was determined that chickens lay the most eggs when pop music was played.\r","The storage capacity of human brain exceeds 4 Terabytes.\r","In Vermont, the ratio of cows to people is 10:1\r","Any free-moving liquid in outer space will form itself into a sphere, because of its surface tension.\r","The average American looks at eight houses before buying one.\r","In the average lifetime, a person will walk the equivalent of 5 times around the equator.\r","Koala is Aboriginal for \"no drink\".\r","Shakespeare spelled his OWN name several different ways.\r","The first contraceptive was crocodile dung used by the ancient Egyptians.\r","A signature is called a John Hancock because he signed the Declaration of Independence. Only 2 people signed the declaration of independence on July 4. The Last person signed 2 years later.\r","Arnold Schonberg suffered from triskaidecaphobia, the fear of the number 13. He died at 13 minutes from midnight on Friday the 13th.\r","Mozart wrote the nursery rhyme 'twinkle, twinkle, little star' at the age of 5.\r","Weatherman Willard Scott was the first original Ronald McDonald.\r","Virginia Woolf wrote all her books standing.\r","Einstein couldn't speak fluently until after his ninth birthday. His parents thought he was mentally retarded.\r","Al Capone's business card said he was a used furniture dealer.\r","Deborah Winger did the voice of E.T.\r","Kelsey Grammar sings and plays the piano for the theme song of Fraiser.\r","Thomas Edison, acclaimed inventor of the light bulb, was afraid of the dark.\r","In England, the Speaker of the House is not allowed to speak.\r","You can sail all the way around the world at latitude 60 degrees south.\r","The earth weighs around 6,588,000,000,000,000,000,000,000,000 tons.\r","Peanuts are one of the ingredients of dynamite.\r","Porcupines can float in water.\r","The average person's left hand does 56% of the typing.\r","A shark is the only fish that can blink with both eyes.\r","The longest one-syllable word in the English language is \"screeched.\"\r","All of the clocks in the movie \"Pulp Fiction\" are stuck on 4:20, a national pot-smokers hour.\r","\"Dreamt\" is the only English word that ends in the letters \"mt.\"\r","Almonds are a member of the peach family.\r","Winston Churchill was born in a ladies' room during a dance.\r","Maine is the only state whose name is just one syllable.\r","There are only four words in the English language which end in \"dous\": tremendous, horrendous, stupendous, and hazardous.\r","Tigers not only have striped fur, they have striped skin!\r","In most advertisements, including newspapers, the time displayed on a watch is 10:10.\r","On the ground, a group of geese is a gaggle, in the sky it is a skein.\r","To Ensure Promptness, one is expected to pay beyond the value of service – hence the later abbreviation: T.I.P.\r","When the University of Nebraska Cornhuskers play football at home, the stadium becomes the state's third largest city.\r","The characters Bert and Ernie on Sesame Street were named after Bert the cop and Ernie the taxi driver in Frank Capra's \"Its A Wonderful Life.\"\r","A dragonfly has a lifespan of 24 hours.\r","A dime has 118 ridges around the edge.\r","On an American one-dollar bill, there is an owl in the upper left-hand corner of the \"1\"encased in the \"shield\" and a spider hidden in the front upper right-hand corner.\r","The name for Oz in the \"Wizard of Oz\" was thought up when the creator, Frank Baum, looked at his filing cabinet and saw A-N, and O-Z; hence the name \"OZ.\"\r","The microwave was invented after a researcher walked by a radar tube and a chocolate bar melted in his pocket.\r","Mr. Rogers is an ordained minister.\r","John Lennon's first girlfriend was named Thelma Pickles.\r","There are 336 dimples on a regulation golf ball.\r","The scene where Indiana Jones shoots the swordsman in Raider’s of the Lost Ark was Harrison Ford's idea so that he could take a bathroom break.\r","A crocodile cannot stick its tongue out.\r","A snail can sleep for three years.\r","All polar bears are left-handed.\r","China has more English speakers than the United States.\r","Elephants are the only animals that can't jump.\r","February 1865 is the only month in recorded history not to have a full moon.\r","If the population of China walked past you in single file, the line would never end because of the rate of reproduction.\r","If you yelled for 8 years, 7 months and 6 days, you will have produced enough sound energy to heat one cup of coffee.\r","In the last 4000 years, no new animals have been domesticated.\r","Leonardo Da Vinci invented the scissors.\r","The word \"set\" has more definitions than any other word in the English language.\r","Nutmeg is extremely poisonous if injected intravenously.\r","On average, people fear spiders more than they do death.\r","One of the reasons marijuana is illegal today is because cotton growers in the 1930s lobbied against hemp farmers they saw it as competition.\r","Shakespeare invented the word 'assassination' and 'bump'.\r","Some lions mate over 50 times a day.\r","Starfish haven't got brains.\r","The ant always falls over on its right side when intoxicated.\r","The name of all continents in the world end with the same letter that they start with.\r","There are two credit cards for every person in the United States.\r","The longest word comprised of one row on the keyboard is: TYPEWRITER\r","You can't kill yourself by holding your breath. \r","The average person spends 12 weeks a year 'looking for things'.\r","The symbol on the \"pound\" key (#) is called an octothorpe.. \r","The dot over the letter 'i' is called a tittle. \r","Ingrown toenails are hereditary. \r","\"Underground\" is the only word in the English language that begins and ends with the letters \"und\"\r","The longest word in the English language, according to the Oxford English Dictionary, is: pneumonoultramicroscopicsilicovolcanoconiosis.. \r","The longest place-name still in use is: Taumatawhakatangihangakoauauotamateaturipukakapikimaungahoronukupokaiakitnatahu, a New Zealand hill. \r","An ostrich's eye is bigger than its brain. \r","Alfred Hitchcock didn't have a belly button. It was eliminated when he was sewn up after surgery.\r","Telly Savalas and Louis Armstrong died on their birthdays. \r","Donald Duck's middle name is Fauntleroy. \r","The muzzle of a lion is like a fingerprint - no two lions have the same pattern of whiskers. \r","Steely Dan got their name from a sexual device depicted in the book 'The Naked Lunch'. \r","The Ramses brand condom is named after the great pharoh Ramses II who fathered over 160 children.\r","There is a seven letter word in the English language that contains ten words without rearranging any of its letters, \"therein\": the, there, he, in, rein, her, here, ere, therein, herein. \r","A goldfish has a memory span of three seconds. \r","Cranberries are sorted for ripeness by bouncing them; a fully ripened cranberry can be dribbled like a basketball. \r","The male gypsy moth can \"smell\" the virgin female gypsy moth from 1.8 miles away. \r","The letters KGB stand for Komitet Gosudarstvennoy Bezopasnosti. \r","The word \"dexter\" whose meaning refers to the right hand is typed with only the left hand. \r","To \"testify\" was based on men in the Roman court swearing to a statement made by swearing on their testicles. \r","Facetious and abstemious contain all the vowels in the correct order, as does arsenious, meaning \"containing arsenic.\" \r","The word \"Checkmate\" in chess comes from the Persian phrase \"Shah Mat,\" which means \"the king is dead.\"\r","The first episode of \"Joanie Loves Chachi\" was the highest rated American program in the history of Korean television, a country where \"Chachi\" translates to \"penis\". \r","Rubber bands last longer when refrigerated. \r","The national anthem of Greece has 158 verses. No one in Greece has memorized all 158 verses. \r","Two-thirds of the world's eggplant is grown in New Jersey. \r","The giant squid has the largest eyes in the world.\r","Giraffes have no vocal cords.\r","The pupils of a goat's eyes are square.\r","Van Gogh only sold one painting when he was alive.\r","A standard slinky measures 87 feet when stretched out.\r","The highest per capita Jell-O comsumption in the US is Des Moines.\r","If a rooster can't fully extend its neck, it can't crow.\r","There were always 56 curls in Shirley Temple's hair.\r","The eyes of a donkey are positioned so that it can see all four feet at all times.\r","Worcestershire sauce in essentially an Anchovy Ketchup.\r","Rhode Island is the only state which the hammer throw is a legal high school sport.\r","The average lifespan of an eyelash is five months.\r","A spider has transparent blood.\r","Every acre of American crops harvested contains 100 pounds of insects.\r","Prince Charles is an avid collecter of toilet seats.\r","The most common street name in the U.S. is Second Street.\r","Tehran is the most expensive city on earth.\r","The sweat drops drawn in cartoon comic strips are called pleuts.\r","Babies are most likely to be born on Tuesdays.\r","The HyperMart outside of Garland Texas has 58 check-outs.\r","The Minneapolis phone book has 21 pages of Andersons.\r","In the 1980's American migraines increased by 60%.\r","Poland is the \"stolen car capital of the world\".\r","Jefferson invented the dumbwaiter, the monetary system, and the folding attic ladder.\r","The S in Harry S. Truman did not stand for anything.\r","In Miconesia, coins are 12 feet across.\r","A horse can look forward with one eye and back with the other.\r","Shakespeare is quoted 33,150 times in the Oxford English dictionary.\r","The word Pennsylvania is misspelled on the Liberty Bell.\r","NBA superstar Michael Jordan was originally cut from his high school basketball team.\r","You spend 7 years of your life in the bathroom.\r","A family of 26 could go to the movies in Mexico city for the price of one in Tokyo.\r","10,000 Dutch cows pass through the Amsterdam airport each year.\r","Approximately every seven minutes of every day, someone in an aerobics class pulls their hamstring.\r","Simplistic passwords contribute to over 80% of all computer password break-ins.\r","The top 3 health-related searches on the Internet are (in this order): Depression, Allergies, & Cancer.\r","Dentists have recommended that a toothbrush be kept at least 6 feet away from a toilet to avoid airborne particles resulting from the flush.\r","Most dust particles in your house are made from dead skin.\r","Venus is the only planet that rotates clockwise.\r","Oak trees do not produce acorns until they are fifty years of age or older.\r","The first owner of the Marlboro company died of lung cancer.\r","All US Presidents have worn glasses; some just didn't like being seen wearing them in public.\r","Mosquito repellents don't repel. They hide you. The spray blocks the mosquito's sensors so they don't know you're there.\r","Walt Disney was afraid of mice.\r","The site with the highest number of women visitors between the age of 35 and 44 years old: Alka-Seltzer.com\r","The king of hearts is the only king without a mustache.\r","Pearls melt in vinegar.\r","It takes 3,000 cows to supply the NFL with enough leather for a year's supply of footballs.\r","Thirty-five percent of people who use personal ads for dating are already married.\r","The 3 most valuable brand names on earth are Marlboro, Coca-Cola, and Budweiser (in that order).\r","Humans are the only primates that don't have pigment in the palms of their hands.\r","Months that begin on a Sunday will always have a 'Friday the 13th'.\r","The fingerprints of koala bears are virtually indistinguishable from those of humans, so much so that they can be easily confused at a crime scene.\r","The mask worn by Michael Myers in the original \"Halloween\" was actually a Captain Kirk mask painted white.\r","The only two days of the year in which there are no professional sports games--MLB, NBA, NHL, or NFL--are the day before and the day after the Major League All-Star Game.\r","Only one person in two billion will live to be 116 or older.\r","When the French Academy was preparing its first dictionary, it defined \"crab\" as, \"A small red fish, which walks backwards.\" This definition was sent with a number of others to the naturalist Cuvier for his approval. The scientist wrote back, \"Your definition, gentlemen, would be perfect, only for three exceptions. The crab is not a fish, it is not red and it does not walk backwards.\"\r","Dr. Jack Kevorkian first patient has Alzheimer's disease.\r","Fictional/horror writer Stephen King sleeps with a nearby light on to calm his fear of the dark. \r","It's possible to lead a cow upstairs but not downstairs.\r","It was discovered on a space mission that a frog can throw up. The frog throws up its stomach first, so the stomach is dangling out of its mouth. Then the frog uses its forearms to dig out all of the stomach's contents and then swallows the stomach back down.\r","The very first song played on MTV was 'Video Killed The Radio Star' by the Buggles.\r","William Marston engineered one of the earliest forms of the polygraph in the early 1900's. Later he went on to create the comic strip Wonder Woman, a story about a displaced Amazon princess who forces anyone caught in her magic lasso to tell the truth\r","Americans travel 1,144,721,000 miles by air every day\r","The the U.S. you dial '911'. In Stockholm, Sweden you dial 90000\r","38% of American men say they love their cars more than women\r","The U.S. military operates 234 golf courses\r","100% of lottery winners do gain weight\r","Bullet proof vests, fire escapes, windshield wipers, and laser printers were all invented by women\r","A cat has 32 muscles in each ear.\r","A duck's quack doesn't echo, and no one knows why.\r","Cats urine glows under a black light.\r","In every episode of Seinfeld there is a Superman somewhere.\r","Lorne Greene had one of his nipples bitten off by an alligator while he was host of \"Lorne Greene's Wild Kingdom.\"\r","Pamela Anderson Lee is Canada's Centennial Baby, being the first baby born on the centennial anniversary of Canada's independence.\r","Pinocchio is Italian for \"pine head.\"\r","When possums are playing 'possum', they are not \"playing.\" They actually pass out from sheer terror.\r","Who's that playing the piano on the \"Mad About You\" theme? Paul Reiser himself.\r","Winston Churchill was born in a ladies' room during a dance.\r","Most lipstick contains fish scales!\r","Donald Duck comics were banned from Finland because he doesn't wear pants!\r","There are more than 10 million bricks in the Empire State Building!\r","Camels have three eyelids to protect themselves from blowing sand!\r","The placement of a donkey's eyes in its' heads enables it to see all four feet at all times!\r","The average American/Canadian will eat about 11.9 pounds of cereal per year!\r","Over 1000 birds a year die from smashing into windows!\r","The state of Florida is bigger than England!\r","Dolphins sleep with one eye open!\r","In the White House, there are 13,092 knives, forks and spoons!\r","Recycling one glass jar, saves enough energy to watch T.V for 3 hours!\r","Owls are one of the only birds who can see the color blue!\r","Honeybees have a type of hair on their eyes!\r","A jellyfish is 95 percent water!\r","In Bangladesh, kids as young as 15 can be jailed for cheating on their finals!\r","The katydid bug hears through holes in its hind legs!\r","Q is the only letter in the alphabet that does not appear in the name of any of the United States!\r","166,875,000,000 pieces of mail are delivered each year in the US\r","Bats always turn left when exiting a cave\r","The praying mantis is the only insect that can turn its head\r","Daffy Duck's middle name is \"Dumas\"\r","In Disney's Fantasia, the Sorcerer's name is \"Yensid\" (Disney backwards.)\r","In The Empire Strikes Back there is a potato hidden in the asteroid field\r","Walt Disney holds the world record for the most Academy Awards won by one person, he has won twenty statuettes, and twelve other plaques and certificates\r","James Bond's car had three different license plates in Goldfinger\r","Canada makes up 6.67 percent of the Earth's land area\r","South Dakota is the only U.S state which shares no letters with the name of it's capital\r","The KGB is headquartered at No. 2 Felix Dzerzhinsky Square, Moscow\r","The Vatican city registered 0 births in 1983\r","Spain leads the world in cork production\r","There are 1,792 steps in the Eiffel Tower\r","There are 269 steps to the top of the Leaning Tower of Pisa\r","Leonardo da Vinci could write with one hand while drawing with the other"] ================================================ FILE: src/lib/constants/nsfw/subreddits.json ================================================ { "amateur": ["Amateur", "RealGirls", "randomsexiness", "PetiteGoneWild", "homemadexxx", "AmateurArchives"], "anal": ["anal", "buttsex", "AnalPorn", "upherbutt", "CumFromAnal"], "asiannsfw": ["AsianHotties", "juicyasians", "AsianNSFW", "AsianPorn", "AsianHottiesGIFS"], "bdsm": ["bdsm", "Spanking", "kinkyporn"], "blowjob": ["Blowjobs", "OnHerKnees", "deepthroat", "BlowjobGifs", "OralSex", "dreamjobs", "lickingdick"], "boobs": ["Boobies", "TittyDrop", "boobbounce", "boobs", "boobgifs", "tits", "BreastEnvy", "PerfectTits"], "booty": ["booty", "SpreadEm", "twerking", "ButtsAndBareFeet", "booty_gifs"], "ass": ["ass", "TheUnderbun", "HighResASS", "AssOnTheGlass", "datass", "assgifs"], "cosplay": ["nsfwcosplay", "starwarsnsfw", "cosplayonoff", "Cosporn", "CosplayBoobs", "PornParody", "Cosplayheels"], "fitgirls": ["fitgirls", "AthleticGirls", "Ohlympics", "NSFW_Hardbodies", "LockerRoom", "GymnastGirls", "worldcupgirls"], "gifs": ["NSFW_GIF", "nsfw_gifs", "60fpsporn", "NSFW_HTML5", "porn_gifs", "adultgifs", "randomsexygifs", "PornGifs"], "gonewild": ["gonewild", "gonewildcurvy", "asstastic", "AsiansGoneWild", "GWCouples", "GoneWildPlus", "GoneWildTube", "ladybonersgw"], "hentai": ["hentai", "ecchi", "HENTAI_GIF", "doujinshi", "WesternHentai", "pantsu", "hentaivids", "hentaibondage", "MonsterGirl", "Lolicons"], "lesbian": ["lesbians", "StraightGirlsPlaying", "girlskissing", "mmgirls", "scissoring", "dyke", "GirlsCuddling", "amateurlesbians", "Lesbian_gifs"], "milfs": ["milf", "MilfsAndHousewives", "maturemilf", "realmilf", "ChocolateMilf", "GroupOfNudeMILFS", "HotAsianMilfs", "MILFS", "realmoms"], "nsfw": ["nsfw", "nsfwhardcore", "nsfw2", "HighResNSFW", "BonerMaterial", "porn", "iWantToFuckHer", "Sexy", "nude", "NSFWCute", "HotGirls"], "nsfwsnapchat": ["NSFW_Snapchat", "snapcgatgw", "snapchatboobs", "SnapchatImages", "NudeSelfies", "CellShots", "selfshots", "selfpix", "xPosing"], "pussy": ["pussy", "rearpussy", "vagaina", "PussyMound", "PerfectPussies", "TheRearPussy", "PussySlip"], "teen": ["LegalTeens", "just18", "youngporn", "Barelylegal", "barelylegalteens"] } ================================================ FILE: src/lib/constants/yomomma.json ================================================ [ "Yo mama is so fat that her bellybutton gets home 15 minutes before she does.", "Yo mama is so fat that when she was diagnosed with a flesh-eating disease, the doctor gave her ten years to live.", "Yo mama is so fat that the National Weather Service names each one of her farts.", "Yo mama is so fat that when she wears a yellow raincoat, people yell \"taxi!\"", "Yo mama is so fat and dumb that the only reason she opened her email was because she heard it contained spam.", "Yo mama is so fat she threw on a sheet for Halloween and went as Antarctica.", "Yo mama is so fat that she looked up cheat codes for Wii Fit", "Yo mama is so fat that the only exercise she gets is when she chases the ice cream truck.", "Yo mama is so fat that she sat on a dollar and squeezed a booger out George Washington's nose.", "Yo mama is so fat that when she gets in an elevator, it has to go down.", "Yo mama is so fat that when her beeper goes off, people think she's backing up.", "Yo mama is so fat that she has to iron her pants on the driveway.", "Yo mama is so fat that she left the house in high heels and came back wearing flip flops.", "Yo mama is so fat that people jog around her for exercise.", "Yo mama is so fat that she was floating in the ocean and Spain claimed her for the New World.", "Yo mama is so fat that when she walked in front of the TV, I missed 3 seasons of Breaking Bad.", "Yo mama is so fat that you have to grease the door frame and hold a twinkie on the other side just to get her through!", "Yo mama is so fat that that when she sits on the beach, Greenpeace shows up and tries to tow her back into the ocean...", "Yo mama is so fat that when she bungee jumps, she brings down the bridge too.", "Yo mama is so fat that when she talks to herself, itgs a long distance call.", "Yo mama is so fat that the last time she saw 90210, it was on a scale.", "Yo mama is so fat that light bends around her.", "Yo mama is so fat that I took a picture of her last Christmas and it's still printing!", "Yo mama is so fat that when she sat on Wal-Mart, she lowered the prices.", "Yo mama is so fat that when she sat on an iphone, it turned into an ipad.", "Yo mama is so fat that even god can't lift her spirit.", "Yo mama is so fat that she gets group insurance.", "Yo mama is so fat that she was zoned for commercial development.", "Yo mama is so fat that she walked into the Gap and filled it.", "Yo mama is so fat that she comes at you from all directions.", "Yo mama is so fat that when she climbed onto a diving board at the beach, the lifeguard told your dad \"sorry, you can't park here\".", "Yo mama is so fat that her cereal bowl came with a lifeguard.", "Yo mama is so fat that she looks like shegs smuggling a Volkswagen.", "Yo mama is so fat that when she got her shoes shined, she had to take the guygs word for it.", "Yo mama is so fat that when she sings, itgs over for everybody.", "Yo mama is so fat that when she ran away, they had to use all four sides of the milk carton to display her picture.", "Yo mama is so fat that when she was growing up she didngt play with dolls, she played with midgets.", "Yo mama is so fat that she uses two buses for roller-blades.", "Yo mama's so fat she blew up the Deathstar.", "Yo mama is so fat that when she goes to a buffet, she gets the group rate.", "Yo mama is so fat that she has to put her belt on with a boomerang.", "Yo mama is so fat that she broke the Stairway to Heaven.", "Yo mama is so fat that she doesngt eat with a fork, she eats with a forklift.", "Yo mama is so fat that the last time the landlord saw her, he doubled the rent.", "Yo mama is so fat that Weight Watchers wongt look at her.", "Yo mama is so fat that the highway patrol made her wear a sign saying \"Caution! Wide Turn\".", "Yo mama is so fat that when she sits around the house, she SITS AROUND THE HOUSE!", "Yo mama is so fat that when she steps on a scale, it reads \"one at a time, please\".", "Yo mama is so fat that she fell in love and broke it.", "Yo mama is so fat that when she gets on the scale it says \"We don't do livestock\".", "Yo mama is so fat that when she tripped on 4th Ave, she landed on 12th.", "Yo mama is so fat that God couldn't light the Earth until she moved!", "Yo mama is so fat that even Bill Gates couldn't pay for her liposuction!", "Yo mama is so fat that she has to pull down her pants to get into her pockets.", "Yo mama is so fat that she was born on the fourth, fifth, and sixth of June.", "Yo mama is so fat that she could fall down and wouldngt even know it.", "Yo mama is so fat that the sign inside one restaurant says, “Maximum occupancy: 300, or Yo momma.”", "Yo mama is so fat that she puts mayonnaise on aspirin.", "Yo mama is so fat that she was born with a silver shovel in her mouth.", "Yo mama is so fat that when she hauls ass, she has to make two trips.", "Yo mama is so fat that she had to go to Sea World to get baptized.", "Yo mama is so fat that her bellybuttongs got an echo.", "Yo mama is so fat that when she turns around people throw her a welcome back party.", "Yo mama is so fat that her belly button doesngt have lint, it has sweaters.", "Yo mama is so fat that a picture of her would fall off the wall.", "Yo mama is so fat that when she takes a shower, her feet dongt get wet.", "Yo mama is so fat that she puts on her lipstick with a paint-roller!", "Yo mama is so fat that she could sell shade.", "Yo mama is so fat that I ran around her twice and got lost.", "Yo mama is so fat that the shadow of her butt weighs 100 pounds.", "Yo mama is so fat that when shegs standing on the corner police drive by and yell, “Hey, break it up.”", "Yo mama is so fat that her blood type is Ragu.", "Yo mama is so fat that when she runs the fifty-yard dash she needs an overnight bag.", "Yo mama is so fat that she cangt even fit into an AOL chat room.", "Yo mama is so fat when she goes skydiving she doesn't use a parachute to land, she uses a twin-engine plane!", "Yo mama is so fat MTX audio's subwoofers couldn't rattle her bones!", "Yo mama is so fat her headphones are a pair of PA speakers connected to a car amplifier.", "Yo mama is so fat that she doesngt have a tailor, she has a contractor.", "Yo mama is so fat that eating contests have banned her because she is unfair competition.", "Yo mama is so fat that she measures 36-24-36, and the other arm is just as big.", "Yo mama is so fat that she gets her toenails painted at Luckygs Auto Body.", "Yo mama is so fat that when she goes to an amusement park, people try to ride HER!", "Yo mama is so fat that when she jumps up in the air she gets stuck!", "Yo mama is so fat that she has more Chins than a Chinese phone book!", "Yo mama is so fat that she influences the tides.", "Yo mama is so fat that when she plays hopscotch, she goes \"New York, L.A., Chicago...\"", "Yo mama is so fat that NASA has to orbit a satellite around her!", "Yo mama is so fat that when she sits on my face I can't hear the stereo.", "Yo mama is so fat that they have to grease the bath tub to get her out!", "Yo mama is so fat that she's on both sides of the family!", "Yo mama is so fat that at the zoo, the elephants throw HER peanuts.", "Yo mama is so fat you have to roll over twice to get off her.", "Yo mama is so fat that she sets off car alarms when she runs.", "Yo mama is so fat that she cant reach into her back pocket.", "Yo mama is so fat that she has her own gravity field.", "Yo mama is so fat that she stepped on a rainbow and made Skittles.", "Yo mama is so fat that the only pictures you have of her were taken by satellite cameras.", "Yo mama is so fat that when she wears a \"Malcolm X\" T-shirt, helicopters try to land on her back!", "Yo mama is so fat that it took Usain Bolt 3 years to run around her.", "Yo mama so fat that she sweats more than a dog in a chinese restaurant.", "Yo mama so fat, that went she stepped in the water, Thailand had to declare another tsunami warning.", "Yo mama is so fat that that she cant tie her own shoes.", "Yo mama is so fat that when she lays on the beach, people run around yelling Free Willy.", "Yo mama is so fat that she uses redwoods to pick her teeth", "Yo mama is so fat that she cut her leg and gravy poured out", "Yo mama is so fat that she was in the Macygs Thanksgiving Day Parade... wearing ropes.", "Yo mama is so fat that she went on a light diet. As soon as itgs light she starts eating.", "Yo mama is so fat that shegs half Italian, half Irish, and half American.", "Yo mama is so fat that her waist size is the Equator.", "Yo mama is so fat that she cangt even jump to a conclusion.", "Yo mama is so fat that she uses a mattress for a tampon.", "Yo mama is so fat that when she got hit by a bus, she said, \"Who threw that rock at me?\"", "Yo mama is so fat that we went to the drive-in and didn't have to pay for her because we dressed her up as a Toyota.", "Yo mama is so fat that when she was born, she gave the hospital stretch marks.", "Yo mama is so fat that she was cut from the cast of E.T., because she caused an eclipse when she rode the bike across the moon.", "Yo mama is so fat that when you get on top of her your ears pop.", "Yo mama is so fat that she got hit by a car and had to go to the hospital to have it removed.", "Yo mama is so fat that she eats \"Wheat Thicks\".", "Yo mama is so fat that we're in her right now!", "Yo mama is so fat that she went to the movie theatre and sat next to everyone.", "Yo mama is so fat that she has been declared a natural habitat for condors.", "Yo mama is so fat that when she wants to shake someones hand, she has to give directions!", "Yo mama is so fat that even Dora can't explore her!", "Yo mama is so fat that when she gets on the scale it says \"to be continued\".", "Yo mama is so fat that when she goes to a resturant, she looks at the menu and says \"okay!\"", "Yo mama is so fat that even Chuck Norris couldn't run around her.", "Yo mama is so fat that her neck looks like a dozen hot dogs!", "Yo mama is so fat that when she bungee jumps she goes straight to hell!", "Yo mama is so fat that she's got her own area code!", "Yo mama is so fat that she looks like she's smuggling a Volkswagon!", "Yo mama is so fat that she has to buy three airline tickets.", "Yo mama is so fat that whenever she goes to the beach the tide comes in!", "Yo mama is so fat that she's got Amtrak written on her leg.", "Yo mama is so fat that her legs are like spoiled milk - white & chunky!", "Yo mama is so fat that I had to take a train and two buses just to get on the her good side!", "Yo mama is so fat that she wakes up in sections!", "Yo mama so fat, all she wants for Christmas is to see her feet.", "Yo mama is so fat that when she lies on the beach no one else gets any sun!", "Yo mama is so fat that that her senior pictures had to be taken from a helicopter!", "Yo mama is so fat that everytime she walks in high heels, she strikes oil!", "Yo mama is so fat that she fell and created the Grand Canyon!", "Yo mama is so fat that her butt drags on the ground and kids yell - \"there goes santa claus with his bag of toys!\"", "Yo mama is so fat that even her clothes have stretch marks!", "Yo mama is so fat that she has to use a VCR as a beeper!", "Yo mama is so fat that when she asked for a waterbed, they put a blanket over the ocean!", "Yo mama is so fat that she got hit by a parked car!", "Yo mama is so fat that they use the elastic in her underwear for bungee jumping.", "Yo mama is so fat that when we were playing Call of Duty, I got a 20 kill streak for killing her.", "Yo mama is so fat that Dracula got Type 2 Diabetes after biting her neck.", "Yo mama is so fat that when she visited Toronto's City Hall, she was arrested for attempting to smuggle 500 lbs of crack into Mayor Rob Ford's office.", "Yo mama is so fat that when she fell over she rocked herself asleep trying to get up again.", "Yo mama is so fat that that when I tried to drive around her I ran out of gas.", "Yo mama is so fat that when she went to church and sat on a bible, Jesus came out and said \"LET MY PEOPLE GO!\"", "Yo mama is so fat that when she dances at a concert the whole band skips.", "Yo mama is so fat that she stands in two time zones.", "Yo mama is so fat that she went to the fair and the kids thought she was a bouncy castle.", "Yo mama is so fat that when she goes to an all you can eat buffet, they have to install speed bumps.", "Yo mama is so fat that the camera TAKES AWAY 10 lbs from her appearance.", "Yo mama is so fat that her sedan can fit 5 people... or just yo mama with the front seats removed.", "Yo mama is so fat that when she went to seaworld the whales started singing \"We Are Family\".", "Yo mama is so fat that she fell out of both sides of her bed.", "Yo mama is so fat that the stripes on her pajamas never end.", "Yo mama is so fat, Al Gore accuses her of global warning everytime she farts!", "Yo mama is so fat that she's got every caterer in the city on speed dial!", "Yo mama's so fat that when she goes on a scale, it shows her own phone number.", "Yo mama's so fat that she doesn't need the internet - she's worldwide.", "Yo mama's so fat that when she goes on a scale, it reads \"lose some weight\".", "Yo mama's so fat that she doesn't get dreams, she gets movies!", "Yo mama's so fat that when she walks, she changes the earth's rotation!", "Yo mama is so fat that she uses the entire country of Mexico as her tanning bed.", "Yo mama is so ugly that when she went to a beautician it took 12 hours... to get a quote!", "Yo mama is so ugly that she looked out the window and got arrested for mooning.", "Yo mama is so ugly that people go as her for Halloween.", "Yo mama is so ugly that she turned Medusa to stone!", "Yo mama is so ugly that the government moved Halloween to her birthday!", "Yo mama is so ugly that she scares the roaches away.", "Yo mama is so ugly that she scared the crap out of the toilet.", "Yo mama is so ugly that... well... look at you!", "Yo mama is so ugly that when she looks in the mirror, the reflection looks back and shakes its head.", "Yo mama is so ugly that she looks like she's been in a dryer filled with rocks.", "Yo mama is so ugly that she makes blind children cry.", "Yo mama is so ugly that she climbed the ugly ladder and didn't miss a step.", "Yo mama is so ugly that the last time I saw something that looked like her, I pinned a tail on it.", "Yo mama is so ugly that we put her in the kennel when we go on vacation.", "Yo mama is so ugly that her shadow ran away from her.", "Yo mama is so ugly that she could scare the flies off a shit wagon.", "Yo mama is so ugly that her birth certificate contained an apology letter from the condom factory.", "Yo mama is so ugly that that your father takes her to work with him so that he doesn't have to kiss her goodbye.", "Yo mama is so ugly that she tried to take a bath and the water jumped out!", "Yo mama is so ugly that when she walks down the street in September, people say \"Wow, is it Halloween already?\"", "Yo mama is so ugly that her mom had to be drunk to breast feed her.", "Yo mama is so ugly that when she walks into a bank, they turn off the surveillence cameras.", "Yo mama is so ugly that they didn't give her a costume when she auditioned for Star Wars.", "Yo mama is so ugly that even Rice Krispies won't talk to her!", "Yo mama is so ugly that when she uploaded a photo of herself to a computer, it was rejected by the anti-virus software.", "Yo mama is so ugly that when she joined an ugly contest, they said \"Sorry, no professionals.\"", "Yo mama is so ugly that she could make a freight train take a dirt road.", "Yo mama is so ugly that that when she sits in the sand on the beach, cats try to bury her.", "Yo mama is so ugly that when she drove past area 51, she was thought to be extraterrestrial life. They took her away never to be seen again.", "Yo mama is so ugly that they pay her to put her clothes on in strip joints", "Yo mama is so ugly that you have to tie a steak around her neck so the dog will play with her!", "Yo mama is so ugly that just after she was born, her mother said \"What a treasure!\" and her father said \"Yes, let's go bury it.\"", "Yo mama is so ugly that she made an onion cry!", "Yo mama is so ugly that when I last saw a mouth like hers, it had a hook in it.", "Yo mama is so ugly that she gets 364 extra days to dress up for Halloween!", "Yo mama is so ugly that when she plays Mortal Kombat, Scorpion tells her to \"Stay Over There!\"", "Yo mama is so ugly that neither Jacob nor Edward want her on their team.", "Yo mama is so ugly that they push her face into dough to make gorilla cookies.", "Yo mama is so ugly that when she goes to the therapist, he makes her lie on the couch face down.", "Yo mama is so ugly that she gives Freddy Kreuger nightmares.", "Yo mama is so ugly that when she walks in the kitchen, the rats jump on the table and start screaming.", "Yo mama is so ugly that even Bill Clinton wouldn't sleep with her.", "Yo mama is so ugly that when she was born, the doctor slapped her AND her parents!", "Yo mama is so ugly that she didn't get hit with the ugly stick, she got hit by the whole damn tree.", "Yo mama is so ugly that she has 7 years bad luck just trying to look at herself in the mirror.", "Yo mama is so ugly that she practices birth control by leaving the lights on.", "Yo mama is so ugly that she threw a boomerang and it wouldn't even come back.", "Yo mama is so ugly that she'd scare the monster out of Loch Ness.", "Yo mama is so ugly that it looks like she's been bobbing for french fries.", "Yo mama is so ugly that her pillow cries at night.", "Yo mama is so ugly that people at the circus pay money not to see her.", "Yo mama is so ugly that when she looks in the mirror it says \"viewer discretion is advised.\"", "Yo mama is so ugly that she can look up a camel's butt and scare the hump off of it.", "Yo mama is so ugly that when she moved into the projects, all her neighbors chipped in for curtains.", "Yo mama is so ugly that Santa pays an elf to drop off her gifts at Christmas.", "Yo mama is so ugly that people hang her picture in their cars so their radios don't get stolen.", "Yo mama is so ugly that I took her to a haunted house and she came out with a job application.", "Yo mama is so ugly that if she was a scarecrow, the corn would run away.", "Yo mama is so ugly that she could be the poster child for birth control.", "Yo mama is so ugly that I took her to the zoo, guy at the door said \"\"", "Yo mama is so ugly that when she went to a beautician it took 12 hours... to get a quote!", "Yo mama is so ugly that she looked out the window and got arrested for mooning.", "Yo mama is so ugly that people go as her for Halloween.", "Yo mama is so ugly that she turned Medusa to stone!", "Yo mama is so ugly that the government moved Halloween to her birthday!", "Yo mama is so ugly that she scares the roaches away.", "Yo mama is so ugly that she scared the crap out of the toilet.", "Yo mama is so ugly that... well... look at you!", "Yo mama is so ugly that when she looks in the mirror, the reflection looks back and shakes its head.", "Yo mama is so ugly that she looks like she's been in a dryer filled with rocks.", "Yo mama is so ugly that she makes blind children cry.", "Yo mama is so ugly that she climbed the ugly ladder and didn't miss a step.", "Yo mama is so ugly that the last time I saw something that looked like her, I pinned a tail on it.", "Yo mama is so ugly that we put her in the kennel when we go on vacation.", "Yo mama is so ugly that her shadow ran away from her.", "Yo mama is so ugly that she could scare the flies off a shit wagon.", "Yo mama is so ugly that her birth certificate contained an apology letter from the condom factory.", "Yo mama is so ugly that that your father takes her to work with him so that he doesn't have to kiss her goodbye.", "Yo mama is so ugly that she tried to take a bath and the water jumped out!", "Yo mama is so ugly that when she walks down the street in September, people say \"Wow, is it Halloween already?\"", "Yo mama is so ugly that her mom had to be drunk to breast feed her.", "Yo mama is so ugly that when she walks into a bank, they turn off the surveillence cameras.", "Yo mama is so ugly that they didn't give her a costume when she auditioned for Star Wars.", "Yo mama is so ugly that even Rice Krispies won't talk to her!", "Yo mama is so ugly that when she uploaded a photo of herself to a computer, it was rejected by the anti-virus software.", "Yo mama is so ugly that when she joined an ugly contest, they said \"Sorry, no professionals.\"", "Yo mama is so ugly that she could make a freight train take a dirt road.", "Yo mama is so ugly that that when she sits in the sand on the beach, cats try to bury her.", "Yo mama is so ugly that when she drove past area 51, she was thought to be extraterrestrial life. They took her away never to be seen again.", "Yo mama is so ugly that they pay her to put her clothes on in strip joints", "Yo mama is so ugly that you have to tie a steak around her neck so the dog will play with her!", "Yo mama is so ugly that just after she was born, her mother said \"What a treasure!\" and her father said \"Yes, let's go bury it.\"", "Yo mama is so ugly that she made an onion cry!", "Yo mama is so ugly that when I last saw a mouth like hers, it had a hook in it.", "Yo mama is so ugly that she gets 364 extra days to dress up for Halloween!", "Yo mama is so ugly that when she plays Mortal Kombat, Scorpion tells her to \"Stay Over There!\"", "Yo mama is so ugly that neither Jacob nor Edward want her on their team.", "Yo mama is so ugly that they push her face into dough to make gorilla cookies.", "Yo mama is so ugly that when she goes to the therapist, he makes her lie on the couch face down.", "Yo mama is so ugly that she gives Freddy Kreuger nightmares.", "Yo mama is so ugly that when she walks in the kitchen, the rats jump on the table and start screaming.", "Yo mama is so ugly that even Bill Clinton wouldn't sleep with her.", "Yo mama is so ugly that when she was born, the doctor slapped her AND her parents!", "Yo mama is so ugly that she didn't get hit with the ugly stick, she got hit by the whole damn tree.", "Yo mama is so ugly that she has 7 years bad luck just trying to look at herself in the mirror.", "Yo mama is so ugly that she practices birth control by leaving the lights on.", "Yo mama is so ugly that she threw a boomerang and it wouldn't even come back.", "Yo mama is so ugly that she'd scare the monster out of Loch Ness.", "Yo mama is so ugly that it looks like she's been bobbing for french fries.", "Yo mama is so ugly that her pillow cries at night.", "Yo mama is so ugly that people at the circus pay money not to see her.", "Yo mama is so ugly that when she looks in the mirror it says \"viewer discretion is advised.\"", "Yo mama is so ugly that she can look up a camel's butt and scare the hump off of it.", "Yo mama is so ugly that when she moved into the projects, all her neighbors chipped in for curtains.", "Yo mama is so ugly that Santa pays an elf to drop off her gifts at Christmas.", "Yo mama is so ugly that people hang her picture in their cars so their radios don't get stolen.", "Yo mama is so ugly that I took her to a haunted house and she came out with a job application.", "Yo mama is so ugly that if she was a scarecrow, the corn would run away.", "Yo mama is so ugly that she could be the poster child for birth control.", "Yo mama is so ugly that I took her to the zoo, guy at the door said \"Thanks for bringing her back.\"", "Yo mama is so ugly that when she went to Taco Bell everyone ran for the border.", "Yo mama is so ugly that her face is blurred on her driver's license.", "Yo mama is so ugly that when she walked out of her house, the neighbours called animal control.", "Yo mama is so ugly that the FCC requires her face to be blurred when she's on TV, because of decency rules.", "Yo mama is so ugly that a sculpture of her face is used when torturing prisoners at Guantanamo Bay.", "Yo mama is so ugly that government intelligence agencies have to pixelize her face when spying on her.", "Yo mama is so ugly that she's never seen herself 'cause the mirrors keep breaking.", "Yo mama is so ugly that it looks like someone did the stanky leg dance on her face.", "Yo mama is so ugly that when she was born she was put in an incubator with tinted windows.", "Yo mama is so ugly that she put the Boogie Man out of business!", "Yo mama is so ugly that she made Barack Obama lose hope!", "Yo mama was such an ugly baby that her parents had to feed her with a slingshot.", "Yo mama is like a hockey player, she only showers after three periods.", "Yo mama is like a chicken coop, cocks fly in and out all day.", "Yo mama has so many teeth missing, that it looks like her tongue is in jail.", "Yo mama's mouth is so big that she speaks in surround sound.", "Yo mama is so grouchy that the McDonalds she works in doesn't even serve Happy Meals.", "You suck... yo mama does too, but she charges.", "Yo mama is like a paper towel, she picks up all kinds of slimy wet stuff.", "Yo mama is like Bazooka Joe, 5 cents a blow.", "Yo mama is like a telephone, even a 3 year old can pick her up.", "Yo mama is like a Christmas tree, everybody hangs balls on her.", "Yo mama is like the sun, look at her too long and you'll go blind.", "Yo mama is like a library, she's open to the public.", "Yo mama is like a fine restaurant, she only takes deliveries in the rear.", "Yo mama is like an ATM, open 24 hours.", "Yo mama is like a bowling ball... round, heavy, and you can fit three fingers in.", "Yo mama is like a basketball hoop, everybody gets a shot.", "Yo mama is like a Discover card, she gives cash back.", "Yo mama is like a championship ring, everybody puts a finger in her.", "Yo mama is like Dominoes Pizza, one call does it all.", "Yo mama is like a microwave, press one button and she's hot.", "Yo mama is like a mail box, open day and night.", "Yo mama is like a bowling ball, she always winds up in the gutter.", "Yo mama is like a bus, guys climb on and off her all day long.", "Yo mama is like a door knob, everybody gets a turn.", "Yo mama is like a light switch, even a little kid can turn her on.", "Yo mama's such a ho that \"who's your daddy?\" is a multiple-choice question.", "You'll never be the man Yo mama was.", "Yo mama... 'nuff said.", "Yo mama is so lazy that she thinks a two-income family is where yo daddy has two jobs.", "Yo mama is so lazy that she's got a remote control just to operate her remote!", "Yo mama's arms are so short that she has to tilt her head to scratch her ear.", "Yo mama's lips are so big that Chapstick had to invent a spray.", "Yo mama is so lazy that she came in last place in a recent snail marathon.", "What's the difference between yo momma and a walrus? One has whiskers and smells of fish... the other one is a walrus!", "Yo mama is missing a finger and can't count past nine.", "Yo mama is so flat that she makes the walls jealous!", "Yo mama's gums are so black that she spits Yoo-hoo.", "It took yo mama 10 tries to get her drivers license - she couldn't get used to the front seat!", "Yo mama's so fat that when she asked me \"what's up?\" I said \"your weight!\"", "Yo mama is twice the man you are.", "Yo mama's head is so small that she got her ear pierced and died.", "Yo mama is cross-eyed and watches TV in stereo.", "Yo mama is so stupid that she was born on Independence Day and can't remember her birthday.", "Yo mama's head is so small that she uses a tea-bag as a pillow.", "Yo mama's face is so wrinkled, that she has to screw her hat on.", "Yo mama's hips are so big that people set their drinks on them.", "Yo mama's hair is so nappy that she has to take Tylenol just to comb it.", "Yo mama's feet are so big that her shoes need to have license plates on them!", "Yo mama's so lonely that she buys hot dogs and nuts wishing she could have sex with them.", "Yo mama is so bald that even a wig wouldn't help!", "Yo mama is so bald that you can see what's on her mind.", "Yo mama is so bald that she took a shower and got brain-washed!", "Yo mama's teeth are so yellow that when she smiles everyone sings \"We're Walking on Sunshine.\"", "Yo mama is like a slaughter house - everybody's hanging their meat up in her.", "Yo mama is like the new AOL 4.0: Fun, Fast, Easy and Free!", "Yo mama is like a carpenter's dream - flat as a board and easy to nail.", "Yo mama is like Humpty Dumpty - First she gets humped, then she gets dumped.", "Yo mama is like a bag of potato chips, \"Free-To-Lay.\"", "Yo mama is like a turtle - once she's on her back she's fucked.", "Yo mama is like a fan - she's always blowing someone.", "Yo mama is like Pizza Hut - if she isn't there in 30 minutes... it's Free!", "Yo mama is like a goalie - she only changes her pads after three periods.", "Yo mama is like a gas station - you gotta pay before you pump!", "Yo mama is like Sprint - 10 cents a minute anywhere in the country.", "Yo mama is like a Chinese restaurant - All you can eat for only $9.95!", "Yo mama smells so bad that the doctor diagnosed her with breath cancer.", "Yo mama's breath smells so bad that when she yawns her teeth duck out of the way.", "What's the difference between yo mama and a Lay-Z-Boy? One's soft, squishy, and always has someone in it. The other is a chair.", "What's the difference between yo mama and a 747? About 20 pounds.", "Yo mama's like a shotgun, one cock and she blows.", "Yo mama's like the Bermuda Triangle, they both swallow a lot of seamen.", "Yo mama's like cake mix, 15 servings per package!", "Yo mama's like a 5 foot tall basketball hoop, it ain't that hard to score.", "Yo mama's like a vacuum cleaner... she sucks, blows, and then gets laid in the closet.", "Yo mama's like the Pillsbury dough boy - everybody pokes her.", "Yo mama's like a brick, dirty, flat on both sides, and always getting laid by Mexicans.", "Yo mama's like a nickel, she ain't worth a dime.", "Yo mama's like a streetlamp, you can find her turned on at night on any street corner.", "Yo mama's like a telephone booth, open to the public, costs a quarter, and guys go in and out all day.", "Yo mama's like a Reese's Peanut Butter Cup, there's no wrong way to eat her.", "Yo mama's like a postage stamp, you lick her, stick her, then send her away.", "Yo mama's like a screen door, after a couple of bangs she loosens up.", "Yo mama's like a dollar bill, she gets handled all across the country.", "Yo mama's like school at 3 o'clock... children keep coming out and nobody can remember all the fathers.", "Yo mama's like a bowling ball, she gets picked up, fingered, thrown down the gutter, and she still comes back for more.", "Yo mama's like a set of speakers - loud, ugly, lives in a box, and you can turn her up, down, on, and off.", "Yo mama's like a birthday cake, everybody gets a piece.", "Yo mama's like 7-Eleven - open all night, hot to go, and for 89 cents you can get a slurpy.", "Yo mama's like a vacuum cleaner - a real good suck.", "Yo mama's like a Snickers bar, packed with nuts.", "Yo mama's like a race car driver - she burns a lot of rubbers.", "Yo mama's like a parking garage, three bucks and you're in.", "Yo mama's like a pool table, she likes balls in her pocket.", "Yo mama's got 1 toe & 1 knee and they call her Tony.", "Yo mama's got a \"wait\" problem, she can't wait to eat.", "Yo mama's got a 4 dollar weave and don't know when to leave.", "Yo mama's teeth are so yellow, when she smiles it looks like a Kraft Singles pack.", "Yo mama's got Play-Doh teeth.", "Yo mama's like the Panama Canal, vessels full of seamen pass through her everyday.", "Yo mama likes to applaud, 'cause she's got clap", "Yo mama's got 1 leg longer than the other so they call her call her hip hop.", "Yo mama's got an eating disorder, she be eating dis order, dat order, she be eating all the damn orders!", "Yo mama sucks so much dick her butt chin turned into a nut chin!", "Yo mama's got more chins than a Chinese phone book.", "Yo mama's like a bungee cord... 100 dollars for 30 seconds and if that rubber breaks, your ass is dead!", "Yo mama's like a squirrel, she's always got some nuts in her mouth.", "Yo mama's like a refrigerator, everyone puts their meat in her.", "Yo mama's like a tricycle, she's easy to ride.", "yo mamas like a hardware store. 25 cents a screw.", "Yo mama's like mustard, she spreads easy.", "Yo mama's like peanut butter: brown, creamy, and easy to spread.", "Yo mama's like McDonalds... Billions and Billions served.", "Yo mama's like an elevator, guys go up and down on her all day.", "Yo mama's like a railroad track, she gets laid all over the country.", "Yo mama's like lettuce, 25 cents a head.", "Yo mama's got an eagle's nest wig.", "Yo mama's twice the man you are.", "Yo mama's got more crust than a bucket of Kentucky Fried Chicken.", "Yo mama's got more weave than a dog in traffic.", "Yo mama's only got one finger and runs around stealing key rings.", "Yo mama's got a peanut butter wig with jelly sideburns.", "Yo mama's got a leather wig with suede sideburns.", "Yo mama got hit upside the head with an ugly stick.", "Yo mama's got so much weave, when a fly goes by her hair swats at it.", "Yo mama's got no ears and was trying on sunglasses.", "Yo mama's got so much weave, AT&T uses her extensions as backup lines.", "Yo mama's got so much dandruff, she needs to defrost it before she combs her hair.", "Yo mama's so bald that I can tell fortunes on her head.", "Yo mama's so bald that you could draw a line down the middle of her head and it would look like my ass.", "Yo mama's so bald that when she goes to bed, her head slips off the pillow.", "Yo mama's so bald that when she braids her hair, it looks like stitches.", "yo mama's breath is so stanky, she eats odour eaters.", "Yo mama's like an iPod, fun to touch!", "Yo mama's got one leg and people call her Ilene.", "Yo mama's been on welfare so long that her picture is on food stamps.", "Yo mama's like Wal-Mart... She's got different discounts everyday.", "Yo mama's so hunchbacked, she has to look up to tie her shoes.", "Yo mama's nostrils are so huge she makes Patrick Ewing jealous.", "Yo mama's so hunchbacked, she has to wear goggles to wash dishes.", "Yo mama's so hunchbacked, she can stand on her feet and her head at the same time.", "Yo mama's so hunchbacked, she hits her head on speed bumps.", "Yo mama's so fat that the Sorting Hat put her in all four houses!", "Yo mama's so fat that a wingardium leviosa spell couldn't lift her.", "Yo mama's so fat, she makes Hagrid look like \"Mini-me\".", "Yo mama's so fat, she tried to eat Cornelius Fudge.", "Yo mama's so ugly, even a dementor wouldn't kiss her!", "Yo mama's so fat the Sorting Hat assigned her to the House of Pancakes.", "Yo mama's so old, she used to babysit Dumbledore.", "Yo mama's so stupid, she thinks Sirius Black is a hip hop station on satellite radio.", "Yo mama's so ugly that the whomping willow saw her and died.", "Yo mama's so stupid she thinks Patronus is a kind of Tequlia.", "Yo Mama's so fat, her Patronus is a Double-Whopper with Cheese.", "Yo mama's so nasty, the Forbidden Forrest was named after her.", "Yo mama's the reason that Dumbledore turned gay.", "Yo mama's so old, her boobs look like two upside down Sorting Hats!", "Yo mama's so fat, she used the invisibility cloak as a bib.", "Yo Mama's so ugly, everybody calls her \"She-Who-Must-Not-Be-Naked\"", "Yo mama's so fat that even the Dementors can't suck her soul out in one sitting.", "Yo mama's so pasty, she makes Ron Weasely look like George Hamilton.", "Yo mama's so fat, she looked in the mirror of Erised and saw a ham!", "Yo mama's so old she gave Nicholas Flamel his first kiss.", "Yo mama's so ugly that the Dementor's Kiss was swapped out for a hearty handshake and a promise to give her a call sometime.", "Yo mama's so stupid, she drowned in a pensieve", "Yo mama's so dumb she thought that she could talk to snakes if she put parsley on her tongue", "Yo mama's so nasty, every pair of her panties has the Dark Mark on them.", "Yo mama's so fat that if she confronted a boggart it would morph into a treadmill.", "Yo Mama's so ugly that even Voldemort won't say her name.", "Yo Mama's so poor she can't even afford a Gringotts account.", "Yo mama's so fat that the sorting hat couldn't decide where to put her - she couldn't fit in any of the houses!!", "Yo mama's the only mute prostitue in Hogsmeade. They call her \"dumb-le-whore\"!", "Yo mama's so fat, she ate the Death Eaters.", "Yo mama's so masculine that Dumbledore would sleep with her!", "Yo mama's so nasty that the order of the phoenix was \"stay away from that woman!\"", "Yo mama's so poor that Dobby gave her a sock to keep her foot warm.", "Yo mama's such a tramp that she's given more rides than the Hogwarts Express!", "Yo mama's so fat even Grawp can't pick her up!", "Yo mama's so smelly, Bertie Bott made her his next jelly bean flavor.", "Yo mama's so fat that it takes two boggarts to shape-shift into her!", "Yo mama's so ugly that she lost a beauty contest to Mountain Troll.", "Yo mama's so ugly that when the bassalisk snuck up on her and saw her face, HE dropped dead.", "Yo mama's breath is the secret ingredient in the Weasly's Butterscotch Barf-ies.", "Yo mama's so ugly that when she walked into Gringotts Wizarding Bank, they gave her a job application.", "Yo mama's so ugly she turned the Basilisk to stone.", "Yo mama's such a tramp that she's like a quidditch broomstick - everyone gets a ride.", "Yo mama's so skanky that the reason you're called a Half-Blood Prince is because she has no idea who your father is!", "Yo mama's so dumb that a stupify spell actually made her smarter.", "Yo mama's so stanky that not even dobby would accept one of her socks.", "Yo mama's so fat that even her Quidditch robes have stretch marks.", "Yo mama's so old she makes Dumbledore look like a teenager.", "Yo mama's so fat they'd have to use transfiguration to sneak her through the hole in the Gryffindor Tower.", "Ya mama's so fat, her wand is a Slim Jim.", "Yo mama's so fat the core of her wand has a creame filling.", "Yo mama's so ugly that Voldemort took one look at her and killed HIMSELF!\"", "Yo mama's so poor she had to go to the Weasley's for a loan.", "Yo mama's so ugly, she thought that Hogwarts were the growth on her thigh.", "Yo mama's so ugly that as a baby they had to use the Confundus Charm so the family would play with her.", "Yo mama's such a ho that she lets ANYONE enter her \"chamber of secrets\".", "Yo mama's so ugly she scares the Dementors away.", "Yo mama's so ugly that when she asked Crabbe to take her to the Yule Ball, he decided to go with Goyle instead!", "Yo mama's so fat that a $700 billion bailout would only keep her fed for a week.", "Yo mama's so fat that the housing bubble popped because she sat on it!", "Yo mama's so stupid, she thinks the G8 is a Value Meal at McDonald's.", "Yo mama's so fat that she supported the bailout just because she wanted a 'barrel of pork'.", "Yo mama's so stupid that she thinks sub-prime is a way to cut steak.", "Yo mama's so fat that even Mitt Romney couldn't afford to take her out to dinner!", "Yo mama's so fat that her biography is called \"The Audacity of Hardee's\".", "Yo mama's so greasy that her face could free the U.S. from its dependence on foreign oil.", "Yo mama's so fat that Sarah Palin can see her from her house.", "Yo mama's so fat that Sarah Palin can't see Russia anymore!.", "Yo mama's so ugly that you could put lipstick on a pig and it would look ten times better than her!", "Yo mama's so fat that \"ACORN\" registered her to vote eight times!", "Yo mama is so dark that she spits chocolate milk!", "Yo mama is so dark that she went to night school and was marked absent!", "Yo mama is so dark that she has to wear white gloves when she eats Tootsie Rolls to keep from eating her fingers.", "Yo mama is so dark that when she goes swimming it looks like an oil spill.", "Yo mama is so dark that her ass looks like two tires.", "Yo mama is so dark that she drinks water and pees coffee.", "Yo mama is so dark that when she puts on yellow lipstick, she looks like a cheese burger.", "Yo mama is so dark that she could show up naked to a funeral.", "Yo mama is so dark that she bleeds molasses.", "Yo mama is so dark that she looks like a picture of outer-space with no stars... except when she smiles.", "Yo mama is so dark that when she goes outside, the streetlights turn on.", "Yo mama is so dark that she got her tattoo done in chalk.", "Yo mama is so dark that when she puts lotion on her legs it looks like she has on patent leather pants.", "Yo mama is so dark that when the police shot at her, the bullets came back for flashlights.", "Yo mama is so dark that she was riding a motorcycle and got a ticket for tinted windows.", "Yo mama is so dark that when she smiles at night she looks like a pack of floating Chicklets.", "Yo mama is so dark that when her eyes are red she looks like a beeper.", "Yo mama is so dark that her nickname is midnight.", "Yo mama is so dark that she makes asphalt look grey.", "Yo mama is so dark that that she can leave fingerprints on charcoal.", "Yo mama's so fat that even the Death Star couldn't blow her up!", "Yo mama's so fat that Spock couldn't find a pressure point to perform the Vulcan Death Grip on her.", "Yo mama's so ugly that Wuher said 'We don't serve your kind here'.", "Yo mama's so fat the odds against not finding her fat are approximately 3,720 to 1.", "Yo mama's so fat that she thought the opening line of Kirk's monologue was \"Spice, the final Frontier...\"", "Yo mama's so stupid that when the borg had to choose between assimilating her and a tree, they chose the tree.", "Yo mama's so fat that if she were placed beside a changeling during regeneration, no one would know the difference.", "Yo mama's so fat that she tried to fly through a temporal anomoly but she didn't fit.", "Yo mama's so fat she makes Riker's belly look 3 atoms thick.", "Yo mama's so fat that when she tried to captain a galaxy class they had to separate the saucer so she could fit.", "Yo mama's so fat that she makes the USS Enterprise look like a micro machines racer.", "Yo mama's so flatulent that she forced the Mustafarians to wear masks!", "Yo mama's so dumb that she tried to rent a car from The Enterprise.", "Yo mama's so fat that Dexster Jettster mistook her for his wife.", "Yo mama's so ugly that the term 'bantha poodoo' wasn't used metaphorically with reference to her.", "Yo mama's so fat that only half her body was able to come out frozen from the carbon freezing chamber in Cloud City.", "Yo mama's so ugly that Dr. Evazan looks like a male supermodel next to her.", "Yo mama's so fat that when she beams to a ship, the ship beams inside of her.", "Yo mama's so such a ho that she slept with me... therefore, I AM YOUR FATHER!", "Yo mama's so dumb that when she found a vulcan, she tried to call Santa to take him back to the north pole.", "Yo mama's so fat that the passengers of the Millenium Falcon mistook her for a small moon.", "Yo mama's so fat that Gardulla the Hutt had a boost in self-esteem after seeing her.", "Yo mama's so ugly that she made doctor McCoy say \"Damnit Jim, I'm a doctor, not a Zoologist!\"", "Yo mama's so fat that she fell to the dark side and couldn't get back up.", "Yo mama's so fat that if she was thrown into the second Death Star's reactor core, she could have blown up the entire Imperial fleet.", "Yo mama's so fat that the Kaminoans couldn't use her as a host for clones since they couldn't pierce her skin deep enough to draw blood.", "Yo mama's so weak-minded that I got her to lead me to Jabba without using a jedi mind trick!", "Yo mama's so fat that she caused Kamino to flood when her water broke.", "Yo mama's so ugly that she's probably a Shi'ido Clawdite that stays in her regular form all the time.", "Yo mama's so fat that her lack of balance caused her to stumble into an Utapau sinkhole.", "Yo mama's so fat that she crushed Boga as soon as she mounted her.", "Yo Mama's so fat, that in an attempt to beam her up, the ship ended up being pulled down to the surface.", "Yo Mama's so ugly even Data would need special eye googles to look at her.", "Yo mama is so hairy that the only language she can speak is wookie.", "Yo mama's so ugly her Kazon hairdo is an improvement!", "Yo Mama's so ugly even a Ferengi would dress her in clothes.", "Yo mama's so old even Guinan refers to her as \"old bag\".", "Yo Mama's so fat that when she walks into a room the replicators stop working.", "Yo Mama's so fat, Data feels strong emotions of disgust and self-terminates.", "Yo Mama's so stupid the Borg wouldn't assimilate her!", "Yo Mama's so fat she wears her own inertia dampener.", "Yo Mama's so ugly she did the truly impossible: she made Captain James T Kirk's penis go limp.", "Yo Mama's so fat, she managed to contain a warp core breach.", "Yo Mama's so fat, she got stuck trying to enter the Nexus.", "Yo Mama's so fat, when she fell over, she punched a hole in the fabric of space/time.", "Yo mama's so fat that when she stepped on the scale, her weight was OVER 9000!!!", "Yo Mama's so fat, she walked in front of the TV and I missed three seasons of Inuyasha!", "Yo mama's so fat, Naruto couldnt make enough clones to see all sides of her.", "Yo mama's so ugly, she can't even get tentacle raped.", "Yo mama's so ugly, even Tamaki wouldn't hit on her.", "Yo mama's so fat that the Dragon Ball Z crew uses her to make craters on set.", "Yo mama's so ugly, she's the real reason sasuke left the village.", "Yo mama's so fat that when she sat down on a park bench, she caused the Naruto timeskip.", "Yo mama's so ugly that she's like a Death Note. Get someone to look at her, and they'll die!", "Yo mama's so ugly, Jiraiya saw her and turned gay!", "Yo mama's so hairy Naruto thought she was a Summon.", "Yo mama's so fat, she scared L into giving up all sweets.", "Yo mama's so ugly that she made Spike Spiegel choke on his cigarette", "Yo mama's so ugly that she makes Sailor Bubba feel dirty.", "Yo mama's so fat that she cant even fit in the expanding plug suit.", "Yo mama's so ugly that she made Loz cry.", "Yo mama's so dumb that when she was handed the death note, she thought they were asking for her autograph.", "Yo mama's so fat that she broke the HP limit!", "Yo mama's so hairy and ugly that she got used as Ashitare's stunt double.", "Yo mama's so stupid she makes Tristan look like Einstein!", "Yo mama's so fat, she makes Vash look anorexic!", "Yo mama's so hairy that she has to go to Furfest to meet a man.", "Yo mama's breath is so nasty that it chases away Miasma.", "Yo mama's so round that she makes a Pokéball look flat!", "Yo mama's so ugly, Saya thought she was a Chiropteran.", "Yo mama's so dumb, she failed out of Cromartie High School.", "Yo mama's so old and fat they use her wrinkles as set terrain for Dragon Ball Z.", "Yo mama's nosehairs are so long that they make Bobobo jealous!", "Yo mama's so fat that she was mistaken for Mt. Fuji at the Sakura festival.", "Yo mama's so fat she makes a Snorlax look like a chihuahua!", "Yo mama's so ugly that when Nozomu Itoshiki saw her, he didn't even bother with his \"ZETSUBOUSHITA!\" speech - he skipped straight to hanging himself.", "Yo mama's so fat that it took the entire Dragon Ball Z crew 1 week just to lift her off the ground.", "Yo mama's cosplay is so bad that she got beat by a Narutard in the masquerade!", "Yo mama's so ugly that when Kakashi looked directly at her, he lost an eye.", "Yo mama's so fat that she tried to eat someone dressed as a box of Pocky!", "Yo mama's so ugly that she makes Orochimaru look beautiful.", "Yo mama's so fat, Choji told her to lose weight.", "Yo mama is so old that her birth certificate says \"expired\" on it.", "Yo mama is so old that that when she was in school there was no history class.", "Yo mama is so old that I told her to act her own age, and she died.", "Yo mama is so old that she knew Burger King while he was still a prince.", "Yo mama is so old that her social security number is 1.", "Yo mama is so old that her birth certificate is written in Roman numerals.", "Yo mama is so old that she has Adam & Eve's autographs.", "Yo mama is so old that she co-wrote the Ten Commandments.", "Yo mama is so old that she has an autographed bible.", "Yo mama is so old she remembers when the Mayans published their calendar.", "Yo mama is so old that the candles cost more than the birthday cake.", "Yo mama is so old that when she farts, dust comes out.", "Yo mama is so old that she owes Fred Flintstone a food stamp.", "Yo mama is so old that she drove a chariot to high school.", "Yo mama is so old that she took her drivers test on a dinosaur.", "Yo mama is so old that she DJ'd at the Boston Tea Party.", "Yo mama is so old that she walked into an antique store and they kept her.", "Yo mama is so old that she baby-sat for Jesus.", "Yo mama is so old that she knew Mr. Clean when he had an afro.", "Yo mama is so old that she knew the Beetles when they were the New Kids on the Block.", "Yo mama is so old that when God said \"Let there be light\" she was there to flick the switch.", "Yo mama is so old that she needed a walker when Jesus was still in diapers.", "Yo mama is so old that when Moses split the red sea, she was on the other side fishing.", "Yo mama is so old that she learned to write on cave walls.", "Yo mama is so old that her memory is in black and white.", "Yo mama is so old that she's mentioned in the shout out at the end of the bible.", "Yo mama is so old that she planted the first tree at Central Park.", "Yo mama is so old that she sat next to Jesus in third grade.", "Yo mama is so old that she has a picture of Moses in her yearbook.", "Yo mama is so old that she knew Cap'n Crunch while he was still a private.", "Yo mama is so old that she called the cops when David and Goliath started to fight.", "Yo mama is so old that when she was born, the Dead Sea was just getting sick.", "Yo mamags so old, when she breast feeds, people mistake her for a fog machine.", "Yo mama is so old that when she was young rainbows were black and white.", "Yo mama is so old that she was a waitress at the Last Supper.", "Yo mama is so old that she owes Jesus a dollar.", "Yo mama is so old that she ran track with dinosaurs.", "Yo mama is so stupid that it took her 2 hours to watch 60 Minutes!", "Yo mama is so stupid that when your dad said it was chilly outside, she ran out the door with a spoon.", "Yo mama is so stupid that when she saw the \"Under 17 not admitted\" sign at a movie theatre, she went home and got 16 friends.", "Yo mama is so stupid that when she went for a blood test, she asked for time to study.", "Yo mama is so stupid that she got locked in a grocery store and starved!", "Yo mama is so stupid that you have to dig for her IQ!", "Yo mama is so stupid that she tripped over a cordless phone!", "Yo mama is so stupid that she sold her car for gas money!", "Yo mama is so stupid that she told everyone that she was \"illegitimate\" because she couldn't read.", "Yo mama is so stupid that that she tried to put M&M's in alphabetical order!", "Yo mama is so stupid that she took the Pepsi challenge and chose Dr. Pepper.", "Yo mama is so stupid that she thought Delta Airlines was a sorority.", "Yo mama is so stupid that she thinks Fleetwood Mac is a new hamburger at McDonalds!", "Yo mama is so stupid that she bought a videocamera to record cable tv shows at home.", "Yo mama is so stupid that when she read on her job application to not write below the dotted line she put \"OK\".", "Yo mama is so stupid that she thought Grape Nuts was an STD.", "Yo mama is so stupid that she spent twenty minutes lookin' at an orange juice box because it said \"concentrate\".", "Yo mama is so stupid that she asked me what yield meant, I said \"Slow down\" and she said \"What... does.... yield... mean?\"", "Yo mama is so stupid that she thought Dunkin' Donuts was a basketball team!", "Yo mama is so stupid that she put a phone up her ass and thought she was making a booty call.", "Yo mama is so stupid that she thinks Tiger Woods is a forest in India.", "Yo mama is so stupid that she put on her glasses to watch 20/20.", "Yo mama is so stupid that she climbed over a glass wall to see what was behind it.", "Yo mama is so stupid that she failed a survey.", "Yo mama is so stupid that she stopped at a stop sign and waited for it to say go.", "Yo mama is so stupid, she went to the aquarium to buy a Blu-Ray.", "Yo mama is so stupid that I told her I was reading a book by Homer and she asked if I had anything written by Bart.", "Yo mama is so stupid that she tried to commit suicide by jumping out of the basement window.", "Yo mama is so stupid that she needs twice as much sense to be a half-wit.", "Yo mama is so stupid that she thought brownie points were coupons for a bake sale.", "Yo mama is so stupid that when the computer said \"Press any key to continue\", she couldn't find the 'Any' key.", "Yo mama is so stupid that she thought Tupac Shakur was a Jewish holiday.", "Yo mama is so stupid that when I was drowning and yelled for a life saver, she said \"Cherry or Grape?\"", "Yo mama is so stupid that she sat in a tree house because she wanted to be a branch manager.", "Yo mama is so stupid that I saw her jumping up and down, asked what she was doing, and she said she drank a bottle of medicine and forgot to shake it.", "Yo mama is so stupid that when she locked her keys in the car, it took her all day to get Yo family out.", "Yo mama is so stupid that she got locked out of a convertible car with the top down.", "Yo mama is so stupid that when she pulled into the drive-thru at McDonald's, she drove through the window.", "Yo mama is so stupid that she put 2 quarters in her ears and thought she was listening to 50 cent.", "Yo mama is so stupid that she was on the corner with a sign that said \"Will eat for food.\"", "Yo mama is so stupid that in the 'No Child Left Behind' act there's a provision that exempts yo mama.", "Yo mama is so stupid that she got locked in a Furniture store and slept on the floor.", "Yo mama is so stupid that she peals M&M's to make chocolate chip cookies.", "Yo mama is so stupid that she leaves the house for the Home Shopping Network.", "Yo mama is so stupid that she brought a cup to the movie \"Juice.\"", "Yo mama is so stupid that she thinks fruit punch is a gay boxer.", "Yo mama is so stupid that she uses Old Spice for cooking.", "Yo mama is so stupid that she threw a rock the ground and missed.", "Yo mama is so stupid that she went to the store to buy a color TV and asked what colors they had.", "Yo mama is so stupid that she tries to email people by putting envelopes into her computer's disk drive.", "Yo mama is so stupid that when she took an IQ test, the results came out negative.", "Yo mama's so stupid that she though Jar-Jar came with Pickles-Pickles.", "Yo mama is so stupid that she thought St. Ides was a Catholic church.", "Yo mama is so stupid that she puts lipstick on her head just to make-up her mind", "Yo mama is so stupid that she thought she needed a token to get on Soul Train.", "Yo mama is so stupid, that she thought Moby Dick was a sexually transmitted disease.", "Yo mama is so stupid that she makes Beavis and Butt-Head look like Nobel Prize winners.", "Yo mama is so stupid that she took a spoon to the superbowl.", "Yo mama is so stupid that that she thought Boyz II Men was a day care center.", "Yo mama is so stupid that she got stabbed in a shoot out.", "Yo mama is so stupid that she sits on the TV, and watches the couch!", "Yo mama is so stupid that she took a umbrella to see Purple Rain.", "Yo mama is so stupid that she ordered her sushi well done.", "Yo mama is so stupid that she got fired from the M&M factory for throwing away all the W's.", "Yo mama is so stupid that she put on a coat to chew winterfresh gum.", "Yo mama is so stupid that she put a quarter in a parking meter and waited for a gumball to come out.", "Yo mama is so stupid that she ordered a cheese burger from McDonald's and said \"Hold the cheese.\"", "Yo mama is so stupid that she thinks Taco Bell is a Mexican Phone Company.", "Yo mama is so stupid that she thinks Christmas Wrap is Snoop Dogg's holiday album.", "Yo mama is so stupid that she ran outside with a purse because she heard there was change in the weather.", "Yo mama is so stupid that I told her Christmas was just around the corner and she went looking for it.", "Yo mama is so stupid that she wiped her ass before she took a shit.", "Yo mama is so stupid that she tries to insult you with yo mama jokes.", "Yo mama is so stupid that she put a peephole in a glass door.", "Yo mama is so stupid that I saw her in the frozen food section with a fishing rod.", "Yo mama is so stupid that when she heard 90% of all crimes occur around the home, she moved.", "Yo mama is so stupid that when she saw a \"Wrong Way\" sign in her rearview mirror, she turned around.", "Yo mama is so stupid that she shoved a AA battery up her butt and said \"I got the power!\"", "Yo mama is so stupid that she called the 7-11 to see when they closed.", "Yo mama is so stupid that she sold the house to pay the mortgage.", "Yo mama is so stupid that when I asked her about X-Men she said \"Sure, there's Bobby my first baby daddy, Roger the guy I see on Thursdays...\"", "Yo mama is so stupid that she thought meow mix was a record for cats.", "Yo mama is so stupid that she took lessons for a player piano.", "Yo mama is so stupid that she said \"what's that letter after x\" and I said Y she said \"Cause I wanna know\".", "Yo mama is so stupid that when she asked me what kinda jeans I wore, I said Guess and she said \"Ummm... Levis?\"", "Yo mama is so stupid that if she spoke her mind, she'd be speechless.", "Yo mama is so stupid that it takes her an hour to cook minute rice.", "Yo mama is so stupid that she asked for a price check at the dollar store.", "Yo mama is so stupid that on her job application where it says emergency contact she put 911.", "Yo mama is so stupid that she can't make Jello because she can't fit 2 quarts of water in the box.", "Yo mama is so stupid that she thinks a stereotype is the brand on her clock-radio.", "Yo mama is so stupid that she thought a lawsuit was something you wear to court.", "Yo mama is so stupid that she thinks sexual battery is something in a dildo.", "Yo mama is so stupid that the first time she used a vibrator, she cracked her two front teeth.", "Yo mama is so stupid that she sent me a fax with a stamp on it.", "Yo mama is so stupid that I saw her walking down the street yelling into an envelope, asked what she was doing, and she said sending a voice mail.", "Yo mama is so stupid that she tried to drown a fish.", "Yo mama is so stupid that if you gave her a penny for her thoughts, you'd get change.", "Yo mama is so stupid that she thought Mick Jagger was a breakfast sandwich!", "Yo mama is so stupid that when she heard her neighbour was spanking the monkey, she called the humane society.", "Yo mama is so stupid that when she took you to the airport and a sign said \"Airport Left,\" she turned around and went home.", "Yo mama is so stupid that when she went to take the 44 bus, she took the 22 twice instead.", "Yo mama is so stupid that she asked you \"What is the number for 911?\"", "Yo mama is so stupid that she thinks a quarterback is a refund!", "Yo mama is so stupid that she bought a solar-powered flashlight!", "Yo mama is so stupid that she took a ruler to bed to see how long she slept.", "Yo mama is so stupid that she thought menopause was a button on the VCR.", "Yo mama is so stupid that she picked up the phone and asked \"What button do I push?\"", "Yo mama is so stupid that when she worked at McDonald's and someone ordered small fries, she said \"Hey Boss, all the small one's are gone.\"", "Yo mama is so stupid that she got hit by a parked car.", "Yo mama is so stupid that when her husband lost his marbles she ran to the store and bought him new ones.", "Yo mama is so stupid that when they said they were playing craps she went and got toilet paper.", "Yo mama is so stupid that when I asked her if she wanted to play one on one, she said \"Ok, but what's the teams?\"", "Yo mama is so stupid that she thinks Johnny Cash is a pay toilet!", "Yo mama is so stupid that when the judge said \"Order in the court,\" she said \"I'll have a hamburger and a Coke.\"", "Yo mama is so stupid that she wiped her ass before she took a shit.", "Yo mama is so stupid that she thinks socialism means partying!", "Yo mama is so stupid that when asked on an application, \"Sex?\", she marked, \"M, F, and wrote sometimes Wednesday too.\"", "Yo mama is so stupid that she thinks deadbeat is a type of music.", "Yo mama is so stupid that she thinks Tiger Woods is a forest.", "Yo mama is so stupid that she put two M&M's in her ears and thought she was listening to Eminem.", "Yo mama is so stupid that at bottom of application where it says Sign Here - she put Scorpio.", "Yo mama is so stupid that she wouldn't know up from down if she had three guesses.", "Yo mama is so stupid that she once attempted to commit suicide by jumping off a curb.", "Yo mama is so stupid that she put on bug spray before going to the flea market.", "Yo mama is so stupid that she stole free bread.", "Yo mama is so stupid that she locked her keys inside a motorcycle.", "Yo mama's so stupid that she got locked inside a motorcycle.", "Yo mama's so stupid that she went to the dentist to get a bluetooth.", "Yo mama's so stupid that she bought tickets to Xbox Live.", "Yo mama's so stupid that whenever someone rings the doorbell, she checks the microwave.", "Yo mama's so stupid that when she broke her VCR, she bought a video tape on how to fix your VCR.", "Yo mama is so stupid that she tried to drop acid but the car battery fell on her foot.", "Yo mama so dumb, she lost a spelling bee to Hodor", "Yo Mama so dumb, she thought Bran Stark was a type of muffin.", "Yo mama so fat, they've been calling her \"the wall\" for thousands of years!", "Yo mama so fat, she Winter-fell and couldn't get up!", "Yo mama so old, the old gods pray to HER!", "Yo Mama So Fat, she can't fit through the moon door.", "Yo Mama so Ugly, she got turned down for \"Girls Gone Wilding\"", "Yo mama so ugly, winter turned around and left!", "Yo mama so fat, even Roose Bolton won't touch her", "Yo mama so bad at sex, the only kind of head she gives is severed.", "Yo mama is so poor that she was in K-Mart with a box of Hefty bags and when I asked her what she was doing she said, \"Buying luggage.\"", "Yo mama is so poor that when she goes to KFC, she has to lick other people's fingers!", "Yo mama is so poor that she went to McDonald's and put a milkshake on layaway.", "Yo mama is so poor that she can't afford to pay attention!", "Yo mama is so poor that when I saw her kicking a can down the street, I asked her what she was doing, and she said \"moving.\"", "Yo mama is so poor that she waves around a popsicle stick and calls it air conditioning.", "Yo mama is so poor that I saw her running after a garbage truck with a shopping list.", "Yo mama is so poor that the bank repossesed her cardboard box.", "Yo mama is so poor Nigerian scammers wire HER money!", "Yo mama is so poor she couldn't afford to apply for Medicare!", "Yo mama is so poor that she has to wear her McDonald's uniform to church.", "Yo mama is so poor that she's got more furniture on her porch than in her house.", "Yo mama is so poor that I came over for dinner and she read me recipes.", "Yo mama is so poor that she has to take the trash IN.", "Yo mama is so poor that she had to get a second mortgage on her cardboard box.", "Yo mama is so poor that she lives in a two story Dorrito bag with a dog named Chip.", "Yo mama is so poor that I went through her front door and ended up in the back yard.", "Yo mama is so poor that her front and back doors are on the same hinge.", "Yo mama is so poor that I saw her wrestling a squirrel for a peanut.", "Yo mama is so poor that the closest thing to a car she has is a low-rider shopping cart with a box on it.", "Yo mama is so poor that she can't even put her two cents in this conversation.", "Yo mama is so poor that when I saw her walking down the street with one shoe and said \"Hey miss, lost a shoe?\" she said \"Nope, just found one!\"", "Yo mama is so poor that her face is on the front of a foodstamp.", "Yo mama is so poor that I went to her house and tore down some cob webs, and she said \"Who's tearing down the drapes?\"", "Yo mama is so poor that I stepped on her skateboard and she said \"Hey, get off the car!\"", "Yo mama is so poor that I walked into her house, asked to use the bathroom, and she said \"3rd bucket to your right.\"", "Yo mama is so poor that when I walked inside her house and put out a cigarette, she said \"who turned off the heater?\"", "Yo mama is so poor that your TV got 2 channels: ON and OFF.", "Yo mama is so poor that she watches TV on an Etch-A-Sketch.", "Yo mama is so poor that she can't even afford to go to the free clinic.", "Yo mama is so poor that she washes paper plates.", "Yo mama is so poor that her idea of a fortune cookie is a tortilla with a food stamp in it.", "Yo mama is so poor that when yo family watches TV, they go to Sears.", "Yo mama is so poor that burglars break in and leave money.", "Yo mama is so poor that she married young just to get the rice!", "Yo mama is so poor that when I went over to her house for dinner and grabbed a paper plate, she said \"Don't use the good china!\"", "Yo mama is so poor that when I saw her rolling some trash cans around in an alley, I asked her what she was doing, she said \"Remodeling.\"", "Yo mama is so poor that I threw a rock at a trash can and she popped out and said \"Who knocked?\"", "Yo mama is so poor that we were on a road trip and she stopped by a dumpster and got out. I said \"what are you doing\" and she said I'm \"booking a hotel!\"", "Yo mama is so poor that I walked into her house and swatted a firefly and Yo Mama said, \"Who turned off the lights?\"", "Yo mama is so poor that when I asked what was for dinner, she pulled her shoelaces off and said \"Spagetti.\"", "Yo mama is so poor that after I pissed in your yard, she thanked me for watering the lawn.", "Yo mama is so poor that your family ate cereal with a fork to save milk.", "Yo mama is so poor that when I ring the doorbell she says,\"DING!\"", "Yo mama is so poor that she got in an elevator and thought it was a mobile home.", "Yo mama's so poor, that her doormat doesn't say \"welcome\", it says \"welfare\".", "Yo mama is so poor that for halloween, her trick was the treat.", "Yo mama is so poor that when she tells people her address, she says \"it's in the second alley from main street, beside the yellow dumpster.\"", "Yo mama is so poor that her idea of a timeshare is a few days camped out under a bridge.", "Yo mama is so poor that when I saw her in the park digging up plants, she said she was \"getting groceries\".", "Yo mama is so poor that when I ring the doorbell I hear the toilet flush!", "Yo mama's so fat that she expresses her weight in scientific notation.", "Yo mama's so fat that scientists track her position by observing anomalies in Pluto's orbit.", "Yo mama's so fat that a recursive function computing her weight causes a stack overflow.", "Yo mama's so fat that the long double numeric variable type in C++ is insufficient to express her weight.", "Yo mama's so fat that THX can't even surround her.", "Yo mama's a convenient proof that the universe is still expanding exponentially.", "Yo mamags so big that she has a gravitational pull equal to that of the sun.", "Yo mama's so big that doctors use scuba divers as nanobots to clean her arteries.", "The mass of yo mama at rest is approximately equal to that of a neutron star traveling at (1-(10^-1000))c.", "Yo mama's so slow and dumb that she can be emulated on a 286.", "Yo mama conforms to Planck's law - the greater the frequency with which she screws, the more energetic she gets.", "Yo mama's like a converging lens - she's wider in the middle than she is on either end.", "Yo mama's dumber than an augmented rat.", "Yo mama's so fat that she and the great wall of China are used as reference points when astronauts look back at the Earth.", "Yo mama's such a ho that even the noble gases are attracted to her.", "Yo mama's so promiscuous that electrons have a positive charge when they're around her.", "Yo mama's so stupid that her exchange particle is a \"moron\".", "Yo mama's so fat that China uses her to block the internet.", "Yo mama's so fat that NASA shot a rocket into her ass looking for water.", "Yo mama's so dumb that she went to the dentist and asked for a bluetooth.", "Yo mama's so fat that she doesn't just have a low center of gravity, she has an elliptical orbit.", "Yo mama's so fat that IEEE is working on a wifi protocol so people can get the signals to reach users on opposite sides of her. It's called 802.11 Draft Fat Momma", "If we were to code your mom in a C++ function she would look like this: double mom (double fat){ mom(fat);return mom;}; //your mom is recursively fat.", "Yo mama's so old that she goes on carbon dates.", "Yo mama's so fat, the cyberman DOWNgraded her.", "Yo mama's so ugly that Dalek's don't actually say 'Exterminate' when they see her, because they figure somebody else already got there first!", "Yo mama's such a drunk, that her sonic screwdriver is made of vodka and orange juice.", "Yo mama's so ugly that when she looks into the Tardis, the Tardis doesn't look into her.", "Yo mama's so ugly that when the Daleks Exterminate her, it's not for domination.", "Yo mama's such a hoe that the nickname for her vagina (Bad Wolf) is scattered across time and space.", "Yo mama's so fat, she's bigger than both the outside AND the inside of the Tardis", "Yo mama's so ugly that when Captain Jack Harkness saw her, he actually died.", "Yo mama's so fat, the Pirate Planet tried to take her over.", "Yo mama's so lazy, she's a \"part-time\" lord", "Yo Mama's so fat that when she got upgraded by the cybermen, they turned her into an ice cream truck", "Yo mama's so stupid that when Cassandra says \"Moisturize!\", she begins to sweat.", "Yo mama's so fat, the Doctor caught her eating his psychic paper, thinking it was a burger.", "Yo mama's such a noisy hoe, her nickname is the sonic screwdriver!", "Yo mama's so fat, it doesn't matter that the Tardis is bigger on the inside. She can't get through the door.", "Yo mama is so skinny that she turned sideways and disappeared.", "Yo mama is so skinny that she hula hoops with a Cheerio.", "Yo mama is so skinny that she has to wear a belt with spandex.", "Yo mama is so skinny that she swallowed a meatball and thought she was pregnant.", "Yo mama is so skinny that she can see out a peephole with both eyes.", "Yo mama is so skinny that she uses a Band-Aid as a maxi-pad.", "Yo mama is so skinny that you can save her from drowning by tossing her a Fruit Loop.", "Yo mama is so skinny that she has to run around in the shower to get wet.", "Yo mama is so skinny that when she wore her yellow dress, she looked like an HB pencil.", "Yo mama is so skinny that if she had a sesame seed on her head, she'd look like a push pin.", "Yo mama is so skinny that her nipples touch.", "Yo mama is so skinny that I could blind-fold her with dental floss.", "Yo mama is so skinny that she looks like a mic stand.", "Yo mama is so skinny that she only has one stripe on her pajamas.", "Yo mama is so skinny that she can dodge rain drops.", "Yo mama is so skinny that she inspires crack whores to diet.", "Yo mama is so skinny that she uses Chapstick for deodorant.", "Yo mama is so small that she goes paragliding on a Dorito.", "Yo mama is so skinny that if she turned sideways and stuck out her tongue, she would look like a zipper.", "Yo mama is so skinny that she goes hot tubbing with the Mini Wheats Man.", "Yo mama is so skinny that when she takes a bath and lets the water out, her toes get caught in the drain.", "Yo mama is so skinny that her bra fits better when she wears it backwards.", "Yo mama is so skinny that she had to stand in the same place twice to cast a shadow.", "Yo mama is so skinny that if she had a yeast infection she'd be a Quarter Pounder with Cheese.", "Yo mama is so skinny that her pants only have one belt loop.", "Yo mama is so skinny that if she had dreads I'd grab her by the ankles and use her to mop the floor.", "Yo mama is so skinny that instead of calling her your parent, you call her transparent.", "Yo mama is so tall that she tripped in Michigan and bumped her head in Florida.", "Yo mama is so tall that she tripped over a rock and hit her head on the moon.", "Yo mama is so tall that if she did a back-flip she'd kick Jesus in the mouth.", "Yo mama's so tall, she can see her house from anywhere.", "Yo mama's so tall, she uses two 100-foot ladders as crutches.", "Yo mama's so tall, she has to take out the driver's seat of her car and sit in the back to operate the vehicle.", "Yo mama's so tall, she makes Shaquille O'Neal look like Gary Coleman.", "Yo mama's so tall, she did a push-up and burned her back on the sun.", "Yo mama is so short that you can see her feet on her drivers license!", "Yo mama is so short that she has to use a ladder to pick up a dime.", "Yo mama is so short that she does backflips under the bed.", "Yo mama is so short that she models for trophys.", "Yo mama is so short that her homies are the Keebler Elfs.", "Yo mama is so short that she has to get a running start to get up on the toilet.", "Yo mama is so short that when she sneezes, she hits her head on the floor.", "Yo mama is so short that she does pull-ups on a staple.", "Yo mama is so short that she can do push-ups under the door.", "Yo mama is so short that when I was dissin' her she tried to jump kick me in the ankle.", "Yo mama is so short that she can limbo under the door.", "Yo mama is so short that she uses a condom for a sleeping bag.", "Yo mama is so short that she slam-dunks her bus fare.", "Yo mama is so short that she has to look up to look down.", "Yo mama is so short that she makes Gary Coleman look like Shaquille O'Neal.", "Yo mama is so short, you can make a life size sculpture of her using one can of Play-Doh.", "Yo mama's so short that when she sat on the curb her feet didn't touch the ground.", "Yo mama is so short that she can play handball on the curb.", "Yo mama has so much hair on her upper lip that she braids it.", "Yo mama is so hairy that Bigfoot wants to take HER picture!", "Yo mama is so hairy that she looks like she has Buckwheat in a headlock.", "Yo mama is so hairy that you almost died of rugburn at birth!", "Yo mama is so hairy that they filmed \"Gorillas in the Mist\" in her shower!", "Yo mama is so hairy that if she could fly she'd look like a magic carpet.", "Yo mama is so hairy that she looks like Bigfoot in a tank top.", "Yo mama is so hairy that she has afros on her nipples.", "Yo mama is so hairy that when I took her to a pet store they locked her in a cage.", "Yo mama is so hairy that she looks like a Chia pet with a sweater on.", "Yo mama is so hairy that Jane Goodall follows her around.", "Yo mama is so hairy that the only language she can speak is wookie.", "Yo mama is so hairy that she shaves her legs with a weedwacker.", "Yo mama is so hairy that if you shaved her legs, you could supply wigs for the entire Hair Club for Men.", "Yo mama is so hairy that her armpits look like she has Don King in a headlock.", "Yo mama's so hairy that she's got sideburns on her tits.", "Yo mama is so hairy that she got a trim and lost 20 pounds.", "Yo mama is so hairy that people run up to her and say \"Chewbacca, can I get your autograph?\"", "Yo mama is so hairy that she gets mistaken for Chewbacca's cousin.", "Yo mama is so hairy that two birds made nests in her armpits and she doesn't even know about it!", "Yo mama is so hairy that when she's at a nude beach people think she's wearing a fur coat!", "Yo mama is so dirty that that she was banned from a sewage facility because of sanitation concerns.", "Yo mama is so dirty that she makes mud look clean.", "Yo mama is so dirty that that you can't tell where the dirt stops and she begins.", "Yo mama is so dirty that she has to creep up on bathwater.", "Yo mama is so dirty that she loses weight in the shower.", "Yo mama is so dirty that even Swamp Thing told her to take a shower.", "Yo mama is so dirty that the US Government uses her bath water as a chemical weapon.", "Yo mama is so dirty that when she tried to take a bath, the water jumped out and said \"I'll wait.\"", "Yo mama is so nasty that she has more rappers in her than an iPod.", "Yo mama is so nasty that she makes speed stick slow down.", "Yo mama is so nasty that she brings crabs to the beach.", "Yo mama is so nasty that that pours salt water down her pants to keep her crabs fresh.", "Yo mama is so nasty that the fishery pays her to stay away.", "Yo mama is so nasty that she only changes her drawers once every 10000 miles.", "Yo mama is so nasty that a skunk smelled her ass and passed out.", "Yo mama is so nasty that I chatted with her on MSN and she gave me a virus.", "Yo mama is so nasty that her tits leak sour milk.", "Yo mama is so nasty that she has to use Right Guard and Left Guard.", "Yo mama is so nasty that she bit the dog and gave it rabies.", "Yo mama is so nasty that she has a sign by her crotch that says: \"Warning: May cause irritation, drowsiness, and a rash or breakouts.\"", "Yo mama is so nasty that she's got more clap than an auditorium.", "Yo mama is so nasty that she calls Janet \"Miss Jackson.\"", "Yo mama is so nasty that she has more crabs then Red Lobster.", "Yo mama is so nasty that she made right guard turn left.", "Yo mama is so nasty that I when I talked to her on the phone, she gave me an ear infection.", "Yo mama is so nasty that next to her a skunk smells sweet.", "Yo mama is so nasty that her shit is glad to escape.", "Yo mama is so nasty that when you were being delivered, the doctor was wearing the oxygen mask.", "Yo mama is so nasty that every time she opens her mouth she's talking shit.", "Yo mama is so nasty that even dogs won't sniff her crotch.", "Yo mama is so nasty that the only dis I want to give her is a disinfectant.", "Yo mama is so nasty that her crabs use her tampon string as a bungee cord.", "Yo mama is so greasy that she uses bacon as a band-aid!", "Yo mama is so greasy that she sweats Crisco!", "Yo mama is so greasy that Texaco buys Oil from her.", "Yo mama is so greasy that she sweats butter and syrup and has a full time job at Denny's wiping pancakes across her forehead.", "Yo mama is so greasy that her freckles slipped off.", "Yo mama is so greasy that if Crisco had a football team, she'd be the mascot.", "Yo mama is so greasy that she squeezes Crisco from her hair to bake cookies.", "Yo mama is so greasy that she's labeled as an ingredient in Crisco.", "Yo mama is so greasy that you could fry a chicken dinner for 12 on her forehead.", "Yo mama is so greasy that I buttered my popcorn with her leg hairs.", "Yo mama's house is so dirty that roaches ride around on dune buggies!", "Yo mama's house is so dirty that she has to wipe her feet before she goes outside.", "Yo mama's teeth are so rotten that when she smiles it looks like she has dice in her mouth.", "Yo mama's teeth are so yellow that traffic slows down when she smiles!", "Yo mama's teeth are so yellow that she spits butter!", "Yo mama's so dirty, she fertilizes her lawn by rolling in it!", "Yo mama's so dirty, when a seed gets stuck in her ass crack it beings to grow!", "Yo mama's so dirty, she jumped in a river and created a mud slide!", "Yo mama's so dirty, when the wind blows people yell \"Sand Storm!!!\"", "Yo mama's so greasy, on hot days she cooks bacon strips on her ass cheeks!", "Yo mama is so fat that she took geometry in high school just cause she heard there was gonna be some pi.", "Yo mama is so fat that the ratio of the circumference to her diameter is four.", "Yo mama is so fat that her derivative is strictly positive.", "Yo mama is like a protractor - she's good at every angle.", "Yo mama is so fat that in a love triangle, she'd be the hypotenuse.", "Yo mama is so stupid that when I told her \"pi-r-squared\" and she replied no, they are round.", "The limit of yo mama's ass goes to infinity.", "Yo mama = x/0 for every x in yo mama.", "The infinite series of yo mama from 0 to infinity is strictly diverging.", "Yo mama is so mean that she has no standard deviation.", "Yo mama is so ugly, that Pythagoras wouldn't touch her with a 3-4-5 triangle.", "Yo mama is so square that she's got imaginary numbers on her social security card.", "Yo mama is such a ho, that she asked all the math majors to to figure out g(f(your mom)) just so they could \"f\" her first.", "The volume of yo mama is an improper integral.", "The integral of yo mama is fat plus a constant, where the constant is equal to more fat.", "Yo mama's muscle-to-fat ratio can only be explained in irrational complex numbers.", "The only way to get from point A to point B is around yo mama's fat ass.", "Yo mama's so smart, the hardest decision she's ever had to make was which college to accept a scholarship from - Harvard, Yale or Princeton!", "Yo mama's so clean, she could bottle her bathwater and sell it at the grocery store alongside Evian, Dasani and FIJI.", "Yo mama's so generous that she sponsors children in Africa, Asia AND South America!", "Yo mama's so popular that Facebook crashed on her birthday, because too many people posted wishes on her wall.", "Yo mama's such a good cook that her vegetable lasagna could be served as the featured item at a Michelin Star restaurant!", "Yo momma's so healthy that medical textbooks use her x-rays to demonstrate what perfect bone structure should look like.", "Yo mama's breath smells so fresh that Wrigley's could make a chewing gum flavour based on it.", "Yo mama's so fit that she could run a marathon, teach a Zumba class AND climb Mount Everest without stopping to catch her breath once.", "Yo mama's so fashionable that Gucci, Prada and Fendi call her on a daily basis to get insight into upcoming fashion trends.", "Yo mama's aging with such grace and beauty that she could be featured on the cover of Elle magazine.", "Yo mama's like a puppy... everybody wants to give her a hug.", "Yo mama's so smart that an employee from Wikipedia calls her when they need to verify facts about 18th century political figures."] ================================================ FILE: src/lib/structures/KlasaCommand.js ================================================ const { Command: KlasaCommand } = require("klasa"); class Command extends KlasaCommand { constructor(store, file, core, { upvoteOnly = false, patronOnly = false, ...options }) { super(store, file, core, options); this.upvoteOnly = upvoteOnly; this.patronOnly = patronOnly; } } module.exports = Command; ================================================ FILE: src/lib/structures/ModLog.js ================================================ const { MessageEmbed, Permissions } = require("discord.js"); const requiredPermissions = new Permissions(["SEND_MESSAGES", "VIEW_CHANNEL", "EMBED_LINKS"]); module.exports = class ModLog { constructor(guild) { this.guild = guild; this.client = guild.client; this.caseType = null; this.user = null; this.moderator = null; this.reason = null; this.case = null; this.timestamp = null; } /** * Gives a type to the mod log * @param {string} type type of case * @returns {ModLog} */ setType(type) { this.type = type; return this; } /** * Sets the target user to the mod log * @param {User} user target user * @returns {ModLog} */ setUser(user) { this.user = { id: user.id, tag: user.tag }; return this; } /** * Sets the moderator to the mod log * @param {User} user moderator user * @returns {ModLog} */ setModerator(user) { this.moderator = { id: user.id, tag: user.tag, avatar: user.displayAvatarURL({ size: 2048, format: "png" }) }; return this; } /** * Sets the reason for the case * @param {string} reason reason of case * @returns {ModLog} */ setReason(reason = null) { if (Array.isArray(reason)) reason = reason.join(" "); this.reason = reason; return this; } /** * Sends an embed with all the details of the mod log * @returns {Promise} */ async send() { const channelId = this.guild.settings.get("channels.modlogs"); if (!channelId) return; let channel = this.guild.channels.cache.get(channelId); if (!channel) channel = this.client.channels.fetch(channelId); if (!channel) return; await this.getCase(); try { if (!channel.permissionsFor(this.guild.me).has(requiredPermissions, true)) return; return channel.sendEmbed(this.embed); } catch (e) { console.error(e); } } /** * Creates an embed with all the details of the mod log * @returns {KlasaMessage} */ get embed() { return new MessageEmbed() .setAuthor(this.moderator.tag, this.moderator.avatar) .setColor(ModLog.color(this.type)) .setDescription([ `**❯ Type**: ${this.type[0].toUpperCase() + this.type.slice(1)}`, `**❯ User**: ${this.user.tag} (${this.user.id})`, `**❯ Reason**: ${this.reason || `Use \`${this.guild.settings.get("prefix")}reason ${this.case}\` to claim this log.`}` ].join("\n")) .setFooter(`Case: ${this.case}`) .setTimestamp(); } /** * Creates an embed with all the details of the mod log * @returns {KlasaMessage} */ async getCase() { this.case = this.guild.settings.get("modlogs").length; this.timestamp = new Date().getTime(); await this.guild.settings.update("modlogs", this.caseInfo).catch(e => console.error(`[Modlog] ${e}`)); return this.case; } /** * Pack all the case information in an object * @returns {Object} */ get caseInfo() { return { type: this.type, user: this.user.id, moderator: this.moderator.id, reason: this.reason, case: this.case, timestamp: this.timestamp }; } /** * Get the default provider being used * @returns {Provider} */ get provider() { return this.client.providers.default; } /** * Gives color corresponding to a type * @param {string} type the type of case * @returns {string} */ static color(type) { switch (type) { case "ban": return "#d9534f"; case "unban": return "#ab9292"; case "mute": return "#d9534f"; case "unmute": return "#ab9292"; case "warn": return "#fbe400"; case "kick": return "#d9534f"; case "softban": return "#d87370"; default: return "#d9534f"; } } }; ================================================ FILE: src/lib/structures/PenguClient.js ================================================ const { Client, Gateway } = require("klasa"); const config = require("../../../config.js"); const { StatsD } = require("hot-shots"); // Extensions require("./PenguGuild"); require("./PenguMember"); // Custom const permissionLevels = require(`./permissionLevels`); // Plugins Client.use(require("@kcp/functions").Client); if (config.musicEnabled) Client.use(require("@pengubot/music")); if (config.apiEnabled) Client.use(require("klasa-api")); // Schemas const defaultMemberSchema = require(`./schemas/defaultMemberSchema`); const defaultGuildSchema = require(`./schemas/defaultGuildSchema`); const defaultClientSchema = require(`./schemas/defaultClientSchema`); const defaultUserSchema = require(`./schemas/defaultUserSchema`); class PenguClient extends Client { constructor(options) { super({ ...options, permissionLevels, defaultGuildSchema, defaultClientSchema, defaultUserSchema }); this.topCache = []; this.health = Object.seal({ commands: { temp: { count: 0, ran: {} }, cmdCount: new Array(60).fill({ count: 0, ran: {} }) } }); this.emotes = { check: "<:penguSuccess:435712876506775553>", cross: "<:penguError:435712890884849664>", loading: "" }; this.dogstats = new StatsD("localhost", 8125); this.version = "2.0.0"; this.userAgent = `PenguBot/${this.version}/${this.options.production ? "Production" : "Development"}`; this.gateways.register(new Gateway(this, "members", { schema: defaultMemberSchema })); } } module.exports = PenguClient; ================================================ FILE: src/lib/structures/PenguGuild.js ================================================ const { Structures } = require("discord.js"); const PenguMemberManager = require("./PenguMemberManager"); Structures.extend("Guild", Guild => { class KlasaGuild extends Guild { constructor(client, data) { // avoid double iteration by the super class populating the members collection const { members, ...restData } = data || {}; super(client, Object.keys(restData).length ? restData : undefined); this.members = new PenguMemberManager(this); if (members) for (const member of members) this.members.add(member); } } return KlasaGuild; }); ================================================ FILE: src/lib/structures/PenguMember.js ================================================ const { Structures } = require("discord.js"); module.exports = Structures.extend("GuildMember", GuildMember => { class KlasaMember extends GuildMember { constructor(...args) { super(...args); this.settings = this.client.gateways.get("members").acquire(this, `${this.guild.id}.${this.id}`); } toJSON() { return { ...super.toJSON(), settings: this.settings.toJSON() }; } } return KlasaMember; }); ================================================ FILE: src/lib/structures/PenguMemberManager.js ================================================ const { GuildMemberManager } = require("discord.js"); module.exports = class PenguMemberManager extends GuildMemberManager { async _fetchSingle(...args) { const member = await super._fetchSingle(...args); await member.settings.sync(); return member; } async _fetchMany(...args) { const members = await super._fetchMany(...args); await Promise.all(members.map(member => member.settings.sync())); return members; } }; ================================================ FILE: src/lib/structures/ServerLog.js ================================================ const { MessageEmbed, Permissions } = require("discord.js"); const requiredPermissions = new Permissions(["SEND_MESSAGES", "VIEW_CHANNEL", "EMBED_LINKS"]); module.exports = class ServerLog { constructor(guild) { this.guild = guild; this.client = guild.client; this.type = null; this.embedColor = null; this.name = null; this.user = null; this.data = {}; } /** * Gives a color to the server log * @param {string} type type of log * @returns {ServerLog} */ setColor(type) { this.embedColor = this.color(type); return this; } /** * Gets the type of log * @param {string} type type of log * @returns {ServerLog} */ setType(type) { this.type = type; return this; } /** * Sets author for an embed * @param {string} name name of author * @param {string} iconurl display avatar link * @returns {ServerLog} */ setAuthor(name = null, iconurl = null) { this.data.author = { name, avatar: iconurl }; return this; } /** * Sets the message * @param {string} message log message * @returns {ServerLog} */ setMessage(message = null) { if (Array.isArray(message)) message = message.join(" "); this.message = message; return this; } /** * Sets the name * @param {string} name log message * @returns {ServerLog} */ setName(name = null) { if (Array.isArray(name)) name = name.join(" "); this.name = name; return this; } /** * Sends an embed with all the details of the server log * @returns {Promise} */ async send() { if (!this.guild.settings.get(`serverlogs.${this.type}`)) return; if (!this.guild.settings.get("channels.logs")) return; const channel = this.guild.channels.cache.get(this.guild.settings.get("channels.logs")); if (!channel) return; if (!channel.permissionsFor(this.guild.me).has(requiredPermissions, true)) return; return channel.sendEmbed(this.embed); } /** * Creates an embed with all the details of the server log * @returns {KlasaMessage} */ get embed() { const embed = new MessageEmbed() .setColor(this.embedColor) .setDescription(this.message) .setFooter(this.name) .setTimestamp(); if (this.data && this.data.author) embed.setAuthor(this.data.author.name, this.data.author.avatar ? this.data.author.avatar : ""); if (this.data && this.data.thumbnail) embed.setThumbnail(this.data.thumbnail); if (this.data && this.data.fields) { for (const field of this.data.fields) { embed.addField(field.name, field.value, field.inline); } } return embed; } /** * Gives color corresponding to a type * @param {string} type the type of case * @returns {string} */ color(type) { switch (type) { case "red": return "#d9534f"; case "green": return "#5cb85c"; case "blue": return "#428bca"; case "yellow": return "#d8d94f"; default: return "#428bca"; } } }; ================================================ FILE: src/lib/structures/permissionLevels.js ================================================ const { PermissionLevels } = require("klasa"); module.exports = new PermissionLevels() // Everyone .add(0, () => true) // Pengu DJ .add(2, ({ member, guild }) => { if (!guild || !member) return false; return member.roles.cache.has(guild.settings.get("roles.dj")) || guild.settings.get("users.dj").includes(member.id); }, { fetch: true }) // Pengu Staff .add(3, ({ member, guild }) => { if (!guild || !member) return false; return member.roles.cache.has(guild.settings.get("roles.staff")) || guild.settings.get("users.staff").includes(member.id); }, { fetch: true }) // Member is a PenguBot Moderator in the guild .add(4, ({ member, guild }) => { if (!guild || !member) return false; return member.roles.cache.has(guild.settings.get("roles.mod")) || guild.settings.get("users.mod").includes(member.id); }, { fetch: true }) // Member must have Kick/Ban Permissions .add(5, ({ member, guild }) => { if (!guild || !member) return false; return member.roles.cache.has(guild.settings.get("roles.mod")) || guild.settings.get("users.mod").includes(member.id) || (member.permissions.has("BAN_MEMBERS") && member.permissions.has("KICK_MEMBERS")); }, { fetch: true }) // Member must have 'MANAGE_GUILD' or 'ADMINISTRATOR' permissions .add(6, ({ member, guild }) => { if (!guild || !member) return false; return member.roles.cache.has(guild.settings.get("roles.admin")) || guild.settings.get("users.admin").includes(member.id) || (member.permissions.has("ADMINISTRATOR") && member.permissions.has("MANAGE_GUILD")); }, { fetch: true }) // The member using this command must be the guild owner .add(7, ({ member, guild }) => { if (!guild || !member) return false; return member === guild.owner; }, { fetch: true }) // Allows the Bot Owner to use any lower commands .add(9, ({ author, client }) => client.owners.has(author), { break: true }) // Allows the bot owner to use Bot Owner only commands, which silently fail for other users. .add(10, ({ author, client }) => client.owners.has(author)); ================================================ FILE: src/lib/structures/schemas/defaultClientSchema.js ================================================ const { KlasaClient } = require("klasa"); module.exports = KlasaClient.defaultClientSchema .add("pGuilds", "string", { array: true, configurable: false }) .add("counter", folder => folder .add("total", "integer") .add("commands", "any", { array: true })) .add("patrons", folder => folder .add("users", "user", { array: true, configurable: false }) .add("guilds", "guild", { array: true, configurable: false })); ================================================ FILE: src/lib/structures/schemas/defaultGuildSchema.js ================================================ /* eslint-disable no-inline-comments */ const { KlasaClient } = require("klasa"); module.exports = KlasaClient.defaultGuildSchema // Logging .add("serverlogs", folder => folder .add("join", "boolean", { default: false }) .add("leave", "boolean", { default: false }) .add("moderation", "boolean", { default: false }) .add("channels", "boolean", { default: false }) .add("messages", "boolean", { default: false }) .add("automod", "boolean", { default: false }) .add("roles", "boolean", { default: false })) // Custom Commands .add("customcmds", "any", { array: true, configurable: false }) // Starboard .add("starboard", folder => folder .add("channel", "textchannel") .add("required", "integer", { default: 3 })) // Inhibitors .add("disabledCommandsGroup", "string", { array: true, configurable: false }) // Welcome & Leave .add("messages", folder => folder .add("leave", "string", { default: "It's sad to see you leave {USERNAME}, hope to see you again." }) .add("join", "string", { default: "Welcome {MENTION} to {GUILD_NAME}, we hope you enjoy your stay!" })) // Automod .add("automod", folder => folder .add("perspective", filter => filter .add("TOXICITY", "any", { default: { enabled: false, threshold: 0.99 } }) .add("SEVERE_TOXICITY", "any", { default: { enabled: false, threshold: 0.99 } }) .add("THREAT", "any", { default: { enabled: true, threshold: 0.99 } }) .add("SPAM", "any", { default: { enabled: true, threshold: 0.99 } }) .add("OBSCENE", "any", { default: { enabled: false, threshold: 0.99 } }) .add("SEXUALLY_EXPLICIT", "any", { default: { enabled: false, threshold: 0.99 } }) .add("PROFANITY", "any", { default: { enabled: false, threshold: 0.99 } })) .add("invites", "boolean", { default: false })) // Patreon .add("patreon", folder => folder .add("premium", "boolean", { default: false, configurable: false }) .add("patron", "user", { configurable: false })) // Misc .add("misc", folder => folder .add("leveluptype", "string", { default: "guild", configurable: false }) .add("volume", "integer", { default: 100, max: 100, min: 0, configurable: false })) // Mod Logs .add("modlogs", "any", { array: true, configurable: false }) // All Channels .add("channels", folder => folder .add("modlogs", "textchannel") .add("join", "textchannel") .add("leave", "textchannel") .add("logs", "textchannel")) // Toggles .add("toggles", folder => folder .add("joinmsg", "boolean", { default: true }) .add("leavemsg", "boolean", { default: true }) .add("autoroles", "boolean", { default: true }) .add("perspective", "boolean", { default: false }) .add("customcmds", "boolean", { default: true }) .add("starboard", "boolean", { default: true }) .add("levelroles", "boolean", { default: true }) .add("modlogs", "boolean", { default: true }) .add("djmode", "boolean", { default: false }) .add("levelup", "boolean", { default: false }) .add("staffbypass", "boolean", { default: true }) .add("selfroles", "boolean", { default: true })) // Permissions .add("users", users => users .add("admin", "user", { array: true }) .add("mod", "user", { array: true }) .add("staff", "user", { array: true }) .add("dj", "user", { array: true })) .add("roles", roles => roles .add("autorole", "role", { array: true }) .add("selfrole", "role", { array: true }) .add("levelrole", "any", { array: true, configurable: false }) .add("admin", "role") .add("mod", "role") .add("staff", "role") .add("dj", "role") .add("muted", "role")); ================================================ FILE: src/lib/structures/schemas/defaultMemberSchema.js ================================================ const { Schema } = require("klasa"); module.exports = new Schema() // Profiles .add("xp", "integer", { default: 0, configurable: false }) .add("level", "integer", { default: 0, configurable: false }); ================================================ FILE: src/lib/structures/schemas/defaultUserSchema.js ================================================ const { KlasaClient } = require("klasa"); module.exports = KlasaClient.defaultUserSchema // Profiles .add("daily", "integer", { default: 0, configurable: false }) .add("xp", "integer", { default: 0, configurable: false }) .add("snowflakes", "integer", { default: 0, configurable: false }) .add("level", "integer", { default: 0, configurable: false }) .add("profilebg", "string", { default: "default", configurable: false }) .add("backgrounds", "string", { default: ["default"], array: true, configurable: false }) .add("reps", "integer", { default: 0, configurable: false }) .add("repcooldown", "integer", { default: 0, configurable: false }) .add("title", "string", { default: "No Title Set", configurable: false, min: 1, max: 30 }) .add("lastUpvote", "integer", { default: 0, configurable: false }) // AFK .add("afk", folder => folder .add("time", "integer", { configurable: false }) .add("reason", "string", { configurable: false })) // Patreon .add("patreon", folder => folder .add("paying", "boolean", { default: false, configurable: false }) .add("guilds", "guild", { array: true, configurable: false }) .add("pledged", "integer", { default: 0, configurable: false }) .add("current", "integer", { default: 0, configurable: false }) .add("tokens", "integer", { default: 0, configurable: false })); ================================================ FILE: src/lib/tags/getjson.js ================================================ const { util: { fetch } } = require("../../index"); module.exports = { name: "getjson", run: async ctx => { const [str, propPath] = ctx.value; const body = await fetch(str); if (!body) throw "No JSON found."; if (!propPath) return JSON.stringify(body); return getProp(body, propPath); } }; function getProp(body, prop) { if (prop === undefined) return body; const propParts = `${prop}`.split("."); let result = body, lastProp; while ((lastProp = propParts.shift()) !== undefined) { if (result[lastProp] === undefined) return undefined; result = result[lastProp]; } return result; } ================================================ FILE: src/lib/tags/sendchannel.js ================================================ const { Argument } = require("klasa"); module.exports = { name: "sendchannel", aliases: ["channelsend"], run: ctx => { const [id, message] = ctx.value; if (!id || !message) throw "You must provide a valid channel ID and content."; let channel; if (Argument.regex.channel.test(id)) { channel = ctx.guild.channels.cache.get(id); } else { channel = ctx.guild.channels.cache.find(chan => chan.name === id); } if (!channel || channel.type === "voice") throw "An invalid channel or channel type was specified."; if (!channel.postable) throw "I do not have permissions to send messages to that channel."; return channel.sendMessage(message); } }; ================================================ FILE: src/lib/util/Util.js ================================================ const fetch = require("node-fetch"); class Util { static toCodePoint(unicode) { const parts = []; let c = 0, p = 0, i = 0; while (i < unicode.length) { c = unicode.charCodeAt(i++); if (p) { parts.push((0x10000 + ((p - 0xD800) << 10) + (c - 0xDC00)).toString(16)); // eslint-disable-line no-bitwise p = 0; } else if (c >= 0xD800 && c <= 0xDBFF) { p = c; } else { parts.push(c.toString(16)); } } return parts.join("-"); } static haste(data, extension = "js") { return Util.fetch("https://paste.pengubot.com/documents", { method: "post", body: data }) .then(body => `https://paste.pengubot.com/${body.key}.${extension}`); } static async fetch(url, options, type) { if (typeof options === "undefined") { options = {}; type = "json"; } else if (typeof options === "string") { type = options; options = {}; } else if (typeof type === "undefined") { type = "json"; } const query = new URLSearchParams(options.query || {}); url = `${url}?${query}`; const result = await fetch(url, options); if (!result.ok) throw new Error(`${url} - ${result.status}`); switch (type) { case "result": return result; case "buffer": return result.buffer(); case "json": return result.json(); case "text": return result.text(); default: throw new Error(`Unknown type ${type}`); } } static shuffleArray(array) { for (let i = array.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * i); const temp = array[i]; array[i] = array[j]; array[j] = temp; } return array; } } module.exports = Util; ================================================ FILE: src/main.js ================================================ const { ShardingManager } = require("kurasuta"); const { join } = require("path"); const config = require("../config.js"); const PenguClient = require("./lib/structures/PenguClient"); const status = "PenguBot.com/premium - p!help"; const sharder = new ShardingManager(join(__dirname, "PenguBot"), { token: config.token, client: PenguClient, clientOptions: { prefix: "p!", commandEditing: true, disableEveryone: true, regexPrefix: /^((?:Hey |Ok )?Pengu(?:,|!| ))/i, typing: false, pieceDefaults: { commands: { deletable: true, quotedStringSupport: true, bucket: 2 }, rawEvents: { enabled: true } }, providers: { default: "rethinkdb", rethinkdb: config.database }, console: { useColor: true }, production: config.production, presence: { activity: { name: status, type: "LISTENING" } }, prefixCaseInsensitive: true, noPrefixDM: true, aliasFunctions: { returnMethod: "run", enabled: true, prefix: "funcs" }, api: { port: 2006, prefix: "/" }, messageSweepInterval: 480, messageCacheLifetime: 120, commandMessageLifetime: 120, owners: ["136549806079344640"], music: { nodes: config.nodes, lyrics: config.apis.lyrics, spotify: { buffer: config.apis.spotify, token: "" } }, ws: { intents: ["GUILDS", "GUILD_MESSAGES", "GUILD_MEMBERS", "GUILD_BANS", "GUILD_VOICE_STATES", "GUILD_MESSAGE_REACTIONS", "DIRECT_MESSAGES", "DIRECT_MESSAGE_REACTIONS"] } }, shardCount: config.shards, ipcSocket: config.patreon ? 12168 : 12169, timeout: 60000 }); sharder.spawn() .catch(console.error); ================================================ FILE: src/middlewares/headers.js ================================================ const { Middleware } = require("../index"); module.exports = class extends Middleware { constructor(...args) { super(...args, { priority: 10 }); } run(req, res) { res.setHeader("X-Content-Type-Options", "nosniff"); res.setHeader("Access-Control-Allow-Origin", "*"); res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); res.setHeader("Access-Control-Allow-Headers", "*"); const matches = /msie\s*(\d+)/i.exec(req.headers["user-agent"]); res.setHeader("X-XSS-Protection", !matches || (Number(matches[1]) >= 9) ? "1; mode=block" : "0"); if (req.method === "OPTIONS") return res.end("Something"); res.setHeader("Content-Type", "application/json"); return undefined; } }; ================================================ FILE: src/middlewares/json.js ================================================ const { Middleware } = require("../index"); const zlib = require("zlib"); module.exports = class extends Middleware { constructor(...args) { super(...args, { priority: 20 }); } async run(req) { if (req.method !== "POST") return; req.body = {}; const stream = this.contentStream(req); let body = ""; for await (const chunk of stream) body += chunk; try { req.body = JSON.parse(body); } catch (noop) { // Yeah nah } } contentStream(req) { const length = req.headers["content-length"]; let stream; switch ((req.headers["content-encoding"] || "identity").toLowerCase()) { case "deflate": stream = zlib.createInflate(); req.pipe(stream); break; case "gzip": stream = zlib.createGunzip(); req.pipe(stream); break; case "identity": stream = req; stream.length = length; break; } return stream; } }; ================================================ FILE: src/monitors/afk.js ================================================ const { Monitor } = require("../index"); module.exports = class extends Monitor { constructor(...args) { super(...args, { ignoreOthers: false }); } async run(msg) { if (!msg.guild || !msg.channel || !msg.channel.postable) return; if (msg.author.settings.get("afk.time")) await this.checkAfk(msg); if (msg.mentions.users.size) await this.afkMentioned(msg); } async checkAfk(msg) { await msg.author.settings.reset(["afk.time", "afk.reason"]); const message = await msg.sendLocale("MONITOR_AFK_REMOVED", [msg.author.username]); return message.delete({ timeout: 10000, reason: "Pengubot AFK Feature" }).catch(() => null); } async afkMentioned(msg) { const mentioned = msg.mentions.users.first(); const afkTime = mentioned.settings.get("afk.time"); if (!afkTime) return; const afkReason = mentioned.settings.get("afk.reason"); return msg.sendLocale("MONITOR_AFK_ISAFK", [mentioned.username, afkReason, afkTime]); } }; ================================================ FILE: src/monitors/antiinvites.js ================================================ const { Monitor, ServerLog } = require("../index"); const inviteRegex = /(https?:\/\/)?(www\.)?(discord\.(gg|li|me|io)|(discordapp|discord)\.com\/invite|invite\.gg)\/.+/; module.exports = class extends Monitor { constructor(...args) { super(...args, { ignoreBots: false, ignoreSelf: true, ignoreOthers: false }); } async run(msg) { if (!msg.guild || !msg.guild.settings.get("automod.invites")) return; if (this.client.user.id !== "303181184718995457" && await msg.guild.members.fetch("303181184718995457").catch(() => null)) return; if (msg.guild.settings.get("toggles.staffbypass") && await msg.hasAtLeastPermissionLevel(3)) return; if (!inviteRegex.test(msg.content)) return; const deleted = await msg.delete().catch(() => null); if (!deleted) return; await new ServerLog(msg.guild) .setColor("red") .setType("automod") .setName("Automod - Invite Deleted") .setAuthor(`${msg.author.tag} in #${msg.channel.name}`, msg.author.displayAvatarURL()) .setMessage(`**Content:**\n${msg.content}`) .send(); } }; ================================================ FILE: src/monitors/memberProfiles.js ================================================ const { Monitor } = require("../index"); const { Canvas } = require("canvas-constructor"); const fs = require("fs-nextra"); const timeout = new Set(); module.exports = class extends Monitor { constructor(...args) { super(...args, { ignoreBots: true, ignoreSelf: true, ignoreOthers: false }); } async run(msg) { if (!msg.guild || timeout.has(`${msg.author.id}-${msg.guild.id}`)) return; if (this.client.user.id !== "303181184718995457" && await msg.guild.members.fetch("303181184718995457").catch(() => null)) return; await msg.member.settings.sync(true); const randomXP = this.client.funcs.randomNumber(1, 5); const oldLevel = msg.member.settings.get("level"); const newXP = msg.member.settings.get("xp") + randomXP; const newLevel = Math.floor(0.2 * Math.sqrt(newXP)); await msg.member.settings.update([["xp", newXP], ["level", newLevel]]); timeout.add(`${msg.author.id}-${msg.guild.id}`); setTimeout(() => timeout.delete(`${msg.author.id}-${msg.guild.id}`), 45000); if (oldLevel === newLevel) return; const { settings } = msg.guild; if (settings.get("toggles.levelup") && settings.get("misc.leveluptype") === "guild") await this.handleLevelup(msg); if (settings.get("toggles.levelroles") && settings.get("roles.levelrole").length) await this.leveledroles(msg); } async handleLevelup(msg) { if (!msg.channel.postable) return; const image = await this.generateLevelUpImage(msg.author.settings.get("profilebg"), msg.author.displayAvatarURL({ format: "png", size: 128 })); return msg.sendMessage(`🆙 | **${msg.author.tag}** has leveled up to **Level ${msg.member.settings.get("level")}** in **${msg.guild.name}**`, { files: [{ attachment: image, name: `${msg.author.id}.png` }] }); } async leveledroles(msg) { const levelRoles = msg.guild.settings.get("roles.levelrole").filter(leveledRole => msg.member.settings.get("level") >= leveledRole.lvl); if (!levelRoles.length) return; const promises = []; for (const levelRole of levelRoles) { if (msg.member.roles.cache.has(levelRole.id)) continue; const role = msg.guild.roles.cache.get(levelRole.id); if (!role) continue; if (role.position >= msg.guild.me.roles.highest.position) continue; promises.push(msg.member.roles.add(role, "Level Based Role").catch(() => null)); } await Promise.all(promises); } async generateLevelUpImage(background, userAvatar) { const [backgroundImage, avatar] = await Promise.all([ fs.readFile(`../assets/profiles/bg/${background}.png`), this.fetchURL(userAvatar, { type: "buffer" }).catch(() => null) ]); return new Canvas(100, 100) .addImage(backgroundImage, 0, 0, 530, 530) .addImage(avatar, 22, 22, 57, 57) .toBufferAsync(); } }; ================================================ FILE: src/monitors/perspectivemod.js ================================================ const { Monitor, ServerLog, config } = require("../index"); module.exports = class extends Monitor { constructor(...args) { super(...args, { ignoreOthers: false }); } async run(msg) { if (!msg.guild || !msg.content || msg.command) return; if (!msg.guild.settings.get("toggles.perspective")) return; if (msg.guild.settings.get("toggles.staffbypass") && await msg.hasAtLeastPermissionLevel(3)) return; const body = await this.fetchURL("https://commentanalyzer.googleapis.com/v1alpha1/comments:analyze", { query: { key: config.apis.perspective }, headers: { "Content-Type": "application/json" }, method: "POST", body: JSON.stringify({ comment: { text: msg.content }, requestedAttributes: { SEVERE_TOXICITY: {}, TOXICITY: {}, OBSCENE: {}, THREAT: {}, SEXUALLY_EXPLICIT: {}, SPAM: {}, PROFANITY: {} } }) }).catch(() => null); if (!body) return; const perspectiveMap = msg.guild.settings.get("automod.perspective"); const perspective = Object.fromEntries(perspectiveMap); for (const key of Object.keys(body.attributeScores)) { if (!perspective[key].enabled) continue; if (body.attributeScores[key].summaryScore.value >= perspective[key].threshold) { await msg.delete().catch(() => null); await new ServerLog(msg.guild) .setColor("red") .setType("automod") .setName(`Automod - Perspective | ${key}`) .setAuthor(`${msg.author.tag} in #${msg.channel.name}`, msg.author.displayAvatarURL()) .setMessage(`**Content:**\n${msg.content}`) .send(); } } } }; ================================================ FILE: src/monitors/profiles.js ================================================ const { Monitor } = require("../index"); const { Canvas } = require("canvas-constructor"); const fs = require("fs-nextra"); const timeout = new Set(); module.exports = class extends Monitor { constructor(...args) { super(...args, { ignoreBots: true, ignoreSelf: true, ignoreOthers: false }); } async run(msg) { if (!msg.guild) return; if (timeout.has(`${msg.guild.id}-${msg.author.id}`)) return; if (this.client.user.id !== "303181184718995457" && await msg.guild.members.fetch("303181184718995457").catch(() => null)) return; await msg.author.settings.sync(true); const randomXP = this.client.funcs.randomNumber(1, 5); const randomSnowflakes = this.client.funcs.randomNumber(1, 2); const newSnowflakes = msg.author.settings.get("snowflakes") + randomSnowflakes; const newXP = msg.author.settings.get("xp") + randomXP; const oldLevel = msg.author.settings.get("level"); const newLevel = Math.floor(0.2 * Math.sqrt(newXP)); await msg.author.settings.update([["xp", newXP], ["level", newLevel], ["snowflakes", newSnowflakes]]); timeout.add(`${msg.guild.id}-${msg.author.id}`); setTimeout(() => timeout.delete(`${msg.guild.id}-${msg.author.id}`), 45000); if (oldLevel === newLevel || !msg.guild.settings.get("toggles.levelup") || msg.guild.settings.get("misc.leveluptype") !== "user" || !msg.channel.postable) return; const image = await this.generateLevelUpImage(msg.author.settings.get("profilebg"), msg.author.displayAvatarURL({ format: "png", size: 128 })); return msg.sendMessage(`🆙 | **${msg.author.tag} has leveled up to Level ${newLevel}!**`, { files: [{ attachment: image, name: `${msg.author.id}.png` }] }); } async generateLevelUpImage(background, userAvatar) { const [backgroundImage, avatar] = await Promise.all([ fs.readFile(`../assets/profiles/bg/${background}.png`), this.fetchURL(userAvatar, { type: "buffer" }).catch(() => null) ]); return new Canvas(100, 100) .addImage(backgroundImage, 0, 0, 530, 530) .addImage(avatar, 22, 22, 57, 57) .toBufferAsync(); } }; ================================================ FILE: src/providers/rethinkdb.js ================================================ // Copyright (c) 2017-2019 dirigeants. All rights reserved. MIT license. const { Provider, util: { mergeDefault, chunk } } = require("klasa"); const rethink = require("rethinkdbdash"); module.exports = class extends Provider { constructor(...args) { super(...args); this.db = rethink(mergeDefault({ db: "pengubot", silent: false }, this.client.options.providers.rethinkdb)); } async init() { const { db } = this.db._poolMaster._options; await this.db.branch(this.db.dbList().contains(db), null, this.db.dbCreate(db)).run(); } get exec() { return this.db; } async ping() { const now = Date.now(); return await this.db.now() - now; } async shutdown() { return this.db.getPoolMaster().drain(); } /* Table methods */ async hasTable(table) { return this.db.tableList().contains(table).run(); } async createTable(table) { return this.db.tableCreate(table).run(); } async deleteTable(table) { return this.db.tableDrop(table).run(); } async sync(table) { return this.db.table(table).sync().run(); } /* Document methods */ async getAll(table, entries = []) { if (entries.length) { const chunks = chunk(entries, 50000); const output = []; for (const myChunk of chunks) output.push(...await this.db.table(table).getAll(...myChunk).run()); return output; } return this.db.table(table).run(); } async getKeys(table, entries = []) { if (entries.length) { const chunks = chunk(entries, 50000); const output = []; for (const myChunk of chunks) output.push(...await this.db.table(table).getAll(...myChunk)("id").run()); return output; } return this.db.table(table)("id").run(); } async get(table, id) { return this.db.table(table).get(id).run(); } async has(table, id) { return this.db.table(table).get(id).ne(null).run(); } async getRandom(table) { return this.db.table(table).sample(1).run(); } async create(table, id, value = {}) { return this.db.table(table).insert({ ...this.parseUpdateInput(value), id }).run(); } async update(table, id, value = {}) { return this.db.table(table).get(id).update(this.parseUpdateInput(value)).run(); } async replace(table, id, value = {}) { return this.db.table(table).get(id).replace({ ...this.parseUpdateInput(value), id }).run(); } async delete(table, id) { return this.db.table(table).get(id).delete().run(); } }; ================================================ FILE: src/routes/application.js ================================================ const { Route, Duration } = require("../index"); module.exports = class extends Route { constructor(...args) { super(...args, { route: "application" }); } async get(request, response) { let [users, guilds, channels, memory, vc, cpm] = [0, 0, 0, 0, 0, 0]; const results = await this.client.shard.broadcastEval(`[this.guilds.cache.reduce((prev, val) => val.memberCount + prev, 0), this.guilds.cache.size, this.channels.cache.size, (process.memoryUsage().heapUsed / 1024 / 1024), this.lavalink.players.size, this.health.commands.cmdCount[59].count]`); // eslint-disable-line max-len for (const result of results) { users += result[0]; guilds += result[1]; channels += result[2]; memory += result[3]; vc += result[4]; cpm += result[5]; } return response.end(JSON.stringify({ users: users, guilds: guilds, channels: channels, shards: this.client.options.shardCount, uptime: Duration.toNow(Date.now() - (process.uptime() * 1000)), latency: this.client.ws.ping.toFixed(0), memory: memory, voice: vc, cmdstotal: this.client.settings.get("counter.total"), cpm: cpm, invite: this.client.invite, ...this.client.application })); } }; ================================================ FILE: src/routes/dblHook.js ================================================ const { Route, config } = require("../index"); module.exports = class extends Route { constructor(...args) { super(...args, { route: "votes/dbl" }); } async post(req, res) { if (req.headers.authorization !== config.apis.dbl) { res.statusCode = 401; return res.end(JSON.stringify({ message: "Unauthenticated" })); } const data = req.body; const user = await this.client.users.fetch(data.user).catch(() => null); if (!user) { res.statusCode = 404; return res.end(JSON.stringify({ message: "User not found" })); } await user.settings.sync(true); let amount = this.client.funcs.randomNumber(100, 200); if (data.isWeekend) amount *= 2; if (user && user.send) user.send(`<:penguSuccess:435712876506775553> ***Thank you for Upvoting PenguBot on DiscordBots.org, you've recieved ❄ \`${amount}\` Snowflakes as a bonus! You can do this again after 12 hours at . You can use these Snowflakes to play games, give them to other people, buy profile backgrounds or save up for upcoming features!***\n\n**Tip: **\`Voting on Weekends will give you double reward than usual so don't forget to upvote then as well!\``).catch(() => null); await user.settings.update([["snowflakes", user.settings.get("snowflakes") + amount], ["lastUpvote", Date.now()]]); res.statusCode = 200; return res.end(JSON.stringify({ message: "Successful" })); } }; ================================================ FILE: src/routes/kdhGuild.js ================================================ const { Route } = require("../index"); module.exports = class extends Route { constructor(...args) { super(...args, { route: "guild/:id" }); } async get(request, response) { const { id } = request.params; if (!id) { response.statusCode = 400; return response.end(JSON.stringify({ message: "No id provided" })); } const guild = await this.client.shard.fetchGuild(id) .catch(() => null); if (!guild) { response.statusCode = 404; return response.end(JSON.stringify({ message: "Guild not found" })); } response.statusCode = 200; return response.end(JSON.stringify(guild)); } }; ================================================ FILE: src/routes/pieces.js ================================================ const { Route } = require("../index"); module.exports = class extends Route { constructor(...args) { super(...args, { route: "pieces/:type/:name" }); } get(request, response) { const { type, name } = request.params; const store = this.client.pieceStores.get(type); if (!store) response.end("[]"); if (name === "all") return response.end(JSON.stringify(store.array())); const piece = store.get(name); if (!piece) return response.end("{}"); return response.end(JSON.stringify(piece)); } }; ================================================ FILE: src/routes/syncdb.js ================================================ const { Route } = require("../index"); const config = require("../../config.js"); module.exports = class extends Route { constructor(...args) { super(...args, { route: "syncdb/:type/:id" }); } async get(request, response) { if (!request.headers.authorization || request.headers.authorization !== config.dashboard.internalSecret) { response.statusCode = 401; return response.end(JSON.stringify({ success: false, body: "Not Authorized" })); } const { type, id } = request.params; if (!type || !id) { response.statusCode = 400; return response.end(JSON.stringify({ success: false, body: "No Type or ID Provided" })); } if (type === "server") { const guild = await this.client.shard.broadcastEval(`this.guilds.cache.get("${id}") ? this.guilds.cache.get("${id}").settings.sync(true) : null`) .catch(() => null); if (!guild || !guild.length || !guild.filter(u => u !== null)) { response.statusCode = 500; return response.end(JSON.stringify({ success: false, body: "Server Error" })); } return response.end(JSON.stringify({ success: true, body: "Sync has been commissioned." })); } else if (type === "user") { const user = await this.client.shard.broadcastEval(`this.users.cache.get("${id}") ? this.users.cache.get("${id}").settings.sync(true) : null`) .catch(() => null); if (!user || !user.length || !user.filter(u => u !== null)) { response.statusCode = 500; return response.end(JSON.stringify({ success: false, body: "Server Error" })); } return response.end(JSON.stringify({ success: true, body: "Sync has been commissioned." })); } else { response.statusCode = 400; return response.end(JSON.stringify({ success: false, body: "Invalid Request" })); } } }; ================================================ FILE: src/tasks/datadog.js ================================================ const { Task } = require("../index"); module.exports = class MemorySweeper extends Task { async run() { if (!this.client.ready) return; let [users, guilds, vc, cpm] = [0, 0, 0, 0]; const results = await this.client.shard.broadcastEval(`[this.guilds.cache.reduce((prev, val) => val.memberCount + prev, 0), this.guilds.cache.size, this.music.filter(music => music.playing).size, this.health.commands.cmdCount[59].count]`); for (const result of results) { users += result[0]; guilds += result[1]; vc += result[2]; cpm += result[3]; } this.client.dogstats.gauge("pengubot.totalcommands", this.client.settings.get("counter.total")); this.client.dogstats.gauge("pengubot.users", users); this.client.dogstats.gauge("pengubot.cpm", cpm); this.client.dogstats.gauge("pengubot.guilds", guilds); this.client.dogstats.gauge("pengubot.voicestreams", vc); } init() { if (this.client.user.id !== "303181184718995457" || this.client.shard.id !== 0) return this.disable(); } }; ================================================ FILE: src/tasks/memorySweeper.js ================================================ const { Task, Colors, SnowflakeUtil } = require("../index"); // THRESHOLD equals to 30 minutes in milliseconds: // - 1000 milliseconds = 1 second // - 60 seconds = 1 minute // - 10 minutes const THRESHOLD = 1000 * 60 * 10; module.exports = class MemorySweeper extends Task { constructor(...args) { super(...args); // The colors to stylise the console's logs this.colors = { red: new Colors({ text: "lightred" }), yellow: new Colors({ text: "lightyellow" }), green: new Colors({ text: "green" }) }; // The header with the console colors this.header = new Colors({ text: "lightblue" }).format("[CACHE CLEANUP]"); } async run() { const OLD_SNOWFLAKE = SnowflakeUtil.generate(Date.now() - THRESHOLD); let guildMembers = 0, emojis = 0, lastMessages = 0, users = 0; // Per-Guild sweeper for (const guild of this.client.guilds.cache.values()) { // Clear members that haven't send a message in the last 30 minutes const { me } = guild; for (const [id, member] of guild.members.cache) { if (member === me) continue; if (member.voice.channelID) continue; if (member.lastMessageID && member.lastMessageID > OLD_SNOWFLAKE) continue; guildMembers++; guild.members.cache.delete(id); } // Clear emojis emojis += guild.emojis.cache.size; guild.emojis.cache.clear(); } // Per-Channel sweeper for (const channel of this.client.channels.cache.values()) { if (!channel.lastMessageID) continue; channel.lastMessageID = null; lastMessages++; } // Per-User sweeper for (const user of this.client.users.cache.values()) { if (user.lastMessageID && user.lastMessageID > OLD_SNOWFLAKE) continue; this.client.users.cache.delete(user.id); users++; } // Emit a log this.client.console.verbose(`${this.header} ${ this.setColor(guildMembers)} [GuildMember]s | ${ this.setColor(users)} [User]s | ${ this.setColor(emojis)} [Emoji]s | ${ this.setColor(lastMessages)} [Last Message]s.`); } /** * Set a colour depending on the amount: * > 1000 : Light Red colour * > 100 : Light Yellow colour * < 100 : Green colour * @since 3.0.0 * @param {number} number The number to colourise * @returns {string} */ setColor(number) { const text = String(number).padStart(5, " "); // Light Red color if (number > 1000) return this.colors.red.format(text); // Light Yellow color if (number > 100) return this.colors.yellow.format(text); // Green color return this.colors.green.format(text); } }; ================================================ FILE: src/tasks/reminder.js ================================================ const { Task } = require("../index"); module.exports = class extends Task { async run({ channel, user, text }) { const _channel = this.client.channels.fetch(channel).catch(() => null); const _user = await this.client.users.fetch(user).catch(() => null); if (_user) return _user.send(`⏰ **Reminder:** ${text}`).catch(() => null); if (_channel) return _channel.send(`📘 | <@${user}>, **Reminder:** ${text}`).catch(() => null); } }; ================================================ FILE: src/tasks/stats.js ================================================ const { Task, config } = require("../index"); module.exports = class extends Task { async run() { if (this.client.user.id !== "303181184718995457" || this.client.shard.id !== 0) return; if (!this.client.ready) return; let [guilds, vc, users] = [0, 0, 0]; const scount = this.client.shard.shardCount; const results = await this.client.shard.broadcastEval(`[this.guilds.cache.reduce((prev, val) => val.memberCount + prev, 0), this.guilds.cache.size, this.music.filter(music => music.playing).size]`); for (const result of results) { users += result[0]; guilds += result[1]; vc += result[2]; } return this.fetchURL("https://server.pengubot.com/bot/statposting", { method: "POST", headers: { authorization: config.apis.pengu, "Content-Type": "application/json" }, body: JSON.stringify({ servers: guilds, shards: scount, voice: vc, users: users }) }); } }; ================================================ FILE: src/tasks/tempMute.js ================================================ const { Task } = require("klasa"); const ModLog = require("../lib/structures/ModLog"); module.exports = class extends Task { async run({ guildID, userID }) { const guild = this.client.guilds.cache.get(guildID); const member = await guild.members.fetch(userID).catch(() => null); if (!guild || !member) return; const roleID = guild.settings.get("roles.muted"); const role = await guild.roles.cache.get(roleID); if (!role) return; const myRole = guild.me.roles.highest; if (role.position > myRole.positon) return; const unmute = await member.roles.remove(role).catch(() => null); if (!unmute) return; if (guild.settings.get("channels.modlogs")) { await new ModLog(guild) .setType("unmute") .setModerator(this.client.user) .setReason("Timed Mute Limit Over") .setUser(member.user) .send(); } } }; ================================================ FILE: src/tasks/timedBan.js ================================================ const { Task } = require("klasa"); const ModLog = require("../lib/structures/ModLog"); module.exports = class extends Task { async run({ guildID, userID }) { const guild = this.client.guilds.cache.get(guildID); const user = await this.client.users.fetch(userID).catch(() => null); if (!guild || !user) return; const unban = await guild.members.unban(user).catch(() => null); if (!unban) return; if (guild.settings.get("channels.modlogs")) { await new ModLog(guild) .setType("unban") .setModerator(this.client.user) .setReason("Timed Ban Limit Over") .setUser(user) .send(); } } };